我带着 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-和汉字/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 |
+----------------------+--------------------+
我已经用其他表进行了测试并遇到了相同类型的问题。 你能解释一下我做错了什么以及如何正确使用 LIKE 和 mariadb 和汉字吗?提前谢谢你
utf8mb4_general_ci 是一个简化的更快的排序/比较实现。它不遵循 Unicode 规则,可能会导致不希望的排序或比较。
你应该使用 utf8mb4_unicode_ci,它基于官方的 unicode 规则进行排序和比较。
select * from chartable where k1 like '%𣅀%' collate utf8mb4_unicode_ci;
hex('%𣅀%')
显示为 hex('?')
,因为在标识符名称中使用 unicode 字符仅限于字符 < +U10000 (see also https://mariadb.com/kb/en/identifier-names/).