我在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类完成的。
当插入一些不同于标记字符的记录时(例如('akikaurismäki','akikaurismäki')和('aki kaurismaki','aki kaurismaki'))我在第二条记录上获得重复密钥异常。我试图在执行之前在PreparedStatement中打印查询,它似乎是正确的(我试图从mysql命令行客户端手动执行此查询并获得任何错误)。
我怎么能解决这个问题? 提前致谢, 安东尼奥
答案 0 :(得分:0)
这是因为 - 如评论中所述 - mySQL的Unicode编码在比较中内部标注重音字符,导致
kaurismäki = kaurismaki
来自manual:
进一步说明,以下内容 两者都有平等 utf8_general_ci和utf8_unicode_ci (因为这有效果 比较或进行搜索时 请参见第9.1.7.8节“的例子 整理的影响“):
Ä = A Ö = O Ü = U
在我的理解中,使索引列ucs2_bin
应该排序。二进制比较不会规范重音字符。
答案 1 :(得分:0)
这可能是因为collation被设置为比较字符相同(如果它们是重音),或者甚至只是不同的情况(大写与小写)。您可能需要做的是将排序规则设置为二进制,如果您希望以这种方式比较重音字符。这样做的缺点是它也会区分大小写,这可能是也可能不是你想要的。我不认为对重音敏感有整理,但不区分大小写。
答案 2 :(得分:0)
这可能与表格的整理有关吗?
整理效果的例子 http://dev.mysql.com/doc/refman/5.0/en/charset-collation-effect.html
连接字符集和排序规则 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html