我有两个 Postgres 9.1 实例:一个是本地的,通过 OS X 上的 Postgres.app 安装,另一个是远程的 Heroku。我已经确保这lc_collate
在en_US.UTF-8
两台机器上,但我仍然看到两者之间的不同行为。
在我的本地实例上,SELECT 'i' > 'N'
返回t
,而远程返回f
。鉴于我已经检查lc_*
了这两个系统,是什么解释了我所看到的差异?
我有两个 Postgres 9.1 实例:一个是本地的,通过 OS X 上的 Postgres.app 安装,另一个是远程的 Heroku。我已经确保这lc_collate
在en_US.UTF-8
两台机器上,但我仍然看到两者之间的不同行为。
在我的本地实例上,SELECT 'i' > 'N'
返回t
,而远程返回f
。鉴于我已经检查lc_*
了这两个系统,是什么解释了我所看到的差异?
从 Unicode 的角度来看,大小写排序是一种定制。摘自http://www.unicode.org/reports/tr10:
案例订购。一些字典和作者在小写之前整理大写,而其他人则使用相反的顺序,因此需要可自定义偏好。有时案件排序是由政府强制执行的,例如在丹麦。通常它只是一个定制或用户偏好。
Mac OS X 的大小写顺序与 Heroku 使用的 OS 不同。在 Mac OS X 上:
$ LC_CTYPE=en_US.UTF-8 sort << EOF
> i
> N
> EOF
产生:
尼
_
Ubuntu 12.04 上完全相同的命令和相同的数据产生:
我
N
这与 PostgreSQL 无关,只是它使用操作系统进行整理,因此不同操作系统之间的这些不幸差异会影响数据库。
从版本 10 开始,PostgreSQL 可以使用ICU 库提供的排序规则,用于使用ICU编译的服务器。这些排序规则可以跨操作系统进行一致的排序。