如何在内存数据库脚本中为 h2 指定字符编码?

Posted

技术标签:

【中文标题】如何在内存数据库脚本中为 h2 指定字符编码?【英文标题】:How to specify character encoding for h2 in memory database scripts? 【发布时间】:2019-04-15 13:17:38 【问题描述】:

我在 JPA 测试类中遇到字符编码问题。

在我的 h2 in memory database 我有这个 insert query

INSERT INTO MYTABLE (ID,FIELD1,FIELD2) VALUES (100,'ABC','Réclamation');

(请注意“Reclamation”中的“é”字符)

在我的 JUnit 测试中,我尝试断言 FIELD2 列的值等于“Réclamation”(如您所见)

但它失败并出现以下错误:

org.junit.ComparisonFailure:预期:R[é]clamation 但 是:R[�]clamation

我想知道是否有办法在persistence.xml文件中指定字符编码(也许?或其他地方)

这是我的 persistence.xml 测试文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence
    version="2.1"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="myTestPU">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>com.myproject.myclass1</class>
        <class>com.myproject.myclass2</class>
        <properties>
            <property
                name="javax.persistence.schema-generation.database.action"
                value="none" />
            <property
                name="javax.persistence.sharedCache.mode"
                value="ENABLE_SELECTIVE" />
            <property
                name="javax.persistence.jdbc.url"
                value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:ddl/schema.sql'\;RUNSCRIPT FROM 'classpath:ddl/data.sql'" />
            <property
                name="javax.persistence.jdbc.driver"
                value="org.h2.Driver" />
            <property
                name="hibernate.dialect"
                value="org.hibernate.dialect.H2Dialect" />
            <property
                name="hibernate.show_sql"
                value="true" />
            <property
                name="hibernate.format_sql"
                value="true" />
        </properties>
    </persistence-unit>
</persistence>

我已经尝试过这些解决方案:

在 persistence.xml 测试文件中添加以下属性:

<property
    name="hibernate.connection.characterEncoding"
    value="utf8" />
<property
    name="hibernate.connection.useUnicode"
    value="true" />
<property
    name="hibernate.connection.charSet"
    value="UTF-8" />

在我的 URL 属性中添加 ?useUnicode=yes&amp;amp;characterEncoding=UTF-8

它们都不适合我...

注意:我的应用程序中没有使用 spring 框架

【问题讨论】:

有什么办法可以解决我的编码问题吗? 【参考方案1】:

我在 import.sql 文件中进行了插入查询,但这些值的编码不正确。 添加属性 &lt;property name="hibernate.hbm2ddl.charset_name" value="UTF-8" /&gt; 帮我修好了。

如果您有旧版本的休眠(显然是 5.2.3 之前的版本),也许可以尝试此线程中的其他解决方案: Hibernate/JPA import.sql utf8 characters corrupted

【讨论】:

以上是关于如何在内存数据库脚本中为 h2 指定字符编码?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 和 JUnit 测试时如何一致地擦除内存数据库中的 H2 [重复]

如何在C中为char**动态分配内存

如何将格式为“3/22/2018 12:24:29 PM”的日期时间字符串格式化为sql时间戳以插入内存数据库中的h2?

播放框架2:内存数据库中的h2 mysql兼容模式:转义字符

如何在c中为指向char的指针数组分配内存

如何使用 H2 嵌入式数据库创建 H2 内存数据库