在 CentOS 上解决 PostgreSQL 乱码问题,通常是因为 客户端编码、数据库编码、或者系统语言环境不一致 导致的。下面按“最常见 → 最完整”的方式给你排查和解决。
以 postgres 用户登录数据库:
su - postgres
psql
在 psql 中执行:
\l
查看:
例如:
Encoding = UTF8
Collate = en_US.UTF-8
✅ 推荐标准配置
Encoding: UTF8
Collate: en_US.UTF-8
Ctype: en_US.UTF-8
在 psql 中执行:
SHOW client_encoding;
如果不是 UTF8,可以临时修改:
SET client_encoding = 'UTF8';
查看系统编码:
locale
如果不是 UTF-8,可以修改:
sudo localectl set-locale LANG=en_US.UTF-8
或编辑:
vi /etc/locale.conf
设置:
LANG=en_US.UTF-8
然后 重新登录终端 或重启。
CREATE DATABASE test;
CREATE DATABASE test
WITH ENCODING 'UTF8'
LC_COLLATE 'en_US.UTF-8'
LC_CTYPE 'en_US.UTF-8';
postgresql.confvi /var/lib/pgsql/data/postgresql.conf
添加或修改:
client_encoding = utf8
然后重启 PostgreSQL:
systemctl restart postgresql
确保终端是 UTF-8:
echo $LANG
如果不是:
export LANG=en_US.UTF-8
JDBC 连接字符串示例:
jdbc:postgresql://localhost:5432/test?useUnicode=true&characterEncoding=UTF-8
Python (psycopg2):
conn = psycopg2.connect(
dbname="test",
user="user",
password="pass",
client_encoding="utf-8"
)
❌ 原数据库:
Encoding = SQL_ASCII
✅ 解决方式:
psql -U user -d db < data.sql
建议使用:
psql -U user -d db --set=client_encoding=UTF8 < data.sql
✅ 数据库编码 UTF8
✅ 系统 locale UTF-8
✅ 客户端编码 UTF8
✅ postgresql.conf 设置 client_encoding
✅ 终端语言环境 UTF-8
如果你愿意,可以贴出以下信息,我可以 精准定位:
\l
SHOW client_encoding;
locale