postgresql 搜索无法使用小写LIKE搜索俄语字符

x759pob2  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(131)

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

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- 27 ubuntu 1 ~18.04)7.3.0编译,64位
服务器和数据库编码为UTF8。客户端编码为UNICODE。

7dl7o3gd

7dl7o3gd1#

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)

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

o8x7eapl

o8x7eapl2#

如果数据库的区域设置错误,则函数LOWERUPPER将无法正常工作。
步骤1.查看Postgres中数据库的区域设置:

\l

步骤-2.查看终端中可用的语言环境:

locale -a

或按您的语言,例如ru

locale -a | grep ru

步骤3.使用步骤2中的区域设置名称(例如ru_RU.utf8)更新Postgres中的数据库YOUR_DATABASE_NAME

update pg_database set datcollate='ru_RU.utf8', datctype='ru_RU.utf8' where datname='YOUR_DATABASE_NAME';

也可以使用区域设置创建新数据库:

CREATE DATABASE NEW_DATABASE_NAME TEMPLATE template0 ENCODING UTF8 LC_COLLATE "ru_RU.UTF-8" LC_CTYPE "ru_RU.UTF-8";

PS我的macOS有名称ru_RU.UTF-8,Ubuntu有名称ru_RU.utf8

b0zn9rqh

b0zn9rqh3#

仔细查看。LIKE语句有时区分大小写。这取决于您使用的程序
第一句话是:

SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%после%');

而第二个是:

SELECT name FROM users WHERE LOWER(name) LIKE LOWER('%После%');

你要找的是

********-------------------------------------------

请注意,在第一个语句中,您用**(п)编写,而第二个语句是(П)**

相关问题