gpt4 book ai didi

MySQL 将 unicode 字符与 ascii 版本匹配

转载 作者:IT王子 更新时间:2023-10-29 00:31:29 26 4
gpt4 key购买 nike

我正在运行 MySQL 5.1.50,并且有一个如下所示的表:

organizations | CREATE TABLE `organizations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`url` text CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25837 DEFAULT CHARSET=utf8 |

我遇到的问题是 MySQL 将 unicode 字符与 ascii 版本匹配。例如,当我搜索包含“é”的单词时,它将匹配包含“e”的相同单词,反之亦然:

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT id, name FROM `organizations` WHERE `name` = 'Universite de Montreal';
+-------+-------------------------+
| id | name |
+-------+-------------------------+
| 16973 | Université de Montreal |
+-------+-------------------------+
1 row in set (0.01 sec)

我从 PHP 和命令行控制台都得到这些结果。如何从我的 SELECT 查询中获得准确的匹配?

谢谢!

最佳答案

您将 name 列指定为 text CHARACTER SET utf8 COLLATE utf8_unicode_ci 告诉 MySQL 考虑 eé 在匹配和排序方面等效。该排序规则和 utf8_general_ci 都使很多东西等效。

http://www.collation-charts.org/一旦您学会了如何阅读图表,这是一个很好的资源,这很容易。

如果您希望 eé 等被视为不同,那么您必须选择不同的排序规则。要找出您的服务器上的排序规则(假设您仅限于 UTF-8 编码):

mysql> show collation like 'utf8%';

并选择使用整理图表作为引用。

另一种特殊的排序规则是 utf8_bin,其中没有等价物,它是二进制匹配。

我知道的唯一不是特定语言的 MySQL Unicode 排序规则是 utf8_unicode_ciutf8_general_ciutf8_bin。他们比较奇怪。归类的真正目的是让计算机按照某个地方的人所期望的方式进行匹配和排序。匈牙利语和土耳其语词典的条目按照不同的规则排序。指定排序规则允许您根据此类本地规则进行排序和匹配。

例如,丹麦人似乎认为 e 和 é 是等价的,但冰岛人却不这样认为:

mysql> select _utf8'e' collate utf8_danish_ci
-> = _utf8'é' collate utf8_danish_ci as equal;
+-------+
| equal |
+-------+
| 1 |
+-------+

mysql> select _utf8'e' collate utf8_icelandic_ci
-> = _utf8'é' collate utf8_icelandic_ci as equal;
+-------+
| equal |
+-------+
| 0 |
+-------+

另一个方便的技巧是用一堆你感兴趣的字符填充一个列表(从脚本中更容易),然后 MySQL 可以告诉你等价物:

mysql> create table t (c char(1) character set utf8);
mysql> insert into t values ('a'), ('ä'), ('á');
mysql> select group_concat(c) from t group by c collate utf8_icelandic_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a |
| á |
| ä |
+-----------------+

mysql> select group_concat(c) from t group by c collate utf8_danish_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,á |
| ä |
+-----------------+

mysql> select group_concat(c) from t group by c collate utf8_general_ci;
+-----------------+
| group_concat(c) |
+-----------------+
| a,ä,á |
+-----------------+

关于MySQL 将 unicode 字符与 ascii 版本匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com