Mysql 字符集 Illegal mix of collations

文章描述了在MySQL中遇到的字符集(CHARACTERSET)和校对(COLLATION)不匹配的错误,以及如何将数据库、表和连接设置为utf8mb4以解决非法混合问题的过程。

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

java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,EXPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='

java.sql.SQLSyntaxErrorException: COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'lat1n'


###########

mysql> alter database db default character set utf8;
Query OK, 1 row affected (0.00 sec) 

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>  set character_set_database=utf8mb4;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set character_set_client=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql>  set character_set_connection=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql>  set character_set_filesystem=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql>  set character_set_server=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql>  set character_set_results=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql>  set character_set_system=utf8mb4;

mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

mysql> set collation_database=utf8_general_ci;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> set collation_server=utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> set collation_connection=utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table xxx convert to character set utf8 collate utf8_general_ci;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
### 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、付费专栏及课程。

余额充值