Nguyên nhân
Lỗi xảy ra khi chèn dữ liệu dài hơn độ dài tối đa cho phép của cột. Ví dụ: cột VARCHAR(6) chỉ chứa tối đa 6 ký tự.
Ví dụ tái hiện lỗi
1. Tạo bảng với giới hạn 10 ký tự
mysql> CREATE TABLE DataToolongDemo ( -> Name VARCHAR(10) -> ); Query OK, 0 rows affected (0.55 sec)
2. Chèn dữ liệu vượt quá 10 ký tự
mysql> INSERT INTO DataToolongDemo VALUES('Carol Taylor');
ERROR 1406 (22001): Data too long for column 'Name' at row 1
Các giải pháp
Giải pháp 1: Tăng độ dài cột (Khuyên dùng)
mysql> ALTER TABLE DataToolongDemo MODIFY Name VARCHAR(100); Query OK, 0 rows affected (2.22 sec) Records: 0 Duplicates: 0 Warnings: 0
Giải pháp 2: Đổi sang TEXT/LONGTEXT
mysql> ALTER TABLE DataToolongDemo CHANGE Name Name LONGTEXT; Query OK, 0 rows affected (2.22 sec) Records: 0 Duplicates: 0 Warnings: 0
Kiểm tra sau khi sửa
mysql> INSERT INTO DataToolongDemo VALUES('Carol Taylor');
Query OK, 1 row affected (0.11 sec)
mysql> SELECT * FROM DataToolongDemo;
+--------------+ | Name | +--------------+ | Carol Taylor | +--------------+ 1 row in set (0.00 sec)
So sánh kiểu dữ liệu văn bản
| Kiểu | Độ dài tối đa | Lưu trữ | Phù hợp cho |
|---|---|---|---|
| VARCHAR(n) | 65,535 bytes | Trong bảng | Chuỗi ngắn, độ dài cố định/định trước |
| TEXT | 64 KB | Ngoài bảng | Văn bản trung bình |
| MEDIUMTEXT | 16 MB | Ngoài bảng | Văn bản dài |
| LONGTEXT | 4 GB | Ngoài bảng | Văn bản rất lớn |
Khuyến nghị
- Ưu tiên
VARCHARvới độ dài hợp lý cho hiệu năng tốt hơn - Chỉ dùng TEXT khi thực sự cần lưu chuỗi rất dài
- Kiểm tra độ dài dữ liệu đầu vào ở ứng dụng trước khi INSERT
- Sử dụng
STRICT_TRANS_TABLESSQL mode để bắt lỗi sớm