【问题标题】:Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) within stored procedure存储过程中归类 (utf8_general_ci,IMPLICIT) 和 (utf8_unicode_ci,IMPLICIT) 的非法混合
【发布时间】:2012-03-01 02:57:18
【问题描述】:
  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> 显示变量,如 'char%'; +--------------------------+---------- ------+ |变量名 |价值 | +--------------------------+---------- ------+ | character_set_client | utf8 | |字符集连接 | utf8 | |字符集数据库 | utf8 | |字符集文件系统 |二进制 | |字符集结果 | utf8 | | character_set_server | utf8 | |字符集系统 | utf8 | |字符集目录 | /usr/share/mysql/charsets/ | +--------------------------+---------- ------+ 一组 8 行(0.02 秒)

    排序规则是

    mysql> 显示变量,如 'colla%';
    +---------------------------------+-----------------+
    |变量名 |价值 |
    +---------------------------------+-----------------+
    | collat​​ion_connection | utf8_unicode_ci |
    | collat​​ion_database | utf8_unicode_ci |
    |排序服务器 | utf8_unicode_ci |
    +---------------------------------+-----------------+
    3 行一组(0.00 秒)
  3. 无论我是通过 Web 浏览器还是通过 mysql bash 客户端调用存储过程,都会触发错误。以防万一我的 ubuntu/linux 语言环境设置是:

    $ 语言环境
    LANG=es_ES.UTF-8
    语言=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,操作系统似乎也在使用utf8_general_ci。

【问题讨论】:

  • 我的猜想是对的,系统以某种方式设置为 utf8_general_ci。如果我将每个表排序规则都转换为 utf_general_ci,我就不会再收到错误消息了。所以看来问题是我的系统正在使用 utf8_general_ci

标签: mysql ubuntu unicode utf-8 collation


【解决方案1】:

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

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

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

【讨论】:

  • 不太可能。无论如何,影响数据存储方式的编码都是 utf8,您只是在更改排序规则。我曾经遇到过类似的问题,存储过程给出了这个错误,但是在存储过程中手动执行语句没有,并且重新创建存储过程使问题消失了。 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】:

一旦您的编码和排序规则设置正确,重新导入存储过程和存储函数将解决问题。遇到了同样的问题。另一个用于故障排除的有用 mysql 原生函数:如果您怀疑表数据格式存在问题,请从 some_table 中选择 collat​​ion(some_col)。

【讨论】:

  • 就我而言,问题不在于存储过程,而在于数据库数据,即编码方式错误。谢谢,为这个问题做出贡献
【解决方案3】:

在参数列表中添加 CHARSET utf8 后,我已经解决了我的问题。可能这对其他人有帮助,

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

【讨论】:

    【解决方案4】:

    如果它对某人有帮助,我们在不同服务器的不同数据库中进行查询时遇到了同样的错误,错误是从另一个迁移。在我们的例子中,它是通过更改 mysql.ini 中的“collat​​ion_server”并重新启动 mysql 服务来修复的。

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 2010-11-03
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2016-02-19
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多