1

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

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

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

  1. word - আর 编码为 Unicode 格式是 %u0986%u09B0
  2. 另一个词 - আঁর 编码为 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` = 'আর'

返回的结果是 -

SELECT SQL 语句的结果

注意:该表只有上述单词 (2)。我正在尝试插入 (1)

那么,尽管事实上,这两个词并不是 100% 相同的,为什么 mysql 无法区分这两者呢?

我正在添加表结构以防万一: cb_words 的表结构

4

2 回答 2

1

插入被忽略,我猜是因为您的 user_id 设置为唯一吗?无法从您的屏幕截图中分辨出来,并且您正在插入 IGNORE 以抑制任何错误。从 user_id 中删除唯一索引。

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

在本地创建您的表:

表项 结果来自您的选择

类似的问题和一些有趣的阅读:如何使用非英语(孟加拉语)语言将数据输入到这个数据库表中?

于 2021-08-31T21:48:19.123 回答
0
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”进行比较时,两者被认为是相等的。

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

于 2021-11-22T01:19:25.267 回答