Postgresql

不區分大小寫的排序規則仍然比較區分大小寫

  • December 17, 2019

我目前正在嘗試創建一個帶有文本列的表,預設情況下將比較區分大小寫**。**這是因為我們有一個第三方程序在我們的數據庫上執行搜尋。該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;

在這個數據庫中,我創建了以下排序規則,我在一篇關於這些排序規則的文章中找到了

CREATE COLLATION collat_ci (
 provider = 'icu',
 locale = 'und-u-ks-level2',
 deterministic = false
);

在此之後,我需要一個表來測試這個排序規則

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');

所以現在我嘗試了以下選擇查詢:

SELECT 
(
   SELECT "Name" FROM person p1 WHERE p1."Id" = 1
)
= 'Robin';

它按預期返回true,因為數據庫中的文本和給定的文字完全匹配。

r但是,如果我嘗試使用由於我的排序規則而希望匹配的小寫字母,但它仍然返回false

SELECT 
(
   SELECT "Name" FROM person p1 WHERE p1."Id" = 1
)
= 'robin';

當嘗試將兩個插入行的名稱相互比較時,我仍然得到false結果:

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

有誰知道為什麼我的比較不符合預期以及如何讓它這樣做?

Windows 版本附帶的 ICU 版本相當舊,所以也許這就是原因。

嘗試

CREATE COLLATION collat_ci (
 provider = 'icu',
 locale = '@colStrength=secondary',
 deterministic = false
);

這應該適用於較舊的 ICU 版本。

引用自:https://dba.stackexchange.com/questions/255780