如何解决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
相关产品推荐
相关产品推荐

