mysql - 将 MySQL 表从 Latin1 转换为 UTF8 时如何防止/检查数据丢失

标签 mysql utf-8

我需要将现有数据库从 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,那么你已经有了伪装成 latin1 的 utf8;您需要更改声明而不修改字节。

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

第二种情况:alter table t修改c varbinary(...); alter table t 修改 c varchar(...) 字符集 utf8;

对该案例和其他案例的更多讨论: mysql.rjweb.org/doc.php/charcoll

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

相关文章:

使用 Spring + Hibernate 创建 MySQL 表

mysql - MariaDB - INNODB 在创建增量记录时跳过数字序列 - 为什么?

java - 将 utf-8 字符添加到字符串数组中

python - 如果我知道只会使用 Latin-1 字符,是否可以将 UTF8 编码字符插入 Latin-1 表?

mysql - 获取上周每个结果的计数摘要

MySQL 表 : BIT(1) not null default b' 1', however, always default to ' 0'

mysql - 为什么撤销权限失败?

unicode - UTF-8:语言使用多少字节来表示可见字符?

java - Heroku:GET 数据未以 UTF-8 形式检索

c++ - 是否有与 `memchr` 具有相似性能的函数可以将每个字符与位掩码匹配而不是完全相等?