必须用 CHANGE COLUMN 同时改字段名和类型,新旧字段名均需明确写出;仅改类型用 MODIFY COLUMN 更简洁,但缩容可能静默截断数据,修改后须用 DESCRIBE 和 SELECT 验证结构与数据。
想换名字又调类型,必须用 CHANGE COLUMN,而且新旧字段名都得写清楚——哪怕名字不变,也得重复一遍。MySQL 不允许只写新类型而省略字段名。
ALTER TABLE employees CHANGE COLUMN first_name given_name VARCHAR(100):把 first_name 改成 given_name,同时扩长到 VARCHAR(100)
CHANGE COLUMN age age TINYINT ——看着冗余,但语法强制要求'abc' 却要改成 INT,直接报错 ERROR 1265 (01000): Data truncated for column 'age' at row 1
纯粹调长度、换类型、加 NOT NULL 或 DEFAULT,用 MODIFY COLUMN 更直白,不用重复字段名。
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2) NOT NULL:升级精度并加非空约束ALTER TABLE users MODIFY COLUMN username VARCHAR(255):只扩长度,不碰字段名VARCHAR(50) → VARCHAR(20) 会截断超长数据,MySQL 默认静默截断(除非 SQL mode 启用了 STRICT_TRANS_TABLES),查不到报错但数据已丢缩小长度不是语法错误,而是数据安全雷区。MySQL 不主动校验现有值是否超出新长度,只在执行时尝试截断。
SELECT MAX(LENGTH(city)) FROM address,确认结果 ≤ 新长度再执行 MODIFY COLUMN city VARCHAR(30)
VARCHAR(30) 实际最多存 7 个汉字(留 2 字节给变长头)INT 改成 TINYINT,原有值 >127 的行会变成 127 或报错,取决于 SQL mode执行完别急着走,DESCRIBE 和 SELECT 必须连做两步。
DESCRIBE employees 确认 Type、Null、Default 列是否如预期SELECT id, given_name, salary FROM employees LIMIT 5,重点核对刚改过的字段值有没有异常(比如全变成 0、NULL 或乱码)DATETIME 改 DATE 会丢掉时分秒,且无法回退——这种丢失是永久性的