无法区分 mysql 和 phpMyAdmin 中由不同 Unicode 字母组成的单词
Posted
技术标签:
【中文标题】无法区分 mysql 和 phpMyAdmin 中由不同 Unicode 字母组成的单词【英文标题】:Unable to differentiate between words consisting of different Unicode letters in mysql and phpMyAdmin 【发布时间】:2021-10-30 11:14:59 【问题描述】:我正在使用来自 php 脚本的以下 sql 查询插入一个单词。
$sql = "INSERT IGNORE into cb_words (word, user_id) VALUES('$word', $user_id)";
问题出现在这种特殊情况下 - cb_words 表包含孟加拉语单词。
-
word - 编码为 Unicode 格式的আর 是 %u0986%u09B0
另一个词 - আঁর 编码为 Unicode 格式是 %u0986%u0981%u09B0
从 Unicode 编码中人们可能会注意到这两个词几乎相似,只是在第二个词中多了一个字母。
现在,表格 - cb_words 已经包含第二个单词,但是当我尝试插入第一个单词时它失败了。 它不插入单词,只是说插入了 0 行。
INSERT IGNORE into cb_words (word, user_id) VALUES('আর', 2)
当从 PHPMyAdmin 尝试时
令人震惊的是,当我在表格中搜索单词时 -
SELECT * FROM `cb_words` where `cb_words`.`word` = 'আর'
返回的结果是-
N.B:该表仅包含上述单词 (2)。我正在尝试插入 (1)
那么,尽管事实上,这两个词并不是100%相同,为什么mysql无法区分这两者呢?
我正在添加表结构以防万一:
【问题讨论】:
【参考方案1】:mysql> select 'আর'='আর' COLLATE utf8mb4_0900_ai_ci;
+-------------------------------------------------+
| 'আর'='আঁর' COLLATE utf8mb4_0900_ai_ci |
+-------------------------------------------------+
| 1 |
+-------------------------------------------------+
即声明列有COLLATE utf8mb4_0900_ai_ci
;
您提到的两项具有以下 HEX 值:
E0A686 E0A6B0
和 E0A686 E0A681 E0A6B0
E0A681
是一个非间距修饰符“BENGALI SIGN CANDRABINDU”。当与“不区分重音”和(或?)“不区分大小写”进行比较时,两者被认为是相等的。
如果您希望它们被视为不相等,请使用不同的排序规则。
【讨论】:
【参考方案2】:插入被忽略,我猜是因为您的 user_id 设置为唯一吗?无法从您的屏幕截图中分辨出来,并且您正在插入 IGNORE 以抑制任何错误。从 user_id 中删除唯一索引。
您可以将排序规则更改为 utf8_bin。
在本地创建您的表:
类似的问题和一些有趣的阅读:How can I enter data using non English (Bangla) language into this database table?
【讨论】:
谢谢。那么,如果我想更改表格的排序规则,我该如何在不损害现有数据的情况下做到这一点? 导出您的数据库并在测试环境中试用。 谢谢。该问题已得到修复。我在本地的测试环境中做完整的事情。感谢您的大力帮助。以上是关于无法区分 mysql 和 phpMyAdmin 中由不同 Unicode 字母组成的单词的主要内容,如果未能解决你的问题,请参考以下文章
windows下mysql的lower_case_table_names=0也无法区分大小写?
如何解决 phpmyadmin 在 localhost 中无法访问?