Python中的腳本無法使用,我將問題簡化爲下面的內容。'P 0'<'P! 'in python and postgresql
在PostgreSQL 9.1我想:
SELECT 'P 0' < 'P! '
f
而且在Python 2.7.3:
>>> 'P 0' < 'P! '
True
爲什麼' '
並不比PostgreSQL的'!'
低?發生什麼事?
Python中的腳本無法使用,我將問題簡化爲下面的內容。'P 0'<'P! 'in python and postgresql
在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運行時環境是什麼,很難說更多。嘗試顯示數據庫語言環境以及shell的輸出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
shell中的postgresql和LC_COLLATE =「es_MX.UTF-8」中的LC_COLLATE ='es_CL.UTF-8'。 –
您永遠不能假定字符串比較規則在兩種不同的語言或系統中是相同的。有無數的約定;它不像數字那樣定義好。平等是最好的定義,但即使在那裏你也會發現差異(尾隨空間被忽略,情況無關緊要等等);不均勻字符串的具體排序超出了便攜式領域的範圍。
檢查哪種語言環境的數據庫使用。字符串比較取決於在當前語言環境中如何完成排序。 – hammar
我很確定這不是因爲語言環境。 – kennytm
@KennyTM:一些語言環境在整理時會忽略空格,這可以解釋在這種情況下的差異。 – hammar