我需要将我的一个数据库中的所有表从latin1更改为utf-8(使用utf8_bin排序规则)。
我已经转储了数据库,从中创建了一个测试数据库,并运行以下内容而没有任何错误或警告:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATION utf8_bin
在真实数据库上重复此操作是否安全?通过检查数据似乎很好......
答案 0 :(得分:10)
有三种不同的案例需要考虑:
这是一致的情况:声明的charset和内容编码匹配。这是我在初步答复中所涵盖的唯一案例。
使用您建议的命令:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
请注意,CONVERT TO CHARACTER SET
命令仅出现在MySQL 4.1.2中,因此使用2005之前安装的数据库的任何人都必须使用导出/导入技巧。这就是为什么互联网上有如此多的遗留脚本和文档以旧方式进行的。
在这种情况下,您不希望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几年。在这种情况下,您必须结合使用这两种技术:
CONVERT TO
转换值。答案 1 :(得分:2)
直接转换可能会破坏任何包含非utf7字符的字符串。
如果你没有任何这些(即你的所有文字都是英文),你通常会没事的。
如果你有其中任何一个,你需要在初始运行中将所有char / varchar / text字段转换为blob,并在后续运行中将它们转换为utf8。
有关详细程序,请参阅此文章:
http://codex.wordpress.org/Converting_Database_Character_Sets
答案 2 :(得分:2)
我过去曾在生产数据库上做过几次这种情况(从旧的标准编码瑞典语转换为latin1),当MySQL遇到无法转换为目标编码的字符时,它会中止转换并保留在不变的状态。因此,我认为ALTER TABLE语句有效。