MySQL错误1267(Illegal mix of collations)通常发生在比较、连接或操作不同字符集(collation)的字符串时。以下是解决该问题的详细步骤:
utf8_general_ci 和 latin1_swedish_ci 就是不同的排序规则。-- 修改单个字段
ALTER TABLE 表名 MODIFY 字段名 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 修改整个表的默认排序规则
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 示例1:使用CONVERT转换排序规则
SELECT * FROM table1 t1
JOIN table2 t2 ON CONVERT(t1.column USING utf8) = t2.column;
-- 示例2:使用CAST
SELECT * FROM table1 t1
JOIN table2 t2 ON CAST(t1.column AS CHAR CHARACTER SET utf8) = t2.column;
-- 使用COLLATE关键字
SELECT * FROM table1 t1
JOIN table2 t2 ON t1.column COLLATE utf8_general_ci = t2.column COLLATE utf8_general_ci;
-- 修改数据库默认排序规则
ALTER DATABASE 数据库名 CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 查看当前数据库排序规则
SELECT @@character_set_database, @@collation_database;
-- 查看数据库排序规则
SHOW CREATE DATABASE 数据库名;
-- 查看表排序规则
SHOW CREATE TABLE 表名;
-- 查看字段排序规则
SHOW FULL COLUMNS FROM 表名;
-- 查看连接相关变量
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 常用的设置(可在my.cnf或会话中设置)
SET NAMES 'utf8';
SET CHARACTER SET utf8;
SET collation_connection = 'utf8_general_ci';
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
CREATE TABLE mytable (
id INT PRIMARY KEY,
name VARCHAR(100)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
utf8mb4(支持4字节字符,如emoji)utf8在MySQL中是3字节编码-- 将数据库升级到utf8mb4
ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 检查所有表中排序规则不一致的情况
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '你的数据库名'
ORDER BY COLLATION_NAME;
在连接数据库后立即执行:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
utf8mb4_unicode_ci
已有项目:逐步统一排序规则,避免一次性修改所有表
临时解决:使用查询时的COLLATE子句
彻底解决:修改表结构和数据库默认设置
修复后,建议运行测试确保数据完整性,特别是包含特殊字符的数据。