PostgreSQL教程FG073-PG本地化配置:字符集/时区/语言设置
本文档风哥主要介绍PostgreSQL的本地化配置,包括字符集、时区和语言设置的基础概念、生产环境规划、实施方案、实战案例和经验总结。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL字符集的概念
PostgreSQL字符集是用于存储和处理文本数据的编码系统,决定了数据库如何存储和显示不同语言的字符。字符集配置直接影响数据库对多语言支持的能力。更多视频教程www.fgedu.net.cn
- UTF8:通用字符集,支持几乎所有语言
- GBK:中文编码字符集
- GB2312:简体中文编码字符集
- Big5:繁体中文编码字符集
- LATIN1:西欧语言字符集
- ASCII:美国标准信息交换码
1.2 PostgreSQL时区的概念
PostgreSQL时区设置决定了数据库如何处理日期和时间类型的数据,包括存储和显示。时区配置直接影响时间相关函数的结果和数据的一致性。
- 支持全球所有时区
- 可以在数据库级别、会话级别和语句级别设置
- 存储的时间戳可以是带时区或不带时区的
- 默认使用服务器的系统时区
1.3 PostgreSQL语言设置的概念
PostgreSQL语言设置决定了数据库系统消息的语言,包括错误信息、提示信息等。语言设置不影响用户数据的存储和处理,只影响系统消息的显示。学习交流加群风哥微信: itpux-com
from oracle:www.itpux.com
- English:英语
- Chinese:中文
- Japanese:日语
- Korean:韩语
- French:法语
- German:德语
- Spanish:西班牙语
- Russian:俄语
Part02-生产环境规划与建议
2.1 PostgreSQL字符集规划
PostgreSQL字符集规划要点:
– 全球化应用:推荐使用UTF8
– 纯中文应用:可以使用GBK或UTF8
– 兼容性考虑:根据现有系统选择
– 性能考虑:UTF8可能会占用更多存储空间
# 字符集规划建议
– 数据库级别:设置为UTF8
– 应用级别:确保应用程序使用相同的字符集
– 连接级别:确保客户端连接使用相同的字符集
– 备份恢复:确保备份和恢复过程中字符集一致
# 常见字符集比较
– UTF8:支持所有语言,存储空间较大
– GBK:支持中文,存储空间较小
– LATIN1:仅支持西欧语言,存储空间最小
2.2 PostgreSQL时区规划
PostgreSQL时区规划要点:
– 全球应用:使用UTC时区
– 区域应用:使用当地时区
– 跨国应用:考虑使用UTC时区,客户端自行转换
– 一致性:确保所有服务器使用相同的时区设置
# 时区规划建议
– 数据库级别:设置为UTC或当地时区
– 应用级别:根据业务需求选择时区
– 连接级别:确保客户端连接使用正确的时区
– 存储类型:根据需要选择带时区或不带时区的时间戳类型
# 常见时区设置
– UTC:协调世界时,全球统一
– Asia/Shanghai:中国标准时间
– America/New_York:美国东部时间
– Europe/London:英国标准时间
2.3 PostgreSQL语言设置规划
PostgreSQL语言设置规划要点:
– 开发团队语言:根据开发团队的语言选择
– 运维团队语言:根据运维团队的语言选择
– 国际化需求:考虑多语言支持
– 一致性:确保所有环境使用相同的语言设置
# 语言设置建议
– 生产环境:建议使用English,便于问题排查和社区支持
– 开发环境:可以使用本地语言,便于开发调试
– 测试环境:与生产环境保持一致
# 常见语言设置
– English:英语(默认)
– Chinese:中文
– Japanese:日语
– Korean:韩语
Part03-生产环境项目实施方案
3.1 PostgreSQL字符集配置
3.1.1 查看当前字符集配置
$ psql -U pgsql
# 查看数据库字符集
postgres=# \l
List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges
—————–+———-+———-+————-+————-+———————–
fgedu_business | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
pgsql | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql template1 | pgsql | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/pgsql +
| | | | | postgres=CTc/pgsql (4 rows)
# 查看服务器字符集设置
postgres=# SHOW server_encoding;
server_encoding
—————–
UTF8
(1 row)
# 查看客户端字符集设置
postgres=# SHOW client_encoding;
client_encoding
—————–
UTF8
(1 row)
3.1.2 修改数据库字符集
# 创建使用GBK字符集的数据库
postgres=# CREATE DATABASE fgedu_gbk
postgres-# WITH
postgres-# OWNER = pgsql postgres-# ENCODING = ‘GBK’
postgres-# LC_COLLATE = ‘zh_CN.GBK’
postgres-# LC_CTYPE = ‘zh_CN.GBK’
postgres-# TABLESPACE = pg_default
postgres-# CONNECTION LIMIT = -1;
CREATE DATABASE
# 查看新创建的数据库
postgres=# \l fgedu_gbk
List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges
————+———-+———-+————+————+———————–
fgedu_gbk | pgsql | GBK | zh_CN.GBK | zh_CN.GBK |
(1 row)
3.1.3 修改客户端字符集
postgres=# SET client_encoding = ‘UTF8’;
SET
# 验证修改
postgres=# SHOW client_encoding;
client_encoding
—————–
UTF8
(1 row)
# 通过环境变量设置客户端字符集
$ export PGCLIENTENCODING=UTF8
$ psql -U pgsql
postgres=# SHOW client_encoding;
client_encoding
—————–
UTF8
(1 row)
3.2 PostgreSQL时区配置
3.2.1 查看当前时区配置
postgres=# SHOW timezone;
TimeZone
———-
PRC
(1 row)
# 查看可用的时区
postgres=# SELECT name FROM pg_timezone_names LIMIT 10;
name
————————
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
(10 rows)
# 查看系统时区
postgres=# SHOW log_timezone;
log_timezone
————–
PRC
(1 row)
3.2.2 修改时区配置
postgres=# SET timezone = ‘UTC’;
SET
# 验证修改
postgres=# SHOW timezone;
TimeZone
———-
UTC
(1 row)
# 修改数据库级别的时区
postgres=# ALTER DATABASE fgedu_business SET timezone = ‘Asia/Shanghai’;
ALTER DATABASE
# 修改服务器级别的时区(需要修改postgresql.conf文件)
$ vi /postgresql/data/postgresql.conf
# 在文件中找到并修改以下行
#timezone = ‘PRC’ # Set the timezone for displaying
# 改为
#timezone = ‘Asia/Shanghai’ # Set the timezone for displaying
# 重新加载配置
$ pg_ctl reload -D /postgresql/data
# 验证服务器级别时区设置
postgres=# SHOW timezone;
TimeZone
———-
Asia/Shanghai
(1 row)
3.2.3 测试时区设置
postgres=# SELECT NOW();
now
——————————-
2026-04-02 10:00:00.000000+08
(1 row)
# 测试带时区的时间戳
postgres=# SELECT TIMESTAMP WITH TIME ZONE ‘2026-04-02 10:00:00+08’;
timestamp with time zone
———————————–
2026-04-02 10:00:00+08
(1 row)
# 测试时区转换
postgres=# SELECT TIMESTAMP WITH TIME ZONE ‘2026-04-02 10:00:00+08’ AT TIME ZONE ‘UTC’;
timezone
————————
2026-04-02 02:00:00
(1 row)
3.3 PostgreSQL语言设置配置
3.3.1 查看当前语言设置
postgres=# SHOW lc_messages;
lc_messages
————-
zh_CN.UTF-8
(1 row)
# 查看所有语言相关设置
postgres=# SHOW ALL WHERE name LIKE ‘lc_%’;
name | setting
——————+————
lc_collate | zh_CN.UTF-8
lc_ctype | zh_CN.UTF-8
lc_messages | zh_CN.UTF-8
lc_monetary | zh_CN.UTF-8
lc_numeric | zh_CN.UTF-8
lc_time | zh_CN.UTF-8
(6 rows)
3.3.2 修改语言设置
postgres=# SET lc_messages = ‘English’;
SET
# 验证修改
postgres=# SHOW lc_messages;
lc_messages
————-
English
(1 row)
# 修改数据库级别的语言设置
postgres=# ALTER DATABASE fgedu_business SET lc_messages = ‘English’;
ALTER DATABASE
# 修改服务器级别的语言设置(需要修改postgresql.conf文件)
$ vi /postgresql/data/postgresql.conf
# 在文件中找到并修改以下行
#lc_messages = ‘zh_CN.UTF-8’ # locale for system error message
# 改为
#lc_messages = ‘English’ # locale for system error message
# 重新加载配置
$ pg_ctl reload -D /postgresql/data
# 验证服务器级别语言设置
postgres=# SHOW lc_messages;
lc_messages
————-
English
(1 row)
3.3.3 测试语言设置
postgres=# SELECT * FROM non_existent_table;
ERROR: relation “non_existent_table” does not exist
LINE 1: SELECT * FROM non_existent_table;
^
# 切换回中文语言设置
postgres=# SET lc_messages = ‘zh_CN.UTF-8’;
SET
# 再次测试错误信息语言
postgres=# SELECT * FROM non_existent_table;
错误: 关系 “non_existent_table” 不存在
第1行: SELECT * FROM non_existent_table;
^
Part04-生产案例与实战讲解
4.1 PostgreSQL字符集配置案例
4.1.1 案例:创建支持多语言的数据库
# 1. 创建使用UTF8字符集的数据库
postgres=# CREATE DATABASE fgedu_ecommerce
postgres-# WITH
postgres-# OWNER = pgsql postgres-# ENCODING = ‘UTF8’
postgres-# LC_COLLATE = ‘zh_CN.UTF-8’
postgres-# LC_CTYPE = ‘zh_CN.UTF-8’
postgres-# TABLESPACE = pg_default
postgres-# CONNECTION LIMIT = -1;
CREATE DATABASE
# 2. 连接到新数据库
postgres=# \c fgedu_ecommerce
You are now connected to fgedudb “fgedu_ecommerce” as fgedu “postgres”.
# 3. 创建支持多语言的表
fgedu_ecommerce=# CREATE TABLE fgedu_products (
fgedu_ecommerce(# id SERIAL PRIMARY KEY,
fgedu_ecommerce(# name VARCHAR(255) NOT NULL,
fgedu_ecommerce(# description TEXT,
fgedu_ecommerce(# price DECIMAL(10,2) NOT NULL,
fgedu_ecommerce(# created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
fgedu_ecommerce(# );
CREATE TABLE fgedu_# 4. 插入多语言数据
fgedu_ecommerce=# INSERT INTO fgedu_products (name, description, price) VALUES
fgedu_ecommerce-# (‘手机’, ‘智能手机,支持5G网络’, 5999.99),
fgedu_ecommerce-# (‘Laptop’, ‘Notebook computer with SSD’, 7999.99),
fgedu_ecommerce-# (‘テレビ’, ‘4K超高清电视’, 3999.99),
fgedu_ecommerce-# (‘상품’, ‘한국어 상품 설명’, 1999.99);
INSERT 0 4
# 5. 验证多语言数据
fgedu_ecommerce=# SELECT * FROM fgedu_products;
id | name | description | price | created_at
—-+——–+—————————–+———-+——————————-
1 | 手机 | 智能手机,支持5G网络 | 5999.99 | 2026-04-02 10:00:00.000000
2 | Laptop | Notebook computer with SSD | 7999.99 | 2026-04-02 10:00:00.000000
3 | テレビ | 4K超高清电视 | 3999.99 | 2026-04-02 10:00:00.000000
4 | 상품 | 한국어 상품 설명 | 1999.99 | 2026-04-02 10:00:00.000000
(4 rows)
4.2 PostgreSQL时区配置案例
4.2.1 案例:配置全球应用的时区
# 1. 修改数据库时区为UTC
postgres=# ALTER DATABASE fgedu_global SET timezone = ‘UTC’;
ALTER DATABASE
# 2. 连接到数据库
postgres=# \c fgedu_global
You are now connected to fgedudb “fgedu_global” as fgedu “postgres”.
# 3. 验证时区设置
fgedu_global=# SHOW timezone;
TimeZone
———-
UTC
(1 row)
# 4. 创建带时区的时间戳表
fgedu_global=# CREATE TABLE fgedu_events (
fgedu_global(# id SERIAL PRIMARY KEY,
fgedu_global(# event_name VARCHAR(255) NOT NULL,
fgedu_global(# event_time TIMESTAMP WITH TIME ZONE NOT NULL,
fgedu_global(# created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
fgedu_global(# );
CREATE TABLE fgedu_# 5. 插入不同时区的事件
fgedu_global=# INSERT INTO fgedu_events (event_name, event_time) VALUES
fgedu_global-# (‘北京会议’, ‘2026-04-02 10:00:00+08’),
fgedu_global-# (‘纽约会议’, ‘2026-04-02 10:00:00-04’),
fgedu_global-# (‘伦敦会议’, ‘2026-04-02 10:00:00+01’),
fgedu_global-# (‘东京会议’, ‘2026-04-02 10:00:00+09’);
INSERT 0 4
# 6. 查看事件时间(以UTC显示)
fgedu_global=# SELECT * FROM fgedu_events;
id | event_name | event_time | created_at
—-+————+—————————+——————————-
1 | 北京会议 | 2026-04-02 02:00:00+00 | 2026-04-02 02:00:00+00
2 | 纽约会议 | 2026-04-02 14:00:00+00 | 2026-04-02 02:00:00+00
3 | 伦敦会议 | 2026-04-02 09:00:00+00 | 2026-04-02 02:00:00+00
4 | 东京会议 | 2026-04-02 01:00:00+00 | 2026-04-02 02:00:00+00
(4 rows)
# 7. 转换为本地时区查看
fgedu_global=# SELECT
fgedu_global-# event_name,
fgedu_global-# event_time AT TIME ZONE ‘Asia/Shanghai’ AS beijing_time,
fgedu_global-# event_time AT TIME ZONE ‘America/New_York’ AS newyork_time,
fgedu_global-# event_time AT TIME ZONE ‘Europe/London’ AS london_time,
fgedu_global-# event_time AT TIME ZONE ‘Asia/Tokyo’ AS tokyo_time
fgedu_global-# FROM fgedu_events;
event_name | beijing_time | newyork_time | london_time | tokyo_time
————+————————–+————————-+————————-+————————
北京会议 | 2026-04-02 10:00:00 | 2026-04-01 22:00:00 | 2026-04-02 02:00:00 | 2026-04-02 11:00:00
纽约会议 | 2026-04-03 02:00:00 | 2026-04-02 10:00:00 | 2026-04-02 14:00:00 | 2026-04-03 03:00:00
伦敦会议 | 2026-04-02 17:00:00 | 2026-04-02 12:00:00 | 2026-04-02 10:00:00 | 2026-04-02 18:00:00
东京会议 | 2026-04-02 10:00:00 | 2026-04-01 21:00:00 | 2026-04-02 01:00:00 | 2026-04-02 10:00:00
(4 rows)
4.3 PostgreSQL语言设置案例
4.3.1 案例:为不同团队设置不同的语言
# 1. 为开发数据库设置中文语言
postgres=# ALTER DATABASE fgedu_development SET lc_messages = ‘zh_CN.UTF-8’;
ALTER DATABASE
# 2. 为生产数据库设置英文语言
postgres=# ALTER DATABASE fgedu_production SET lc_messages = ‘English’;
ALTER DATABASE
# 3. 测试开发数据库的语言设置
postgres=# \c fgedu_development
You are now connected to fgedudb “fgedu_development” as fgedu “postgres”.
fgedu_development=# SELECT * FROM non_existent_table;
错误: 关系 “non_existent_table” 不存在
第1行: SELECT * FROM non_existent_table;
^
# 4. 测试生产数据库的语言设置
postgres=# \c fgedu_production
You are now connected to fgedudb “fgedu_production” as fgedu “postgres”.
fgedu_production=# SELECT * FROM non_existent_table;
ERROR: relation “non_existent_table” does not exist
LINE 1: SELECT * FROM non_existent_table;
^
Part05-风哥经验总结与分享
5.1 PostgreSQL本地化配置最佳实践
PostgreSQL本地化配置最佳实践:
- 字符集配置:
- 推荐使用UTF8字符集,支持多语言
- 确保数据库、应用程序和客户端连接使用相同的字符集
- 在创建数据库时指定正确的字符集和排序规则
- 时区配置:
- 全球应用建议使用UTC时区
- 区域应用可以使用当地时区
- 使用TIMESTAMP WITH TIME ZONE类型存储带时区的时间戳
- 确保所有服务器使用相同的时区设置
- 语言设置:
- 风哥教程针对风哥教程针对风哥教程针对生产环境建议使用English,便于问题排查和社区支持
- 开发环境可以根据团队语言设置为本地语言
- 确保所有环境的语言设置一致
5.2 PostgreSQL本地化配置常见问题
PostgreSQL本地化配置常见问题及解决方案:
- 字符集不匹配:确保数据库、应用程序和客户端连接使用相同的字符集,避免乱码问题
- 时区不一致:确保所有服务器使用相同的时区设置,避免时间数据不一致
- 语言设置冲突:在多团队环境中,统一语言设置标准,便于协作
- 排序规则问题:选择正确的排序规则,确保数据排序符合预期
- 性能影响:UTF8字符集可能会占用更多存储空间,需要考虑存储成本
5.3 PostgreSQL本地化配置工具推荐
PostgreSQL本地化配置常用工具:
- psql:命令行工具,用于查看和修改本地化配置
- pgAdmin4:图形化管理工具,提供直观的本地化配置界面
- locale命令:系统命令,用于查看系统支持的语言和区域设置
- timedatectl命令:系统命令,用于管理系统时区
- 自定义脚本:用于批量修改本地化配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
