Pythonのスクリプトがうまくいかず、私はこの問題を次のように減らしました。 PostgreSQLの9.1では'P 0' <'P! 'in python and postgresql
私が試した:
SELECT 'P 0' < 'P! '
f
とPython 2.7.3での:
>>> 'P 0' < 'P! '
True
なぜPostgreSQLで'!'
よりも低くない' '
のですか?何が起こっている?
Pythonのスクリプトがうまくいかず、私はこの問題を次のように減らしました。 PostgreSQLの9.1では'P 0' <'P! 'in python and postgresql
私が試した:
SELECT 'P 0' < 'P! '
f
とPython 2.7.3での:
>>> 'P 0' < 'P! '
True
なぜPostgreSQLで'!'
よりも低くない' '
のですか?何が起こっている?
PostgreSQLは、文字列比較にロケールの照合ルールを使用しています。 Pythonは照合のために別のロケール(おそらく "C")を使用しています。
データベースLC_COLLATE
が(\l+
:psql
)であることと、Pythonの実行環境が何であるかを知らなくても、それ以上のことは言い難いです。データベースのロケールとシェルlocale
コマンドの出力を表示してみてください。
the PostgreSQL documentation on localesを参照してください。例えば
、比較対照:
-- results may vary depending on your OS/libc
SELECT 'P 0' < 'P! ' COLLATE "C"; -- returns true
SELECT 'P 0' < 'P! ' COLLATE "en_GB"; -- returns false
postgresqlではLC_COLLATE = 'es_CL.UTF-8'、シェルではLC_COLLATE = "es_MX.UTF-8"です。 –
文字列比較ルールが2つの異なる言語またはシステムで同じであることは決して想定できません。たくさんの慣習があります。それは数字のように明確に定義されていません。平等は最もよく定義されていますが、そこにも違いがあります(末尾のスペースは無視され、大文字と小文字は区別されません)。不等な文字列の特定の順序は、ポータブルの領域の外にあります。
は、データベースが使用しているロケールものを確認してください。文字列の比較は、現在のロケールで照合がどのように行われるかによって異なります。 – hammar
私はそれがロケールのためではないと確信しています。 – kennytm
@KennyTM:一部のロケールは照合時にスペースを無視しますが、これはこの場合の違いを説明します。 – hammar