https://learnku.com/articles/41546

 

 

、查询 MySQL 的版本:
  SELECT VERSION();
2、查询 MySQL 当前使用的字符集:   SHOW VARIABLES LIKE '%character%';
3、查询指定数据库的指定数据表的状态信息(db_test 是数据库,t_text 是数据表):   SHOW TABLE STATUS FROM `db_test` LIKE '%t_text%';
4、查看数据表的列信息:   SHOW FULL COLUMNS FROM t_text;
5、修改数据表 t_text 的字符集:   ALTER TABLE t_text DEFAULT CHARACTER SET utf8mb4;

6、修改数据表 t_text 中的 nickname 字段的字符集:   ALTER TABLE t_text CHANGE nickname nickname VARCHAR(256) CHARACTER SET utf8mb4 NOT NULL;

 

 

 

 

 

 

 

 

 

 

 

事情起因
今天在一个统计功能时候,因为用到联表查询语句时候 mysql 报错了,错误提示为

1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
根据错误提示,推断可能是由于两个表的字符集不一致导致的,接下来我开始了一步步的追踪

分析过程
1. 首先,我希望查看一下数据库的字符集,我使用了语句

show variables like "collation_database";
显示结果为


然后,我想看看我查询所用到的表的字符集和数据库的字符集是否一致,我使用语句

show table status like 'xxxx'


这样看来表和数据库字符集编码应该是相同的。
2. 既然表和数据库字符编码一致,那么应该是联合查询的表的字段字符集不一样吧,带着着这样的疑问我继续追踪。
使用 sql 语句查询一下其中一个表 a 的所有字段

SHOW FULL COLUMNS FROM a


在查询另一个表 b 的所有字段

SHOW FULL COLUMNS FROM b

如上所示,现在问题找到了,就是字段的字符集编码不一致.

解决办法
原因找到后,就开始解决了。我找到了 3 种办法解决
1. 改变表字段的编码,使两个表的字段编码保持一致。(如果是联合查询一般更改语句 on xx.sn=xxx.sn 中 sn 字段)
2. 如果没有权限更改表那么可以考虑用 CONVERT 如下

CONVERT(xxx.sn USING utf8) COLLATE utf8_general_ci=xxxx.sn
3. 也可以把两个字段转为二进制用

BINARY xxx.sn=BINARY xxxx.sn
方法点评
方法 1 最为直接。(这就要求我们创建数据库和表的时候要注意,保持字符集编码一致真的很重要!!)
方法 2 对于数据量较大的表不太适用,因为索引有可能没法用到,导致查询速度很慢。
方法 3 对于字符类型的字段很好用,但是如果字段是数字类型字符串(比如 98765432334 当做字符串来存到表的字段)则有可能得不到想要的结果。

我按照第 1 中方法改的(本人集运维开发与一身,公司穷,请不起运维),如果有更好的办法,欢迎大家和我交流!

————————————————
原文作者:阿隆索逃跑了
转自链接:https://learnku.com/articles/41546
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。