Thuộc tính ZEROFILL
Khi định nghĩa cột số nguyên, thêm ZEROFILL để tự động đệm số 0 ở đầu đến độ dài hiển thị (display width).
Ví dụ
Tạo bảng:
CREATE TABLE DemoTable626 (
Value INT(5) ZEROFILL
);
Chèn dữ liệu:
INSERT INTO DemoTable626 VALUES (9), (12), (567), (3478);
Kết quả hiển thị:
+-------+
| Value |
+-------+
| 00009 |
| 00012 |
| 00567 |
| 03478 |
+-------+
Đặc điểm quan trọng
- Chỉ ảnh hưởng hiển thị: Giá trị lưu trữ nội bộ vẫn là số nguyên bình thường (9, 12, 567, 3478).
- Display width: Số trong ngoặc
INT(5)= độ rộng hiển thị = 5 chữ số. - Tự động thêm UNSIGNED:
ZEROFILLngầm hiểuUNSIGNED(không cho âm). - Không ảnh hưởng tính toán:
Value + 1vẫn đúng toán học.
So sánh: ZEROFILL vs LPAD trong SELECT
-- ZEROFILL (tự động khi SELECT)
SELECT Value FROM DemoTable626; -- 00009
-- LPAD (tùy ý, không cần schema change)
SELECT LPAD(Value, 5, '0') FROM DemoTable626; -- 00009
-- FORMAT (có dấu phẩy nghìn)
SELECT FORMAT(Value, 0) FROM DemoTable626; -- 9 (không pad 0)
Lưu ý
- Display width (
INT(5)) KHÔNG giới hạn phạm vi lưu trữ (INT luôn -2^31..2^31-1). - MySQL 8.0.17+ deprecated display width cho integer types (vẫn hoạt động nhưng warning).
- Khuyên dùng
LPADtrong SELECT hoặc format ở application layer thay vì ZEROFILL. - Không dùng cho khóa ngoại (FK) vì so sánh giá trị số, không quan tâm hiển thị.
Ứng dụng thực tế
- Mã số định danh: STT, mã phiếu, mã nhân viên (EMP0001, EMP0002...).
- Số thứ tự hóa đơn, ticket number.
- Hiển thị báo cáo, export fixed-width file.