Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL ZEROFILL: เติมศูนย์หน้าตัวเลข (Zero Padding)

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

ApproachStorageDisplayข้อดี
ZEROFILL ColumnINTAuto PadSimple, Schema-level
Normal INT + LPAD()INTQuery TimeFlexible, Portable
VARCHAR + App FormatVARCHARApp LayerFull Control, No Cast Issue
Generated ColumnINT + VIRTUAL VARCHARAutoBest 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;