标签: international-components-unicode

LIKE 不支持 PostgreSQL 不确定性排序规则

我正在使用 Postgresql v12。我创建了一个像这样的排序规则:

CREATE COLLATION ci (provider = icu, locale = 'tr_TR', deterministic = false);
Run Code Online (Sandbox Code Playgroud)

我在表中使用了该排序规则:

create table testtable1 (
    id serial  primary key,
    name text  COLLATE "ci"
);
Run Code Online (Sandbox Code Playgroud)

我插入了示例数据:

insert into testtable1 values(3,'abc');
Run Code Online (Sandbox Code Playgroud)

当我使用 查询该表时LIKE,它返回以下错误:

select name from testtable1 WHERE name LIKE '%a%'  
Run Code Online (Sandbox Code Playgroud)


错误:LIKE SQL 状态不支持非确定性排序规则:0A000

但我需要使用LIKE. 有什么办法允许这样做吗?

collation unicode case-sensitive international-components-unicode postgresql-12

10
推荐指数
1
解决办法
1万
查看次数

在 Postgres 10 中将 ICU 排序规则指定为 `ENCODING`、`LC_COLLATE` 和 `LC_CTYPE`

Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。

那么在创建数据库时究竟如何指定 ICU 排序规则呢?

我确实在CREATE DATABASEto use 中阅读了一个提示,template0而不是template1iftemplate1可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0,您需要启用数据连接以覆盖默认值。

我在 Postgres 10 doc page for Collat​​ion Support中读到:

und-x-icu(用于“未定义”)

ICU“根”整理。使用它来获得合理的与语言无关的排序顺序。

因此,und-x-icu在建立包含多语言文本的新数据库时,这似乎是一个很好的使用价值。当已知某种语言专注于特定语言时,该SELECT命令可以指定另一种排序规则,例如 German de-x-icu。否则,回退到默认值und-x-icu

所以我尝试了以下 SQL 在 Postgres 10 Beta 2 中创建一个数据库。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

[42809] …

postgresql collation postgresql-10 international-components-unicode

6
推荐指数
1
解决办法
2556
查看次数

PostgreSQL 是否支持 ICU 整理的选项和设置?

ICU 指定不同的LDML 整理设置。其中一些看起来很有趣,尤其是关于大小写和口音的那些,

  • “忽略重音”: strength=primary
  • “忽略重音”但要考虑大小写: strength=primary caseLevel=on
  • “忽略大小写”: strength=secondary
  • “忽略标点符号”(完全): strength=tertiary alternate=shifted
  • “忽略标点符号”但区分标点符号:strength=quaternary alternate=shifted可能是更好的做事方法

您还可以在此处查看这些文档PostgreSQL 10 ICU 整理支持是否可以使用这些 ICU 选项和设置?

CREATE COLLATION special (provider = icu, locale = 'en@strength=primary');
SELECT 'Å' LIKE 'A' COLLATE "special"; # returns false
Run Code Online (Sandbox Code Playgroud)

我也试过CLDR BCP47

从 ICU 54 开始,排序规则属性也可以通过语言环境关键字指定,使用旧的语言环境扩展语法 (" el@colCaseFirst=upper") 或语言标记语法 ("el-u-kf-upper")。关键字和值不区分大小写。请参阅LDML 归类规范、归类设置和列出有效归类关键字及其值的数据文件。(不支持已弃用的属性 kh/colHiraganaQuaternary 和 vt/variableTop。)

为此,这看起来是对的

CREATE COLLATION special (provider = icu, locale = 'en-ks-level1');
SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql collation postgresql-10 international-components-unicode

3
推荐指数
1
解决办法
1485
查看次数

PostgreSQL 的“collat​​es”中的“-x-icu”是什么意思?

我有这个查询:

SELECT * FROM table ORDER BY label ASC;
Run Code Online (Sandbox Code Playgroud)

由于标签不是英文的,它们没有按正确的顺序排序(以“ö”开头的标签不在底部/末尾)。

因此,我尝试:

SELECT * FROM table ORDER BY label COLLATE "sv-SE" ASC;
SELECT * FROM table ORDER BY label COLLATE "sv_SE" ASC;
Run Code Online (Sandbox Code Playgroud)

这些给出了关于那些不存在的排序规则的错误,这让我感到困惑。

经过一番搜索,我想出了这样做:

SELECT * FROM pg_collation;
Run Code Online (Sandbox Code Playgroud)

这表明它应该是:

sv-SE-x-icu
Run Code Online (Sandbox Code Playgroud)

当我使用该标识符时它起作用了,但是“-x-icu”的东西有什么用?那是怎么回事?我讨厌他们总是不得不弄乱标准的语言环境标识符,所以你永远不能只依赖标准的“language_location”格式。

postgresql collation unicode international-components-unicode

2
推荐指数
1
解决办法
411
查看次数