MySQL5.5
据我所知,排序规则是排序和比较字符串的规则集,
例如,他们可以将'Mane'
视为与'Manè'
相同。
对我来说,只有在比较两个文本字符串的情况下,整理才有意义。
我有一张包含latin1
字符集和latin1_swedish_ci
整理
CREATE TABLE `swedish` (
`c` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
引擎,charset和collation都有约束条件。
insert into swedish values ('Bar'), ('Bär'), ('Ber'), ('Bêr'), ('Yac'), ('Yaç');
我需要使用ASCII搜索值进行不区分大小写和重音不敏感的搜索,我想使用排序latin1_german1_ci
将这3对夫妇视为相同。
我在docs中看到了如何做到这一点
-- it works with 'ber' or 'yac' as well
-- 'like' instead of '=' works as well
select c from swedish where c = _latin1 'bar' collate latin1_german1_ci;
给出
+------+
| c |
+------+
| Bar |
| Bär |
+------+
好的,有效,这就是我所需要的。但为什么呢?
IIRC _latin1 'bar' collate latin1_german1_ci
是character set introducer,它定义(强制?)字符串'bar'
的字符集和整理。
所以我看到两个collates,瑞典语用于搜索词的列'c`和german1的值。
where子句会发生什么?列`c` collation latin1_swedish_ci
中是否有选中的字符串?但那时比较应该给出一个错误。它是以某种方式转换为排序latin1_german1_ci
?
如果我不使用charset介绍人,'bar'
的搜索只会给'bar'
,我认为这是瑞典校对的预期行为。
继续,如果我做
select c from swedish where c = _latin1 'bär' collate latin1_german1_ci;
它给出了0行,为什么会这样?
P.S。 我找不到关于不同排序规则的任何详细文档,有谁知道在哪里可以找到一些信息?