mysql:Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT)

博主新建MySQL数据库时遇到字符集编码冲突问题,插入含罕见汉字的数据时,执行插入更新操作报错。经排查,发现是数据库创建时指定的编码与创建表时默认的编码不一致导致。

最近在新建mysql数据库时,遇到一个字符集编码冲突问题,因为插入数据有一个罕见汉字,导致在执行数据插入更新时一直报下面错误:


lingtuo-ai> SELECT * FROM qa_text WHERE question = "𧿹外翻如何通过康复训练治疗?"
[2023-10-26 15:09:08] [HY000][1267] Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
[2023-10-26 15:09:08] [HY000][1267] Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='
# 显示表结构
show create table dingxiang_qa_text;

# 输出结果
CREATE TABLE `qa_text` (
  `idx` int(11) NOT NULL COMMENT '问题id',
  `dis_id` int(11) DEFAULT NULL COMMENT '疾病id',
  `dis_name` varchar(100) DEFAULT NULL COMMENT '疾病名称',
  `classify` varchar(30) DEFAULT NULL COMMENT '疾病问题类型',
  `key_id` int(11) DEFAULT NULL COMMENT '问题类别序号',
  `question` varchar(255) NOT NULL COMMENT '疾病问题',
  `answer` text COMMENT '疾病问题回答',
  `source_db` varchar(100) DEFAULT NULL COMMENT '数据来源',
  `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4


#修改表的字符编码,使其与数据库的字符编码保持一致
alter table dingxiang_qa_text default character set utf8mb4 collate=utf8mb4_unicode_ci;

之前执行了上面的第二条指令,发现控制台还是报字符编码冲突错误,后来才明白是mysql数据库创建时指定的编码与创建表时默认的编码不一致 (如下图),才出现上述错误问题;

在Java应用程序中,当使用MySQL数据库执行 `LIKE` 操作时,若涉及的字段使用了不同的排序规则(Collation),例如 `utf8mb4_unicode_ci` 和 `utf8mb4_general_ci`,则可能会抛出如下异常: ``` java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation 'LIKE' ``` 该错误的根本原因是MySQL在执行字符串比较操作(如 `LIKE`)时,要求参与操作的字段或值的排序规则一致。若不一致,则数据库无法确定使用哪种规则进行比较,从而抛出异常。 ### 解决方案 #### 1. 统一字段的排序规则 将涉及 `LIKE` 操作的字段的排序规则统一为相同类型。例如,将字段的排序规则统一为 `utf8mb4_unicode_ci`: ```sql ALTER TABLE your_table MODIFY your_column VARCHAR(255) COLLATE utf8mb4_unicode_ci; ``` 此方法适用于字段数据量不大、不影响其他业务逻辑的场景。 #### 2. 在SQL语句中显式指定排序规则 在查询语句中对字段或值显式指定排序规则,以确保一致性。例如: ```sql SELECT * FROM your_table WHERE your_column COLLATE utf8mb4_unicode_ci LIKE '%value%' COLLATE utf8mb4_unicode_ci; ``` 此方法无需修改表结构,适用于临时修复或字段较多、修改结构成本较高的情况。 #### 3. 设置数据库、表和字段的默认排序规则 为数据库和表设置统一的默认排序规则,可以避免未来出现类似问题。例如: ```sql ALTER DATABASE your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 该方法适用于新项目或可重构的数据库环境。 #### 4. 在连接字符串中指定字符集和排序规则 确保数据库连接使用统一的字符集和排序规则,可以在JDBC连接字符串中添加参数: ```properties jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8mb4_unicode_ci ``` 这可以确保客户端与服务器端在字符集和排序规则上保持一致。 #### 5. 使用二进制比较方式 若对排序规则的敏感性不高,可以将比较操作转换为二进制模式,绕过排序规则的限制: ```sql SELECT * FROM your_table WHERE BINARY your_column LIKE BINARY '%value%'; ``` 该方法适用于对大小写敏感且无需语言排序规则的场景。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值