ZEROFILL Attribute: แสดงตัวเลขพร้อม Leading Zeros
ZEROFILL เป็น Column Attribute ทำให้ค่าที่แสดงผลถูก Padding ด้วย 0 ด้านซ้าย จนครบ Display Width ที่กำหนด
Syntax
CREATE TABLE table_name (
column_name INT(5) ZEROFILL
);
ตัวอย่าง
CREATE TABLE DemoTable626 (Value INT(5) ZEROFILL);
INSERT INTO DemoTable626 VALUES (9), (12), (567), (3478);
SELECT * FROM DemoTable626;
ผลลัพธ์:
+-------+
| Value |
+-------+
| 00009 |
| 00012 |
| 00567 |
| 03478 |
+-------+
รายละเอียดสำคัญ
INT(5)= Display Width 5 ตัว (ไม่ใช่จำกัดค่า Max - INT ยังเก็บได้ถึง 2 Billion)ZEROFILLทำให้ Column กลายเป็น UNSIGNED อัตโนมัติ (ไม่เก็บค่าลบได้)- เป็นเพียง Display Formatting - ค่าจริงใน Storage ยังคงเป็น 9, 12, 567, 3478
- Application ที่ Query ผ่าน Connector จะได้ค่าเป็น String '00009' (ขึ้นกับ Driver)
ตัวอย่าง UNSIGNED Effect
CREATE TABLE t (val INT(5) ZEROFILL);
INSERT INTO t VALUES (-5); -- Error: Out of range (เพราะ ZEROFILL → UNSIGNED)
Alternative: Format ใน Query (ไม่ผูกกับ Schema)
-- LPAD: Pad ซ้ายด้วย Char ที่ระบุ
SELECT LPAD(CAST(Value AS CHAR), 5, '0') AS padded
FROM DemoTable626;
-- FORMAT: พร้อม Comma Separator (ไม่เหมาะกับ Zero Padding)
SELECT FORMAT(Value, 0); -- 9, 12, 567, 3,478
-- printf-style (MySQL 8.0+)
SELECT FORMAT(Value, 0);
กรณีใช้งานจริง
- รหัสสินค้า/สมาชิก:
MEMBER00001,PROD00123 - เลขที่เอกสาร:
INV-2024-00045 - Barcode/QR Code Generation
- Fixed-width File Export (Legacy Systems)
Best Practice: แยก Storage และ Display
| Approach | Storage | Display | ข้อดี |
|---|---|---|---|
| ZEROFILL Column | INT | Auto Pad | Simple, Schema-level |
| Normal INT + LPAD() | INT | Query Time | Flexible, Portable |
| VARCHAR + App Format | VARCHAR | App Layer | Full Control, No Cast Issue |
| Generated Column | INT + VIRTUAL VARCHAR | Auto | Best of Both (MySQL 5.7+) |
Generated Column Example (MySQL 5.7+)
ALTER TABLE DemoTable626
ADD COLUMN Value_Padded VARCHAR(10)
GENERATED ALWAYS AS (LPAD(CAST(Value AS CHAR), 5, '0')) VIRTUAL;