使用Spring,Hibernate和MySQL编码地狱

时间:2019-06-03 11:02:08

标签: mysql hibernate utf-8 character-encoding

我有一个编码问题,这使我发疯。我的网站支持英语和西班牙语两种语言。我的某些表(由hibernate生成)的排序规则为utf8_general_ci,另一些表的命名为latin1_swedish_ci,我不知道为什么。但是令我感到震惊的是,当人们使用“联系人”表单并在其中放入带有“?”的单词时,Spring Controller会接受它并向我发送一封可以(保存之前带有“?”)的电子邮件,然后再保存MySQL上的数据。但是,当我检查保存在MySQL中的哪个文件(并且我的“联系人”表具有utf8_general_ci排序规则)时,其中会出现一些可怕的符号来代替“ñ”字符,例如ÃlvaroNúñez Cabeza deVÃç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,并且我的表单的一部分效果很好,但其他人则将ÁlvarNúñezCabeza de Vaca表示为ÃlvarNúñez Cabeza de Vaca。 过滤器为:

<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

相同

1 个答案:

答案 0 :(得分:0)

听起来可能会出现多个问题。因此,请计划进行多个修复。

  • 始终使用UTF-8。 (Latin1可以使用英语+西班牙语,但是该行业正在逐步摆脱这种情况。)
  • MySQL的旧版本默认为latin1字符集(和latin1_swedish_ci归类)。
  • 对于MySQL使用CHARACTER SET utf8mb4(而不是utf8)。这相当于外部世界的UTF-8。在该配置的代码段中,将characterEncoding=utf8更改为characterEncoding=UTF-8
  • 您提到了utf8_general_ci-更改为utf8mb4...,并考虑了utf8mb4_unicode_520_ci(总体最佳)或utf8mb4_spanish_ciutf8mb4_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