SELECT a < b COLLATE "de_DE" FROM test1;
假设这是使用国际数据的正确方法,这是数据库本身的最佳排序规则? PostgreSQL documentation says:
The C and POSIX collations both specify “traditional C” behavior,in which only the ASCII letters “A” through “Z” are treated as letters,and sorting is done strictly by character code byte values.
我认为这是这种情况下的最佳选择,还是我错了?
(加分问题:在查询本身中选择排序规则是否太慢?).
C
collation是正确的选择.
没有语言环境,一切都快一点.并且由于无论如何都没有正确的排序规则,因此无需整理即可创建数据库,这意味着使用C.
为许多操作提供整理可能是一种痛苦.但是,默认排序规则和临时排序规则之间的速度不应该有明显的差异.毕竟它只是未排序的数据,并且在排序时应用排序规则.
请注意,Postgres基于底层操作系统提供的语言环境设置,因此您需要为每个要使用的语言环境生成语言环境.更多关于SO here和here的相关答案.
但是,如@Craig already mentioned所示,索引是此方案的瓶颈.在许多涉及字符数据的情况下,索引的排序规则必须与应用运算符的排序规则相匹配.
您可以使用索引中的COLLATE说明符来生成匹配的索引.如果要在同一个表中混合数据,Partial indexes可能是完美的选择.
例如,包含国际字符串的表:
CREATE TABLE string ( string_id serial,lang_id int NOT NULL,string text NOT NULL );
而且你最常对一种语言感兴趣:
SELECT * FROM string WHERE lang_id = 5 -- 5 being German / Germany here AND string > 'foo' COLLATE "de_DE" ORDER BY string COLLATE "de_DE";
然后创建部分索引,如:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE") WHERE lang_id = 5;
每种语言都需要一个.
实际上,对于像这样的表格来说,inheritance可能是一种优越的方法.然后,您可以在每个继承的表上包含一个普通索引,该索引仅包含单个语言环境的字符串.当然,您需要熟悉继承表的特殊规则.