我在Debian上运行了Postgres 9.4.4,并且得到以下ORDER BY
行为:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
和uname -a
:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
但是,在使用Postgres 9.3.4的iMac上,我得到以下信息:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
和uname -a
:
Darwin ---- 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64
我对为什么Debian版本似乎不区分大小写而OS X版本却不区分大小写感到困惑。我缺少什么,或者我需要提供什么其他信息?
更新:在我的Mac上,该pg_collation
表显示我有一个en_US.UTF-8
排序规则,但在Debian上,我有一个en_US.utf8
排序规则。因此,在我的Mac上:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.UTF-8";
bar
-----------
A
CD
Capacitor
D
a
b
c
d
(8 rows)
在Debian上:
veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
)
SELECT bar FROM foo
ORDER BY bar collate "en_US.utf8";
bar
-----------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
那么en_US.UTF-8
,en_US.utf8
有不同的排序顺序吗?
结果相同。在其他消息中,结果
—
Curtis Poe15年
select * from pg_collation
显示Debian盒中有en_US.utf8
,而OS X中有en_US.UTF-8
。使用那些在各个框上显式强制排序规则将显示不同的排序顺序:(
而且我已经发布了可能解释该问题的更新,但是对我来说,这只会加深神秘感。而且我现在发现这一点:stackoverflow.com/questions/19967555/...这:stackoverflow.com/questions/27395317/...
—
柯蒂斯坡
不幸的是,Postgres使用了OS的归类实现,这使这种行为依赖于OS(我个人认为是一个错误-无论OS是什么,DBMS的行为都应相同)。因此,这归结为Debian和OSX之间的系统库之间的差异
—
a_horse_with_no_name 2015年
如果排序顺序与其余部分不一致,则Postgres和系统其他部分之间将存在分歧。我也更喜欢相同的行为,但是我不会称其为遵循系统区域设置的错误。最终,相同的语言环境在整个OS上的行为应相同。在Debian的区域似乎正确的,苹果似乎是在错误(除非有一些其他的解释)。
—
Erwin Brandstetter 2015年
'D d a A c b CD Capacitor'
不会text
在Mac上将字符串转换为字段吗?IE浏览器,尝试SELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;
看看会发生什么...