MySQL的Illegal mix of collationsy异常原因和解决方法

本文介绍了一种在MySQL中使用临时表及游标时遇到的字符集异常问题,并详细解释了如何通过统一字符集来避免(concat)操作时出现的非法混合字符集错误。
 今天在使用数据库临时表的游标时,发现了这个异常。
经查找资料,最终结果。这里和大家分享一下。 字符集问题还是一定要统一的才是最简单的。

create temporary table temp2(mc1 varchar(20) default '',mc2 varchar(20)default '',mc3 varchar(20)default '',mc4 varchar(20)default '',mc5 varchar(20)default '',parentid varchar(20),levelnum int); -- 生成临时表

declare mycur67 CURSOR for select concat(replace(space(levelnum-1),space(1),'------'),mc1,mc2,mc3,mc4,mc5) as mc,parentid as location from temp2;

异常信息为:
Illegal mix of collations for operation 'concat'

将concat的代码去掉后面的部分内容,运行结果为
declare mycur67 CURSOR for select concat(replace(space(levelnum-1),space(1),'------'),mc1) as mc,parentid as location from temp2;

错误:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (gb2312_chinese_ci,IMPLICIT) for operation 'concat'

可见,是2个字段的编码类型不一致造成的。

原来我的数据库创建时,选择的是gb2312编码,而字段操作默认为UTF8的编码。 绝对统一使用UTF-8

create temporary table temp2(mc1 varchar(20) default '',mc2 varchar(20)default '',mc3 varchar(20)default '',mc4 varchar(20)default '',mc5 varchar(20)default '',parentid varchar(20),levelnum int)DEFAULT CHARSET=UTF8;

运行结果正常。

经查找资料,如下说的很清楚
mysql> show variables like "%character%"; show variables like "%collation%"; +--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

fix it with
set collation_database=utf8_general_ci;
set collation_connection=utf8_general_ci;
set collation_server=utf8_general_ci;
### MySQL 中 `Illegal mix of collations` 错误的原因解决方案 #### 错误概述 当执行某些操作(如比较、连接或联合查询)时,如果涉及的列具有不同的字符集或排序规则,则可能会触发 `Illegal mix of collations` 错误。此错误表明数据库无法自动处理这些不同字符集之间的转换。 例如,在引用中提到的情况之一是由于两个表中的字段分别使用了 `utf8_general_ci` `utf16_general_ci` 字符集而导致的错误[^1]。另一个例子则是因字段间存在 `utf8_general_ci` `utf8_unicode_ci` 排序规则差异而引发的问题[^2]。 --- #### 解决方案 ##### 方法一:统一字符集排序规则 最直接的方式是在创建表或者修改现有结构时确保所有相关联的数据列采用相同的字符集以及一致性的排序方式。可以通过以下 SQL 命令实现: ```sql ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 这条语句会将指定表格内的全部数据列调整至 UTF-8 编码并应用通用区分大小写的排序规则 `utf8_general_ci`[^3]。 对于特定字段也可以单独设置其属性: ```sql ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 这样可以避免因为个别字段不匹配所造成的冲突情况发生。 --- ##### 方法二:强制指定临时排序规则 如果不希望永久更改整个表的设计,还可以通过在查询过程中显式声明期望使用的排序规则来规避该类问题。比如下面这个示例展示了如何利用 CAST 函数改变表达式的类型从而绕过潜在矛盾之处: ```sql SELECT * FROM table_a a JOIN table_b b ON (CAST(a.column AS CHAR CHARACTER SET utf8) = CAST(b.column AS CHAR CHARACTER SET utf8)); ``` 这里我们把参与运算的部分都转化为相同的标准形式后再做进一步判断逻辑处理[^3]。 另外一种更简洁的做法就是在条件子句里加入额外参数说明具体应该遵循哪套规则来进行对比测试工作: ```sql WHERE colA COLLATE utf8_general_ci = colB COLLATE utf8_general_ci ; ``` 这种方法适用于那些只需要偶尔运行特殊脚本而不必长期维护新版本架构的应用场景下非常有用。 --- ##### 方法三:检查默认配置文件设定 有时候全局级别的初始化选项也可能成为诱因所在位置。因此有必要核查服务器启动时候加载的相关参数值是否合理恰当。打开 my.cnf 或者 my.ini 文件寻找如下几项内容是否存在偏差: ```ini [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci ``` 如果没有正确指派的话就按照上面给出的例子补充进去保存退出之后重启服务生效即可。 --- ### 总结 针对 `Illegal mix of collations` 这种类型的错误消息提示信息来说,核心要点在于保持一致性原则——无论是从单个记录单元层面还是整体系统环境角度出发都需要努力达成高度协调的状态才能有效预防此类状况再次重现。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值