UTF-8 в MySQL: возможно ли точное сравнение строк и полнотекстовый поиск без учета регистра? - PullRequest
0 голосов
/ 03 марта 2012

Посредством исследований и испытаний я обнаружил, что, по-видимому, наиболее равное поведение латинской кодировки существует, если использовать для полей кодировку utf8_bin (гарантирует точное сравнение строк) и преобразовывать сопоставление, например, в. utf8_general_ci в предложениях "order by".

Тем не менее, я не могу найти обходной путь, чтобы заставить работать полнотекстовый поиск без учета регистра, так как здесь нет конвертации, и, похоже, нельзя использовать «более низкий» для полнотекстового ключа.

Учитывая то, что я читал об этой целой теме до сих пор, это может быть похоже на то, чтобы съесть твой пирог и съесть его тоже, но я решил спросить, прежде чем я вернусь к латинской кодировке и откажусь от международной поддержки с моего сайта.

Ответы [ 2 ]

0 голосов
/ 04 марта 2012

Я сейчас протестировал множество вариантов, основанных на совете Алексиса о регулярных выражениях, и ради других людей, имеющих дело с этой проблемой, я решил поделиться своими выводами.

На мой взгляд, лучшее решение заранее: используйте lower () для двоичных полей utf-8 в сочетании с регулярными выражениями для поиска целых ключевых слов.По крайней мере, что касается решений с одной таблицей.Я думаю, в конце концов, мой ответ на исходный вопрос будет иметь две таблицы.Тот, который содержит все тексты в нижнем регистре и используется для полнотекстового поиска, и тот, который содержит тексты, когда они отображаются пользователям.В два раза больше данных, но запросы с логическим поиском будут выполняться намного быстрее.

Во-первых, недвоичная таблица с полнотекстовым индексом в качестве ориентира:

SELECT * FROM texts WHERE MATCH (text1, text2, text3, text4) AGAINST ('psycho' in boolean mode) 
Query took 0.0003 sec

Самое быстрое решение для двоичного файла:

SELECT * FROM texts_bin WHERE lower(text1) rlike 'psycho' OR lower(text2) rlike 'psycho' OR lower(text3) rlike 'psycho' OR lower(text4) rlike 'psycho'
Query took 0.0014 sec

Plus - другие проведенные мной тесты, которые могут оказаться полезными:

SELECT * FROM texts_bin WHERE lower(text1) like '%psycho%' OR lower(text2) like '%psycho%' OR lower(text3) like '%psycho%' OR lower(text4) like '%psycho%'
Query took 0.0023 sec

SELECT * FROM texts_bin WHERE text1 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text2 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text3 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text4 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)'
Query took 0.0282 sec
0 голосов
/ 03 марта 2012

MySQL поддерживает полные регулярные выражения "в стиле perl", поэтому вы должны иметь возможность указывать независимость от регистра в поисковом запросе: WHERE field RLIKE '(?i)search term'.Не могу сказать точно, но это должно работать с UTF-8.

Редактировать: (?i) и его род не упоминаются на странице MySQL, так что это может быть не стартер.

...