存储过程中非法混合的归类(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)

Pac*_*cer 14 mysql unicode ubuntu collation utf-8

  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;
    
    Run Code Online (Sandbox Code Playgroud)

    并转换每个表以防万一

    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;         
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我的数据库整理设置在utf8_unicode_ci.

    charsets是

    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. 无论我是通过Web浏览器还是通过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冲突.

即使mysql连接设置为utf_unicode_ci,似乎os正在使用utf8_general_ci.

Pac*_*cer 18

我解决了我的问题,并且由于迁移过程中的错误转换,我转换为utf_general_ci而不是utf8_unicode_ci,所以尽管mysql数据库结构正确,但源数据编码错误(utf8_general_ci)并插入mysql ddbb那样.

所以问题是你可以在你的mysql数据库中拥有正确的字符集和排序规则,并且仍然会出现"非法混合排序"错误,因为数据被另一个排序规则所包含.

希望这有助于未来的某些人.

  • 你有问题... 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认同)