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核对。生产改表先备份再评估锁表风险。


emer 发布于  2026-10-20 07:16