MySQL:将排序规则从utf8\u bin更改为utf8\u unicode\u ce

MySQL:将排序规则从utf8\u bin更改为utf8\u unicode\u ce,mysql,collation,Mysql,Collation,给定一个完整的表,如何将排序规则从utf8\u bin更改为utf8\u unicode\u ce?由于“重复输入错误”,正常的“alter”查询不起作用。例如,有两个条目 David Hussa 及 我知道他们是一样的。有没有一种优雅的方式告诉MySQL“合并”入口?我应该提到,条目的id在其他表中用作参考,因此MySQL也必须遵守这一点。或者我必须用冗长而烦人的方式来做这件事:意味着手动合并每个副本,然后更改排序规则 该表如下所示: delimiter $$ CREATE TABLE `

给定一个完整的表,如何将排序规则从utf8\u bin更改为utf8\u unicode\u ce?由于“重复输入错误”,正常的“alter”查询不起作用。例如,有两个条目

David Hussa

我知道他们是一样的。有没有一种优雅的方式告诉MySQL“合并”入口?我应该提到,条目的id在其他表中用作参考,因此MySQL也必须遵守这一点。或者我必须用冗长而烦人的方式来做这件事:意味着手动合并每个副本,然后更改排序规则

该表如下所示:

delimiter $$

CREATE TABLE `authors` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_bin NOT NULL,
  `count` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`),
  FULLTEXT KEY `name_FULLTEXT` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=930710 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Stores all authors from dblp.xml.'$$

您可以删除重复的条目:

DELETE  a2
FROM    authors a1
JOIN    authors a2
ON      a2.name COLLATE UTF8_GENERAL_CI = a1.name COLLATE UTF8_GENERAL_CI
        AND a2.id < a1.id
UPDATE  child c
JOIN    (
        (
        SELECT  name COLLATE utf8_unicode_ci AS name_ci, MAX(id) AS mid
        FROM    authors
        GROUP BY
                name_ci
        ) pa
        JOIN    authors a
        ON      a.name COLLATE utf8_unicode_ci = name_ci
        )
ON      c.author = a.id
SET     author = mid;
  • 删除索引

  • 重新创建
    UNIQUE
    约束
  • 要更新引用表,请在删除条目之前运行以下查询:

    DELETE  a2
    FROM    authors a1
    JOIN    authors a2
    ON      a2.name COLLATE UTF8_GENERAL_CI = a1.name COLLATE UTF8_GENERAL_CI
            AND a2.id < a1.id
    
    UPDATE  child c
    JOIN    (
            (
            SELECT  name COLLATE utf8_unicode_ci AS name_ci, MAX(id) AS mid
            FROM    authors
            GROUP BY
                    name_ci
            ) pa
            JOIN    authors a
            ON      a.name COLLATE utf8_unicode_ci = name_ci
            )
    ON      c.author = a.id
    SET     author = mid;
    

    在所有参考表格上。

    感谢您重新措辞。但仍然存在一个问题:如果名称的id在另一个表中使用,并且名称是重复的。是否由“其他”id自动更新?我的意思是,如果“约翰·多伊”的id=1,“约翰·多伊”的id=2,那么第二个id就丢失了,对吗?@Aufwind:对不起,我一开始不明白你的意思。不,它不会自动更新名称。您必须运行我现在将编写的查询。非常感谢您的努力。它工作起来很不顺利。对于像我这样的其他Noobie,我想添加以下注释:child是引用表的名称,c是它的缩写,在最后一行的c.author中使用。我花了一些时间自己弄明白^^