PostgreSQL ORDER BY가 대소 문자를 구분하지 않는 이유는 무엇입니까?


27

데비안에서 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

데비안 버전이 대소 문자를 구분하지 않고 OS X 버전이 아닌 이유가 궁금합니다. 무엇을 놓치거나 다른 정보를 제공해야합니까?

업데이트 : 내 Mac에서 pg_collation테이블에 en_US.UTF-8데이터 정렬이 있지만 데비안에서는 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)

그리고 데비안에서 :

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-8en_US.utf8다른 정렬 순서가?


테스트 할 Mac이 없어서 여기서 어두운 곳에서 촬영하고 있습니다. Mac에서 줄 'D d a A c b CD Capacitor'text필드 로 캐스트되지 않을 가능성이 있습니까? IE, SELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;어떤 일이 일어나고 있는지 보십시오 .
Chris

같은 결과입니다. 다른 소식으로 OS X에는 select * from pg_collation데비안 박스가 en_US.utf8있고, OS X에는 en_US.UTF-8. 그것들을 사용하여 각각의 박스에 명시 적으로 데이터 정렬을 강제하는 것은 다른 정렬 순서를 보여줍니다 :(
Curtis Poe

그리고 나는 문제를 설명 할 수있는 업데이트를 게시했지만 나에게 그것은 단지 미스터리를 심화시킵니다. 그리고 나는 이것을 발견했다 : stackoverflow.com/questions/19967555/… 그리고 이것 : stackoverflow.com/questions/27395317/…
Curtis Poe

7
불행히도 Postgres는 OS의 데이터 정렬 구현을 사용하여 OS에 의존하는 이러한 종류의 동작을 만듭니다 (개인적으로 버그로 간주됩니다-DBMS는 OS에 관계없이 동일하게 작동해야 함). 이 데비안와 OSX의 시스템 라이브러리의 차이로 귀결 그래서
a_horse_with_no_name

1
정렬 순서가 나머지 순서와 일치하지 않으면 Postgres와 시스템의 다른 부분 사이에 불일치가 있습니다. 나도 동일한 행동을 선호하지만 시스템 로케일을 따르는 버그라고 부르지 않을 것입니다. 궁극적으로 동일한 로케일이 OS에서 동일하게 작동해야합니다. 데비안 로케일이 오른쪽으로 보인다 (다른 설명이없는 한), 애플은 잘못이 될 것으로 보인다.
Erwin Brandstetter

답변:


16

그래서 en_US.UTF-8en_US.utf8다른 정렬 순서가?

아니요, 둘 다 동일하며 이름 지정 규칙이 다릅니다.

데비안 버전이 대소 문자를 구분하지 않고 OS X 버전이 아닌 이유가 궁금합니다.

그래 너가 옳아. 이것이 Mac의 기본 동작입니다. 데이터 정렬은 UTF8인코딩을 위해 BSD-ish OS (OSX 포함)에서 작동하지 않습니다 .

이를 증명하기위한 참고 자료는 다음과 같습니다.

정렬 순서 문제 (UTF8 로케일이 작동하지 않음

으로 a_horse_with_no_name가 말했다, 포스트 그레스는 OS에서 데이터 정렬 구현을 사용합니다. 두 운영 체제에서 동일한 결과를 얻을 수있는 방법은 없습니다.

귀하의 경우에는 다음과 같이 할 수 있습니다 ORDER BY lower(fieldname).


2
ORDER BY function()잠재적으로 큰 결과 집합에서 사용할 때 성능을 확인 하십시오. 정렬에 사용되는 인덱스가 중지되므로 추가 정렬 작업 (디스크에있을 수 있음)이 발생할 수 있으며 쿼리 플래너의 쿼리를보다 광범위하게 공격하는 방법이 변경 될 수 있습니다 .
David Spillett

@David Spillett : 주문 기능에 대한 것이 맞습니다. 내 대답은 OP가 iMac과 Debian에서 다른 정렬 방식을 갖는 이유에 더 집중되어 있다고 생각합니다. 감사합니다
JSapkota

1
예, 귀하의 답변은 완벽하며 질문을 완전히 포함합니다. "쿼리 계획에 영향을 줄 수있는 변경 후 실제 데이터로 테스트하는 것"은 잊어 버리기 쉽고 (그리고 사람들이 자주하는 일) 백업에 대한 습관적인 반응이되었습니다. 데이터베이스 작업을 처음 접하는 사람들의 경우조차 알지 못합니다.
David Spillett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.