สามารถเปลี่ยน Data Type จาก INTEGER เป็น VARCHAR ได้โดยไม่สูญเสียข้อมูล เพราะตัวเลขทุกตัวสามารถแทนเป็นสตริงได้ ใช้คำสั่ง ALTER TABLE ... CHANGE หรือ MODIFY
สร้างตารางและตรวจสอบโครงสร้าง
mysql> create table DemoTable (
UserId int,
UserFirstName varchar(20),
UserLastName varchar(20),
UserAge int
);
mysql> desc DemoTable;
+---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | UserId | int(11) | YES | | NULL | | | UserFirstName | varchar(20) | YES | | NULL | | | UserLastName | varchar(20) | YES | | NULL | | | UserAge | int(11) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+
เปลี่ยน UserId จาก INT เป็น VARCHAR(20)
mysql> alter table DemoTable change UserId UserId varchar(20);
ตรวจสอบหลังเปลี่ยน
mysql> desc DemoTable;
+---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | UserId | varchar(20) | YES | | NULL | | | UserFirstName | varchar(20) | YES | | NULL | | | UserLastName | varchar(20) | YES | | NULL | | | UserAge | int(11) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+
ข้อมูลเดิมยังคงอยู่ (แปลงอัตโนมัติ)
mysql> insert into DemoTable(UserId, UserFirstName) values(123, 'Test'); mysql> select * from DemoTable; +--------+---------------+--------------+--------+ | UserId | UserFirstName | UserLastName | UserAge | +--------+---------------+--------------+--------+ | 123 | Test | NULL | NULL | +--------+---------------+--------------+--------+
ข้อควรระวัง
- VARCHAR ขนาดพอ - INT สูงสุด ~10 ตัวอักษร (-2147483648) VARCHAR(11) พอ, BIGINT ต้อง VARCHAR(20)
- Leading Zeros - INT ไม่เก็บ Leading Zero → VARCHAR จะไม่มี (00123 → '123')
- Index - Index บน INT จะ Drop แล้วสร้างใหม่บน VARCHAR (ช้ากว่า)
- Foreign Key - ต้อง Drop FK ก่อน แล้ว ALTER แล้วสร้าง FK ใหม่ (Type ต้องตรง)
- Application - Code ที่ Expect INT อาจ Error (Type Mismatch)
ทางกลับกัน: VARCHAR → INT (เสี่ยง)
- ได้ก็ต่อเมื่อทุกค่าเป็นตัวเลขบริสุทธิ์
- มีอักขระอื่น → Error หรือ Data Loss
- ใช้
CAST(col AS UNSIGNED)ทดสอบก่อน
Best Practice
- Backup:
CREATE TABLE backup AS SELECT * FROM DemoTable; - ทดสอบใน Staging
- ใช้ MODIFY แทน CHANGE หากไม่เปลี่ยนชื่อ
- ตรวจสอบ Application Compatibility