Khi chèn giá trị FLOAT vào cột DECIMAL (hoặc INT), MySQL có thể cắt bớt phần thập phân và phát ra cảnh báo (Warning). Dùng SHOW WARNINGS để xem.
Ví dụ minh họa
Tạo bảng tạm với cột DECIMAL (mặc định DECIMAL(10,0) = số nguyên):
mysql> CREATE TEMPORARY TABLE WarningDemo (
-> Value DECIMAL
-> );
Chèn giá trị float 9.80:
mysql> INSERT INTO WarningDemo VALUES(9.80); Query OK, 1 row affected, 1 warning (0.03 sec)
Xem cảnh báo:
mysql> SHOW WARNINGS;
Kết quả:
+-------+------+--------------------------------------------+ | Level | Code | Message | +-------+------+--------------------------------------------+ | Note | 1265 | Data truncated for column 'Value' at row 1 | +-------+------+--------------------------------------------+
Kiểm tra giá trị thực tế lưu:
mysql> SELECT * FROM WarningDemo;
+-------+ | Value | +-------+ | 10 | +-------+
Giá trị 9.80 bị làm tròn thành 10 (vì DECIMAL mặc định scale=0).
Giải pháp tránh mất dữ liệu
- Định nghĩa scale rõ ràng:
DECIMAL(10,2)(2 chữ số thập phân) - Hoặc dùng
FLOAT/DOUBLEnếu cần chính xác gần đúng - Bật
SQL_MODE='STRICT_TRANS_TABLES'để chuyển warning thành ERROR
Các loại cảnh báo thường gặp
| Code | Message | Nguyên nhân |
|---|---|---|
| 1265 | Data truncated | Giá trị vượt phạm vi/scale cột |
| 1366 | Incorrect integer value | Chèn chuỗi vào cột số |
| 1292 | Incorrect datetime value | Định dạng ngày sai |
| 1062 | Duplicate entry | Trùng khóa chính/unique |