mysql调用存储过程出现Illegal mix of collations错误

本文介绍了解决MySQL调用存储过程中出现的Illegal mix of collations错误的方法,包括调整character set、collation设置以及如何正确创建存储过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql调用存储过程出现Illegal mix of collations错误,检查如下,

1. 查看character_set,看是不是有不一致的,如有需改为一致

show variables where Variable_name like 'character_set%';

修改character_set_server的方法:编辑mysql安装目录下的my.ini,在[mysqld]下添加 character-set-server=utf8

 

2. 查看collation是不是有不一致的,如有需改为一致.

show variables where Variable_name like 'collation%';

修改数据库的collation:

alter database databasename collate utf8_general_ci 

 

3.查看用到的表的collation是不是存在不一致的,同时需检查表的字段的collation

show table status from db_name

修改表或字段的collation,可用navicat for mysql 工具,在设计表界面中设置。

 

4.以上都没问题,还报错(我就是),则需重建procedure,每个字符型的参数后指定字符集

CREATE PROCEDURE `proce_test`(admin_name VARCHAR(32) charset utf8)

 

参考:

mysql调用存储过程出现Illegal mix of collations错误

FAQ系列 - 调用存储过程时报错 Illegal mix of collations

Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT)

怎样改变数据库及表的Collation

### 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` 这种类型的错误消息提示信息来说,核心要点在于保持一致性原则——无论是从单个记录单元层面还是整体系统环境角度出发都需要努力达成高度协调的状态才能有效预防此类状况再次重现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值