首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL 14在Linux和Mac上排序行为的差异

PostgreSQL 14在Linux和Mac上排序行为的差异
EN

Database Administration用户
提问于 2023-01-31 05:04:35
回答 3查看 490关注 0票数 5

我在我的Mac和Ubuntu上安装了PostgreSQL,如下所示:

代码语言:javascript
复制
atsweb=# select version();
                                                      version                                                      
-------------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.6 on x86_64-apple-darwin20.6.0, compiled by Apple clang version 12.0.0 (clang-1200.0.32.29), 64-bit
(1 row)
代码语言:javascript
复制
atsweb=# select version();
                                                               version                                                                
--------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.6 (Ubuntu 14.6-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, 64-bit
(1 row)

它们具有相同的数据库、排序和编码:

代码语言:javascript
复制
atsweb=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 atsweb    | atsweb   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

但是,当我在Ubuntu上指定en_US.UTF-8排序规则时,我会得到以下错误:

代码语言:javascript
复制
atsweb=# select 'test last name' < 'test2 last name' COLLATE "en_US.UTF8";
ERROR:  collation "en_US.UTF8" for encoding "UTF8" does not exist
LINE 1: select 'test last name' < 'test2 last name' COLLATE "en_US.U...

指定en_US排序规则在Ubuntu上有效,但是当我运行完全相同的语句(如下所示)时,结果是不同的:

Ubuntu:

代码语言:javascript
复制
atsweb=# select 'test last name' < 'test2 last name' COLLATE "en_US";
 ?column? 
----------
 f
(1 row)

Mac:

代码语言:javascript
复制
atsweb=# select 'test last name' < 'test2 last name' COLLATE "en_US";
 ?column? 
----------
 t
(1 row)

这是我的错误配置还是某个地方的错误?有什么我能解决的线索吗?

更新:

在PostgreSQL14.6对接图像上进行了尝试,得到了与Ubuntu完全相同的结果。这是否意味着有问题的是Mac安装?“test2姓氏”应该在"en_US“或"en_US.UTF-8”排序规则下“测试姓氏”之前进行吗?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2023-02-03 02:52:55

显然,正如答案所指出的,除了"C“排序之外,排序规则与操作系统有关,即使它们被命名为相同,也可能有所不同。甚至有一个开票指出,Mac中的实现已经中断。因为我只需要为了测试目的而保持排序的一致性,所以我修改了我的测试以解决这个问题。

票数 0
EN

Database Administration用户

发布于 2023-01-31 07:00:19

您可能必须以root的形式运行以下命令,从而在Ubuntu上生成相应的区域设置:

代码语言:javascript
复制
locale-gen en_US.UTF-8

之后,您必须以超级用户的身份在PostgreSQL中创建新的排序规则:

代码语言:javascript
复制
SELECT pg_import_system_collations('pg_catalog');
票数 5
EN

Database Administration用户

发布于 2023-01-31 15:57:07

似乎是Mac的排序规则实现中的一个bug。

通过直接在shell中进行排序,将PostgreSQL从方程中提取出来。像这样的东西(为了巴什)

代码语言:javascript
复制
unset LC_ALL
echo -e "test last name\ntest2 last name"| LANG=en_US.UTF-8 sort
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/322811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档