• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL表排序规则不同错误问题分析

    MySQL多表join时报错如下:[Err]1267 – Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=

    就是说两个表的排序规则(COLLATION)不同,无法完成比较。COLLATION是用在排序,大小比较上,一个字符集有一个或多种COLLATION,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二进制)结束。在做比较时,应该确保两个表的字符排序相同。一般建表的时候不指定,可以走默认的,全是默认的就没什么问题了。

    下面来模拟一下各种场景,表结构如下(utf8默认排序规则为utf8_general_ci):

    mysql> show create table test.cs\G
    *************************** 1. row ***************************
        Table: cs
    Create Table: CREATE TABLE `cs` (
     `id` int(11) DEFAULT NULL,
     `name` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.01 sec)

    查看表默认排序规则集

    mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs';
    +--------------+------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION |
    +--------------+------------+-----------------+
    | test     | cs     | utf8_general_ci |
    +--------------+------------+-----------------+
    1 row in set (0.00 sec)

    查看列排序规则集

    mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs';
    +--------------+------------+-------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME |
    +--------------+------------+-------------+-----------------+
    | test     | cs     | id     | NULL      |
    | test     | cs     | name    | utf8_general_ci |
    +--------------+------------+-------------+-----------------+
    2 rows in set (0.00 sec)

    从utf8升级为utf8mb4是不支持online ddl的,如下:

    mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8mb4,ALGORITHM=INPLACE,LOCK=NONE;
    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

    从utf8.utf8_general_ci变更为utf8.utf8_unicode_ci是不支持online ddl的,如下:

    mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci,ALGORITHM=INPLACE,LOCK=NONE;
    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

    如果使用下面这种方式修改字符集,你会发现,只更改了表级的,没有更改列级的。

    mysql> ALTER TABLE cs CHARACTER SET utf8 collate utf8_unicode_ci;      
    Query OK, 0 rows affected (0.01 sec)
    Records: 0 Duplicates: 0 Warnings: 0
     
    mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs';      
    +--------------+------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION |
    +--------------+------------+-----------------+
    | test     | cs     | utf8_unicode_ci |
    +--------------+------------+-----------------+
    1 row in set (0.00 sec)
     
    mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs';
    +--------------+------------+-------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME |
    +--------------+------------+-------------+-----------------+
    | test     | cs     | id     | NULL      |
    | test     | cs     | name    | utf8_general_ci |
    +--------------+------------+-------------+-----------------+
    2 rows in set (0.00 sec)

    所以真正改字符集的时候别忘了加上CONVERT TO,如下:

    mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci;
    Query OK, 5 rows affected (0.06 sec)
    Records: 5 Duplicates: 0 Warnings: 0
     
    mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs';
    +--------------+------------+-------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME |
    +--------------+------------+-------------+-----------------+
    | test     | cs     | id     | NULL      |
    | test     | cs     | name    | utf8_unicode_ci |
    +--------------+------------+-------------+-----------------+
    2 rows in set (0.00 sec)

    要仅仅改变一个表的默认字符集,应使用此语句:

    mysql> ALTER TABLE cs default CHARACTER SET utf8 collate utf8_general_ci,ALGORITHM=INPLACE,LOCK=NONE;         
    Query OK, 0 rows affected (0.00 sec)
    Records: 0 Duplicates: 0 Warnings: 0
     
    mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs';      
    +--------------+------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION |
    +--------------+------------+-----------------+
    | test     | cs     | utf8_general_ci |
    +--------------+------------+-----------------+
    1 row in set (0.00 sec)
     
    mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs';  
    +--------------+------------+-------------+-----------------+
    | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME |
    +--------------+------------+-------------+-----------------+
    | test     | cs     | id     | NULL      |
    | test     | cs     | name    | utf8_unicode_ci |
    +--------------+------------+-------------+-----------------+
    2 rows in set (0.00 sec)

    可以发现列字符集没有改变,并且只有新的列才会默认继承表的字符集(utf8.utf8_general_ci)。

    总结

    以上就是本文关于MySQL表排序规则不同错误问题分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:几个比较重要的MySQL变量、MySQL 声明变量及存储过程分析、MySQL主库binlog(master-log)与从库relay-log关系代码详解、MySQL prepare原理详解等,有什么问题可以随时留言,互相交流,共同进步。

    您可能感兴趣的文章:
    • MySQL中Order By多字段排序规则代码示例
    • Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
    上一篇:MySQL中Order By多字段排序规则代码示例
    下一篇:企业生产MySQL优化介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL表排序规则不同错误问题分析 MySQL,表,排序,规则,不同,