Collation

LIKE 不支持 PostgreSQL 非確定性排序規則

  • May 5, 2020

我正在使用 Postgresql v12。我創建了這樣的排序規則:

CREATE COLLATION ci (provider = icu, locale = 'tr_TR', deterministic = false);

我在表格中使用了該排序規則:

create table testtable1 (
   id serial  primary key,
   name text  COLLATE "ci"
);

我插入了樣本數據:

insert into testtable1 values(3,'abc');

當我使用 查詢該表時LIKE,它返回以下錯誤:

select name from testtable1 WHERE name LIKE '%a%'  

錯誤:LIKE SQL 狀態不支持非確定性排序

規則:0A000

但我需要使用LIKE. 有沒有辦法允許這樣做?

假設大多數時候自定義的、非確定性的排序規則對您有用,並且您偶爾需要確定性的東西,那麼您可以在需要時通過COLLATE子句簡單地提供確定性排序規則。例如,在您的情況下,您可以使用tr-TR-x-icu如下排序規則:

select name from testtable1 WHERE name LIKE '%a%' COLLATE "tr-TR-x-icu"

您可以使用問題中發布的範常式式碼在db<>fiddle上看到一個工作展示。

當然,這將區分大小寫。為此,您需要使用區分大小寫ILIKE運算符。例如:

select name from testtable1 WHERE name ILIKE '%A%' COLLATE "tr-TR-x-icu"

但是,=運算符仍然區分大小寫,因為CREATE COLLATION語句中定義的排序規則沒有改變預設的敏感性,並且預設排序規則對所有內容都敏感(這二進制排序規則不同,僅供參考)。

要創建使用“tr-TR”語言環境並且區分大小寫排序規則,您需要locale在語句中指定屬性,CREATE COLLATION如下所示:

locale = 'tr-TR-u-ks-level2'

要查看實際情況,請參閱:db<>fiddle example 2

請參閱“ Unicode 技術標準 #35:UNICODE LOCALE DATA MARKUP LANGUAGE (LDML),第 5 部分:排序規則”以獲取排序規則選項的完整列表。

並且,請訪問排序規則資訊以獲取排序規則相關資訊。它主要面向 SQL Server 和 .NET,但也有一些 MySQL 和 PostgreSQL 的東西,而且跨平台和語言的關鍵概念通常是相同的。

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