Python “p0”
Python中的脚本不起作用,我将问题简化为以下内容 在PostgreSQL 9.1中,我尝试了:Python “p0”,python,postgresql,Python,Postgresql,Python中的脚本不起作用,我将问题简化为以下内容 在PostgreSQL 9.1中,我尝试了: SELECT 'P 0' < 'P! ' f 在Python 2.7.3中: >>> 'P 0' < 'P! ' True 为什么“不低于”!“在PostgreSQL中?发生了什么?您永远不能假设两种不同语言或系统中的字符串比较规则是相同的。有无数的习俗;它不像数字那样有很好的定义。相等是最好的定义,但即使在这里,您也会发现尾随空格的差异被忽略,大小写不重要,等等
SELECT 'P 0' < 'P! '
f
在Python 2.7.3中:
>>> 'P 0' < 'P! '
True
为什么“不低于”!“在PostgreSQL中?发生了什么?您永远不能假设两种不同语言或系统中的字符串比较规则是相同的。有无数的习俗;它不像数字那样有很好的定义。相等是最好的定义,但即使在这里,您也会发现尾随空格的差异被忽略,大小写不重要,等等。;不相等字符串的特定顺序远远超出了可移植的范围。PostgreSQL正在使用区域设置的排序规则进行字符串比较。Python正在使用不同的语言环境(可能是C)进行排序 如果不知道您的数据库LC_COLLATE来自psql中的\l+,以及Python的运行时环境是什么,就很难说得更多。尝试显示数据库区域设置和shell区域设置命令的输出 看 例如,比较和对比:
-- 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
检查数据库使用的区域设置。字符串比较取决于当前区域设置中的排序方式。我很确定这不是因为区域设置。@KennyTM:某些区域设置在排序时忽略空格,这可以解释这种情况下的差异。LC_COLLATE='es_CL.UTF-8'在postgresql中,而LC_COLLATE=es_MX.UTF-8在shell中。