首页 > 解决方案 > 通过变音符号搜索的MYSQL错误结果

问题描述

我在 mysql 5.7.26 中设置了一个 InnoDB。字符集是 utf8mb4,但现在我在通过变音符号过滤时发现了一些错误行为。

设置:

mysql> SHOW VARIABLES WHERE Variable_name RLIKE '^(character_set|collation)_' ;
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

CREATE TABLE `umlauttest` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `umlautvalue` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

SELECT * from umlauttest;
+----+-------------+
| id | umlautvalue |
+----+-------------+
|  1 | max         |
|  2 | maximilian  |
|  3 | maximum     |
|  4 | mäx         |
|  5 | abcmäxabc   |
+----+-------------+

错误

列表中的前三个值不包含元音变音(这里是字符ä),但最后两个值包含。因此,以下查询的计数应为第一个(不带变音符号)为 3,第二个(带变音符号)为 2。不幸的是,这两个查询的结果都是 5,这告诉我元音变音被忽略/无法识别

SELECT COUNT(id) FROM `umlauttest` WHERE `umlautvalue` LIKE '%max%';
SELECT COUNT(id) FROM `umlauttest` WHERE `umlautvalue` LIKE '%mäx%';

您是否知道如何解决这种奇怪的行为。我感谢任何将我指向正确方向的提示。

最佳-endo

编辑

要设置排序规则就可以了:

SELECT COUNT(id) FROM `umlauttest` 
WHERE `umlautvalue` LIKE '%mäx%' collate utf8mb4_bin;

thx @Shadow指向https://stackoverflow.com/a/47645231/5389997

标签: mysqlcharacter-encodingnon-ascii-charactersmysql-5.7

解决方案


推荐阅读