【发布时间】:2010-06-14 23:11:55
【问题描述】:
我想在我的 Latin-1 字符数据库中删除新条目,只允许 UTF-8。我计划更改表并进行以下更改:
字符集:latin1 -> utf-8
排序规则:latin1_swdish_ci -> utf8_general_ci
有问题的表有 100 万行。这是一个好主意吗?这样做有什么风险?我尝试输入的非 utf-8 数据会发生什么情况?之前输入的不是 utf-8 的数据会怎样?
【问题讨论】:
我想在我的 Latin-1 字符数据库中删除新条目,只允许 UTF-8。我计划更改表并进行以下更改:
字符集:latin1 -> utf-8
排序规则:latin1_swdish_ci -> utf8_general_ci
有问题的表有 100 万行。这是一个好主意吗?这样做有什么风险?我尝试输入的非 utf-8 数据会发生什么情况?之前输入的不是 utf-8 的数据会怎样?
【问题讨论】:
您应该创建一个表副本,启动一个事务,插入旧表中的所有行,然后提交。最安全的方法。
总结一下:
CREATE TABLE duplicate ... (with the charset you like, etc)
SET AUTOCOMMIT=0;
START TRANSACTION;
INSERT INTO duplicate (...field-list...)
SELECT (...field-list...) from original_table;
COMMIT;
ALTER TABLE original RENAME TO original_backup;
ALTER TABLE duplicate RENAME TO original;
您必须小心使用唯一索引和自动增量字段。确保创建没有索引的重复表,以便快速插入,然后添加它们。
【讨论】:
另一种方法是更改字符集。以下 2 个语句应该转换您的表和所有列。
ALTER TABLE schema.table_name CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE schema.table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
如果您有外键,但会收到警告,因为您需要删除它们,请运行上述 SQL,然后重新创建它们。
【讨论】: