postgresql – 如何为国际数据库选择排序规则?

我正在设计一个以不同语言存储数据的数据库(使用UTF-8),所以我认为显示查询结果的最佳方法是在查询本身( because there are more than one correct ways to do that)期间根据用户的语言对其进行排序,如下所示:
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 herehere的相关答案.

但是,如@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可能是一种优越的方法.然后,您可以在每个继承的表上包含一个普通索引,该索引仅包含单个语言环境的字符串.当然,您需要熟悉继承表的特殊规则.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...