gpt4 book ai didi

mysql - 存储过程中非法混合排序规则 (utf8_general_ci,IMPLICIT) 和 (utf8_unicode_ci,IMPLICIT)

转载 作者:IT老高 更新时间:2023-10-29 00:07:09 27 4
gpt4 key购买 nike

  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 语言环境设置是:

    $ localeLANG=es_ES.UTF-8LANGUAGE=es_ES.UTF-8LC_CTYPE=es_ES.UTF-8LC_NUMERIC="es_ES.UTF-8"LC_TIME="es_ES.UTF-8"LC_COLLATE=es_ES.UTF-8LC_MONETARY="es_ES.UTF-8"LC_MESSAGES=es_ES.UTF-8LC_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,操作系统似乎也在使用utf8_general_ci。

最佳答案

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

所以问题是你可以在你的 mysql 数据库中拥有正确的字符集和排序规则,但仍然会出现“非法混合排序规则”错误,因为数据是用另一个排序规则编码的。

希望这对将来的某人有所帮助。

关于mysql - 存储过程中非法混合排序规则 (utf8_general_ci,IMPLICIT) 和 (utf8_unicode_ci,IMPLICIT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197300/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com