使用 liquibase 和 docker postgis/postgis 的错误编码

Posted

技术标签:

【中文标题】使用 liquibase 和 docker postgis/postgis 的错误编码【英文标题】:Wrong encoding using liquibase and docker postgis/postgis 【发布时间】:2021-12-12 13:18:51 【问题描述】:

我的 sprintboot 项目使用 docker postgresql db postgis/postgis 有一个非常奇怪的行为。

我用这个 docker 文件创建带有 db 的 docker 容器:

version: '3'
    services:
      project-postgresql:
        image: postgis/postgis:13-master
        volumes:
          - ./postgres-initdb/:/docker-entrypoint-initdb.d/
        environment:
          - POSTGRES_USER=xxx
          - POSTGRES_PASSWORD=xxx
        ports:
          - 9432:5432

数据库是用 UTF8 创建的:

project-postgresql_1  | The database cluster will be initialized with locale "en_US.utf8".
project-postgresql_1  | The default database encoding has accordingly been set to "UTF8".
project-postgresql_1  | The default text search configuration will be set to "english".

当我开始我的 springboot 项目时,会播放 liquibase 更改日志,并在数据库中插入一些内容,但编码似乎错误,并且所有重音都被特殊字符替换。

我检查了什么:

除了 intellij 和编码正确设置为 utf8 的其他编辑器中更改日志文件的编码。 在 db 控制台中,我尝试运行 SHOW SERVER_ENCODING,它是 UTF8 我尝试删除编码错误的行,然后从控制台的更改日志中复制过去插入,并且编码正确 尝试使用重音符号从应用程序中持久化一些数据,它可以工作。 尝试在启动应用程序之前运行 liquibase:update -Dfile.encoding=UTF-8,同样的编码问题。 我查看了目标后端\target\classes\db\更改日志的编码,它们是正确的。 尝试删除 docker 容器、镜像并从头开始。

我们是同一个项目的 3 个开发人员,问题仅在我的开发机器上,我使用相同堆栈的所有其他项目都在同一台机器上工作。

附加信息:

<liquibase.version>4.3.5</liquibase.version>
<liquibase-hibernate5.version>4.3.5</liquibase-hibernate5.version>
<testcontainers.version>1.15.3</testcontainers.version>
<hibernate-types.version>2.10.2</hibernate-types.version>

您是否知道一种方法来显示 liquibase 在启动时播放的插入语句的输出?或者可能有另一个解决这个问题的想法?

更新

我尝试将 liquibase 版本从 4.3.5 更改为旧版本 (3.8.7),它可以工作。我还尝试从我的 .m2 文件夹中删除 liquibase 并再次导入版本 4.3.5 并再次出现同样的问题。

谢谢, 厄施

【问题讨论】:

【参考方案1】:

我们已经看到这个问题发生了,可能的解决方案是设置JAVA_OPTS 参数。此解决方案适用于使用 liquibase CLI 的用户。

For Windows:
set JAVA_OPTS=-Dfile.encoding=UTF-8 && liquibase update

For Linux:
JAVA_OPTS=-Dfile.encoding=UTF-8 liquibase update

【讨论】:

以上是关于使用 liquibase 和 docker postgis/postgis 的错误编码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Liquibase 的 Spring Boot 未在 Docker 中执行

JAVA SpringBoot:在 Docker 中,liquibase 插件运行时出现错误并且不执行更改日志

docker 使用 ltp分词和pos标注

Spring Boot 中的 Keycloak 无法应用 Liquibase 补丁

Flyway和liquibase在一起? [关闭]

Liquibase:关系“databasechangeloglock”已经存在,使用 grails 插件和非默认模式