1

我已经用 PHP 和 MySQL 实现了搜索。目前我的桌子的整理是"utf8_unicode_ci"。问题是,这个排序规则"ä" = "a"是。如果我将排序规则更改为"utf_bin"一切正常,但该排序规则不区分大小写。

所以我想要两者都不需要用 or 改变 SQL 或 PHP"upper"代码"lower":)

什么是最适合我的搜索的 MySQL 排序规则?

4

1 回答 1

0

一般来说,您不能这样做,并且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'
于 2016-10-07T11:45:54.257 回答