如何修复大型MySQL数据库上的UTF-8双编码数据
我有大约70个数据库,每个数据库包含750多个表(完全相同的结构),存储了大量数据,但问题是只有少数数据库设置为如何修复大型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) 但问题是我
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