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



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

> create table foo (a varchar(10));

我用值填充它们,order by子句在PostgreSQL和Oracle中的行为不同(我不认为版本与这个问题相关):

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.

我得到了我想要的。.101之前,因为在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)

为什么有差异?我知道它可能与整理顺序或类似的东西有关,但我想知道在哪里可以读到更多关于它的信息。

UPDATE:整理PostgreSQL数据库信息:

Encoding: UTF8
Collante: en_US.UTF-8
Ctype: en_US.UTF-8 | 

谢谢!

Postgres只有两种内置排序规则:C和POSIX。任何其他排序由操作系统提供。在许多使用UTF语言环境的linux系统中,在排序过程中忽略所有非字母数字字符。

使用collate C:

可以获得预期的结果
select a, length(a) from foo order by a collate "C";

最新更新