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