MySQL 修改字段类型,核心是用 ALTER TABLE ... MODIFY COLUMN 或 ALTER TABLE ... CHANGE COLUMN 语句。选哪个取决于是否要同时改字段名——只改类型用
MODIFY;既要改类型又要改名字,用
CHANGE。
确认当前字段定义
执行前先查清楚原字段的完整定义,避免丢失属性(如 NOT NULL、DEFAULT、COMMENT 等):
SHOW CREATE TABLE 表名;
重点关注字段的类型、是否允许 NULL、默认值、自增、注释等。直接复制原定义再修改更稳妥。
使用 MODIFY COLUMN 修改类型(不改字段名)
语法简洁,适合仅调整数据类型或长度:
ALTER TABLE users MODIFY COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;必须写出完整的字段定义,包括约束(如 NOT NULL),否则可能被重置为 NULL 若原字段有 DEFAULT 值,新定义里也要显式写上,否则 DEFAULT 会被移除 修改为更小的类型(如 VARCHAR(255) → VARCHAR(50))需确保现有数据不超长,否则报错
使用 CHANGE COLUMN 修改类型(可同时改字段名)
语法多一个旧字段名参数,适合需要重命名的场景:
ALTER TABLE users CHANGE COLUMN user_name username VARCHAR(100) NOT NULL;即使不改名,也要重复写两次字段名:
CHANGE COLUMN col1 col1 新类型和 MODIFY 一样,所有约束都要重新声明,不能省略 如果字段有索引(尤其是主键或唯一索引),变更后索引仍有效,但要注意类型兼容性(如从 INT 改为 VARCHAR 可能导致索引失效)
注意事项与常见问题
大表修改可能锁表(尤其在 MySQL 5.6 之前),建议在低峰期操作,或使用ALGORITHM=INPLACE(支持时)减少影响 TEXT / BLOB 类型字段不能有默认值,修改时若加了 DEFAULT 会报错 修改 ENUM 或 SET 类型时,新增值必须用单引号包裹,且不能包含特殊字符 时间类型转换要小心:比如从 DATETIME 改为 TIMESTAMP,时区行为不同,历史数据可能被自动转换
