2012-11-23 4 views
9

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で'!'よりも低くない' 'のですか?何が起こっている?

+3

は、データベースが使用しているロケールものを確認してください。文字列の比較は、現在のロケールで照合がどのように行われるかによって異なります。 – hammar

+0

私はそれがロケールのためではないと確信しています。 – kennytm

+1

@KennyTM:一部のロケールは照合時にスペースを無視しますが、これはこの場合の違いを説明します。 – hammar

答えて

7

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 
+1

postgresqlではLC_COLLATE = 'es_CL.UTF-8'、シェルではLC_COLLATE = "es_MX.UTF-8"です。 –

3

文字列比較ルールが2つの異なる言語またはシステムで同じであることは決して想定できません。たくさんの慣習があります。それは数字のように明確に定義されていません。平等は最もよく定義されていますが、そこにも違いがあります(末尾のスペースは無視され、大文字と小文字は区別されません)。不等な文字列の特定の順序は、ポータブルの領域の外にあります。

関連する問題