Spring Boot with Maven 中 data.sql 的编码问题
Encoding issue with data.sql in Spring Boot with Maven
我正在尝试测试包含 Spring Data JPA 实体和存储库的数据访问库。
我的 SpringBootTests 创建了一个数据库并使用模式-test.sql 和数据-test.sql
自动填充它
在我的 application.properties:
spring.datasource.initialization-mode=always
spring.datasource.platform=test
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=none
在我的数据-test.sql中,我有一些拉丁字符。类似于:
INSERT INTO TABLE
(ID, NAME)
VALUES
(1, 'Donnée');
我的数据-test.sql 文件是 UTF-8 编码的。我用 Vim :se fenc
和 Eclipse 进行了双重检查:
当我从 Eclipse 启动我的 JUnit 测试时,一切正常,我的测试通过了。但是当我从 Eclipse 启动一个 maven 包目标时,我的测试失败了,如下所示:
Expecting:
<Optional[TableEntity [id=1, name=Donnée]]>
to contain:
<TableEntity [id=1, name=Donnée]>
but did not.
maven 似乎没有将我的数据-test.sql 文件解释为 UTF-8 编码文件,而是解释为 CP-1252 编码文件。
我在 pom.xml 中添加了以下内容:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
还有:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- Latin1 is still the default for .properties files -->
<propertiesEncoding>ISO-8859-1</propertiesEncoding>
</configuration>
</plugin>
在 Eclipse“运行 配置”中,我添加了以下 VM 参数:
-Dfile.encoding=UTF-8
而且我还在“通用”选项卡中强制编码:
在控制台中,我发现:
[DEBUG] Copying file application.properties
[DEBUG] file application.properties has a filtered file extension
[DEBUG] Using 'ISO-8859-1' encoding to copy filtered resource 'application.properties'.
[DEBUG] copy (...)\src\test\resources\application.properties to (...)\target\test-classes\application.properties
[DEBUG] Copying file data-test.sql
[DEBUG] file data-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'data-test.sql'.
[DEBUG] copy (...)\src\test\resources\data-test.sql to (...)\target\test-classes\data-test.sql
[DEBUG] Copying file schema-test.sql
[DEBUG] file schema-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'schema-test.sql'.
[DEBUG] copy (...)\src\test\resources\schema-test.sql to (...)\target\test-classes\schema-test.sql
是否有隐藏选项强制 Maven 或我的 SpringBootTest class 将 SQL 文件解释为旧的 CP-1252 或 ISO-8859-1 编码?
完整示例可用 on GitHub。
显示您的日食属性。
也应该是“UTF-8”。
在数据库中编码
检查 H2 数据库的编码。
所以设置hibernate.hbm2ddl.charset_name = "UTF-8"
当你使用 spring 引导时,你还可以设置如下:
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
编码问题似乎来自surefire插件。我在 pom.xml 的 <plugins/>
中添加了以下行:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
问题已解决:似乎 surefire 在其自己的 JVM 中启动了测试,采用 ISO-8859-1 编码。
固定项目可用on GitHub
我正在尝试测试包含 Spring Data JPA 实体和存储库的数据访问库。
我的 SpringBootTests 创建了一个数据库并使用模式-test.sql 和数据-test.sql
自动填充它在我的 application.properties:
spring.datasource.initialization-mode=always
spring.datasource.platform=test
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=none
在我的数据-test.sql中,我有一些拉丁字符。类似于:
INSERT INTO TABLE
(ID, NAME)
VALUES
(1, 'Donnée');
我的数据-test.sql 文件是 UTF-8 编码的。我用 Vim :se fenc
和 Eclipse 进行了双重检查:
当我从 Eclipse 启动我的 JUnit 测试时,一切正常,我的测试通过了。但是当我从 Eclipse 启动一个 maven 包目标时,我的测试失败了,如下所示:
Expecting:
<Optional[TableEntity [id=1, name=Donnée]]>
to contain:
<TableEntity [id=1, name=Donnée]>
but did not.
maven 似乎没有将我的数据-test.sql 文件解释为 UTF-8 编码文件,而是解释为 CP-1252 编码文件。
我在 pom.xml 中添加了以下内容:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
还有:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- Latin1 is still the default for .properties files -->
<propertiesEncoding>ISO-8859-1</propertiesEncoding>
</configuration>
</plugin>
在 Eclipse“运行 配置”中,我添加了以下 VM 参数:
-Dfile.encoding=UTF-8
而且我还在“通用”选项卡中强制编码:
在控制台中,我发现:
[DEBUG] Copying file application.properties
[DEBUG] file application.properties has a filtered file extension
[DEBUG] Using 'ISO-8859-1' encoding to copy filtered resource 'application.properties'.
[DEBUG] copy (...)\src\test\resources\application.properties to (...)\target\test-classes\application.properties
[DEBUG] Copying file data-test.sql
[DEBUG] file data-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'data-test.sql'.
[DEBUG] copy (...)\src\test\resources\data-test.sql to (...)\target\test-classes\data-test.sql
[DEBUG] Copying file schema-test.sql
[DEBUG] file schema-test.sql has a filtered file extension
[DEBUG] Using 'UTF-8' encoding to copy filtered resource 'schema-test.sql'.
[DEBUG] copy (...)\src\test\resources\schema-test.sql to (...)\target\test-classes\schema-test.sql
是否有隐藏选项强制 Maven 或我的 SpringBootTest class 将 SQL 文件解释为旧的 CP-1252 或 ISO-8859-1 编码?
完整示例可用 on GitHub。
显示您的日食属性。 也应该是“UTF-8”。
在数据库中编码
检查 H2 数据库的编码。
所以设置hibernate.hbm2ddl.charset_name = "UTF-8"
当你使用 spring 引导时,你还可以设置如下:
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
编码问题似乎来自surefire插件。我在 pom.xml 的 <plugins/>
中添加了以下行:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
问题已解决:似乎 surefire 在其自己的 JVM 中启动了测试,采用 ISO-8859-1 编码。
固定项目可用on GitHub