MySQL修改字段类型
MySQL修改字段类型
引言
上线后字段长度不够、类型选错是常见需求,ALTER TABLE MODIFY可以改字段类型,但收缩长度或跨类型可能丢数据,大表执行还会长时间锁表,动手前必须备份和评估。
修改字段类型与长度
ALTER TABLE users
MODIFY COLUMN phone VARCHAR(20) NOT NULL DEFAULT '';
MODIFY重写该列完整定义,要把NOT NULL、默认值、字符集一起带上,否则会被重置。
修改字段名:CHANGE
ALTER TABLE users
CHANGE COLUMN tel phone VARCHAR(20) NOT NULL;
CHANGE既要写旧名也要写新名,顺便改类型,MODIFY只改类型不改名。
数字类型扩容
ALTER TABLE orders
MODIFY COLUMN amount DECIMAL(12,2) NOT NULL;
金额从DECIMAL(10,2)扩到(12,2)属于安全扩容,精度扩大不丢数据。
字符串加长
ALTER TABLE posts
MODIFY COLUMN title VARCHAR(255) NOT NULL;
varchar加长一般安全,注意字符集下长度是字符数不是字节。
大表谨慎执行
# 大表避开高峰,用pt-online-schema-change或gh-ost在线改
直接ALTER在InnoDB可能重建整表并锁写,百万行以上务必在线工具。
改前必查
SELECT COUNT(*) FROM users WHERE CHAR_LENGTH(phone) > 20;
先查有没有超长数据,收缩长度前先清理,否则直接截断或报错。
注意事项
- MODIFY要带全字段约束,别只写类型;
- CHANGE改名+改类型,MODIFY只改类型;
- 收缩长度、改窄类型可能截断丢数据,先备份;
- 大表用在线DDL工具,避开高峰;
- 改完用SHOW CREATE TABLE核对;
- 类型转换不兼容(如字符串转数字)会失败或变0,先清洗数据。
总结
MODIFY改字段类型需重写完整定义含约束默认值,CHANGE可同时改名,数字扩容和字符串加长相对安全,收缩长度跨类型前先查超长数据并备份,大表用pt-osc或gh-ost在线改避免锁表,改完SHOW CREATE核对。生产改表先备份再评估锁表风险。