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