3

我在共享主机上有一个 PostgreSQL 数据库,upper由于语言环境设置,在我的本地数据库中使用该函数的结果不同。

这是我想要的,并且在我的本地环境中拥有:

SELECT version();
-- "PostgreSQL 8.4.16 on i386-apple-darwin10.8.0, compiled by GCC i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3), 64-bit"

SHOW LC_COLLATE;
-- "fr_FR.UTF-8"

SELECT upper('étienne');
-- "ÉTIENNE"

这是我在生产环境中的内容:

SELECT version();
-- "PostgreSQL 9.0.13 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2, 64-bit"

SHOW LC_COLLATE;
-- "C"

SELECT upper('étienne');
-- éTIENNE

现在,由于生产环境位于共享主机中,由于主机策略,我无法更改语言环境。那么,在使用上层函数时,是否有另一种方法可以获得预期的结果?

4

3 回答 3

4

对于 9.1 及更高版本,您只需在本地为查询选择排序规则。
可悲的是,考虑到您的版本号,这将需要升级,因此可能会或可能不会有帮助。

SELECT UPPER('étienne' COLLATE "C")      C_Collation,
       UPPER('étienne' COLLATE "fr_FR") FR_Collation;

C_Collation        FR_Collation
--------------------------------------
éTIENNE            ÉTIENNE

一个用于测试的 SQLfiddle

于 2013-07-18T17:19:56.797 回答
1
select upper('étienne') collate "fr_FR";
于 2013-07-18T17:19:33.967 回答
1

请注意,您不能在 8.4 或 9.0 版本中覆盖排序规则(如其他答案所示)。这个特性是在 Postgres 9.1中引入的。

在早期版本中,您无法更改创建数据库时选择的排序规则。COLLATE关键字不存在,如果您尝试,您会收到错误SET LC_COLLATE = ...

ERROR: parameter "lc_collate" cannot be changed

您需要更新的版本来执行此操作。

-> SQL小提琴

对不起,但你运气不好。

于 2013-07-18T17:46:56.790 回答