我在我的Mac和Ubuntu上安装了PostgreSQL,如下所示:
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)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)它们具有相同的数据库、排序和编码:
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排序规则时,我会得到以下错误:
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上有效,但是当我运行完全相同的语句(如下所示)时,结果是不同的:
atsweb=# select 'test last name' < 'test2 last name' COLLATE "en_US";
?column?
----------
f
(1 row)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”排序规则下“测试姓氏”之前进行吗?
发布于 2023-02-03 02:52:55
发布于 2023-01-31 07:00:19
您可能必须以root的形式运行以下命令,从而在Ubuntu上生成相应的区域设置:
locale-gen en_US.UTF-8之后,您必须以超级用户的身份在PostgreSQL中创建新的排序规则:
SELECT pg_import_system_collations('pg_catalog');发布于 2023-01-31 15:57:07
似乎是Mac的排序规则实现中的一个bug。
通过直接在shell中进行排序,将PostgreSQL从方程中提取出来。像这样的东西(为了巴什)
unset LC_ALL
echo -e "test last name\ntest2 last name"| LANG=en_US.UTF-8 sorthttps://dba.stackexchange.com/questions/322811
复制相似问题