MySQL与phpMyAdmin无法区分不同Unicode字符组成的孟加拉语单词
回答
问题原因
该问题由MySQL的**排序规则(collation)**配置导致。
你当前word列使用的是utf8mb4_general_ci这类通用不区分重音的排序规则,这类规则在做字符等值判断时,会默认忽略孟加拉语中的鼻化标记(也就是第二个单词中多出的%u0981字符,即钱德拉宾杜符号),因此会将两个编码不同的单词判定为完全相同。
使用INSERT IGNORE插入时,因为word列存在唯一索引,MySQL判定待插入内容重复就会跳过插入,返回0行受影响;执行等值查询时也会将两个单词判定为匹配,返回已有的记录。
解决方案
修改word列的排序规则为区分重音的规则即可解决,推荐两种可选方案:
- 通用兼容方案:使用二进制排序规则
utf8mb4_bin,该规则会完全按照字符的二进制编码进行比较,100%区分所有编码不同的字符,不会出现判定误差,修改语句参考:
ALTER TABLE cb_words MODIFY COLUMN word VARCHAR(你原有字段长度) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin -- 补充原有字段的其他属性,比如NOT NULL、默认值等,和原字段定义保持一致即可 ;
- 孟加拉语适配方案:如果你使用的是MySQL 8.0及以上版本,可以使用
utf8mb4_0900_as_ci(区分重音、不区分大小写)或者utf8mb4_0900_as_cs(区分重音、区分大小写)排序规则,更贴合孟加拉语的常规排序使用习惯。
修改完成后重新执行插入和查询操作,即可正确区分两个不同的单词。
内容的提问来源于stack exchange,提问作者Joy Ram Sen Gupta
相关产品推荐
相关产品推荐

