2016-10-07 7 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_collations.html) указывает на то, что Немецкий2, исландский, датский, эстонский, словацкий, и шведский являются единственными utf8 сортировки которые рассматривают 'Ä' как не равные' A'. –