Все таблицы находятся в utf_unicode_ci
.
Я сделал это для проверки
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name <> 'utf8_unicode_ci' AND table_schema LIKE 'my_database'
ORDER BY table_schema, table_name, ordinal_position;
И на всякий случай преобразовал каждую таблицу
ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci;
ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Настройки collation моей базы данных находятся в utf8_unicode_ci
.
charsets are
mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Имя_переменной | Значение | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | +--------------------------+----------------------------+ 8 строк в наборе (0.02 сек)
collations are
mysql> show variables like 'colla%'; +----------------------+-----------------+ | Имя_переменной | Значение | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | | +----------------------+-----------------+ 3 строки в наборе (0.00 сек)
ошибка возникает независимо от того, вызываю ли я хранимую процедуру через веб-браузер или через клиент mysql bash. на всякий случай мои настройки локали ubuntu/linux:
$ locale LANG=es_ES.UTF-8 LANGUAGE=es_ES.UTF-8 LC_CTYPE=es_ES.UTF-8 LC_NUMERIC="es_ES.UTF-8" LC_TIME="es_ES.UTF-8" LC_COLLATE=es_ES.UTF-8 LC_MONETARY="es_ES.UTF-8" LC_MESSAGES=es_ES.UTF-8 LC_PAPER="es_ES.UTF-8" LC_NAME="es_ES.UTF-8" LC_ADDRESS="es_ES.UTF-8" LC_TELEPHONE="es_ES.UTF-8" LC_MEASUREMENT="es_ES.UTF-8" LC_IDENTIFICATION="es_ES.UTF-8" LC_ALL=
Единственный способ решить эту проблему - использовать convert
внутри каждого запроса, который вызывает ошибку (или использовать COLLATE
внутри запроса), но проблема в том, что есть много довольно сложных хранимых процедур, поэтому трудно определить "плохие" запросы и это занимает много времени.
Я предполагаю, что переменные, передаваемые хранимой процедуре из моей системы (ubuntu : клиент mysql, браузер), передаются в utf8_general_ci, поэтому возникает конфликт с ut8_unicode_ci из моей базы данных.
Кажется, что os работает с utf8_general_ci, даже если соединение mysql установлено на utf_unicode_ci.