2016-10-07 48 views
1

我已經使用PHP和MySQL實現搜索。目前我桌子的整理是"utf8_unicode_ci"。問題是,用這個排序規則"ä" = "a"是。如果我將整理更改爲"utf_bin"一切正常,但整理不是事例性的。搜索的最佳MySQL整理

所以我想都沒有改變SQL或PHP代碼"upper""lower" :)

什麼是最好的MySQL整理我的搜索?

回答

0

一般情況下,您不能這樣做,並且在您的代碼中使用lower是適用於所有類型字符和語言的安全方法。對於某些語言,有專門的排序規則可以支持您的比較,但可能會有一些複雜的問題。對於'ä' = 'Ä' != 'A',您可以使用utf8_german2_ci德國電話簿訂購)。它將把下列字符作爲平等的比較:

Ä = Æ = AE 
Ö = Œ = OE 
Ü = UE 
ß = ss 

比較(如=, <, >)的字面意思是:因爲排序規則實際上涉及到排序,該排序規則有奇怪sideeffect是'AE' = 'Ä',但不'AE' like 'Ä'在您的代碼中考慮可能比僅僅在所有地方添加lower更困難,並且可能會在稍後導致一些大腦扭曲效應。但是,如果你能忍受這一點,並且你不需要支持其他特殊字符而不只是德語變音符號(例如'à''á''å'仍然會被視爲'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' 
+0

[_this_](http://mysql.rjweb.org/utf8_collat​​ions.html)指出,german2,冰島,丹麥,愛沙尼亞語,斯洛伐克語和瑞典是唯一UTF8歸類把'Ä'視爲不等於'A'。 –