问题描述
在执行某个存储过程时报告了以下错误:
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='
检查所有参与比较的字段,使用的都是utf8mb4_unicode_ci排序规则,后确认是数据库默认排序规则为utf8mb4_0900_ai_ci导致。
-
查看当前数据库默认排序规则
SELECT DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'your_db_name';
输出以下内容:
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_0900_ai_ci |
+------------------------+
1 row in set (0.00 sec)
-
查看会话默认
SHOW VARIABLES LIKE 'collation%';
输出以下内容:
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
-
查看数据库创建语句
show create database your_db_name;
输出以下内容:
CREATE DATABASE `your_db_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */
解决方案(任选其一)
1. 在存储过程中定义变量时指定排序规则
DECLARE mchId VARCHAR(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 修改数据库默认排序规则
-
找到配置文件位置(常见路径):
- Linux: /etc/my.cnf 或 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
- Windows: my.ini(通常在 MySQL 安装目录下)
-
在 [mysqld] 段落下添加:
[mysqld]
字符集和排序规则统一为 utf8mb4 + utf8mb4_unicode_ci
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci可选:确保客户端也使用一致设置(避免连接层问题)
skip-character-set-client-handshake
init-connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
skip-character-set-client-handshake 强制所有客户端使用服务器默认字符集(谨慎使用,某些旧客户端可能不兼容)。
-
保存后重启 MySQL:
Ubuntu/Debian
sudo systemctl restart mysql
CentOS/RHEL
sudo systemctl restart mysqld
Windows:通过服务管理器重启 MySQL
-
验证配置是否生效
SHOW VARIABLES LIKE 'character_set_server';
-- 应返回 utf8mb4SHOW VARIABLES LIKE 'collation_server';
-- 应返回 utf8mb4_unicode_ci
3. 修改现有数据库的默认排序规则(推荐)
-
执行以下语句修改db排序规则
ALTER DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
修改现有表的字段排序规则
-- 生成 ALTER TABLE 语句(检查是否有不一致的字段)
SELECT
CONCAT('ALTER TABLE', TABLE_NAME, 'CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db_name';
然后执行输出的 SQL(谨慎操作,先备份!)。
注意:CONVERT TO 会重建表并转换数据,大表需停机维护。