这是将MySQL表从latin1转换为utf-8的安全方法吗?

时间:2011-05-31 05:49:09

标签: mysql character-encoding collation

我需要将我的一个数据库中的所有表从latin1更改为utf-8(使用utf8_bin排序规则)。

我已经转储了数据库,从中创建了一个测试数据库,并运行以下内容而没有任何错误或警告:

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATION utf8_bin

在真实数据库上重复此操作是否安全?通过检查数据似乎很好......

3 个答案:

答案 0 :(得分:10)

有三种不同的案例需要考虑:

这些值确实使用Latin1

进行编码

这是一致的情况:声明的charset和内容编码匹配。这是我在初步答复中所涵盖的唯一案例。

使用您建议的命令:

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin

请注意,CONVERT TO CHARACTER SET命令仅出现在MySQL 4.1.2中,因此使用2005之前安装的数据库的任何人都必须使用导出/导入技巧。这就是为什么互联网上有如此多的遗留脚本和文档以旧方式进行的。

已使用utf8

对值进行编码

在这种情况下,您不希望mysql转换任何数据,您只需要更改列的元数据。

为此,您必须先将类型更改为BLOB,然后更改为每列的TEXT utf8,以便没有值转换:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8

这是推荐的方式,并在Alter Table Syntax Documentation中明确记录。

值使用不同的编码

在某些Linux发行版上,默认编码是Latin1几年。在这种情况下,您必须结合使用这两种技术:

  • 使用BLOB类型技巧
  • 修复表元数据
  • 使用CONVERT TO转换值。

答案 1 :(得分:2)

直接转换可能会破坏任何包含非utf7字符的字符串。

如果你没有任何这些(即你的所有文字都是英文),你通常会没事的。

如果你有其中任何一个,你需要在初始运行中将所有char / varchar / text字段转换为blob,并在后续运行中将它们转换为utf8。

有关详细程序,请参阅此文章:

http://codex.wordpress.org/Converting_Database_Character_Sets

答案 2 :(得分:2)

我过去曾在生产数据库上做过几次这种情况(从旧的标准编码瑞典语转换为latin1),当MySQL遇到无法转换为目标编码的字符时,它会中止转换并保留在不变的状态。因此,我认为ALTER TABLE语句有效。