背景
最近项目上MySQL库运行过程中遇到SQL执行报错:java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation ‘=’
分析
扣问DBA后,被告知是关联查询的表排序规则不一致导致,如下图:
解决办法
要解决这个问题很简朴,就是将两张表的排序规则调整一致就好。但是以哪个为准呢?
首先,我们要确定命据库使用的排序规则,一般情况下,建表的排序规则尽量与数据默认设置保持一致
- show variables where variable_name like '%collation%';
-
复制代码 效果如下图:
剩下就简朴了,如果有工具连数据库,那么直接在工具里操作就好,固然我们也可以执行SQL处置惩罚;
调整表字符集SQL如下:
- alter table TabelName default character set utf8mb4 collate=utf8mb4_general_ci;
复制代码 最后呢,就是统一整库所有表字符集、排序规则的SQL,其中$DATABASE_NAME需要根据实际情况调整
- /**修改数据库的默认字符集及排序规则**/
- alter database $DATABASE_NAME charset=utf8mb4 collate=utf8mb4_general_ci;
- /**修改表的字符集**/
- /**将以下sql的执行结果在命令窗口中执行**/
- SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) '修正SQL' FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '$DATABASE_NAME$';
- /**修改表中的字段的字符集**/
- /**将以下sql的执行结果在命令窗口中执行**/
- SELECT CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT \'',COLUMN_DEFAULT,'\';' ) '修正SQL' FROM information_schema.`COLUMNS`
- WHERE COLUMN_DEFAULT is not null AND TABLE_SCHEMA = '$DATABASE_NAME' and COLLATION_name!='utf8mb4_general_ci';
- SELECT CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;' ) '修正SQL' FROM information_schema.`COLUMNS`
- WHERE COLUMN_DEFAULT is null AND TABLE_SCHEMA = '$DATABASE_NAME' and COLLATION_name!='utf8mb4_general_ci';
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |