Отправляет email-рассылки с помощью сервиса Sendsay

utf8 в mysql

Как обстоят дела с поддержкой русского в mysql на utf8?

Пытался осуществлять поиск при помощи например
SELECT 'Поле' REGEXP '[Пп][Оо][Лл][Ее]' ;

результат 'false'

При поиске по шаблону с точным совпадением регистров символов (верхнего
и нижнего) ищет:

SELECT 'Поле' REGEXP 'Поле' ;

Что интересно: при поиске по шаблону типа '[Пп][Оо][Лл][Ее]' похоже ищет
в однобайтном режиме, потому как находит все что угодно, где совпадений
по символам вовсе нет.

Выставлял различные значения charset и collation как для самого сервера
mysqld, так и для базы данных и для отдельных полей - результат тот же.

Что интересно - если неправильно выставить collation, то выдает ошибку,
из которой следует, что regexp работает с collation 'latin1_swedish_ci'

Еще: в клиенте mysql и в моей проге на php с русским в моей базе все в
порядке, а вот в phpmyadmin и при выгрузке дампа средствами mysql уникод
идет нечитаемым 'D->D-DGD-.D-MyN~E=D-1/2N~<D-1S'.

В результате хотелось бы иметь нормальную сортировку и поиск, даже можно
смириться с некорректным преобразованием регистра символов в верхний или
нижний (другими средствами сделал). Кстати в php5 та же проблема с
переводом функциями strtoupper/strtolower, но это легко решилось
написанием своих функций.

Можно конечно перейти на cp1251 или koi8r (в ней не все символы
определены), но если других способов нет.

В общем - помогите чем можете.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 34035; Возраст листа: 1718; Участников: 1511
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/737716

Ответить   Mon, 07 Apr 2008 09:44:07 +0400 (#737716)

 

Ответы:

Так просто не одолеете. Плохо в regexp и иже с ним с multibyte chars.
Почитайте вот это, например:

http://dev.mysql.com/doc/refman/5.1/en/string-comparison-functions.html#operator_regexp

Там четко написано:

The REGEXP and RLIKE operators work in byte-wise fashion, so they are
not multi-byte safe and may produce unexpected results with multi-byte
character sets. In addition, these operators compare characters by their
byte values and accented characters may not compare as equal even if a
given collation treats them as equal.

Есть даже worklog на это дело:

http://forge1.mysql.com/worklog/task.php?id=353

avm7wo***@m*****.ru wrote:

Ответить   Mon, 07 Apr 2008 19:17:36 +0400 (#737881)