MySQL报错:Illegal mix of collations

锦通  论坛元老 | 2024-10-28 15:27:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1585|帖子 1585|积分 4755

背景

   最近项目上MySQL库运行过程中遇到SQL执行报错:java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation ‘=’
  分析

扣问DBA后,被告知是关联查询的表排序规则不一致导致,如下图:


解决办法

要解决这个问题很简朴,就是将两张表的排序规则调整一致就好。但是以哪个为准呢?
首先,我们要确定命据库使用的排序规则,一般情况下,建表的排序规则尽量与数据默认设置保持一致
  1. show variables where variable_name like '%collation%';
复制代码
效果如下图:

剩下就简朴了,如果有工具连数据库,那么直接在工具里操作就好,固然我们也可以执行SQL处置惩罚;
调整表字符集SQL如下:
  1. alter table TabelName default character set utf8mb4 collate=utf8mb4_general_ci;
复制代码
最后呢,就是统一整库所有表字符集、排序规则的SQL,其中$DATABASE_NAME需要根据实际情况调整
  1. /**修改数据库的默认字符集及排序规则**/
  2. alter database $DATABASE_NAME charset=utf8mb4 collate=utf8mb4_general_ci;
  3. /**修改表的字符集**/
  4. /**将以下sql的执行结果在命令窗口中执行**/
  5. SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) '修正SQL' FROM information_schema.`TABLES`  WHERE  TABLE_SCHEMA = '$DATABASE_NAME$';
  6. /**修改表中的字段的字符集**/
  7. /**将以下sql的执行结果在命令窗口中执行**/
  8. 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`
  9. WHERE COLUMN_DEFAULT is not null AND TABLE_SCHEMA = '$DATABASE_NAME' and  COLLATION_name!='utf8mb4_general_ci';
  10. 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`
  11. WHERE COLUMN_DEFAULT is  null AND TABLE_SCHEMA = '$DATABASE_NAME' and  COLLATION_name!='utf8mb4_general_ci';
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表