Неверное сочетание параметров сортировки (utf8_general_ci, IMPLICIT) и (utf8_unicode_ci, IMPLICIT) в хранимой процедуре - PullRequest
14 голосов
/ 08 февраля 2012
  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. Мои параметры сортировки базы данных находятся в 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)
  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 из моей базы данных.

Похоже, что ОС работает с utf8_general_ci, хотя для подключения mysql установлено значение utf_unicode_ci.

Ответы [ 4 ]

18 голосов
/ 14 февраля 2012

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

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

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

2 голосов
/ 06 мая 2015

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

1 голос
/ 06 февраля 2013

Повторный импорт сохраненных процедур и хранимых функций, если вы правильно настроили параметры кодирования и сортировки, решит проблемы.Столкнулся с той же самой проблемой.Еще одна полезная функция mysql для устранения неполадок: выберите параметры сортировки (some_col) из some_table, если вы подозреваете проблемы с форматом данных таблицы.

0 голосов
/ 01 октября 2014

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


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

...