Шукати в цьому блозі

середу, 11 листопада 2009 р.

mySQL + UTF8 проблема с поиском данных с кириллицей при использовании фунций ( lower/upper )

Исходные данные: Ubuntu server 9.04 + MySQL 5.1.x, была какая-то база MBASE с таблицей abase, в которую вносились данные в кодировке utf8, все запросы происходили посредством самописных Perl скриптов.

Так сложилось, что появилась необходимость использовать регистронезависимый поиск.
Самым простым способом реализации регистронезависимого поиска, является преобразование строки поиска и значения поля(ей) таблиц к верхнему(upper) или нижнему(lower) регистру.

Пример банального SELECT-а ввыглядит бля таблици abase так:

select * form abase where locate(lower('ЯбЛо'),lower(message0))>0;

т.е. строка поиска "ЯбЛо" и значение в поле message0 таблицы abase преобразовывается
к нижнему регистру и ищется вхождение.

К сожалению поиск не работал. Однако, не работал для кирилических символов, т.е. регистрозависимый в стиле:

select * form abase where messages0 LIKE 'Ябло%';

отрабатывал, но как только использовалось преобразование регистров, переставал работать.

Залогинившись mysql -uroot -ppass побросал запросы напрямую - увидел, что после использования функций преобразования регитров символов, отдает какю-то ересь из квадратиков.

Погуглив, нашел подсказку в указании кодировки по-умолчание в файле конфигурации MySQL:


[mysqld]
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
init-connect="SET NAMES utf8"
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8

[client]
default-character-set = utf8


Вписав эти инструкции и перегрузив сервер MySQL сервер, получил еще ведро ошибок в стиле:
'Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)'


Вобщем, плохо все, нашел совет перекодировать:

alter table `abase` convert to character set utf8
collate utf8_swedish_ci;


Однако, то ли я не разобрался, то ли еще почему-то, но не получилось.

На самом деле, нужно просто правильно создавать базы вначале с указанием правильных кодировок:

CREATE DATABASE vizor CHARACTER SET utf8 COLLATE utf8_general_ci;

Тогда и проблем не будет.
Пошел, скорей неправильным путем, создавая правильно новую базу и экспортируя таблици из старой через mysqldump.