像 mariadb 和汉字一样使用

问题描述 投票:0回答:1

我带着 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 和汉字吗?提前谢谢你

mariadb sql-like cjk utf8mb4
1个回答
0
投票

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/).

© www.soinside.com 2019 - 2024. All rights reserved.