在 CentOS 上修复 PostgreSQL 乱码,通常不是 PostgreSQL 本身“坏了”,而是字符集不一致导致的。下面按「排查 → 修复 → 预防」来说明。
psql -U postgres -c "\l"
重点看:
EncodingCollateCtype正常应为:
UTF8 | en_US.UTF-8 | en_US.UTF-8
SHOW client_encoding;
若不是 UTF8,很容易乱码。
locale
CentOS 常见问题是:
LANG=C
这会导致 PostgreSQL 使用非 UTF-8。
现象:psql 查出来是乱码,但数据本身没问题
修复
SET client_encoding = 'UTF8';
或永久生效(psql):
export PGCLIENTENCODING=UTF8
修复 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
⚠️ 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
导出时指定编码
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.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
直接把你的:
psql 版本
CentOS 版本
\l 输出
报错截图/文字
发我就行。