无法在MySQL中插入非拉丁符号

我正在使用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 

Hibernate连接设置

 com.mysql.jdbc.Driver jdbc:mysql://localhost/E2012?characterEncoding=UTF8&useUnicode=true *** *** UTF8 

MySQL配置My.cnf

 [client] default-character-set=utf8 [mysqld] default-character-set=utf8 

甚至查询集名称utf-8也无法解决问题

感谢帮助!

在UTF-8中, Упячка实际上应该表示为\x423\x43F\x44F\x447\x43A\x430\xD0\xA3\xD0\xBF\xD1\x8F...表示使用ISO-8859-1错误地编码它们。

这是一个测试片段,certificate了这一点:

 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中,这是相应地在/conf/server.xml中设置HTTP连接器的URIEncoding属性的问题。 对于POST请求,客户端(webbrowser)应该已经足够聪明地使用JSP中指定的响应编码。 如果没有,那么您需要引入一个Filter来检查并设置请求编码。

有关更多背景信息,您可能会发现本文很有用。


除此之外,MySQL还有另一个Unicode字符问题。 它仅支持最多3个字节的 UTF-8字符,而不支持4个字节。 换句话说,仅支持65535个字符的BMP范围,而不支持。 例如,PostgreSQL完全支持它。 这可能不会伤害您的Web应用程序,但这当然要记住。

尝试在JDBC URL中使用UTF-8作为characterEncoding参数,而不是UTF8 (注意破折号)。

这发生在我之前。