Подтвердить что ты не робот

Недопустимое сочетание сортировок (utf8_general_ci, IMPLICIT) и (utf8_unicode_ci, IMPLICIT) в хранимой процедуре

  • Все таблицы находятся в 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 client, browser), отправляются в utf8_general_ci, поэтому он конфликтует с ut8_unicode_ci из моей базы данных.

Кажется, что os работает с utf8_general_ci, даже если для соединения mysql установлено значение utf_unicode_ci.

4b9b3361

Ответ 1

Я решил свою проблему и был из-за неправильного преобразования во время миграции, я преобразовал в utf_general_ci вместо utf8_unicode_ci, поэтому, хотя структура базы данных mysql была правильной, исходные данные были закодированы в неправильной кодировке (utf8_general_ci) и вставлены в mysql ddbb таким образом.

Итак, вы можете иметь правильный набор символов и сортировку в базе данных mysql и по-прежнему получать эту ошибку "Недопустимое смешение коллажей" из-за того, что данные привязаны к другой сортировке.

Надеюсь, это поможет кому-то в будущем.

Ответ 2

В случае, если это помогает кому-то, у нас была такая же ошибка при выполнении запроса в разных базах данных на разных серверах, одна с ошибкой была переходом от другой. В нашем случае это было исправлено путем изменения "collation_server" в mysql.ini и перезапуска службы mysql.

Ответ 3

Повторное импортирование хранимых процедур и хранимых функций после правильной настройки параметров кодирования и сопоставления устраняет проблемы. Иди в ту же самую проблему. Другая полезная функция mysql для устранения неполадок: выберите collation (some_col) из some_table, если вы подозреваете проблемы с табличным форматом данных.

Ответ 4

Я решил проблему после добавления CHARSET utf8 в список параметров. может быть, это поможет полностью другим,


   PROCEDURE `USP_USR_AuthenticateUser`(
      IN ip_username VARCHAR(50) CHARSET utf8**,
      IN ip_pwd NVARCHAR(256)
   )