【问题标题】:Can't persist UTF-8 Symbols using MySQL, JPA, Hibernate无法使用 MySQL、JPA、Hibernate 持久化 UTF-8 符号
【发布时间】:2015-01-22 18:05:18
【问题描述】:

有很多类似的问题,但没有一个能解决我的问题。 我将 JPA 与 hibernate 一起使用,并希望保存 UTF-8 字符。

我的 Maven 依赖项是:

       <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>

       <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>3.6.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.mysema.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>3.6.0</version>
        </dependency>

所以我使用 JPA 2.1 和 QueryDSL 3.6.0。 我的persistance.xml 是:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence


http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">


<persistence-unit name="thePersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <properties>

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/newsDB?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>

            <!--Hibernate properties-->
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

        </properties>
    </persistence-unit>
</persistence>

然后我使用 XAMPP MySQL 和 Apache

并添加

port= 3306
[client]
default-character-set = utf8

[mysqld]
init-connect='SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci

[mysql]
default-character-set = utf8

我的数据库排序规则是:

还有我的桌子:

当我打开记录器时,我看到了:

TRACE [main] (BasicBinder.java:81) - binding parameter [1] as [VARCHAR] - [Xelian]
TRACE [main] (BasicBinder.java:81) - binding parameter [2] as [VARCHAR] - [Описание]
TRACE [main] (BasicBinder.java:81) - binding parameter [3] as [CLOB] - [Content of the text .Чирипаха.]
TRACE [main] (BasicBinder.java:81) - binding parameter [4] as [BIGINT] - [112]
TRACE [main] (BasicBinder.java:81) - binding parameter [5] as [TIMESTAMP] - [Thu Jan 22 19:44:59 EET 2015]
TRACE [main] (BasicBinder.java:81) - binding parameter [6] as [VARCHAR] - [Title]
TRACE [main] (BasicBinder.java:81) - binding parameter [7] as [TIMESTAMP] - [Thu Jan 22 19:44:59 EET 2015]
TRACE [main] (BasicBinder.java:81) - binding parameter [8] as [BIGINT] - [0]

您可以看到这些值很奇怪Р§РёСЂРёРїР°С...Р°.。通过 phpmyadmin 我看到:

但是当我手动编辑它时

您可以看到我的数据库正确地显示了西里尔语 sumbols。所以我想知道问题出在哪里。

【问题讨论】:

    标签: mysql hibernate jpa querydsl


    【解决方案1】:

    所以。我在我的机器上卸载了 XAMPP 一个独立的 MySQL 服务器。然后运行 ​​MySQL 命令行客户端:

    show variables like "%character%";show variables like "%collation%";
    

    一切似乎都很好。 UTF-8 无处不在。然后导致数据库没有正确编码,仍然存在奇怪的符号。当我编辑它们时,西里尔字母插入正常。所以我怀疑 Hibernate persistance.xml。 我编辑它并放:

    <?xml version="1.0" encoding="UTF-8" ?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    
    
    <persistence-unit name="thePersistenceUnit" transaction-type="RESOURCE_LOCAL">
    
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/dnesdb?useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
    
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
    
            <property name="hibernate.connection.characterEncoding" value="utf8"/>
            <property name="hibernate.connection.useUnicode" value="true"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
        </properties>
    </persistence-unit>
    </persistence>
    

    现在 UTF-8 (Cyrillic) 可以持久化了。

    !!!并且不要忘记 BEFORE 创建数据库来设置 java 属性: -Dfile.encoding=UTF-8 如果创建了表,然后您设置了 -Dfile.encoding=UTF-8,问题将继续存在。所以删除表设置java编码属性,然后重新创建表。

    【讨论】:

    • 我遇到了同样的问题,您的解决方案效果很好:) 谢谢
    【解决方案2】:

    我认为您已经解决了这个问题,但我的建议可能对其他用户有用。

    我遇到了类似的问题。我尝试使用 stackoverflow 的许多建议,但无济于事。问题出在我的 IDE(Intellij IDEA)中我的项目的编码中。我的项目有 windows-1251 编码,我的数据库有 utf8 编码。您需要根据您的数据库更改项目编码。在 Intellij 中:设置->编辑器->文件编码->项目编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多