当在 utf8mb4 数据和子字符串 ü 上有索引时,MySql 和 MariaDB 中的错误?

no_*_*ity 6 mysql sql database mariadb

使用这样的表时:

CREATE TABLE test (
  name VARCHAR(100),
  INDEX name_index (name)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Run Code Online (Sandbox Code Playgroud)

然后插入一些数据:

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');
Run Code Online (Sandbox Code Playgroud)

此查询失败:

SELECT * FROM test WHERE name LIKE ("ü%");
Run Code Online (Sandbox Code Playgroud)

它省略了“ü 无空格笑脸”行。

这是一个数据库小提琴:

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

有趣的是,当删除索引时,结果会发生变化。因此,如果演示中没有第 3 行,它会按预期运行。

这是一个已知的错误?

我在 MySql 5.7、MySql 8.0 和 MariaDB 10.3 中尝试过——都表现出相同的行为。

VBo*_*oka 1

在我在另一个小提琴上尝试了您的代码之后:https://dbfiddle.uk/?rdbms=mysql_5.7 \n它适用于 MySQL 5.7 和 MySQL 5.6 以及 MariaDB 10.3,但您已经注意到它不适用于MySQL 8.0。

\n\n

我已将您的代码更改为CREATE TABLE

\n\n
CREATE TABLE test (\n  name VARCHAR(100),\n  INDEX name_index (name)\n) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在就可以了:) DEMO \n希望这有帮助。\n干杯!

\n\n

有关更多信息,请查看此处的文档:

\n\n

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

\n\n

更新

\n\n

第一个解决方案不起作用,因为 u = \xc3\xbc 在这种情况下使用:

\n\n
CREATE TABLE test (\n  name VARCHAR(100),\n  INDEX name_index (name)\n) CHARACTER SET gb18030 COLLATE gb18030_chinese_ci;\n
Run Code Online (Sandbox Code Playgroud)\n\n

演示

\n\n

更新2

\n\n

好吧,如果这是交易:“字符集需要是 utf8mb4”:) 那么无需更改任何内容,您可以尝试此查询:

\n\n
SELECT name from test\nwhere hex(name) like concat(\'%\',hex(\'\xc3\xbc\'),\'%\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是一个新小提琴中的演示,您要求对其进行解释。\n干杯。

\n