MySQL常见问题之illegal mix of collations
前言
今天在进行web页面测试时,Tomcat日志报错:
1 | [Err] 1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=' |
问题分析:表之间的编码不一致,或者是比较的字段之间的编码不一致。
解决方法
1、根据报错日志,找到报错的SQL语句,将语句与参数取出,单独在Navicat或其他数据库查询工具中执行,定位报错的SQL语句。
2、查看MySQL全局编码格式:
1 | show variables like 'character%'; |
3、如果全局编码格式不对,则修改MySQL的全局编码格式(character_set_filesystem=binary 不用修改),其余属性如下修改即可:
1 | set character_set_client = utf8; |
4、查看MySQL数据库字符集:
1 | show variables like '%collation%'; |
5、如果数据库字符集编码不一致,则按如下进行修改即可:
1 | set collation_connection = utf8_general_ci; |
6、如果仍然报错,则查看报错SQL语句中涉及到的表,查看表间的字符集编码是否一致:
1 | show create table <表名>; |
7、如果表间字符集编码不一致,修改其中一个表的编码格式,使其表间编码一致:
1 | alter table <表名> character set utf8 COLLATE utf8_general_ci; |
8、如果表间编码一致仍出现同样错误,则查看表字段字符集编码是否一致:
1 | show full columns from <表名>; |
9、修改字段编码:
1 | ALTER TABLE <表名> MODIFY <字段名> <字段类型,如varchar(30)> CHARACTER SET utf8 COLLATE utf8_general_ci; |
10、如果数据库编码一致,表间编码一致,字段编码一致,且涉及到存储过程,仍然出现此类报错,则打开存储过程的定义,删除存储过程中CHARSET utf8,保存存储过程即可。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zane!
评论