我正在使用MySQL版本5.1.45,Tomcat 5.5.28和Hibernate 3编写Web应用程序
当我尝试保存包含非拉丁字符的字符串(例如Упячка)时,会发生错误:
1589 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1366, SQLState: HY000
1589 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Incorrect string value: '\xD0\xA3\xD0\xBF\xD1\x8F...' for column 'name' at row 1
休眠连接设置
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/E2012?characterEncoding=UTF8&useUnicode=true</property>
<property name="connection.username">***</property>
<property name="connection.password">***</property>
<property name="hibernate.connection.charSet">UTF8</property>
MySQL配置My.cnf
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8
甚至查询集名称utf-8也无法解决问题
感谢您的帮助!
答案 0 :(得分:7)
在UTF-8中,Упячка
实际上应该表示为\x423\x43F\x44F\x447\x43A\x430
。 \xD0\xA3\xD0\xBF\xD1\x8F...
表示使用ISO-8859-1错误地编码了它们。
这是一个证明这一点的测试片段:
String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
System.out.printf("\\x%X", (int) c);
}
打印
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0
所以你的问题需要先解决一步。由于您正在讨论Java Web应用程序,并且此字符串可能是由用户输入引起的,您确定已经注意了HTTP请求和响应编码吗?首先,在JSP中,您需要将以下内容添加到JSP的顶部:
<%@ page pageEncoding="UTF-8" %>
这不仅以UTF-8呈现页面,而且还隐式设置HTTP Content-Type
响应头,指示客户端使用UTF-8呈现页面,以便客户端知道它应该显示任何内容和处理使用相同编码的任何表格。
现在,HTTP请求部分,对于GET请求,您需要配置相关的servletcontainer。例如,在Tomcat中,需要相应地设置URIEncoding
中/conf/server.xml
的{{1}}属性。对于POST请求,客户端(webbrowser)应该已经足够聪明地使用JSP中指定的响应编码。如果没有,那么您需要引入Filter
HTTP connector和checks请求编码。
有关更多背景信息,您可能会发现sets非常有用。
除此之外,MySQL还有另一个Unicode字符问题。它仅支持UTF-8字符this article,而不支持4个字节。换句话说,只支持65535个字符的BMP范围,不支持。例如PostgreSQL完全支持它。这可能不会损害您的Web应用程序,但这当然要记住。
答案 1 :(得分:1)
尝试将UTF-8
用于JDBC网址中的characterEncoding
参数,而不是UTF8
(请注意短划线)。
之前发生在我身上。