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

时间:2019-06-12 09:48:00

标签: postgresql

此查询没有给出结果的原因是什么

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

这很好时:

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

名称为“Последователь”。如果我使用“邮政”之类的名称,则搜索效果很好。

版本:x86_64-pc-linux-gnu上的PostgreSQL 11.2(Ubuntu 11.2-100),由gcc(Ubuntu 7.3.0-27ubuntu1〜18.04)7.3.0,64位编译

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

enter image description here

2 个答案:

答案 0 :(得分:3)

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)

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

答案 1 :(得分:-1)

仔细看。 LIKE语句有时区分大小写。取决于您使用的程序

第一个语句是:

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

第二个是:

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

您要寻找的是

  

Последователь

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