【问题标题】:Cannot insert non latin symbols in MySQL无法在 MySQL 中插入非拉丁符号
【发布时间】:2011-02-15 06:52:09
【问题描述】:

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

休眠连接设置

<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 也无法解决问题

感谢您的帮助!

【问题讨论】:

  • 在数据库中,触发 SHOW VARIABLES LIKE 'collation%' 并将结果粘贴到此处。
  • collat​​ion_connection utf8_general_ci collat​​ion_database utf8_general_ci collat​​ion_server utf8_general_ci

标签: java mysql unicode encoding


【解决方案1】:

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

这是一个证明这一点的测试 sn-p:

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 connectorURIEncoding 属性的问题。对于 POST 请求,这应该已经由足够聪明的客户端(网络浏览器)处理,以使用 JSP 中指定的响应编码。如果没有,那么您需要引入 Filter 其中 checkssets 请求编码。

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


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

【讨论】:

  • 我正在使用单元测试来测试编码。我尝试过不同的文件编码:utf-8 和 ISO-8859-1 甚至 MacCyrillic(我使用 OS X)。都没有成功。
【解决方案2】:

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

我以前也遇到过这种情况。

【讨论】:

  • 事实上,在你的例子中,无论你有UTF8,我都把它作为UTF-8
  • utf8 没有破折号它是几个小时实验的结果:有破折号,没有破折号,大写或小写。不幸的是,所有的实验都是不合理的 :(
猜你喜欢
  • 2015-06-26
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多