26

我目前正在构建一个 Spring MVC webapp,数据库是至关重要的后端部分。然而,无论出于何种原因,Spring 都拒绝将数据处理为 UTF-8。由于视图、资源和浏览器设置为 Unicode,数据库中的表也是如此(并且还阅读了很多类似的问题),我确定问题出在数据库连接上。

JDBC Driver 应该在 connectionProperties 中提供两项:useUnicode(设置为yes和 characterEncoding(设置为utf8)。但事实证明,这是不可能的。

JDBC 是一个 bean,因此通过 XML 文件进行配置,如下所示:

<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/<database>" />
<property name="username" value="<not telling>" />
<property name="password" value="<not telling>" />

此设置将从数据库中提取的所有非字母数字字符(例如箭头或希腊字母)转换为问号。这显然是不可接受的。

我尝试了多种解决方案:将 JDBC URL 指定为jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8,使用my.ini文件(和 MySQL Workbench)来强制数据库中的所有内容默认为utf8字符集,以及导致最大头痛的事情:添加<property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. 事实证明,在单个 bean 中设置两个 connectionProperties 实际上是不可能的,因为......任何地方都没有提到分隔字符(bean 将尝试将其读取为试图设置yes;characterEncoding=utf8为 的值useUnicode)。所以我的问题是:我如何使用utf8?

4

5 回答 5

38

该问题可能是由指定utf8而不是UTF-8引起的。从使用字符集和 Unicode

在客户端指定字符编码时,请使用 Java 样式的名称。下表列出了 MySQL 字符集名称和相应的 Java 样式名称...

utf8映射到UTF-8。尝试以下 JDBC URL:

jdbc:mysql://localhost:3306/?useUnicode=yes&characterEncoding=UTF-8

于 2013-12-06T11:50:54.977 回答
11

请注意,如果您使用的是 Spring Boot,则可以使用其中的属性来执行此操作,application.properties而不必向连接字符串添加额外的参数:

将其放入 application.properties:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
于 2016-04-13T15:14:38.350 回答
6

你试过了吗:

<property name="connectionProperties">
    <props>
        <prop key="useUnicode">yes</prop>
        <prop key="characterEncoding">utf8</prop>
    </props>
</property>

另外:您是否尝试过连接到数据库的简单 Java 客户端(控制台应用程序)?UTF-8 在这种情况下是否有效?

于 2013-09-27T14:09:27.797 回答
6

我在使用 Spring-boot + Embedded H2 + Hibernate 时遇到了同样的问题,但问题出在读取 SQL 脚本的那一刻。(data.sql)每次读取任何外来字符时,数据库中的编码都会被破坏。

将以下行添加到我的 application.properties 解决了该问题:

spring.datasource.sqlScriptEncoding=UTF-8

如果可能,请转到控制台并手动添加一些数据。如果外来字符以正确的方式出现。那么这个解决方案可能适合你。

我在这里找到了解决方案:

http://ufasoli.blogspot.com/2014/07/spring-boot-jpa-broken-encoding-on.html

于 2017-08-06T12:57:48.523 回答
2

我浪费时间生成 utf-8 表。以上非对我有用。最后我改变了我的 mysql 配置文件,它就像一个魅力。如果你在linux(我在ubuntu,我确定有一个windows的文件)​​打开文件/etc/mysql/my.cnf并添加以下代码。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

不要忘记重启mysql服务。

于 2017-11-30T07:23:40.027 回答