【问题标题】:mySQL: utf8 charset on index table and duplicate key errormySQL:索引表上的 utf8 字符集和重复键错误
【发布时间】:2014-02-23 15:04:58
【问题描述】:

当使用以 utf8 编码的 varchar 字段作为主键时,我预计 mySQL 会出现奇怪的行为。对于在我的开发环境中不相等的字符串,它会因重复键错误而失败。

一个简短的例子:

SET NAMES 'utf8';

CREATE TABLE `test` (
  `id` varchar(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` (`id`) VALUES ('das'), ('daß');

失败并出现错误:Duplicate entry 'daß' for key 'PRIMARY'.

我在 ubuntu 13.10 上使用默认配置运行 mySQL 5.5.35。

在另一个 mySQL Server(版本 5.0.95)上,相同的查询没有失败。这是因为 mySQL 版本还是有设置索引表编码的配置选项?

我在尝试将 mySQL 转储从生产服务器导入我的开发环境时遇到了这个问题。

【问题讨论】:

    标签: mysql utf-8


    【解决方案1】:

    当您使用德语字符时,您应该使用排序规则utf8_unicode_ci,根据此错误中的讨论:Bug #39816 German collation under utf8_unicode_ci is incorrect

    尽管有那个 bug 的标题,我只是在 5.6.15 上测试了这个,你的测试用例有效,而默认的 unicode 排序规则不起作用:

    CREATE TABLE `test` (
      `id` varchar(5) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_unicode_ci;
    
    INSERT INTO `test` (`id`) VALUES ('das'), ('daß');
    

    PS:我建议您在开发环境中使用与生产环境相同的所有软件版本,或者至少共享相同的主要版本。如果您在 5.5 中开发,然后尝试部署到 5.0,则必然会遇到其他不兼容问题。

    【讨论】:

    • 是的,这行得通。但是我仍然很困惑为什么使用 phpmyadmin 转储无法导入。 phpmyadmin 是否在导出时缺少 DEFAULT COLLATE,或者 mysql 5.0.x 处理此问题的方式不同,或者我的两个 mysql 服务器之间的 DEFAULT COLLATE 的全局设置是否不同?
    • 您可以在两台服务器上尝试SHOW CREATE DATABASE <databasename>,以便比较它们的默认字符集和排序规则。
    • 我发现我可以使用SHOW FULL COLUMNS <tablename> 获得字段排序规则。在两台服务器上,排序规则都是utf_general_ci。仍然不知道是什么导致了不同的行为。但我想我会在这里停止调查,因为我知道如何避免这个问题。
    【解决方案2】:

    问题是数据库没有重新识别daß它重新识别为das然后它变成了id的双重输入,而这只是一个测试表

    为什么不使用 autoincrenebt 和其他列名创建列 ID,其中您有这些值就像这样:

    SET NAMES 'utf8';
    CREATE TABLE `test` (
    `id` int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     `name` varchar(5)
     ) ENGINE=MYISAM DEFAULT CHARSET=utf8;
    
     INSERT INTO `test` (`name`) VALUES ('das'), ('daß');
    

    WATCH DEMO HERE


    您的问题是在 here 讨论的带有德语字符的错误。

    【讨论】:

      【解决方案3】:

      utf8_general_mysql500_ciutf8_general_ci 的区别在于ß 是否被视为等于s

      为了“修复”不兼容性,在 MySQL 5.1.62 / 5.5.21 / 5.6.5 中添加了排序规则 utf8_general_mysql500_ci。

      更多历史:http://mysql.rjweb.org/doc.php/charcoll#german_sharp_s_

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2021-10-25
        • 2021-09-02
        • 2018-07-29
        相关资源
        最近更新 更多