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 版本。
| 归档时间: |
|
| 查看次数: |
1958 次 |
| 最近记录: |