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

nfm*_*nfm 10 mysql collation character-encoding

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

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

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATION utf8_bin
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*ome 10

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

这些值确实使用Latin1编码

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

使用您建议的命令:

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Run Code Online (Sandbox Code Playgroud)

请注意,该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
Run Code Online (Sandbox Code Playgroud)

这是推荐的方法,并在Alter Table语法文档中明确记录.

值使用不同的编码

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

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