2

我在 Mysql 5.1 模式中有一个表。创建此表的语句是:

CREATE TABLE `prova` (

  `id` varchar(150) NOT NULL,
  `name` varchar(150) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)

) ENGINE=InnoDb DEFAULT CHARSET=ucs2;

我还有一个在 Ubuntu 10.10 上运行的 Java 应用程序,它在这个由 Connector/J 5.1.14 接口的表中写入记录。插入记录是使用 Prepared Statement 类完成的。

当插入一对标记字符不同的记录时(例如('aki kaurismäki','aki kaurismäki')和('aki kaurismaki','aki kaurismaki')),我在第二条记录上得到一个重复键异常。我尝试在执行前在 PreparedStatement 中打印查询,这似乎是正确的(我尝试从 mysql 命令行客户端手动执行此查询并得到任何错误)。

我该如何解决这个问题?在此先感谢,安东尼奥

4

3 回答 3

0

这是因为 - 正如评论中所说 - mySQL 的 Unicode 编码在比较中内部规范化重音字符,导致

 kaurismäki = kaurismaki

手册

为了进一步说明,以下等式在 utf8_general_ci 和 utf8_unicode_ci 中都成立(对于比较或搜索时的效果,请参见第 9.1.7.8 节,“整理效果的示例”):

Ä = A 
Ö = O 
Ü = U

据我了解,制作索引列ucs2_bin应该对其进行排序。二进制比较不会标准化重音字符。

于 2011-01-15T13:39:14.270 回答
0

这可能是因为排序规则设置为比较相同的字符,如果它们有重音,甚至只是不同的大小写(大写与小写)。如果您希望以这种方式比较重音字符,您可能需要做的是将排序规则设置为二进制。这样做的缺点是它也会区分大小写,这可能是也可能不是您想要的。我认为没有区分重音但不区分大小写的排序规则。

于 2011-01-15T13:52:31.103 回答
0

也许这与表格的排序有关?

整理效果示例 http://dev.mysql.com/doc/refman/5.0/en/charset-collat ​​ion-effect.html

连接字符集和排序规则 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

于 2011-01-15T13:55:46.370 回答