根据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?
答案 0 :(得分:1)
好问题,我不完全确定,但我的初步理解是:
这里Postgresql的意思是“真实字符”(最终是多字节),而不是字节。无论是否有这个特殊指数,比较“始终理解UTF-8”。
关键是,对于具有特殊(非C)归类规则的语言环境,我们通常希望在进行比较时遵循这些规则(并调用相应的语言环境库)(<
,>
...)和排序。但我们不希望将这些排序规则用于POSIX常规匹配和LIKE模式。因此,文本存在两种不同类型的索引。
答案 1 :(得分:1)
text_pattern_ops
运算符类中的运算符实际上对字符串执行memcmp()
,因此文档可能在描述字符时可能稍微不准确。
但这并不会影响他们是否支持UTF-8的问题。以所描述的方式索引模式匹配操作确实支持UTF-8。底层运算符不必担心编码。