2016-06-15 14 views
2

postgresql-9.5에서 파이썬 스크립트에 다른 결과를 주었기 때문에 이상한 데이터 정렬 문제를 발견했습니다. 위 왼쪽 문자열로 'X'를 추가하는 경우postgresql과 이상한 데이터 정렬

select 'ab' < 'ac'; 
t 

select 'abX' < 'ac'; 
t 

는 그래서 관련성이없는입니다 : 내가 알고있는 것처럼, 일반적으로 문자를 정렬 할 때 왼쪽에서 오른쪽으로 한 번에 하나씩 비교됩니다. 이것은 공간과 대시 사이의 비교를 보유하지 않는 경우

그래서 놀랐습니다 :

select 'a ' < 'a-'; 
t 

select 'a X' < 'a-'; 
f 

이 버그인가, 아니면이이 주변에 어떤 방법입니다; 위의 마지막 문도 true를 반환하기를 원합니다. 내가 파이썬에서 유니 코드로 분류 않는 것이 PostgreSQL의에서 버그가 아닙니다 그래서 나는 비슷한 결과를 얻을 수 있지만, 유니 코드의 버그 경우

show lc_collate; 
en_US.UTF-8 


[@ laurenz-ALBE의 답변을 수용 한 후 편집] 내 의견으로는 데이터 정렬 사양! :

>>> import locale; locale.setlocale(locale.LC_ALL, "") 
'en_US.UTF-8' 
>>> l = ['ac', 'ab']; sorted(l) == sorted(l, cmp=locale.strcoll) 
True 
>>> l = ['ac', 'abX']; sorted(l) == sorted(l, cmp=locale.strcoll) 
True 
>>> l = ['ac', 'abX']; sorted(l) == sorted(l, cmp=locale.strcoll) 
True 
>>> l = ['a-', 'a X']; sorted(l) == sorted(l, cmp=locale.strcoll) 
False 
>>> sorted(l), sorted(l, cmp=locale.strcoll) 
(['a X', 'a-'], ['a-', 'a X']) 
+0

효과적으로 바이트 현명한 비교 연산자를 사용 바이트 현명한 ASCII 비교를 강제로 : 창에 마지막 요청은 true, 윈도우즈에서는 false, LC_COLLATE = 'C'그리고 리눅스에서 LC_COLLATE = 'tr_TR.UTF-8' –

답변

2

문자는 데이터 정렬을 사용하여 비교됩니다. SQL 명령

SHOW lc_collate; 

을 사용하여 기본 데이터 정렬을 확인할 수 있습니다.

PostgreSQL은 운영 체제의 데이터 정렬을 사용하기 때문에 비교 결과는 종종 운영 체제에 따라 다릅니다.

는 윈도우와 리눅스에서 C 정렬

test=> SELECT 'a X' COLLATE "C" < 'a-'; 
?column? 
---------- 
t 
(1 row) 

또는 두 개의 PostgreSQL을 9.1에

test=> SELECT 'a X' ~<~ 'a-'; 
?column? 
---------- 
t 
(1 row)