温馨提示×

centos如何修复postgresql乱码

小樊
54
2026-09-12 07:51:30
栏目: 云计算

在 CentOS 上修复 PostgreSQL 乱码,通常不是 PostgreSQL 本身“坏了”,而是字符集不一致导致的。下面按「排查 → 修复 → 预防」来说明。


一、先确认乱码原因(非常关键)

1. 查看数据库字符集

psql -U postgres -c "\l"

重点看:

  • Encoding
  • Collate
  • Ctype

正常应为:

UTF8 | en_US.UTF-8 | en_US.UTF-8

2. 查看客户端编码

SHOW client_encoding;

若不是 UTF8,很容易乱码。

3. 查看系统 locale

locale

CentOS 常见问题是:

LANG=C

这会导致 PostgreSQL 使用非 UTF-8。


二、常见乱码场景及修复方法


✅ 场景 1:客户端乱码(数据库是 UTF8)

现象:psql 查出来是乱码,但数据本身没问题

修复

SET client_encoding = 'UTF8';

或永久生效(psql):

export PGCLIENTENCODING=UTF8

✅ 场景 2:CentOS 系统 locale 不是 UTF-8

修复 locale

localectl set-locale LANG=en_US.UTF-8

或手动修改:

vi /etc/locale.conf

内容:

LANG=en_US.UTF-8

然后:

source /etc/locale.conf

重启 PostgreSQL:

systemctl restart postgresql

✅ 场景 3:数据库创建时编码不对(最常见)

⚠️ PostgreSQL 不能直接修改已有数据库的 Encoding

正确做法:重建数据库

createdb -E UTF8 -T template0 mydb

如果原库有数据:

pg_dump mydb > mydb.sql
createdb -E UTF8 -T template0 mydb_new
psql mydb_new < mydb.sql

✅ 场景 4:CSV / 文件导入乱码

导出时指定编码

pg_dump -E UTF8 mydb > dump.sql

导入时

psql -d mydb -f dump.sql

如果是 COPY:

COPY t FROM '/data.csv' WITH (FORMAT csv, ENCODING 'UTF8');

三、PostgreSQL 服务端推荐配置

postgresql.conf:

client_encoding = UTF8
lc_messages = en_US.UTF-8
lc_collate = en_US.UTF-8
lc_ctype = en_US.UTF-8

修改后:

systemctl restart postgresql

四、快速自检清单 ✅

  • [ ] 系统 locale = UTF-8
  • [ ] 数据库 Encoding = UTF8
  • [ ] client_encoding = UTF8
  • [ ] 导入/导出文件是 UTF-8
  • [ ] 应用连接串指定了 UTF-8

五、如果你愿意,我可以:

  • 帮你看具体报错信息
  • 判断是客户端 / 服务端 / 文件乱码
  • 给你一键修复脚本(CentOS 7/8/Stream)

直接把你的:

psql 版本
CentOS 版本
\l 输出
报错截图/文字

发我就行。

0 踩