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

标签 java mysql unicode encoding

我正在使用 MySQL 5.1.45 版、Tomcat 5.5.28 和 Hibernate 3 编写网络应用

当我尝试保存包含非拉丁字符(例如Упячка)的字符串时,出现错误:

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 连接设置

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/E2012?characterEncoding=UTF8&amp;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 也无法解决问题

感谢您的帮助!

最佳答案

在 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 webapplication 并且这个字符串可能是用户输入的结果,你确定你已经注意了 HTTP 请求和响应编码吗?首先,在 JSP 中,您需要将以下内容添加到 JSP 顶部:

<%@ page pageEncoding="UTF-8" %>

这不仅以 UTF-8 格式呈现页面,而且还隐式设置了一个 HTTP Content-Type响应 header 指示客户端该页面使用 UTF-8 呈现,以便客户端知道它应该使用相同的编码显示任何内容并处理任何表单。

现在,HTTP 请求部分,对于 GET 请求,您需要配置相关的 servletcontainer。例如,在 Tomcat 中,这是设置 HTTP connectorURIEncoding 属性的问题。相应地在 /conf/server.xml 中。对于 POST 请求,客户端(web 浏览器)应该已经注意到这一点,它足够聪明,可以使用 JSP 中指定的响应编码。如果没有,那么您需要引入一个 Filtercheckssets请求编码。

有关更多背景信息,您可以找到 this article有用。


除此之外,MySQL 还有一个 Unicode 字符问题。它只支持 UTF-8 字符 up to 3 bytes , 而不是 4 个字节。也就是说,只支持65535个字符的BMP范围,外面不支持。例如 PostgreSQL 完全支持它。这可能不会损害您的 Web 应用程序,但一定要记住这一点。

关于java - 无法在 MySQL 中插入非拉丁符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762416/

相关文章:

java - hibernate关系在注释方式上找不到外键

JAVA_HOME路径问题

php - 建议我,更改默认的 Joomla 代码结构是个好主意吗?

mysql - 如何使用父表中的值将连接表连接到另一个连接表?

python - json.dump 中的 UnicodeDecodeError

Java : Get any day in a week from Calendar

java - elasticsearch Java API 中的多个平均聚合

mysql 选择如果 datediff 大于

language-agnostic - 检测字符串是否以 UTF-8 进行双重编码

c# - .Net 中带有希伯来字母和数字的 Unicode 字符串