无法区分 mysql 和 phpMyAdmin 中由不同 Unicode 字母组成的单词

Unable to differentiate between words consisting of different Unicode letters in mysql and phpMyAdmin

我正在使用 php 脚本中的以下 sql 查询插入一个词。

$sql = "INSERT IGNORE into cb_words (word, user_id) VALUES('$word', $user_id)";

问题出现在这种特殊情况下 - cb_words table 包含孟加拉语单词。

  1. word - আর编码为Unicode格式是%u0986%u09B0
  2. 另一个词-আঁর编码为Unicode格式是%u0986%u0981%u09B0

正如人们可能从这两个词的 Unicode 编码中注意到的那样,它们几乎相似,只是第二个词中多了一个字母。

现在,table - cb_words 已经包含第二个单词,但是当我尝试插入第一个单词时却失败了。 它不插入单词,只是说插入了 0 行。

INSERT IGNORE into cb_words (word, user_id) VALUES('আর', 2)

从 PHPMyAdmin 尝试时

令人震惊的是,当我在 table 中搜索单词 -

SELECT * FROM `cb_words` where `cb_words`.`word` = 'আর'

返回结果为-

N.B:table只有上面所说的(2)字。我正在尝试插入 (1)

那么,尽管这两个词并非 100% 相同,为什么 mysql 无法区分两者?

我正在添加 table 结构以备不时之需:

插入被忽略,我猜是因为您的 user_id 设置为唯一?无法从您的屏幕截图中看出,您正在插入 IGNORE 抑制任何错误。从 user_id.

中删除唯一索引

您可以将排序规则更改为 utf8_bin。

在本地创建了您的 table:

类似的问题和一些有趣的阅读:

mysql> select 'আর'='আর' COLLATE utf8mb4_0900_ai_ci;
+-------------------------------------------------+
| 'আর'='আঁর' COLLATE utf8mb4_0900_ai_ci           |
+-------------------------------------------------+
|                                               1 |
+-------------------------------------------------+

即声明列有COLLATE utf8mb4_0900_ai_ci;

您提到的两项具有以下十六进制值: E0A686 E0A6B0E0A686 E0A681 E0A6B0

E0A681 是一个非间距修饰符“BENGALI SIGN CANDRABINDU”。当与“Accent Insensitive”和(或?)“Case Insensitive”进行比较时,两者被认为是相等的。

如果您希望它们被视为不相等,请使用不同的排序规则。