我已经用 PHP 和 MySQL 实现了搜索。目前我的桌子的整理是"utf8_unicode_ci"
。问题是,这个排序规则"ä" = "a"
是。如果我将排序规则更改为"utf_bin"
一切正常,但该排序规则不区分大小写。
所以我想要两者都不需要用 or 改变 SQL 或 PHP"upper"
代码"lower"
:)
什么是最适合我的搜索的 MySQL 排序规则?
一般来说,您不能这样做,并且lower
在您的代码中使用是适用于所有类型的字符和语言的安全方法。对于某些语言,有专门的排序规则可以支持您的比较,但它们本身可能会有一些复杂性。对于'ä' = 'Ä' != 'A'
,您可以使用utf8_german2_ci
(德国电话簿订购)。它将在比较中将以下字符视为相等:
Ä = Æ = AE
Ö = Œ = OE
Ü = UE
ß = ss
但是比较(例如=, <, >
)是字面意思:因为排序规则实际上与排序有关,所以这种排序规则有一个奇怪的副作用'AE' = 'Ä'
,但不是'AE' like 'Ä'
!在您的代码中考虑这一点可能比简单地在lower
任何地方添加 a 更难,并且可能会在以后导致一些令人费解的效果。但是,如果您可以忍受这一点,并且您不必支持除了德语变音符号以外的其他特殊字符(例如'à'
,'á'
并且'å'
仍将被视为'a'
),您可以尝试一下。
例子:
create table germanumlaut (
word varchar(20) collate utf8_german2_ci
);
insert into germanumlaut (word)
values ('Ä'), ('ä'), ('A'), ('á'), ('AE');
select * from germanumlaut where word = 'A';
-- result: 'A', 'á', as 'á' is not a german umlaut and treated as 'a'
select * from germanumlaut where word = 'Ä';
-- result: 'Ä', 'ä', 'AE', as 'AE' = 'Ä'
select * from germanumlaut where word > 'Ad';
-- result: 'Ä', 'ä', 'AE', as 'Ä' = 'AE'
select * from germanumlaut where word like 'A';
-- result: 'A', 'á'
select * from germanumlaut where word like 'Ä';
-- result: 'Ä', 'ä'
select * from germanumlaut where word like 'A%';
-- result: 'A', 'á', 'AE'