"е" и "ё" в поиске DLE

FM
На сайте с 31.10.2011
Offline
113
2248

Добрый вечер, как приравнять буквы "е" и "ё" в поиске, чтобы они считались одной и той же буквой?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Правильно настроить кодировки и локали на сервере.

Убедиться в отсутствии модификатора "BINARY" в SQL-запросах.

Лог в помощь!
N
На сайте с 06.05.2007
Offline
419
#2
FC1488SM:
Добрый вечер, как приравнять буквы "е" и "ё" в поиске, чтобы они считались одной и той же буквой?

Я не думаю что кто-то там в здравом уме использовал BINARY. Так что остается еще один случай - вы используете cp1251 в базе и индексах.

Внезапно, у mysql в разных charset была выбрана разная "сила сравнения" (collation strength). Та, которая вам нужна - это в utf8.

И не забыть выразить негодование по этому поводу на сайте bugs.mysql.com. Реально ведь бардак.

Кнопка вызова админа ()
FM
На сайте с 31.10.2011
Offline
113
#3
'[umka:
;13432299']Правильно настроить кодировки и локали на сервере.
Убедиться в отсутствии модификатора "BINARY" в SQL-запросах.

а какой-нибудь не столь революционный способ есть?

[umka]
На сайте с 25.05.2008
Offline
456
#4
FC1488SM:
а какой-нибудь не столь революционный способ есть?

Ну, как уже верно заметил коллега, вряд ли в SQL-запросах используется BINARY.

А во всём остальном никакой революции нет. Всё вполне естественно.

Чтобы поиск работал по-человечески, нужно, чтобы у mysql-я была нужная локаля, чтобы данные не были криво залиты в другой кодировке, и чтобы была установлена нужная кодировка сопоставления (collation).

дани мапов
На сайте с 06.09.2012
Offline
204
#5

Файл - /engine/modules/search.php

После строки:


if( isset( $_REQUEST['story'] ) ) $story = dle_substr( strip_data( rawurldecode( $_REQUEST['story'] ) ), 0, 90, $config['charset'] ); else $story = "";

добавляем это:


if ($story) $story = str_replace('ё', 'е', $story);

Файл - engine/ajax/search.php

После строки:


if( $query == "" ) die();

добавляем это:


$query = str_replace('ё', 'е', $query);

Проверил на DLE 10.2 - работает.

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
[umka]
На сайте с 25.05.2008
Offline
456
#6

дани мапов, вы считаете, такие костыли правильнее, чем настройка локали / collation-а? :)

Если да, то в этом случае нужно применять iconv и конвертировать все символы и диакритическими знаками.

Потому что, теоретически, в поиске могут искать "Кёнигсберг" и "Königsberg".

---------- Добавлено 21.01.2015 в 12:55 ----------

mysql> select * from test;
+--------------+
| txt |
+--------------+
| свёкла |
| Königsberg |
+--------------+
2 rows in set (0.00 sec)

mysql> select * from test where txt='свекла';
+--------------+
| txt |
+--------------+
| свёкла |
+--------------+
1 row in set (0.00 sec)

mysql> select * from test where txt='Konigsberg';
+-------------+
| txt |
+-------------+
| Königsberg |
+-------------+
1 row in set (0.00 sec)
FM
На сайте с 31.10.2011
Offline
113
#7
дани мапов:
Файл - /engine/modules/search.php

После строки:

if( isset( $_REQUEST['story'] ) ) $story = dle_substr( strip_data( rawurldecode( $_REQUEST['story'] ) ), 0, 90, $config['charset'] ); else $story = "";


добавляем это:

if ($story) $story = str_replace('ё', 'е', $story);



Файл - engine/ajax/search.php

После строки:

if( $query == "" ) die();


добавляем это:

$query = str_replace('ё', 'е', $query);


Проверил на DLE 10.2 - работает.

да спасибо, тоже работает, только немного не так, как я хотел. Например когда ввожу ёмобиль, поиск находит по запросу "емобиль", а статью "ёмобиль" он не выводит, а нужно чтобы статью "ёмобиль" выводили и если ввести "ёмобиль", и если ввести "емобиль"..надеюсь не запутал)

Mad_Man
На сайте с 10.11.2008
Offline
162
#8
FC1488SM:
да спасибо, тоже работает, только немного не так, как я хотел. Например когда ввожу ёмобиль, поиск находит по запросу "емобиль", а статью "ёмобиль" он не выводит, а нужно чтобы статью "ёмобиль" выводили и если ввести "ёмобиль", и если ввести "емобиль"..надеюсь не запутал)

Пользователь umka предельно ясно сказал что нужно делать. Пятый день уже топику, можно было всё же потратить жалких пару минут на решение проблемы, а не на поиск кривых костылей.

N
На сайте с 06.05.2007
Offline
419
#9
[umka:
;13440845]дани мапов, вы считаете, такие костыли правильнее, чем настройка локали / collation-а?

А не факт, что там что-то неправильно настроено. Я думаю, там просто cp1251 используют и никто не задумывался зачем и почему. В правильно настроенной cp1251 ci все равно будут различаться Е и Ё. Выбрать какую именно силу сравнения использовать в mysql нельзя. Ее однажды уже выбрали разработчики.

Настройка своей специальной collation для cp1251 совсем не тривиальна и потребует своей копии mysql-сервера.

Я предлагал просто базу в utf8 перевести. А там само все исправится. По крайней мере для Ё и E.

Исходя из возможности это сделать уже и нужно выбирать решение.

[umka]
На сайте с 25.05.2008
Offline
456
#10

netwind, я проверил, достаточно только установить collation utf8_general_ci для того поля, по которому производится поиск.

В cp1251_general_ci, действительно, "е" и "ё" считаются разными :)

Ошибок в сортировке и прочих огрехов при использовании utf8_general_ci пока не заметил.

Всё остальное — кодировка БД, кодировка таблицы и их collation-ы могут быть cp1251.

И никакого "шаманства" не требуется :) Только пару раз кликнуть мышкой в phpMyAdmin.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий