我需要将现有数据库从Latin1转换为UTF8。看here 我想我看到了我需要做的一切。但是,其他links建议您必须实际导出数据,然后重新导入以保留数据。实际上需要哪种方法来防止任何数据丢失?如果没有办法真正防止任何数据丢失(丢失是对两者之间没有映射的字符的不同编码),捕获所有这些实例的最佳方法是什么?我能简单地做一个差异,还是有更快/更好的方式?
答案 0 :(得分:0)
我相信所有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