Выборка из таблицы LIKE (русские буквы)

Freeman

Новичок
Выборка из таблицы LIKE (русские буквы)

Требуется сделать поиск по таблице вида
id | title (varchar 255, cp1251_bin) | text (text, cp1251_bin)

При выборе из таблицы запросом WHERE...LIKE 'русские буквы' phpMyAdmin выдает ошибку
#1267 - Illegal mix of collations (cp1251_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
В скрипте выполняю этот запрос (mysql_query()) - вообще ничего не возвращает (вернее возвращает ошибку)
Как такое победить??? Причем для некторых слов поиск проходит и выдается результат, но неполный (не все записи, имеющие совпадение с введенным словом).
P.S.: PHP 4.3.6, MySQL 4.1, Win2000 Server
P.S.S.: SET NAMES 'cp1251' и SET CHARACTER SET 'cp1251' сделал...
 

Freeman

Новичок
Автор оригинала: Апельсин
покажи что выводит
show variables like "%collation%";
collation_connection utf8_general_ci
collation_database cp1251_general_ci
collation_server latin1_swedish_ci

Как я понимаю, все кодировки надо привести к единому "стандарту"... Можно это сделать запросами или надо обязательно лезть в конфиги MySQL?
 

Апельсин

Оранжевое создание
collation_connection utf8_general_ci

ну так ничего удивительного в ошибке нет.

если set names в phpmyadmin делал, значит он каждый раз заново открывает соединение при выполнении запроса.
смотри может в конфигах самого phpmyadmin настроить как-то можно.
 

Freeman

Новичок
Вопрос вот в чем: можно ли поменять collation_connection БЕЗ переустановки MySQL? Если да, то как?
Второй вариант: перевести всю базу в utf8, но боюсь, что накроется весь русский текст... А база уже рабочая:(
Может, что посоветуете?
 

Profic

just Profic (PHP5 BetaTeam)
1) вопрос, зачем cp1251_bin если есть сp1251_general_ci, bin букву ё будет в начало списка загонять при сортировке (если это конечно важно :)

если ничего не хочется трогать :), то можно написать [sql]WHERE CONVERT(field, utf8_general_ci) LIKE 'бла-бла'[/sql] (или где-то так) и таким же образом переделать все запросы :)
или скормить phpMyAdmin-у конструкцию
[sql]
SET NAMES cp1251_bin;
SELECT ... WHERE field LIKE 'бла-бла';
[/sql]
за один раз, но этот вариант может не работать...
ADD: не будет работать. еще это 'бла-бла' тоже нужно из utf в cp1251 сконвертировать CONVERT()-ом

2) я не понял - в качестве интерфейса используется phpMyAdmin или что-то самописное?
если самописное, то я на такую проблему обычно не обращаю внимание - тестовые запросы изменяю в соответствии (1)
 

Freeman

Новичок
Автор оригинала: Profic
2) я не понял - в качестве интерфейса используется phpMyAdmin или что-то самописное?
если самописное, то я на такую проблему обычно не обращаю внимание - тестовые запросы изменяю в соответствии (1)
Да, использую свой (вернее, не свой, к сожалению) скрипт. Спасибо за ответ, буду переделывать исходники:)

если ничего не хочется трогать , то можно написать SQL: WHERE CONVERT( field, utf8_general_ci ) LIKE 'бла-бла'
Что-то у меня ошибочка выдается на utf8_general_ci... А если заглянуть в справочное руководство, то там говорится следующее:

CONVERT(expression,type)

где аргумент type представляет один из типов:
BINARY
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}

Блин, ведь должна же быть в mysql функция "приведения кодировок"???

И еще такой вопрос: создение полнотекстового индекса FULLTEXT поможет ускорить поиск? Или я неверно понимаю назначение этого индекса? Сама база пока небольшая (порядка 500 статей по 5-6 страниц в среднем)...
 

Profic

just Profic (PHP5 BetaTeam)
1) если, свой, то зачем вобще все эти пляски?
SET NAMES cp1251; в скриптах после коннекта и все (вроде, на крайний случай заменить collation своих полей на cp1251_general_ci или сделать SET collation_connection = cp1251_bin, но насчет последнего не уверен)
2) http://dev.mysql.com/doc/mysql/en/charset-convert.html
 

Freeman

Новичок
Автор оригинала: Profic
1) если, свой, то зачем вобще все эти пляски?
SET NAMES cp1251; в скриптах после коннекта и все (вроде, на крайний случай заменить collation своих полей на cp1251_general_ci или сделать SET collation_connection = cp1251_bin, но насчет последнего не уверен)
2) http://dev.mysql.com/doc/mysql/en/charset-convert.html
Супер! Совсем забыл про http://dev.mysql.com:) Действительно, вариант с CONVERT(field USING 'utf-8') LIKE 'bla-bla' прошел:)
 

Profic

just Profic (PHP5 BetaTeam)
а может мисье все же обратит внимание на мои первые вопросы?
 

Freeman

Новичок
Автор оригинала: Profic
а может мисье все же обратит внимание на мои первые вопросы?
Если ты имеешь в виду SET NAMES, то я уже говорил, что я делаю это сразу после коннекта, благодаря чему получаю нормальные русские символы из базы (а без оного я получаю "???????"). А если ты имеешь в виду
заменить collation своих полей на cp1251_general_ci или сделать SET collation_connection = cp1251_bin
, то это я буду пробовать уже завтра. В любом случае, сенк:)
 

123av

Новичок
помогите мне решить аналогичную проблему

#1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

подскажите как сделать mysql connect в latin1_swedish_ci а не в utf8_general_ci

делаю

mysql_query ("SET NAMES 'latin1_swedish_ci'");

Unknown character set: 'latin1_swedish_ci'
 
Сверху