无法区分 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 E0A6B0E0A686 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也无法区分大小写?

Node.js 无法连接 MySQL、PHPMyAdmin

如何解决 phpmyadmin 在 localhost 中无法访问?

Phpmyadmin 页面无法加载

#1045 无法从 phpMyAdmin 和命令行登录到 MySql 服务器

phpmyadmin中访问时出现2002 无法登录 MySQL 服务器