如何在Spring管理的MySQL JDBC连接上设置useUnicode = true和characterEncoding = utf8属性

时间:2013-09-27 13:57:26

标签: java spring spring-mvc jdbc

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

JDBC驱动程序应该在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 charset,以及某些内容这引起了最大的麻烦:添加<property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />。事实证明,在单个bean中设置两个connectionProperties实际上是不可能的,因为......在任何地方都没有提到的分隔字符(bean会尝试将其读作为试图将yes;characterEncoding=utf8设置为{{1}的值}})。所以我的问题是:我如何utf8?

5 个答案:

答案 0 :(得分:34)

问题可能是由指定 utf8 而不是 UTF-8 引起的。来自Using Character Sets and Unicode

  

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

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

  

JDBC:MySQL的://本地主机:3306 /了useUnicode = YES&安培;的characterEncoding = UTF-8

答案 1 :(得分:6)

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

将其放入application.properties:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

答案 2 :(得分:5)

你有没有尝试过:

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

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

答案 3 :(得分:2)

我在使用Spring-boot +嵌入式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

答案 4 :(得分:1)

我浪费时间生成utf-8表。以上不适用于我。最后我改变了我的mysql配置文件&amp;它就像一个魅力。如果你在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服务。