【问题标题】:Search is not working with lowercase LIKE for russian characters搜索不适用于俄语字符的小写 LIKE
【发布时间】:2019-06-12 18:16:14
【问题描述】:

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

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。

【问题讨论】:

  • 检查Query Editor的字符集。
  • @Shawn.X 客户端编码是 UNICODE

标签: postgresql


【解决方案1】:

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 函数(可能选择不同的名称)。
【解决方案2】:

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

第一条语句是:

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

而第二个是:

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

你追求的是

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

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

【讨论】:

  • LOWER(name) 是做什么的?
  • 下套管柱
  • 也许你没有意识到,п 在西里尔文中是小写的П
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多