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+
in psql
)以及您的 Python 运行时环境是什么,很难说更多。尝试显示数据库区域设置和 shelllocale
命令的输出。
请参阅有关 locales 的 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
您永远不能假设字符串比较规则在两种不同的语言或系统中是相同的。有无数的约定;它不像数字那样定义明确。平等是最好的定义,但即使在那里你也会发现差异(尾随空格被忽略,大小写无关等);不相等字符串的特定顺序超出了便携式范围。