【发布时间】: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&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,但如果我知道重现您的问题不会太难,我可以这样做来进行试验。)