改表的字符集,DEFAULT CHARACTER SET 改不动老列
-- 只改表的默认值:以后新加的列用 utf8mb4,已有的列不动
ALTER TABLE t DEFAULT CHARACTER SET utf8mb4;
-- 把已有列和数据都转过去
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4;
-- 改单列的类型
ALTER TABLE t MODIFY COLUMN v BIGINT;后两种要改每一行的数据,只能走 COPY,期间不能写。
有个例外:VARCHAR 扩长度,只要长度前缀的字节数不变,就能 INPLACE。我在 utf8mb4 下试的:
ALTER TABLE d MODIFY s VARCHAR(60), ALGORITHM=INPLACE; -- 50 → 60:成功
ALTER TABLE d MODIFY s VARCHAR(70), ALGORITHM=INPLACE; -- 50 → 70:报错utf8mb4 一个字符最多 4 字节。VARCHAR(63) 以内最多 252 字节,长度前缀 1 字节;到 VARCHAR(64) 就超过 255 字节,前缀要变成 2 字节,行格式变了,只能 COPY。