MySQL:将整理从utf8_bin更改为utf8_unicode_ce

时间:2011-04-01 15:55:46

标签: mysql collation

给定一个完整的表,如何将排序从utf8_bin更改为utf8_unicode_ce?由于“重复输入错误”,正常的“更改”查询不起作用。例如,有两个条目

David Hussa

David Hußa

我知道他们是一样的。是否有一种优雅的方式告诉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.'$$

1 个答案:

答案 0 :(得分:5)

您可以删除重复的条目:

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

请注意,如果您的桌子很大,这可能需要很长时间。

最好这样做:

  • 删除UNIQUE约束

  • 更改整理

  • name

  • 上创建一个简单的非唯一索引
  • 运行查询(不带COLLATE子句):

    DELETE  a2
    FROM    authors a1
    JOIN    authors a2
    ON      a2.name = a1.name
            AND a2.id < a1.id
    
  • 删除索引

  • 重新创建UNIQUE约束。

要更新引用表,请在删除条目之前运行此查询:

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;

所有引用表。