我正在使用 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
如下排序规则:您可以使用问题中发布的示例代码在db<>fiddle上看到一个工作演示。
当然,这将区分大小写。为此,您需要使用区分大小写的
ILIKE
运算符。例如:但是,
=
运算符仍然区分大小写,因为CREATE COLLATION
语句中定义的排序规则没有改变默认敏感性,并且默认排序规则对所有内容都敏感(这与二进制排序规则不同,仅供参考)。要创建使用“tr-TR”语言环境并且区分大小写的排序规则,您需要
locale
在语句中指定属性,CREATE COLLATION
如下所示:要查看实际情况,请参阅:db<>fiddle example 2
请参阅“ Unicode 技术标准 #35:UNICODE LOCALE DATA MARKUP LANGUAGE (LDML),第 5 部分:排序规则”以获取排序规则选项的完整列表。
并且,请访问排序规则信息以获取排序规则相关信息。它主要面向 SQL Server 和 .NET,但也有一些 MySQL 和 PostgreSQL 的东西,而且跨平台和语言的关键概念通常是相同的。