注意:您可能会在以下问题中看到?或者阻止而不是字符,这是因为你没有合适的字体。请忽略这一点。
我的表格数据结构如下:
CREATE TABLE `decomposition_dup` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`structure` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`child` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `child` (`child`),
KEY `parent_2` (`parent`,`child`)
) ENGINE=InnoDB AUTO_INCREMENT=211929 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
以及一些示例数据:
INSERT INTO `decomposition_dup` (`id`, `parent`, `structure`, `child`) VALUES
(154647, '锦', 'a', '钅'),
(154648, '锦', 'a', '帛'),
(185775, '钅', 'd', '二'),
(185774, '钅', 'd', '㇟'),
(21195, '钅', 'd', ''),
(21178, '⻐', 'd', '乇'),
(21177, '⻐', 'd', '');
并且字符集都设置正确:
非常重要的是要注意:
如您所见,它们是不同的角色。但是,在某些情况下,它们被视为相同的字符。
当我运行以下查询时,它只返回正确的子项(即,不会返回看起来相似但不同的字符子项):
SELECT *
FROM decomposition_dup
WHERE parent = '锦'
这是正确的行为。
但是,当我使用钅(http://unicode.scarfboy.com/?s=%E9%92%85)运行以下查询时,它会返回两个相似的字符:
SELECT *
FROM decomposition_dup
WHERE parent = '钅'
这应该只返回185775,185774& 21195
当我使用⻐(http://unicode.scarfboy.com/?s=%E2%BB%90)运行以下查询时,它也会返回两个相似的字符:
SELECT *
FROM decomposition_dup
WHERE parent = '⻐'
这应该只返回21178和21177.
如果我将=
替换为LIKE
以查找损坏的查询(例如案例2和案例3),则会正确返回。
例如,以下查询与案例3相同,但使用LIKE
:
SELECT *
FROM decomposition_dup
WHERE parent LIKE '⻐'
这会返回正确的字符,但会降低查询速度。
这是MySQL中的错误还是在查询UTF8扩展字符时我忽略了什么?
答案 0 :(得分:1)
如果您希望它们相同,请将列的COLLATION
设置为utf8mb4_unicode_ci
或utf8mb4_unicode_520_ci
。
如果您希望它们不同,请使用utf8mb4_general_ci
,而不是:
mysql> SELECT CONVERT(UNHEX('e99285') USING utf8mb4) =
-> CONVERT(UNHEX('e2bb90') USING utf8mb4) COLLATE utf8mb4_general_ci AS general;
+---------+
| general |
+---------+
| 0 |
+---------+
mysql> SELECT CONVERT(UNHEX('e99285') USING utf8mb4) =
-> CONVERT(UNHEX('e2bb90') USING utf8mb4) COLLATE utf8mb4_unicode_ci AS unicode;
+---------+
| unicode |
+---------+
| 1 |
+---------+
mysql> SELECT CONVERT(UNHEX('e99285') USING utf8mb4) =
-> CONVERT(UNHEX('e2bb90') USING utf8mb4) COLLATE utf8mb4_unicode_520_ci AS unicode_520;
+-------------+
| unicode_520 |
+-------------+
| 1 |
+-------------+
答案 1 :(得分:-1)
从我能解决的问题出发,在SQL研究方面你会发现这个错误代码意味着
MySQL的utf8只允许使用Unicode字符 用UTF-8中的3个字节表示。
所以它可能是您在SQL
的情况下使用的字符