mysql - 使用 Spring、Hibernate 和 MySQL 编码 hell

标签 mysql hibernate utf-8 character-encoding

我有一个编码问题,这让我发疯。我的网站支持英语和西类牙语。我的一些表(由 hibernate 生成)具有排序规则 utf8_general_ci,其他一些表(我不知道为什么)具有 latin1_swedish_ci。但令我震惊的是,当人们使用我的联系人表单并在其中放入一个带有“ñ”的单词时,我的 Spring Controller 会接受它并向我发送一封电子邮件,该电子邮件在保存之前没问题(我的意思是它有 ñ) MySQL 上的数据。但是,当我检查 MySQL 中保存的内容(并且我的联系人表有 utf8_general_ci 排序规则)时,里面会出现一些可怕的符号替换“ñ”字符,例如 Álvaro Nàñez Cabeza de Váca。继续,jsp页面声明了UTF-8,表是utf8_general_ci,hbn也声明了utf-8:

# hibernate props
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show.sql=true
hibernate.hbm2ddl.auto=update
hibernate.format_sql=true
# hibernate props added to fix 4bytes encoded characters
hibernate.connection.CharSet=utf8mb4
hibernate.connection.characterEncoding=utf8
hibernate.connection.useUnicode=true

但是所有这些都没有按预期工作。

非常欢迎任何帮助。

解决方案:至少对我来说,唯一有效的修复方法是在 web.xml 中添加过滤器。我很确定有更好的方法以更优雅的方式解决编码问题,但在我的情况下,所有内容都配置为使用 UTF-8 并且我的表单部分工作良好,但其他人将 Álvar Núñez Cabeza de Vaca 显示为 Álvar Núñez卡贝萨·德·瓦卡。 过滤器是:

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

正如这篇文章中的那样Spring MVC UTF-8 Encoding

最佳答案

听起来可能存在多个问题。因此,计划进行多项修复。

  • 始终使用 UTF-8。 (Latin1 适用于英语 + 西类牙语,但该行业正在远离这一点。)
  • 旧版本的 MySQL 默认为 latin1 字符集(和 latin1_swedish_ci 排序规则)。
  • 对 MySQL 使用字符集 utf8mb4(不是 utf8)。这相当于外界的UTF-8。在该配置片段中,将 characterEncoding=utf8 更改为 characterEncoding=UTF-8
  • 您提到了 utf8_general_ci - 更改为 utf8mb4... 并考虑 utf8mb4_unicode_520_ci(总体最佳)或 utf8mb4_spanish_ci > 或 utf8mb4_spanish2_ci
  • NúñezNúñez 的 Mojibake。当系统的一部分使用 latin1 而另一部分使用 UTF-8 时,就会发生这种情况。
  • 如果您需要恢复困惑的数据(由于 Mojibake),我们可以讨论。最好重新开始,始终使用 UTF-8/utf8mb4。

有关诊断 Mojibake 等的更多信息:Trouble with UTF-8 characters; what I see is not what I stored

对于排序规则差异:http://mysql.rjweb.org/utf8_collations.html -- 主要与 chllñ 有关 -- 您希望将它们视为“单独的字母”吗? (ch 应该在 cgci 之间排序还是在 cz 之后排序?等等)

对于 Java/JDBC/Hibernate/etc:?useUnicode=true&characterEncoding=UTF-8

关于mysql - 使用 Spring、Hibernate 和 MySQL 编码 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56426019/

相关文章:

jQuery 格式化日期范围

mysql - 选择一列中具有非空值的最新记录

mysql - 在 mysql workbench 5.5 上定义事件名称时出现错误

hibernate - 如何在可以为空的字段上创建条件?

Axis2 找不到 Hibernate 配置文件

mysql - 保存非英语字符时出现问题

mysql - 得到??????使用 JSP 代替来自 MySQL 数据库的印地语文本

MYSQL:多重连接

python - 如何对字典中的所有值进行编码?

hibernate - org.hibernate.QueryException : not an association