zeromodule
@zeromodule
PHP

Как заставить PostgreSQL не различать буквы «Е» и «Ё»?

Необходимо, чтобы запрос вида
select * from tbl where surname = 'фёдоров';

возвращал (в том числе) записи, где surname = 'федоров'.

Ну, и наоборот.
Помню, что в MySQL такое было возможно.
  • Вопрос задан
  • 5443 просмотра
Пригласить эксперта
Ответы на вопрос 4
antonov22
@antonov22
PHP - программист.
Решал такую задачу. Пришел к тому что делаеть через регулярку.
Если в строке запроса есть буква "е", то все вхождения замениям на [е|ё]
$q = str_replace('е', '[е|ё]', $q);
и в sql уже идет с
select *
from tbl
WHERE tbl.name SIMILAR TO '%ж[е|ё]лтый%'
Ответ написан
Комментировать
@hx510b
"Я знаю, что ничего не знаю"
Используйте расширение unaccent
Подробности https://www.postgresql.org/docs/current/unaccent.html
С дистрибутивом поставляются правила соответствия символов, например:
/usr/pgsql-13/share/tsearch_data/unaccent.rules
После подключения правил и перестроения индексов БД согласно этим правилам, поиск должен осуществляться без учета разницы между "е" и "ё".
Ответ написан
Комментировать
zeromodule
@zeromodule Автор вопроса
PHP
Решением может быть это:

$surname = str_replace('ё', 'е', 'фёдоров');

select * from tbl where replace(surname, 'ё', 'е') = '{$surname}';
Ответ написан
agoalofalife
@agoalofalife
Team Lead
Наверное еще можно исключить в базе эту пресловутую букву ё
UPDATE table SET field = REPLACE(field, 'ё', 'е');
В Mysql этот запрос заменит все буквы, если это подойдет, то удастся избежать проблем в будущем. В коде что то менят, себе яму копать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы