You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Zonky Embedded Postgres中非拉丁字符编码乱码问题?

Zonky Embedded Postgres 配合Liquibase插入非拉丁字符乱码问题排查

以下是几个可能的原因及对应的解决方法:

1. 嵌入式Postgres数据库未指定UTF8编码

真实环境的Postgres通常默认使用UTF8编码,但Zonky启动的嵌入式数据库如果没有显式指定编码,可能会继承系统区域设置的默认编码(比如ISO-8859-1等),导致非拉丁字符存储时乱码。

在application-test.yml中添加Zonky启动参数,强制数据库使用UTF8编码:

spring:
  embedded:
    postgres:
      init-args:
        - --encoding=UTF8
        - --lc-collate=en_US.UTF-8
        - --lc-ctype=en_US.UTF-8
  datasource:
    url: jdbc:postgresql://localhost:${embedded.postgres.port}/testdb?characterEncoding=UTF-8

2. Liquibase变更集文件编码不匹配

检查你的Liquibase变更集文件(XML/SQL格式)是否以UTF8编码保存。如果文件本身是其他编码(比如GBK),Liquibase读取时会出现转码错误,导致插入的字符乱码。

  • 确保变更集文件保存为UTF8编码(无BOM);
  • 如果是SQL格式的变更集,可在文件开头添加强制编码的语句:
    SET client_encoding = 'UTF8';
    
  • 也可在application-test.yml中指定Liquibase的文件编码:
    liquibase:
      parameters:
        fileEncoding: UTF-8
    

3. JDBC连接未明确指定字符集

虽然Postgres JDBC驱动默认使用UTF8,但测试环境的数据源配置可能缺少明确的字符集参数,导致会话编码异常。在application-test.yml的数据源URL中补充字符集参数:

spring:
  datasource:
    url: jdbc:postgresql://localhost:${embedded.postgres.port}/testdb?characterEncoding=UTF-8&stringtype=unspecified

4. Zonky版本兼容问题

旧版本的Zonky Embedded Postgres可能存在默认编码配置的bug,尝试升级Zonky的依赖版本到最新稳定版,比如在pom.xml中:

<dependency>
  <groupId>io.github.zonky.test</groupId>
  <artifactId>embedded-postgres-spring-boot-starter</artifactId>
  <version>2.2.0</version>
  <scope>test</scope>
</dependency>

内容的提问来源于stack exchange,提问作者fckNewbee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:30:46