MySQL 在不改变结构的情况下转换为 UTF8

Sco*_*oks 3 mysql replication utf-8

我有一个相当大的数据库,我试图将其从字符集和排序规则转换latin1/latin1_swedish_ciutf8mb4/utf8mb4_unicode_ci. 我希望设置复制到从站,运行转换,然后在完成后提升从站以避免停机。

我注意到在运行查询时...

ALTER TABLE `sometable` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

... MySQL的自动转换textmediumtextmediumtextlongtext

有没有办法关闭这个功能?MySQL有这个特性很好,但问题是它破坏了复制,因为slave上的表结构与master不同。

egg*_*yal 9

ALTER TABLE语法下所述:

对于数据类型为VARCHAR或其中一种的列TEXTCONVERT TO CHARACTER SET将根据需要更改数据类型,以确保新列的长度足以存储与原始列一样多的字符。例如,一TEXT列有两个长度字节,用于存储列中值的字节长度,最大为 65,535。对于一latin1 TEXT列,每个字符需要一个字节,因此该列最多可以存储 65,535 个字符。如果将列转换为utf8,则每个字符最多可能需要三个字节,最大可能长度为 3 × 65,535 = 196,605 个字节。该长度不适合TEXT列的长度字节,因此 MySQL 会将数据类型转换为MEDIUMTEXT,这是长度字节可以记录值 196,605 的最小字符串类型。同样,VARCHAR列可能会转换为MEDIUMTEXT.

为避免刚刚描述的类型的数据类型更改,请勿使用CONVERT TO CHARACTER SET. 相反,用于MODIFY更改单个列。例如:

ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)