我有一个编码问题,这让我发疯。我的网站支持英语和西类牙语。我的一些表(由 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úñez
是Núñ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 -- 主要与 ch
、ll
、ñ
有关 -- 您希望将它们视为“单独的字母”吗? (ch
应该在 cg
和 ci
之间排序还是在 cz
之后排序?等等)
对于 Java/JDBC/Hibernate/etc:?useUnicode=true&characterEncoding=UTF-8
关于mysql - 使用 Spring、Hibernate 和 MySQL 编码 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56426019/