温馨提示×

CentOS怎么解决PostgreSQL乱码

小樊
45
2026-08-31 03:44:34
栏目: 云计算

在 CentOS 上解决 PostgreSQL 乱码问题,通常是因为 客户端编码、数据库编码、或者系统语言环境不一致 导致的。下面按“最常见 → 最完整”的方式给你排查和解决。


一、最常见原因 & 快速解决

✅ 1. 查看 PostgreSQL 的编码

postgres 用户登录数据库:

su - postgres
psql

在 psql 中执行:

\l

查看:

  • Encoding
  • Collate
  • Ctype

例如:

Encoding = UTF8
Collate = en_US.UTF-8

推荐标准配置

Encoding: UTF8
Collate: en_US.UTF-8
Ctype: en_US.UTF-8

✅ 2. 查看当前客户端编码

在 psql 中执行:

SHOW client_encoding;

如果不是 UTF8,可以临时修改:

SET client_encoding = 'UTF8';

✅ 3. CentOS 系统语言环境

查看系统编码:

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 服务层面设置(推荐)

1️⃣ 修改 postgresql.conf

vi /var/lib/pgsql/data/postgresql.conf

添加或修改:

client_encoding = utf8

然后重启 PostgreSQL:

systemctl restart postgresql

四、客户端连接时乱码(psql / 程序)

psql 乱码

确保终端是 UTF-8:

echo $LANG

如果不是:

export LANG=en_US.UTF-8

JDBC / 程序连接乱码

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"
)

五、中文数据乱码典型场景

✅ 场景 1:数据库是 SQL_ASCII

❌ 原数据库:

Encoding = SQL_ASCII

✅ 解决方式:

  • 新建 UTF8 数据库
  • 导出数据再导入(SQL_ASCII 无法直接转换)

✅ 场景 2:导入 SQL 文件乱码

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

0