Все таблицы в 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;
Мои параметры сортировки базы данных находятся в utf8_unicode_ci
.
наборы символов
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| 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 rows in set (0.02 sec)
параметры сортировки
mysql> show variables like 'colla%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
ошибка вызывается, вызываю ли я хранимую процедуру через веб-браузер или через 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 из моей базы данных.
Похоже, что ОС работает с utf8_general_ci, хотя для подключения mysql установлено значение utf_unicode_ci.