搜索不适用于俄语字符的小写 LIKE

RTW*_*RTW 3 postgresql

这个查询没有结果的原因是什么:

SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%?????%');
Run Code Online (Sandbox Code Playgroud)

当这工作正常时:

SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%?????%');
Run Code Online (Sandbox Code Playgroud)

名字是 '?????????????'。如果我使用“发布”之类的名称,则搜索工作正常。

版本:PostgreSQL 11.2 (Ubuntu 11.2-100) on x86_64-pc-linux-gnu,由 gcc 编译 (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, 64-bit

服务器和数据库编码为 UTF8。客户端编码是 UNICODE。

在此处输入图片说明

Lau*_*lbe 6

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)
Run Code Online (Sandbox Code Playgroud)

但它不适用于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)
Run Code Online (Sandbox Code Playgroud)

因此,如果您希望您的查询正常工作,请确保您使用的排序规则知道如何将字符转换为大写和小写。