Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) within stored procedure

  1. Все таблицы находятся в 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; 
    
  2. Настройки 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 сек)
  3. ошибка возникает независимо от того, вызываю ли я хранимую процедуру через веб-браузер или через клиент 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.

14
задан Packet Tracer 4 August 2014 в 19:11
поделиться