不区分大小写的排序规则仍然比较区分大小写

Rob*_*n B 8 postgresql collation case-sensitive postgresql-12

目前我正在试图创建一个表,一个文本列将比较案例默认情况下是敏感的。这是因为我们有一个第三方程序可以对我们的数据库执行搜索。该SELECT程序使用的语句不能更改。

抽象的问题是我们不知何故需要这个搜索不区分大小写,但它目前是区分大小写的。

我读到 Postgres 12 确实支持允许这种行为的非确定性排序规则。

我在德国 Windows 机器上安装了 Postgres 服务器(版本 PostgreSQL 12.1,由 Visual C++ build 1914 编译,64 位)。

因此,出于测试目的,我创建了一个新数据库进行测试:

CREATE DATABASE collation_test
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    CONNECTION LIMIT = -1;
Run Code Online (Sandbox Code Playgroud)

在这个数据库中,我创建了以下排序规则,我在一篇关于这些排序规则的文章中找到

CREATE COLLATION collat_ci (
  provider = 'icu',
  locale = 'und-u-ks-level2',
  deterministic = false
);
Run Code Online (Sandbox Code Playgroud)

在此之后,我需要一个表来测试这个排序规则

CREATE TABLE public.person
(
    "Id" bigint NOT NULL,
    "Name" text COLLATE public.collat_ci,
    PRIMARY KEY ("Id")
);

ALTER TABLE public.person
    OWNER to postgres;

INSERT INTO person VALUES
(1, 'Robin'),
(2, 'robin');
Run Code Online (Sandbox Code Playgroud)

所以现在我尝试了以下选择查询:

SELECT 
(
    SELECT "Name" FROM person p1 WHERE p1."Id" = 1
)
= 'Robin';
Run Code Online (Sandbox Code Playgroud)

true由于数据库中的文本和给定的文字完全匹配,因此按预期返回。

但是,如果我尝试使用小写字母进行相同的操作,r由于我的整理,我希望匹配该小写字母,但它仍然返回false.

SELECT 
(
    SELECT "Name" FROM person p1 WHERE p1."Id" = 1
)
= 'robin';
Run Code Online (Sandbox Code Playgroud)

当尝试将两个插入的行的名称相互比较时,我仍然得到false结果:

SELECT 
(
    SELECT "Name" FROM person p1 WHERE p1."Id" = 1 --'Robin'
)
=
(
    SELECT "Name" FROM person p2 WHERE p2."Id" = 2 --'robin'
);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我的比较不像预期的那样表现以及如何让它这样做?

Lau*_*lbe 11

Windows 版本附带的 ICU 版本很旧,所以也许这就是原因。

尝试

CREATE COLLATION collat_ci (
  provider = 'icu',
  locale = '@colStrength=secondary',
  deterministic = false
);
Run Code Online (Sandbox Code Playgroud)

这应该适用于较旧的 ICU 版本。

  • 我可以确认这适用于 Windows 10 和 Postgres 12.1。在 CentOS 7.7 上我也需要使用这个定义。 (2认同)