"order by"子句中的不同行为:Oracle vs. PostgreSQL

Pab*_*ruz 3 oracle postgresql sql-order-by

我有下表(在Oracle和PostgreSQL中创建并填充它们):

> create table foo (a varchar(10));
Run Code Online (Sandbox Code Playgroud)

我使用值填充它们,并且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.
Run Code Online (Sandbox Code Playgroud)

我得到了我的期望..1之前01,因为.0在ascii表之前.

但是,在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)
Run Code Online (Sandbox Code Playgroud)

为什么不同?我知道它可能与整理顺序或类似有关,但我想在哪里阅读更多关于它的一些指示.

更新:整理PostgreSQL数据库的信息:

Encoding: UTF8
Collante: en_US.UTF-8
Ctype: en_US.UTF-8 | 
Run Code Online (Sandbox Code Playgroud)

谢谢!

kli*_*lin 5

Postgres只有两个内置的排序规则:C和POSIX.操作系统提供任何其他排序规则.在UTF语言环境中的许多Linux系统上,在排序期间将忽略所有非字母数字字符.

您可以使用collate C以下方法获得预期结

select a, length(a) from foo order by a collate "C";
Run Code Online (Sandbox Code Playgroud)

您可以在此答案中找到更详细的说明.