Sử dụng ALTER TABLE ... MODIFY COLUMN để định nghĩa lại cột với độ dài VARCHAR mới lớn hơn.
Tạo bảng
mysql> CREATE TABLE DemoTable (
-> UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserFirstName VARCHAR(10),
-> UserLastName VARCHAR(20),
-> UserAge INT
-> );
Kiểm tra cấu trúc ban đầu
mysql> DESC DemoTable;
+---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+----------------+ | UserId | int(11) | NO | PRI | NULL | auto_increment | | UserFirstName | varchar(10) | YES | | NULL | | | UserLastName | varchar(20) | YES | | NULL | | | UserAge | int(11) | YES | | NULL | | +---------------+-------------+------+-----+---------+----------------+
Tăng UserFirstName từ VARCHAR(10) lên VARCHAR(40)
mysql> ALTER TABLE DemoTable MODIFY UserFirstName VARCHAR(40);
Query OK, 0 rows affected (0.23 sec)
Kiểm tra cấu trúc sau thay đổi
mysql> DESC DemoTable;
+---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+----------------+ | UserId | int(11) | NO | PRI | NULL | auto_increment | | UserFirstName | varchar(40) | YES | | NULL | | | UserLastName | varchar(20) | YES | | NULL | | | UserAge | int(11) | YES | | NULL | | +---------------+-------------+------+-----+---------+----------------+
Lưu ý quan trọng
- Chỉ tăng độ dài (VARCHAR(10) → VARCHAR(40)): An toàn, nhanh, không mất dữ liệu
- Giảm độ dài (VARCHAR(40) → VARCHAR(10)): Rủi ro cắt dữ liệu. MySQL strict mode sẽ báo lỗi nếu có dữ liệu > 10 ký tự
- Thay đổi kiểu (VARCHAR ↔ INT, v.v.): Cần kiểm tra dữ liệu tương thích
- Index: Nếu cột có index, ALTER sẽ rebuild index (tốn thời gian trên bảng lớn)
- Metadata lock: ALTER TABLE khóa bảng — tránh giờ cao điểm
Cú pháp thay thế: CHANGE
ALTER TABLE DemoTable CHANGE UserFirstName UserFirstName VARCHAR(40);
Cần lặp tên cột 2 lần (old_name, new_name). Dùng khi muốn đổi tên cột.
Kiểm tra độ dài thực tế dữ liệu trước khi giảm
SELECT MAX(CHAR_LENGTH(UserFirstName)) FROM DemoTable;
Đảm bảo giá trị max ≤ độ dài mới mong muốn.