Лучший подборка MySQL для поиска

Я реализовал поиск с помощью PHP и MySQL. На данный момент сопоставление моего стола "utf8_unicode_ci", Проблема в том, что с этим сопоставлением "ä" = "a" является. Если я изменю параметры сортировки на "utf_bin" все работает, но это сопоставление не является случайным.

Поэтому я хочу, чтобы оба без изменения кода SQL или PHP с "upper" или же "lower" 🙂

Какой самый лучший сортировка MySQL для моего поиска?

1

Решение

В общем, вы не можете сделать это, и с помощью 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'
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector