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

时间:2012-02-08 16:22:41

标签: mysql ubuntu unicode utf-8 collation

  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

    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. 无论是通过网络浏览器还是通过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=
  4. 我能够解决此问题的唯一方法是在每个查询中使用convert导致错误(或在查询中使用COLLATE),但问题是存在很多非常复杂的存储过程因此很难识别“坏”查询并花费大量时间。

    我想不知怎的,从我的系统(ubuntu:mysql客户端,浏览器)传递给存储过程的变量正在utf8_general_ci中发送,因此它与我的数据库中的ut8_unicode_ci冲突。

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

4 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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


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