为什么我的PostgreSQL ORDER BY不区分大小写?

前端之家收集整理的这篇文章主要介绍了为什么我的PostgreSQL ORDER BY不区分大小写?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Debian上运行Postgres 9.4.4,我得到以下ORDER BY行为:
  1. veure_test=# show LC_COLLATE;
  2. lc_collate
  3. -------------
  4. en_US.UTF-8
  5. (1 row)
  6.  
  7. veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor',' ') ORDER BY 1;
  8. regexp_split_to_table
  9. -----------------------
  10. a
  11. A
  12. b
  13. c
  14. Capacitor
  15. CD
  16. d
  17. D
  18. (8 rows)

和uname -a:

  1. Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux

但是,在我的iMac上,使用Postgres 9.3.4,我得到以下内容

  1. veure_test=# show LC_COLLATE;
  2. lc_collate
  3. -------------
  4. en_US.UTF-8
  5. (1 row)
  6.  
  7. veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor',' ') ORDER BY 1;
  8. regexp_split_to_table
  9. -----------------------
  10. A
  11. CD
  12. Capacitor
  13. D
  14. a
  15. b
  16. c
  17. d
  18. (8 rows)

和uname -a:

  1. 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_collat​​ion表显示我有一个en_US.UTF-8排序规则,但在Debian上,我有一个en_US.utf8排序规则.因此,在我的Mac上:

  1. veure_test=# with foo as (
  2. SELECT regexp_split_to_table('D d a A c b CD Capacitor',' ') as bar
  3. )
  4. SELECT bar FROM foo
  5. ORDER BY bar collate "en_US.UTF-8";
  6. bar
  7. -----------
  8. A
  9. CD
  10. Capacitor
  11. D
  12. a
  13. b
  14. c
  15. d
  16. (8 rows)

在Debian上:

  1. veure_test=# with foo as (
  2. SELECT regexp_split_to_table('D d a A c b CD Capacitor',' ') as bar
  3. )
  4. SELECT bar FROM foo
  5. ORDER BY bar collate "en_US.utf8";
  6. bar
  7. -----------
  8. a
  9. A
  10. b
  11. c
  12. Capacitor
  13. CD
  14. d
  15. D
  16. (8 rows)

那么en_US.UTF-8和en_US.utf8有不同的排序顺序?

So en_US.UTF-8 and en_US.utf8 have different sort orders?

不,这两者都是相同的,只是一个不同的命名约定.

I’m mystified by why the Debian version appears to be case-insensitive and the OS X version is not.

是的,你是对的.这是Mac中的默认行为.对于UTF8编码,排序规则不适用于任何BSD-ish操作系统(包括OSX).

以下是证明:

Problems with sort order (UTF8 locales don’t work

正如a_horse_with_no_name所说,Postgres使用操作系统的整理实现.无法在两个操作系统上获得相同的结果.

在你的情况下,你可能(我说可能)这样做:ORDER BY lower(fieldname).

猜你在找的Postgre SQL相关文章