我需要将现有的数据库从Latin1转换为UTF8。看起来here
我想我已经看到了我需要做的所有事情。但是,其他links建议您必须实际导出数据,然后重新导入才能保留数据。实际需要什么来防止数据丢失?如果没有办法真正防止任何数据丢失(丢失的字符编码方式不同,则无法在两者之间映射),那么捕获这种情况的最佳方法是什么?我可以简单地做一个比较,还是有一个更快/更好的方法?

最佳答案

我相信所有256个latin1编码在utf8中都有一个映射。 (但肯定不是另一个方向。)因此,如果您拥有合适的代码,您将不会丢失数据。我建议您在冒险之前测试转换。

但是首先,我们需要确保您进行的转换正确。您有一个latin1列,在latin1中包含带一个字节的重音字母吗?查找带有重音符号的单元格SELECT LENGTH(col), CHAR_LENGTH(col) ...如果长度相同,则为一字节编码,例如latin1。

SELECT HEX(col) ...-e-acute(é)在latin1中为E9,在utf8中为C3A9。这很重要-如果您有E9,则需要将所有文本从latin1转换为utf8,并更改列的声明。如果您已经有C3A9,则您已经有utf8伪装为latin1;您需要更改声明而不修改字节。

第一种情况:ALTER TABLE tbl CONVERT TO CHARACTER SET utf8;-这会主动更改列中的必要字节。

第二种情况:alter table t modify c varbinary(...); alter table t modify c varchar(...) charset utf8;

关于该情况和其他情况的更多讨论:
mysql.rjweb.org/doc.php/charcoll

关于mysql - 将MySQL表从Latin1转换为UTF8时如何防止/检查数据丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29113564/

10-13 04:47