前言


今天在进行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,保存存储过程即可。