提问人:Usaginomimi 提问时间:2/25/2023 更新时间:3/4/2023 访问量:163
将 like 与 mariadb 和汉字一起使用
Using like with mariadb and chinese characters
问:
我带着 utf8mb4 字符问题回来了。我在装有 Linux Mint 20.3 的本地机器上使用 mariadb 服务器版本:10.3.37-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04。 下面是一个测试表:
CREATE TABLE chartable (
k1 VARCHAR(5)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO chartable (k1) values
('食𣅀C' ),
('食B𡃀'),
('亰BC');
现在的问题是:
MariaDB [test]> select * from chartable where k1 like '%𣅀%';
+----------+
| k1 |
+----------+
| 食𣅀C |
| 食B𡃀 |
+----------+
2 rows in set (0,008 sec)
MariaDB [test]> select hex('𣅀');
+----------+
| hex('?') |
+----------+
| F0A38580 |
+----------+
1 行(0.001 秒)
我注意到第一个查询没有返回我预期的内容,即食𣅀C 第二个查询显示一个 ?而不是𣅀 我确保字符集和排序规则是一致的,数据库和表具有相同的字符集和排序规则,utf8mb4_general_ci正如我在这个线程 https://stackoverflow.com/questions/74975518/false-duplicate-with-mariadb-and-chinese-characters/74975829#74975829 中被告知的那样
MariaDB [nihongo]> show variables like 'character%';
+--------------------------+----------------------------+
| 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
和:
MariaDB [nihongo]> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
我已经用其他表进行了测试,并遇到了相同类型的问题。 你能解释一下我做错了什么,以及如何正确使用 mariadb 和汉字吗?先谢谢你
答:
utf8mb4_general_ci 是一种简化的快速排序/比较实现。它不遵循 Unicode 规则,可能会导致不必要的排序或比较。
而不是你应该使用utf8mb4_unicode_ci,它基于官方的 unicode 规则进行排序和比较。
select * from chartable where k1 like '%𣅀%' collate utf8mb4_unicode_ci;
hex('%𣅀%')
显示为因为标识符名称中使用 Unicode 字符仅限于 +U10000 <字符(另请参阅 https://mariadb.com/kb/en/identifier-names/)。hex('?')
感谢您的回复。问题是我已经从 改为 因为发生了类似的问题,正如我在这个线程中被告知的那样。utf8mb4_unicode_ci
utf8mb4_general_ci
utf8mb4_unicode_ci
让我们在图表中添加以下两个字符:
INSERT INTO chartable VALUES ('⺌'), ('⺍');
然后,我使用两个排序规则测试 SELECT
MariaDB [test]> select * from chartable where k1='⺌' collate utf8mb4_unicode_ci;
+------+
| k1 |
+------+
| ⺌ |
| ⺍ |
+------+
MariaDB [test]> select * from chartable where k1='⺌' collate utf8mb4_general_ci;
+------+
| k1 |
+------+
| ⺌ |
+------+
在这里,我注意到正确的答案来自排序规则,而没有返回正确的答案。这两个排序规则似乎都适用于某些 Unicode 字符,而不适用于其他字符。如何管理?utf8mb4_general_ci
utf8mb4_unicode_ci
评论