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

แปลง Integer เป็น VARCHAR ใน MySQL ไม่สูญเสียข้อมูลด้วย ALTER TABLE

สามารถเปลี่ยน 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

  1. Backup: CREATE TABLE backup AS SELECT * FROM DemoTable;
  2. ทดสอบใน Staging
  3. ใช้ MODIFY แทน CHANGE หากไม่เปลี่ยนชื่อ
  4. ตรวจสอบ Application Compatibility