无法区分 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 包含孟加拉语单词。
- word - আর编码为Unicode格式是%u0986%u09B0
- 另一个词-আঁর编码为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 E0A6B0
和 E0A686 E0A681 E0A6B0
E0A681
是一个非间距修饰符“BENGALI SIGN CANDRABINDU”。当与“Accent Insensitive”和(或?)“Case Insensitive”进行比较时,两者被认为是相等的。
如果您希望它们被视为不相等,请使用不同的排序规则。
我正在使用 php 脚本中的以下 sql 查询插入一个词。
$sql = "INSERT IGNORE into cb_words (word, user_id) VALUES('$word', $user_id)";
问题出现在这种特殊情况下 - cb_words table 包含孟加拉语单词。
- word - আর编码为Unicode格式是%u0986%u09B0
- 另一个词-আঁর编码为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 E0A6B0
和 E0A686 E0A681 E0A6B0
E0A681
是一个非间距修饰符“BENGALI SIGN CANDRABINDU”。当与“Accent Insensitive”和(或?)“Case Insensitive”进行比较时,两者被认为是相等的。
如果您希望它们被视为不相等,请使用不同的排序规则。