前言
今天在进行web页面测试时,Tomcat日志报错:
[Err] 1267 - Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
问题分析:表之间的编码不一致,或者是比较的字段之间的编码不一致。
解决方法
1、根据报错日志,找到报错的SQL语句,将语句与参数取出,单独在Navicat或其他数据库查询工具中执行,定位报错的SQL语句。
2、查看mysql全局编码格式:
show variables like 'character%';
3、如果全局编码格式不对,则修改mysql的全局编码格式(character_set_filesystem=binary 不用修改),其余属性如下修改即可:
set character_set_client = utf8;
4、查看mysql数据库字符集:
show variables like '%collation%';
5、如果数据库字符集编码不一致,则按如下进行修改即可:
set collation_connection = utf8_general_ci;
6、如果仍然报错,则查看报错SQL语句中涉及到的表,查看表间的字符集编码是否一致:
show create table <表名>;
7、如果表间字符集编码不一致,修改其中一个表的编码格式,使其表间编码一致:
alter table <表名> character set utf8 COLLATE utf8_general_ci;
8、如果表间编码一致仍出现同样错误,则查看表字段字符集编码是否一致:
show full columns from <表名>;
9、修改字段编码:
ALTER TABLE <表名> MODIFY <字段名> <字段类型,如varchar(30)> CHARACTER SET utf8 COLLATE utf8_general_ci;
10、如果数据库编码一致,表间编码一致,字段编码一致,且涉及到存储过程,仍然出现此类报错,则打开存储过程的定义,删除存储过程中CHARSET utf8,保存存储过程即可。
欢迎访问我的个人博客:Lemon - 万事顺遂