MySQL 8.0 utf8mb4_bin下插入不同孟加拉语单词触发唯一键重复错误
问题原因
- 字段排序规则未生效:唯一键的等值判断逻辑基于字段绑定的排序规则实现,你建表语句虽然声明了
COLLATE=utf8mb4_bin,但如果受库/表级默认排序规则、客户端连接配置影响,jp_word实际生效的不是二进制排序规则,就会将存在Unicode等价性的两个孟加拉语单词判定为相等,触发唯一键冲突。 - MyISAM引擎缺陷:MySQL 8.0已停止对MyISAM引擎的功能维护,该引擎对Unicode字符的索引校验存在已知bug,哪怕字段用了二进制排序规则,也可能出现二进制值不同的字符串被判定为重复的问题。
- 低版本MySQL bug:你使用的8.0.12属于早期8.0版本,存在utf8mb4二进制排序规则校验异常的已知问题,也会导致该错误。
解决方法
- 确认并修正字段排序规则
执行以下命令查看jp_word字段的实际属性:
SHOW FULL COLUMNS FROM lc6_words WHERE Field = 'jp_word';
如果返回结果的Collation列不是utf8mb4_bin,执行修改语句:
ALTER TABLE lc6_words MODIFY COLUMN jp_word VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
- 更换存储引擎为InnoDB
InnoDB是MySQL官方目前主推的存储引擎,对Unicode索引的支持更稳定,执行语句更换:
ALTER TABLE lc6_words ENGINE = InnoDB;
- 升级MySQL版本
如果上述操作后仍有问题,将MySQL升级到8.0最新稳定版即可修复低版本的字符集校验bug。 - 临时规避方案
如果暂时无法修改表结构或升级数据库,可以新增一个二进制哈希字段作为唯一键,存储MD5(BINARY jp_word)的计算结果,绕过字符排序规则的校验问题。
内容的提问来源于stack exchange,提问作者sariDon
相关产品推荐
相关产品推荐

