在Python和PostgreSQL中,'P 0' < 'P! '是什么意思?

9

一个 Python 脚本无法运行,我将问题归纳如下。

在 PostgreSQL 9.1 中,我尝试了以下操作:

SELECT 'P 0' < 'P! '
f

在Python 2.7.3中:
>>> 'P 0' < 'P! '
True

为什么在PostgreSQL中,' '不比'!'小?发生了什么?

3
请检查数据库正在使用的语言环境。字符串比较取决于当前语言环境中的排序规则。 - hammar
我非常确定这不是由于区域设置的原因。 - kennytm
1
@KennyTM:一些语言环境在排序时会忽略空格,这可能解释了这种情况下的差异。 - hammar
2个回答

7

PostgreSQL正在使用您的语言环境的规则进行字符串比较。 Python在排序时使用不同的语言环境(可能是“C”)。

如果不知道数据库LC_COLLATE是什么(从psql中的\l+获取),以及Python的运行环境,请提供数据库语言环境和shell 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

1
在postgresql中,LC_COLLATE = 'es_CL.UTF-8',而在shell中,LC_COLLATE="es_MX.UTF-8"。 - f p

3

在两个不同的语言或系统中,您永远不能假设字符串比较规则相同。有无数种约定;它不像数字那样定义良好。等式是最清晰明确的,但即使在那里,也会发现差异(忽略尾随空格,大小写不敏感等);非相等字符串的特定排序远超出可移植领域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接