По какой причине этот запрос не дает результатов:
SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%после%');
Когда это работает нормально:
SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%После%');
Имя "Последователь". Если я использую имя типа «Пост», поиск работает нормально.
Версия: PostgreSQL 11.2 (Ubuntu 11.2-100) на x86_64-pc-linux-gnu, скомпилированная gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, 64-разрядная
Кодировка сервера и БД - UTF8. Кодировка клиента - UNICODE.
Кодировка клиента @Shawn.X - UNICODE
Присмотрись. Оператор LIKE иногда чувствителен к регистру. Зависит от программы, которую вы используете
Первое утверждение:
SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%после%');
в то время как второй:
SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%После%');
То, что вы ищете,
П оследователь
обратите внимание, что в первом выражении вы написали (п), а во втором — (П).
что делает НИЖЕ(имя)?
нижняя обсадная колонна
Может быть, вы этого не понимаете, но п
— это строчная буква П
в кириллице.
Функция lower
работает в соответствии с параметрами сортировки базы данных, поэтому результат будет зависеть от того, как определена ваша база данных.
В этом случае хорошо сработает:
test=# CREATE DATABASE rus TEMPLATE template0
ENCODING UTF8 LC_COLLATE "ru_RU.utf8" LC_CTYPE "ru_RU.utf8";
CREATE DATABASE
test=# \c rus
You are now connected to database "rus" as user "postgres".
rus=# SELECT LOWER('%после%') = LOWER('%После%');
?column?
----------
t
(1 row)
Но это не будет работать с сопоставлением C
, потому что оно не знает, как правильно строчные символы кириллицы:
rus=# \c test
You are now connected to database "test" as user "postgres".
test=# DROP DATABASE rus;
DROP DATABASE
test=# CREATE DATABASE rus TEMPLATE template0
ENCODING UTF8 LC_COLLATE "C" LC_CTYPE "C";
CREATE DATABASE
test=# \c rus
You are now connected to database "rus" as user "postgres".
rus=# SELECT LOWER('%после%') = LOWER('%После%');
?column?
----------
f
(1 row)
Поэтому, если вы хотите, чтобы ваш запрос работал хорошо, убедитесь, что вы используете сопоставление, которое умеет преобразовывать символы в верхний и нижний регистр.
Есть ли альтернативы? Потому что db управляется облачным хостингом:/
Вы можете написать свою собственную функцию lower
(возможно, выбрать другое имя).
И проверьте кодировку
Query Editor
.