如何在 Spring 管理的 MySQL JDBC 连接上设置 useUnicode=true 和 characterEncoding=utf8 属性
Posted
技术标签:
【中文标题】如何在 Spring 管理的 MySQL JDBC 连接上设置 useUnicode=true 和 characterEncoding=utf8 属性【英文标题】:How to set useUnicode=true and characterEncoding=utf8 properties on Spring-managed MySQL JDBC connection 【发布时间】:2013-10-03 20:44:15 【问题描述】:我目前正在构建一个 Spring MVC webapp,而数据库是至关重要的后端部分。然而,无论出于何种原因,Spring 都拒绝将数据处理为 UTF-8。由于视图、资源和浏览器设置为 Unicode,数据库中的表也是如此(并且还阅读了很多类似的问题),我确定问题出在数据库连接上。
应该在connectionProperties中为JDBC Driver提供两项: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?
【问题讨论】:
也许characterEncoding=utf8
后面也需要一个分号,就像这里提到的:***.com/questions/13359683/…
@GriffeyDog 我确实放了一个分号,我没有从代码中复制它。它也不会让我在没有它的情况下进行编译(嗯,它会 - 但不久之后我会得到一个例外)。
【参考方案1】:
我浪费时间生成 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服务。
【讨论】:
【参考方案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
【讨论】:
【参考方案3】:请注意,如果您使用的是 Spring Boot,则可以使用 application.properties
中的属性来执行此操作,而不必向连接字符串添加额外的参数:
把这个放到application.properties中:
spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;
【讨论】:
谢谢。这是所有人的最佳答案。我有 Spring JPA; Hibernate & Embedded H2 db,每次从 import.sql 加载时,编码都搞砸了。 这对我不起作用,我很好奇它如何适用于其他人。官方文档也没有在可能的参数列表中提到它:docs.spring.io/spring-boot/docs/1.5.x/reference/html/… 这个属性在 Spring Boot 1.4 及更高版本中不再存在。见***.com/questions/40250678/… 确实,正如@WimDeblauwe 在 SO 中提到的另一个 Q,您可能需要切换到连接池特定属性,例如对于 Tomcat:spring.datasource.tomcat.connection-properties=myprops
,如 docs.spring.io/spring-boot/docs/current/reference/html/… 中所述【参考方案4】:
问题可能是由指定 utf8 而不是 UTF-8 引起的。来自Using Character Sets and Unicode:
在客户端指定字符编码时,请使用 Java 样式的名称。下表列出了 MySQL 字符集名称和对应的 Java 样式名称...
和 utf8 映射到 UTF-8。请尝试以下 JDBC URL:
jdbc:mysql://localhost:3306/?useUnicode=yes&characterEncoding=UTF-8
【讨论】:
【参考方案5】:你试过了吗:
<property name="connectionProperties">
<props>
<prop key="useUnicode">yes</prop>
<prop key="characterEncoding">utf8</prop>
</props>
</property>
另外:您是否尝试过连接数据库的简单 Java 客户端(控制台应用程序)? UTF-8 在这种情况下是否有效?
【讨论】:
我刚才试过你的解决方案,没有用。对于一个简单的控制台应用程序 - 我还没有(还)。我很快就会的。 您能否更具体地了解配置中的错误(如果有)?你还配置了哪个bean? (<bean class="...">
)
根本没有错误,这是问题之一!我得到的唯一一个是当我尝试指定单个属性值时。如上所述。我正在配置一个名为 dataSource 的 bean,其类为 org.springframework.jdbc.datasource.DriverManagerDataSource
,属性如上所述。
OK,DriverManagerDataSource.connectionProperties
确实是java.util.Properties
,所以上面的配置应该是正确的。 (我不确定单值案例;Spring 是透明地处理它还是抛出错误?什么版本的 Spring?)尝试命令行,我认为缩小问题范围(Java 或 DB)会很有用.
单值案例在运行时(即当我尝试访问需要数据库连接的网页时)抛出异常,显示“'yes;characterEncosing=utf8;'不是 useUnicode 可接受的值”。我会看看那个控制台应用程序。以上是关于如何在 Spring 管理的 MySQL JDBC 连接上设置 useUnicode=true 和 characterEncoding=utf8 属性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 和 XML 配置在 Spring Security 中配置 jdbc 身份验证管理器?