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'])
効果的にバイト単位の比較演算子を使用し、バイト単位のASCII比較を強制するには、次のウィンドウにあなたの最後の要求はtrueを返します.Linuxではfalse、WindowsではLC_COLLATE = 'C'、LinuxではLC_COLLATE = 'tr_TR.UTF-8' –