如何修复大型MySQL数据库上的UTF-8双编码数据

如何修复大型MySQL数据库上的UTF-8双编码数据,mysql,utf-8,Mysql,Utf 8,我有大约70个数据库,每个数据库包含750多个表(完全相同的结构),存储了大量数据,但问题是只有少数数据库设置为utf8,其他数据库设置为latin1,因此latin1数据库为接近初報 因此,我想将所有数据库转换为utf8mb4,以便保存正确的数据,但这显然需要现有的双编码数据才能转换为utf8mb4 我有以下sql查询来转换数据 使用utf8更新表格集合col=IFNULL(CONVERT(CONVERT(CONVERT)(CONVERT(col使用拉丁语1)使用二进制),col) 但问题是我

我有大约70个数据库,每个数据库包含750多个表(完全相同的结构),存储了大量数据,但问题是只有少数数据库设置为
utf8
,其他数据库设置为
latin1
,因此
latin1
数据库为
接近初報

因此,我想将所有数据库转换为
utf8mb4
,以便保存正确的数据,但这显然需要现有的双编码数据才能转换为
utf8mb4

我有以下sql查询来转换数据

使用utf8更新表格集合col=IFNULL(CONVERT(CONVERT(CONVERT)(CONVERT(col使用拉丁语1)使用二进制),col)

但问题是我的数据库非常大,这将花费大量时间将数据转换为
utf8
。那么,有没有简单的方法可以一次性更新整个数据库的数据,或者其他简单的方法呢


非常感谢

您真的应该使用
utf8mb4
进行中文
;有些汉字在MySQL的3字节utf8中无法表示

略短的表达式:

CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4)
哪种情况?请参见——您可能需要以下第三种情况:

  • 字符集latin1,但其中包含utf8字节;修复字符集时不使用字节: 首先,假设您对tbl.col有以下声明:

    col VARCHAR(111)字符集拉丁1不为空

然后,要在不更改字节的情况下转换列,请执行以下操作:

ALTER TABLE tbl MODIFY COLUMN col VARBINARY(111) NOT NULL;
ALTER TABLE tbl MODIFY COLUMN col VARCHAR(111) CHARACTER SET utf8mb4 NOT NULL;
注意:如果从文本开始,请使用BLOB作为中间定义。由于
ALTER
需要知道所有细节(大小、空值等),因此动态创建
ALTER
非常麻烦

  • 具有双重编码的字符集utf8mb4:

    使用utf8mb4更新tbl SET col=转换(二进制(转换(col使用拉丁语1))

  • 使用双重编码的字符集latin1:进行两步更改,然后修复双重编码

浏览表格

SELECT CONCAT("UPDATE ", table_schema, ".", table_name, "
         SET ", column_name, " = CONVERT(BINARY(CONVERT(", column_name, 
         " USING latin1)) USING utf8mb4);")
    FROM information_schema.columns
    WHERE character_set_name = 'latin1';
然后复制并粘贴输出。(或者编写一个存储过程来执行。)


警告:
选择
可能会选择更多的表/列。

您可以使用perl、php或python吗?您好,@DanielE。是的,我正在使用PHP7.2