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


本文摘自PHP中文网,作者小云云,侵删。

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

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

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


1

2

3

4

5

6

7

8

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)

查看表默认排序规则集


1

2

3

4

5

6

7

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)

查看列排序规则集


1

2

3

4

5

6

7

8

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的,如下:


1

2

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的,如下:


1

2

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主键是必须的吗

mysql中的事件调度基础学习教程

mysql引擎有哪些

mysql如何设置数据表的默认编码格式

mysql安装启动两种方法教程详解

mysql 错误1248怎么办

mysql 十大优化方法

关于mysql explain中key_len的计算方法讲解

xammp怎么打开mysql

mysql 中间件mycat安装与使用方法实例分享

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...