【问题标题】:Encoding problems in Mysql databaseMysql数据库中的编码问题
【发布时间】:2011-01-15 13:10:13
【问题描述】:

我在 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;

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

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

我该如何解决这个问题? 提前致谢, 安东尼奥

【问题讨论】:

  • 这可能是因为ucs2 在比较中内部将重音字符标准化,导致kaurismäki = kaurismaki。我不知道是否有不显示这种行为的 16 位替代字符集
  • 感谢 Pekka 的回复 它既不适用于 utf8_general_ci,也不适用于 utf_unicode_ci。在 mysql 命令行客户端中插入的相同查询没有错误,这真的很奇怪..
  • 不,这两个排序规则就像 ucs2 一样工作,他们无法解决这个问题。按照以下建议尝试 ucs2_bin

标签: java mysql unicode mysql-connector


【解决方案1】:

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

 kaurismäki = kaurismaki

来自manual

为了进一步说明,以下 双方平等 utf8_general_ci 和 utf8_unicode_ci (对于这在 比较或进行搜索时, 请参见第 9.1.7.8 节,“ 整理效果”):

Ä = A 
Ö = O 
Ü = U

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      整理效果示例 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-26
        • 2021-11-21
        • 2017-04-06
        • 2019-06-25
        • 2023-03-29
        • 1970-01-01
        • 2021-01-22
        • 2019-05-30
        相关资源
        最近更新 更多