Mysql数据库中的编码问题

时间:2011-01-15 13:10:14

标签: java mysql unicode mysql-connector

我在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命令行客户端手动执行此查询并获得任何错误)。

我怎么能解决这个问题? 提前致谢, 安东尼奥

3 个答案:

答案 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