text_pattern_ops比较器是否理解UTF-8?

时间:2013-05-09 14:46:28

标签: postgresql

根据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 of the documentation部分指出这会导致“逐字符”比较。这些(非宽)C字符或比较是否理解UTF-8?

2 个答案:

答案 0 :(得分:1)

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

这里Postgresql的意思是“真实字符”(最终是多字节),而不是字节。无论是否有这个特殊指数,比较“始终理解UTF-8”。

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

答案 1 :(得分:1)

text_pattern_ops运算符类中的运算符实际上对字符串执行memcmp(),因此文档可能在描述字符时可能稍微不准确。

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