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

 更新时间:2017年10月12日 15:03:07   作者:彭东稳  
这篇文章主要介绍了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查询优化:连接查询排序浅谈

    MySQL查询优化:连接查询排序浅谈

    不知道有没有人碰到过这样恶心的问题:两张表连接查询并limit,SQL效率很高,但是加上order by以后,语句的执行时间变的巨长,效率巨低。下边就来看看这个问题需要如何解决
    2013-02-02
  • mysql数据库视图和执行计划实战案例

    mysql数据库视图和执行计划实战案例

    这篇文章主要给大家介绍了关于mysql数据库视图和执行计划的相关资料,在使用MySQL过程中视图和执行计划是一个很好的工具,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • 浅谈Using filesort和Using temporary 为什么这么慢

    浅谈Using filesort和Using temporary 为什么这么慢

    本文主要介绍了Using filesort和Using temporary为什么这么慢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 深入理解Mysql的四种隔离级别

    深入理解Mysql的四种隔离级别

    开发工作中我们会使用到事务,那你们知道事务又分哪几种吗?MYSQL标准定义了4类隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低的隔离级一般支持更高的并发处理,并拥有更低的系统开销。下面通过这篇文章我们来一起深入理解Mysql中的四种隔离级别。
    2016-11-11
  • ubuntu linux下使用Qt连接MySQL数据库的方法

    ubuntu linux下使用Qt连接MySQL数据库的方法

    Linux下完整的MySQL开发需要安装服务器端,如果安装客户端也没什么不好。直接在软件中心搜mysql,把client和server选上。
    2011-08-08
  • Mysql优化方法详细介绍

    Mysql优化方法详细介绍

    MySQL的优化指的是一个很大的系统,面试的时候我之前是从sql的语句优化方面去说的,这种优化也有作用,不过是从逻辑方面去优化,下面这篇文章主要给大家介绍了关于MySQL查询缓存优化的相关资料,需要的朋友可以参考下
    2023-02-02
  • mysql判断字符串是否存在几种常见方式

    mysql判断字符串是否存在几种常见方式

    写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,下面这篇文章主要给大家介绍了关于mysql判断字符串是否存在的几种常见方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • MySQL 5.7 zip版本(zip版)安装配置步骤详解

    MySQL 5.7 zip版本(zip版)安装配置步骤详解

    这篇文章主要介绍了MySQL 5.7 zip版本(zip版)安装配置步骤详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • mysql导出查询结果到csv的实现方法

    mysql导出查询结果到csv的实现方法

    下面小编就为大家带来一篇mysql导出查询结果到csv的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MYSQL必知必会读书笔记第六章之过滤数据

    MYSQL必知必会读书笔记第六章之过滤数据

    本文给大家分享MYSQL必知必会读书笔记第六章之过滤数据的相关知识,非常实用,特此分享到脚本之家平台,供大家参考
    2016-05-05

最新评论