4

根据 PostgreSQL 9.2 文档,如果我使用 C 语言环境以外的语言环境(在我的情况下为 en_US.UTF-8),则文本列上的 btree 索引用于支持查询,例如

SELECT * from my_table WHERE text_col LIKE 'abcd%' 

需要text_pattern_ops像这样创建

CREATE INDEX my_idx ON my_table (text_col text_pattern_ops)

现在文档的第 11.9节指出,这会导致“逐字符”比较。这些(非宽)C 字符还是比较理解 UTF-8?

4

2 回答 2

2

好问题,我不完全确定,但我的初步理解是:

这里 Postgresql 的意思是“真正的字符”(最终是多字节),而不是字节。无论有没有这个特殊索引,比较总是“理解 UTF-8”。

关键是,对于具有特殊(非 C)排序规则的语言环境,我们通常希望在进行比较(<>...)和排序时遵循这些规则(并调用相应的语言环境库)。但是我们不想将这些排序规则用于 POSIX 正则匹配和 LIKE 模式。因此存在两种不同类型的文本索引。

于 2013-05-09T15:55:16.430 回答
2

运算text_pattern_ops符类中的运算符实际上memcmp()对字符串执行 a 操作,因此文档中关于字符的讨论可能有些不准确。

但这并不真正影响他们是否支持 UTF-8 的问题。以所述方式对模式匹配操作进行索引确实支持 UTF-8。底层运算符不必担心编码。

于 2013-05-09T21:19:19.733 回答