我有以下表(在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)
为什么有差异?我知道它可能与整理顺序或类似的东西有关,但我想知道在哪里可以读到更多关于它的信息。
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";