Ошибка в MySql и MariaDB при наличии индекса для данных utf8mb4 и подстроки ü?? - PullRequest
6 голосов
/ 17 января 2020

При использовании таблицы, подобной этой:

CREATE TABLE test (
  name VARCHAR(100),
  INDEX name_index (name)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

И затем вставка некоторых данных:

INSERT INTO test(name) VALUES('ü here is a ? smiley');
INSERT INTO test(name) VALUES('ü? no space smiley');
INSERT INTO test(name) VALUES('ü ? space smiley');
INSERT INTO test(name) VALUES('ü without smiley');

Этот запрос не выполняется:

SELECT * FROM test WHERE name LIKE ("ü%");

Он пропускает Строка 'ü? no space smiley'.

Вот дб-скрипка:

https://www.db-fiddle.com/f/bR6Yx2PXPJdD7iSCLnW65Y/0

Интересно, что результат меняется, когда один удаляет индекс Таким образом, без строки 3 в демонстрационной версии, она ведет себя как ожидалось.

Это известная ошибка?

Я пробовал ее в MySql 5.7, MySql 8.0 и MariaDB 10.3 - все показывает такое же поведение.

1 Ответ

1 голос
/ 17 января 2020

После того, как я попробовал ваш код на другой скрипке: https://dbfiddle.uk/?rdbms=mysql_5.7 Он работал для MySQL 5.7 и MySQL 5.6 и для MariaDB 10.3, но вы заметили, что он не работал для MySQL 8.0.

Я изменил ваш код для CREATE TABLE на этот:

CREATE TABLE test (
  name VARCHAR(100),
  INDEX name_index (name)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

И теперь все в порядке :) DEMO Надежда это помогает. Приветствия!

Для получения дополнительной информации проверьте документацию здесь:

https://dev.mysql.com/doc/refman/5.7/en/charset.html https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html

ОБНОВЛЕНИЕ

Первое решение не работает, потому что u = ü В этом случае используйте это:

CREATE TABLE test (
  name VARCHAR(100),
  INDEX name_index (name)
) CHARACTER SET gb18030 COLLATE gb18030_chinese_ci;

Новый DEMO

ОБНОВЛЕНИЕ 2

Ну, если это так: «Набор символов должен быть utf8mb4» :), то, не меняя ничего, вы можете попробовать этот запрос:

SELECT name from test
where hex(name) like concat('%',hex('ü'),'%')

Вот DEMO в новой скрипке, где вы просили объяснения. Приветствия.

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