将 MySQL 表从 Latin1 转换为 UTF8 时如何 prevent/check 丢失数据

How to prevent/check for data loss when converting MySQL tables from Latin1 to UTF8

我需要将现有数据库从 Latin1 转换为 UTF8。正在寻找 here 我想我看到了我需要做的一切。但是,其他 links 建议您必须实际导出数据,然后重新导入以保留数据。实际上需要哪个来防止任何数据丢失?如果没有办法真正防止任何数据丢失(丢失是对不在两者之间映射的字符的不同编码),捕获所有实例的最佳方法是什么?我可以简单地做一个 diff,还是有 faster/better 方法?

我相信所有 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,那么你就已经有了伪装成 latin1 的 utf8;您需要更改声明 而不 修改字节。

第一种情况: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