MySQL:将排序规则从utf8\u bin更改为utf8\u unicode\u ce
给定一个完整的表,如何将排序规则从utf8\u bin更改为utf8\u unicode\u ce?由于“重复输入错误”,正常的“alter”查询不起作用。例如,有两个条目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 `
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中使用。我花了一些时间自己弄明白^^