我有下表(在Oracle和PostgreSQL中创建并填充它们):
> create table foo (a varchar(10));
我用值填充它们,order by
子句在PostgreSQL和Oracle中表现不同(我不认为版本与此问题相关):
甲骨文:
> select a, length(a) from foo order by a;
A LENGTH(A)
---------- ----------
.1 2
01 2
1 1
1#0 3
1#1 3
1.0 3
1.1 3
10 2
11 2
9 rows selected.
我得到了我的期望。 .1
之前的01
,因为.
位于ascii表中的0
之前。
然而,在PostgreSQL中我有:
=> select a, length(a) from foo order by a;
a | length
-----+--------
01 | 2
1 | 1
.1 | 2
10 | 2
1.0 | 3
1#0 | 3
11 | 2
1.1 | 3
1#1 | 3
(9 rows)
为何与众不同?我知道它可能与整理顺序或类似情况有关,但我想了解一下如何阅读更多相关信息。
更新:整理PostgreSQL数据库的信息:
Encoding: UTF8
Collante: en_US.UTF-8
Ctype: en_US.UTF-8 |
谢谢!
答案 0 :(得分:5)
Postgres只有两个内置排序规则:C和POSIX。 操作系统提供任何其他排序规则。 在UTF语言环境中的许多Linux系统上,在排序过程中会忽略所有非字母数字字符。
您可以使用select a, length(a) from foo order by a collate "C";
获得预期结果:
this.fn()
您可以找到更详细的解释documentation。