Невозможно различить слова, состоящие из разных букв Unicode в mysql и phpMyAdmin

Я вставляю слово, используя следующий запрос sql из скрипта php.

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

Проблема возникает в этом конкретном сценарии - таблица cb_words содержит слова на языке Bangla.

  1. слово - আর, которое закодировано в формате 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` = 'আর'

Возвращенный результат -

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является модификатором без пробелов «БЕНГАЛЬСКИЙ ЗНАК КАНДРАБИНДУ». При сопоставлении с «Без учета акцента» и (или?) «Без учета регистра» они считаются равными.

Если вы хотите, чтобы они рассматривались как неравные, используйте другое сопоставление.

Другие вопросы по тегам