【问题标题】:Hibernate doesn't encode UTF-8 when persisting objects to MySQL database将对象持久化到 MySQL 数据库时,Hibernate 不编码 UTF-8
【发布时间】:2016-01-16 19:36:54
【问题描述】:

我正在创建一个 Spring MVC Web 应用程序。 Hibernate 持久化到 MySQL 数据库的对象编码错误。数据来自 .jsp 页面表单,并使用 POST 方法传递给控制器​​方法。

我已经尝试应用提出的解决方案 here 和here,但它们似乎不起作用。

这是我在 JSP 页面上使用的标题:

<%@page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

这是我在应用程序中使用的数据库配置文件:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/database?useUnicode=yes&amp;characterEncoding=UTF-8
jdbc.username=root
jdbc.password=password

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=true

我还在我的 web.xml 文件中添加了一个 UTF-8 过滤器:

<filter>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

我还尝试通过在 MySQL Workbench 中运行命令来更改数据库的排序规则(尝试了 utf8、utf8_unicode_ci、utf8_polish_ci)。我也尝试仅更改一张表(包含 UTF-8 字符串的表)的排序规则。

这些都不起作用。 UTF-8 字符存储为“?”。我知道在持久化对象时会发生错误,因为我在持久化之前在控制台中打印了对象,并且 UTF-8 正确显示。所以我认为问题在于 Hibernate 配置和/或 MySQL 数据库配置。

如果有必要,我会提供额外的配置文件。

以下是相关表的 CREATE 语句:

CREATE TABLE `table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `string` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

【问题讨论】:

  • 我们可以知道您的 MySQL 架构是什么样的,是的 - 所涉及的字段类型是什么?
  • 数据库中的字段类型为 VARCHAR(255)。 Java 端的字符串。
  • 你能通过 MySQL 工作台存储非 ASCII 字符吗?如果这样做,您能否在 Java 应用程序中检索它们?尽可能缩小问题的范围是值得的。
  • 是的,我可以通过 MySQL 工作台存储非 ASCII 字符。我能够找回它们。只有当我使用 Hibernate 持久化它们时才会出现问题。
  • 对。在这种情况下,我建议将 Web 应用程序部分完全排除在外,并提供一个简短但完整的 console 应用程序示例,该应用程序只是初始化 Hibernate,然后使用硬编码存储一个值细绳。所有这一切都是为了减少问题的表面积......并让其他人更容易重现问题。 (我现在没有安装 MySQL,但如果我知道重现您的问题不会太难,我可以这样做来进行试验。)

标签: java mysql hibernate


【解决方案1】:

您是否在 mysql 上正确设置了排序规则?可以使用以下语句进行检查:

show variables like 'character%';
show variables like 'collation%';

允许在mysql服务器上使用unicode:

[mysqld]
character-set-server = utf8
character-set-filesystem = utf8

希望对您有所帮助。

【讨论】:

  • 那行得通。所以问题在于一般的 MySQL 配置设置,而不是一个模式。谢谢。
  • 不用担心,很高兴为您提供帮助。
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2014-09-25
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多