2016-06-15 29 views
2

postgresql-9.5の奇妙な照合の問題がPythonスクリプトに異なる出力を与えていたことに気付きました。私の理解では、通常の文字はソート時に左から右に一つずつ比較されていますpostgresqlとの奇妙な照合

select 'ab' < 'ac'; 
t 

select 'abX' < 'ac'; 
t 

あなたは上記の左側の文字列に「X」を追加するのであれば、それは無関係です。

これはスペースとダッシュの間の比較のために保持していないときに、私は驚いた:

select 'a ' < 'a-'; 
t 

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

それはバグですか、この周りにどのような方法があります。上記の最後のステートメントもtrueを返すようにします。私はPythonでUnicodeでソートするか、それはPostgreSQLのバグではありませんので、私は同様の結果を得るが、ユニコードのバグ場合

show lc_collate; 
en_US.UTF-8 


[@ローレンツ-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を返します.Linuxではfalse、WindowsではLC_COLLATE = 'C'、LinuxではLC_COLLATE = 'tr_TR.UTF-8' –

答えて

2

照合を使用して文字を比較します。 SQLコマンド

SHOW lc_collate; 

を使用して、デフォルトの照合順序を確認することができます。

PostgreSQLはオペレーティングシステムの照合を使用するため、比較結果はオペレーティングシステムによって異なることがよくあります。

はWindowsとLinux上のC照合

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

または2 Postgresqlの9.1上

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