【问题标题】:Different behaviour in "order by" clause: Oracle vs. PostgreSQL“order by”子句中的不同行为:Oracle 与 PostgreSQL
【发布时间】:2015-07-20 23:34:15
【问题描述】:

我有下表(在 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.

我得到了我的期望。 .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)

为什么不一样?我知道这可能与整理顺序或类似内容有关,但我想知道在哪里可以阅读更多相关信息。

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

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

谢谢!

【问题讨论】:

  • 不同的排序规则?看起来 PostgreSQL 忽略了符号,这可以解释行为(因为没有任何符号的值是有序的)。
  • 在查询中使用COLLATE "POSIX"会改变PgSQL结果吗?
  • @user2864740 是的,是的。

标签: oracle postgresql sql-order-by


【解决方案1】:

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

您可以使用collate C获得预期结果:

select a, length(a) from foo order by a collate "C";

你可以找到更详细的解释in this answer

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 2011-10-12
    • 2022-07-04
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多