Python のスクリプトが機能しなかったので、問題を次のように縮小しました。
PostgreSQL 9.1で試しました:
SELECT 'P 0' < 'P! '
f
Python 2.7.3 では:
>>> 'P 0' < 'P! '
True
PostgreSQL' '
よりも低くないのはなぜですか? '!'
何が起こっている?
Python のスクリプトが機能しなかったので、問題を次のように縮小しました。
PostgreSQL 9.1で試しました:
SELECT 'P 0' < 'P! '
f
Python 2.7.3 では:
>>> 'P 0' < 'P! '
True
PostgreSQL' '
よりも低くないのはなぜですか? '!'
何が起こっている?
PostgreSQL は、文字列の比較にロケールの照合規則を使用しています。Python は、照合に別のロケール (おそらく「C」) を使用しています。
LC_COLLATE
データベースが何であるか ( から) と\l+
、psql
Python のランタイム環境が何であるかを知らずに、これ以上言うことは困難です。データベースのロケールとシェルlocale
コマンドの出力を表示してみてください。
ロケールに関する PostgreSQL のドキュメントを参照してください。
たとえば、次のように比較対照します。
-- 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
文字列比較規則が 2 つの異なる言語またはシステムで同じであると想定することはできません。無数の規則があります。数字のように明確に定義されていません。同等性が最もよく定義されていますが、それでも違いがあります (末尾のスペースが無視される、大文字と小文字が区別されないなど)。等しくない文字列の特定の順序付けは、ポータブルの領域をはるかに超えています。