Я реализовал поиск с помощью PHP и MySQL. На данный момент сопоставление моего стола "utf8_unicode_ci"
, Проблема в том, что с этим сопоставлением "ä" = "a"
является. Если я изменю параметры сортировки на "utf_bin"
все работает, но это сопоставление не является случайным.
Поэтому я хочу, чтобы оба без изменения кода SQL или PHP с "upper"
или же "lower"
🙂
Какой самый лучший сортировка MySQL для моего поиска?
В общем, вы не можете сделать это, и с помощью lower
в вашем коде есть безопасный подход, который будет работать для всех видов символов и языков. Для некоторых языков существуют специализированные параметры сортировки, которые будут поддерживать ваше сравнение, но могут иметь некоторые сложности сами по себе. За 'ä' = 'Ä' != 'A'
, ты можешь использовать utf8_german2_ci
(заказ немецкой телефонной книги). Это будет относиться к следующим символам как равным в сравнении:
Ä = Æ = AE
Ö = Œ = OE
Ü = UE
ß = ss
Но сравнение (например. =, <, >
) подразумевается буквально: поскольку сопоставление на самом деле относится к сортировке, это сопоставление имеет странный побочный эффект, который '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'
Других решений пока нет …