docker启动官方Postgres中文排序非预期,自定义区域字符集

项目场景:

docker-compose.yml

version: "3"
services:
  postgres:
    image: postgres:11.6
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
    ports:
        - 5432:5432
    volumes:
      - /tmp/postgresql:/var/lib/postgresql/data

使用docker进行部署postgres,直接使用官方镜像进行启动。

问题描述:

碰到字段排序,中文字符未按照预期排序。查看发现官网镜像默认系统是Debian,系统字符集是:en_US.utf8 , 查看日志postgres进行初始化时默认使用:

postgres | The database cluster will be initialized with locale “en_US.utf8”.
postgres | The default database encoding has accordingly been set to “UTF8”.
postgres | The default text search configuration will be set to “english”.

创建数据库默认使用template1,查看发现其Collate和Ctype都是en_US.utf8。所以考虑可以创建数据库时可自定义配置:

create database test03 encoding 'UTF8' lc_collate 'zh_CN.utf8' lc_ctype 'zh_CN.utf8'  template template0;

但是此时发现并没有zh_CN.utf8,进到容器中执行locale -a 发现系统中确实没zh_CN.utf8,所以需要安装执行dpkg-reconfigure locales,选择zh_CN.utf8en_US.utf8,然后此时就可以正常使用中文排序了。但是此时还有两个问题:

  • 一旦重新创建新的容器问题依旧
  • 创建数据库时若使用默认不指定则问题也存在

而且查询资料发现此数据库的Collate和Ctype一旦创建不可修改,所以换种思路打包自己的镜像,上传到私服使用。

解决方案:

build镜像,自定义Locale ,将默认语言环境设置为zh_CN.utf8

Dockerfile:

    FROM postgres:11.6
    RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
    ENV LANG zh_CN.utf8

打包镜像:

docker build -t tuine/postgres .

更改docker-compose.yml,image: tuine/postgres,然后进行启动docker-compose up发现日志输出变成了中文,所有默认都改为了zh_CN.utf8,此时中文排序也按预期进行了。完美!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值