PostgreSQL的区域设置

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: PostgreSQL的区域设置 对于中文用户,在PostgreSQL中应该将编码无条件的设为UTF8,为简化和统一区域(loacle)也推荐尽量设置为C,但Collate和Ctype对性能或功能有一定影响,需要注意。

PostgreSQL的区域设置

对于中文用户,在PostgreSQL中应该将编码无条件的设为UTF8,为简化和统一区域(loacle)也推荐尽量设置为C,但Collate和Ctype对性能或功能有一定影响,需要注意。

环境

  • rhel 6.3 x64虚机(4C/8G/300G HDD)
  • PostgreSQL 9.6.2

数据库

en_US=# \l+
                                                                   List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description                 
-----------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------
 en_US     | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 |                       | 7343 kB | pg_default | 
 postgres  | postgres | UTF8     | C          | C          |                       | 414 MB  | pg_default | default administrative connection database
 template0 | postgres | UTF8     | C          | C          | =c/postgres          +| 7225 kB | pg_default | unmodifiable empty database
           |          |          |            |            | postgres=CTc/postgres |         |            | 
 template1 | postgres | UTF8     | C          | C          | =c/postgres          +| 7225 kB | pg_default | default template for new databases
           |          |          |            |            | postgres=CTc/postgres |         |            | 
 zh_CN     | postgres | UTF8     | zh_CN.UTF8 | zh_CN.UTF8 |                       | 7225 kB | pg_default | 
(5 rows) 

Collate对功能的影响

Collate会影响中文的排序,在zh_CN的区域下中文按拼音排序,其它区域按字符编码排序。

postgres=# select * from (values ('王'),('貂'),('西'),('杨')) a order by a;
 column1 
---------
 杨
 王
 西
 貂
(4 rows)

postgres=# \c en_US
You are now connected to database "en_US" as user "postgres".
en_US=# select * from (values ('王'),('貂'),('西'),('杨')) a order by a;
 column1 
---------
 杨
 王
 西
 貂
(4 rows)

en_US=# \c zh_CN
You are now connected to database "zh_CN" as user "postgres".
zh_CN=# select * from (values ('王'),('貂'),('西'),('杨')) a order by a;
 column1 
---------
 貂
 王
 西
 杨
(4 rows) 

Collate对性能的影响

测试方法

postgres=# create table tb1(c1 text);
CREATE TABLE
Time: 5.653 ms
postgres=# insert into tb1 select md5(generate_series(1,1000000)::text);
INSERT 0 1000000
Time: 2671.929 ms
postgres=# vacuum ANALYZE tb1;
VACUUM
Time: 398.817 ms
postgres=# select * from tb1 order by c1 limit 1;
                c1                
----------------------------------
 0000104cd168386a335ba6bf6e32219d
(1 row)

Time: 176.779 ms
postgres=# create index idx1 on tb1(c1);
CREATE INDEX
Time: 1549.436 ms 

测试结果

Collate/Ctype       C       en_US.UTF8  zh_CN.UTF8
insert              2671    2613        2670
vacuum ANALYZE      398     250         396
order by            176     388         401
create index        1549    7492        7904
insert(with index)  11199   15621       16128 

Ctype的影响

Ctype会影响pg_trgm和部分正则匹配的结果,比如Ctype为'C'时,pg_trgm将无法支持中文

postgres=# select show_trgm('aaabbbc到的x');
                      show_trgm                      
-----------------------------------------------------
 {"  a","  x"," aa"," x ",aaa,aab,abb,bbb,bbc,"bc "}
(1 row)

en_US=# select show_trgm('aaabbbc到的x');
                               show_trgm                               
-----------------------------------------------------------------------
 {"  a"," aa",0x27bdf1,0x30bd19,0x4624bc,aaa,aab,abb,bbb,bbc,0x6a2ad5}
(1 row)

zh_CN=# select show_trgm('aaabbbc到的x');
                               show_trgm                               
-----------------------------------------------------------------------
 {"  a"," aa",0x27bdf1,0x30bd19,0x4624bc,aaa,aab,abb,bbb,bbc,0x6a2ad5}
(1 row) 

结论

  1. 对性能要求不高的场景建议将Collate和Ctype都设置为zh_CN.UTF8,其它区域设置为C。

    initdb -E UTF8 --locale=C --lc-collate=zh_CN.UTF8 --lc-ctype=zh_CN.UTF8 ... 
  2. 对性能要求较高的场景建议将Ctype设置为zh_CN.UTF8,其它区域设置为C。如果有部分查询需要按拼音排序,可在列定义和SQL表达式中指定Collate为zh_CN。

    initdb -E UTF8 --locale=C --lc-ctype=zh_CN.UTF8 ... 

参考

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
关系型数据库 Linux PostgreSQL
Linux centos8 docker中安装postgresql12.4及远程访问设置
Linux centos8 docker中安装postgresql12.4及远程访问设置
1053 0
|
关系型数据库 Shell 数据库
PostgreSQL怎么设置?
【8月更文挑战第6天】PostgreSQL怎么设置?
138 3
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
关系型数据库 Linux 数据安全/隐私保护
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
159 0
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
|
关系型数据库 PostgreSQL
Postgresql设置时区
Postgresql设置时区
261 0
|
SQL 关系型数据库 数据库
使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群
使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群
682 0
|
关系型数据库 MySQL PostgreSQL
PostgreSQL - 设置数据表编号初始值
PostgreSQL - 设置数据表编号初始值
177 0
|
SQL 数据可视化 关系型数据库
postgresql如何设置自动增长
postgresql如何设置自动增长
560 0
|
并行计算 算法 关系型数据库
PostgreSQL 11 并行计算算法,参数,强制并行度设置
标签 PostgreSQL , 并行计算 背景 PostgreSQL 并行计算原理、应用参考: 《PostgreSQL 多场景 沙箱实验》 优化器并行计算的并行度计算方法 1、总worker进程数 postgres=# show ; max_worker_processes ---------------------- 128 (1 row) 2、所有会话,在同一时刻的QUERY,并行计算最大允许开启的WORKER数。
5435 0
|
关系型数据库 Linux Shell

推荐镜像

更多