以下是在 openEuler 2403 上配置 PostgreSQL 17 字符集(UTF-8 与 GBK)的完整指南,包含操作步骤和注意事项:


一、环境准备

  1. 操作系统配置

    # 查看当前 locale
    localectl status
    
    # 生成 GBK locale(若未安装)
    sudo localedef -c -f GBK -i zh_CN zh_CN.GBK
    
    # 设置系统 locale(二选一)
    sudo localectl set-locale LANG=zh_CN.UTF-8    # UTF-8 模式
    sudo localectl set-locale LANG=zh_CN.GBK      # GBK 模式
    

  2. 安装 PostgreSQL 17

    sudo dnf install postgresql17-server
    sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
    sudo systemctl enable postgresql-17
    


二、字符集配置方案

方案1:初始化时指定字符集
# 停止服务
sudo systemctl stop postgresql-17

# 备份原数据
sudo mv /var/lib/pgsql/17/data /var/lib/pgsql/17/data.bak

# 初始化时指定字符集(任选其一)
sudo -u postgres /usr/pgsql-17/bin/initdb -D /var/lib/pgsql/17/data --encoding=UTF8   # UTF-8
sudo -u postgres /usr/pgsql-17/bin/initdb -D /var/lib/pgsql/17/data --encoding=GBK     # GBK

# 重启服务
sudo systemctl start postgresql-17

方案2:修改现有数据库
-- 连接数据库
psql -U postgres

-- 创建新数据库(UTF-8 示例)
CREATE DATABASE new_db WITH ENCODING='UTF8' LC_COLLATE='zh_CN.UTF-8' LC_CTYPE='zh_CN.UTF-8';

-- GBK 示例
CREATE DATABASE gbk_db WITH ENCODING='GBK' LC_COLLATE='zh_CN.GBK' LC_CTYPE='zh_CN.GBK';


三、字符集切换验证

  1. 检查数据库编码

    SELECT datname, pg_encoding_to_char(encoding) 
    FROM pg_database;
    

    预期输出

     datname  | pg_encoding_to_char 
    ----------+---------------------
     template0| UTF8
     gbk_db   | GBK
    

  2. 客户端编码同步
    psql 中执行:

    SET client_encoding TO 'GBK';  -- 或 UTF8
    


四、关键注意事项

  1. 数据迁移风险

    • 使用 pg_dump/pg_restore 转换编码:
      pg_dump old_db -E UTF8 | psql new_utf8_db
      

    • GBK 限制
      不支持 Emoji 表情符(如 😊)和部分生僻汉字(如 "𠮷")
  2. 排序规则差异

    • UTF-8 使用 zh_CN.UTF-8 时支持拼音排序
    • GBK 默认按汉字内码排序,需额外扩展
  3. 服务配置同步
    修改 /var/lib/pgsql/17/data/postgresql.conf

    client_encoding = 'auto'  # 自动匹配客户端
    


五、故障排查

  1. 乱码问题
    -- 强制连接编码(Session级修复)
    SET client_encoding TO 'GBK';
    

  2. 启动失败
    检查日志:
    journalctl -u postgresql-17 -xe
    

    常见错误

    invalid locale name "zh_CN.GBK"
    解决方案:执行 sudo localedef -f GBK -i zh_CN zh_CN.GBK


六、容器化部署方案(可选)

docker run -d --name pg17 \
  -e POSTGRES_ENCODING=GBK \
  -e LANG=zh_CN.GBK \
  -p 5432:5432 \
  postgres:17

最佳实践建议

  1. 新项目强制使用 UTF-8
  2. 兼容旧系统时:
    • 前端应用层做 GBK 转码
    • 数据库保留 UTF-8 存储
      $$ \text{应用层编码} \xrightarrow{\text{转码}} \text{数据库(UTF-8)} $$
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐