Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เพิ่มความยาว VARCHAR คอลัมน์ใน MySQL ด้วย ALTER TABLE MODIFY

เมื่อต้องการเพิ่มความยาว (Length) ของคอลัมน์ VARCHAR ให้ใช้ ALTER TABLE ... MODIFY ระบุขนาดใหม่ที่ใหญ่กว่าเดิม ข้อมูลเดิมจะคงอยู่

สร้างตารางและตรวจสอบ

mysql> create table DemoTable (
    UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    UserFirstName varchar(10),
    UserLastName varchar(20),
    UserAge int
);
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    |                |
+---------------+-------------+------+-----+---------+----------------+

เพิ่มความยาว UserFirstName จาก 10 เป็น 40

mysql> alter table DemoTable modify UserFirstName varchar(40);

ตรวจสอบหลังเปลี่ยน

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    |                |
+---------------+-------------+------+-----+---------+----------------+

Syntax

ALTER TABLE table_name MODIFY column_name VARCHAR(new_length) [other_constraints];

ข้อสังเกต

  • เพิ่มขนาด (Increase) - ปลอดภัย ข้อมูลไม่หาย Index Rebuild อัตโนมัติ
  • ลดขนาด (Decrease) - เสี่ยง Data Truncation ต้องเช็ค MAX(LENGTH(col)) ก่อน
  • VARCHAR → TEXT - ได้ แต่ Index ต้อง Drop ก่อน (Prefix Length)
  • CHAR → VARCHAR - ได้ (Space Padding จะหาย)

ตรวจสอบก่อนลดขนาด

SELECT MAX(LENGTH(UserFirstName)) FROM DemoTable;
-- ถ้าผลลัพธ์ <= ขนาดใหม่ → ปลอดภัย

MySQL 8.0+ Instant DDL (บางกรณี)

  • เพิ่ม VARCHAR Length: Instant (Metadata Only, No Table Rebuild) - MySQL 8.0.12+
  • ลด VARCHAR Length: Inplace (Rebuild Table)
  • เปลี่ยน CHAR → VARCHAR: Inplace

คำเตือน Production

  • Table Lock ระหว่าง Rebuild (ยกเว้น Instant DDL)
  • ขนาดใหญ่ ใช้ pt-online-schema-change (Percona Toolkit) หรือ gh-ost (GitHub)
  • Backup ก่อนทำ Schema Change
  • ทดสอบ Staging ก่อน Production