Невозможно различить слова, состоящие из разных букв Unicode в mysql и phpMyAdmin
Я вставляю слово, используя следующий запрос sql из скрипта php.
$sql = "INSERT IGNORE into cb_words (word, user_id) VALUES('$word', $user_id)";
Проблема возникает в этом конкретном сценарии - таблица cb_words содержит слова на языке Bangla.
- слово - আর, которое закодировано в формате Unicode:% u0986% u09B0
- Другое слово - আঁর, которое закодировано в формате Unicode, это% u0986% u0981% u09B0.
Как можно заметить из кодировки Unicode для обоих слов, они почти одинаковы с дополнительной буквой во втором слове.
Теперь таблица - cb_words уже содержит второе слово, но когда я пытаюсь вставить первое слово, это не удается. Он не вставляет слово, а просто говорит, что вставлено 0 строк.
INSERT IGNORE into cb_words (word, user_id) VALUES('আর', 2)
Достаточно шокирующе, когда я ищу в таблице слово как -
SELECT * FROM `cb_words` where `cb_words`.`word` = 'আর'
Возвращенный результат -
NB: в таблице есть только слово (2), как описано выше. и я пытаюсь вставить (1)
Итак, несмотря на то, что эти два слова не идентичны на 100%, почему mysql не может различить их?
Я добавляю структуру таблицы на случай, если это может понадобиться:
2 ответа
Я предполагаю, что вставка игнорируется, потому что ваш user_id установлен на уникальный? не могу сказать по вашим скриншотам, и вы вставляете с IGNORE, подавляя любые ошибки. Удалите уникальный индекс из user_id.
Вы можете изменить параметры сортировки на utf8_bin.
Создал вашу таблицу локально:
аналогичный вопрос с некоторым интересным чтением: Как я могу ввести данные, используя не английский (Bangla) язык в эту таблицу базы данных?
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
является модификатором без пробелов «БЕНГАЛЬСКИЙ ЗНАК КАНДРАБИНДУ». При сопоставлении с «Без учета акцента» и (или?) «Без учета регистра» они считаются равными.
Если вы хотите, чтобы они рассматривались как неравные, используйте другое сопоставление.