Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Có cách chuyển Integer sang Varchar không mất dữ liệu trong MySQL?

Có. Sử dụng ALTER TABLE ... CHANGE COLUMN (hoặc MODIFY) để đổi kiểu dữ liệu từ INT sang VARCHAR. MySQL tự động chuyển đổi giá trị số sang chuỗi.

Tạo bảng

mysql> CREATE TABLE DemoTable (
    -> UserId INT,
    -> UserFirstName VARCHAR(20),
    -> 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)     | YES  |     | NULL    |       |
| UserFirstName | varchar(20) | YES  |     | NULL    |       |
| UserLastName  | varchar(20) | YES  |     | NULL    |       |
| UserAge       | int(11)     | YES  |     | NULL    |       |
+---------------+-------------+------+-----+---------+-------+

Đổi UserId từ INT sang VARCHAR(20)

mysql> ALTER TABLE DemoTable CHANGE UserId UserId VARCHAR(20);
Query OK, 0 rows affected (1.35 sec)

Kiểm tra cấu trúc sau đổi

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

Lưu ý quan trọng

  • An toàn: INT → VARCHAR luôn an toàn (số → chuỗi)
  • Rủi ro: VARCHAR → INT có thể mất dữ liệu nếu chuỗi không phải số (ví dụ: 'abc' → 0 hoặc lỗi)
  • Độ dài VARCHAR: Chọn đủ lớn (INT tối đa ~10 chữ số, BIGINT ~19, thêm dấu âm)
  • Index/FK: Cần drop index/FK trước, tạo lại sau
  • Strict mode: Bật STRICT_TRANS_TABLES để bắt lỗi chuyển đổi ngầm

Cú pháp thay thế: MODIFY

ALTER TABLE DemoTable MODIFY UserId VARCHAR(20);

Gọn hơn khi không đổi tên cột.

Kiểm tra dữ liệu sau chuyển đổi

SELECT UserId, UserId REGEXP '^[0-9]+$' AS IsNumeric FROM DemoTable;

Đảm bảo mọi giá trị đều là chuỗi số hợp lệ.