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

标签 oracle postgresql sql-order-by

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

谢谢!

最佳答案

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

您可以使用collat​​e C 获得预期的结果:

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

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

关于oracle - "order by"子句 : Oracle vs. PostgreSQL 中的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528037/

相关文章:

oracle - 将自定义菜单替换为 Oracle Forms 11g 默认菜单

SQL 查询 : Deleting rows from PostgreSQL with same values

sql - 将两列相乘并在新列 PostgreSQL 中显示结果

php - 保持数据库与文件系统上的图片同步 [PHP/Postgresql/Linux]

mysql - 按索引使用排序

sql - 循环索引变量使用在 PL/SQL 集合中无效

oracle - 如何创建选择列表而不指定其值列表?

sql - 连接时避免字符串和序列之间有空格

perl - 如何在perl中对全数字矩阵进行排序

mysql : ORDER BY Twice