資料模型演進中,欄位型別調整是常見操作。MySQL 提供 MODIFY COLUMN 子句支援就地型別變更,本文說明標準語法、資料相容性檢查與避坑指南。
ALTER TABLE `資料表名` MODIFY COLUMN `欄位名` 新資料型別 [預設值] [NULL/NOT NULL] [AUTO_INCREMENT] [COMMENT '註解'];
-- 將 VARCHAR(20) 擴充為 VARCHAR(100) ALTER TABLE users MODIFY COLUMN nickname VARCHAR(100) NOT NULL DEFAULT '' COMMENT '暱稱'; -- 將 INT 改為 BIGINT(防止 ID 耗盡) ALTER TABLE orders MODIFY COLUMN order_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT; -- 移除 NOT NULL 約束 ALTER TABLE products MODIFY COLUMN description TEXT NULL;
| 原型別 | 目標型別 | 風險等級 | 說明 |
|---|---|---|---|
| VARCHAR(10) | VARCHAR(50) | 低 | 擴充長度安全 |
| VARCHAR(50) | VARCHAR(10) | 高 | 資料截斷,需先清洗 |
| INT | BIGINT | 低 | 擴大範圍安全 |
| BIGINT | INT | 極高 | 溢位風險,嚴禁直接執行 |
| DATETIME | TIMESTAMP | 中 | 時區轉換、範圍差異(1970-2038) |
| TEXT | VARCHAR(255) | 高 | 超長資料截斷 |
| DECIMAL(10,2) | DECIMAL(12,4) | 低 | 精度擴充安全 |
SELECT MAX(LENGTH(`欄位名`)), MAX(`欄位名`) FROM `表名`; 確認現有資料符合新型別限制。mysqldump --single-transaction 完整備份,或建立影子表測試變更。SHOW CREATE TABLE `表名`; -- 確認型別、約束、註解 DESC `表名`; -- 快速檢視欄位定義