หลายคนเข้าใจผิดว่า BIGINT(8) จำกัดค่าสูงสุดได้แค่ 8 หลัก แต่จริงๆ ตัวเลขในวงเล็บ เป็น Display Width เท่านั้น** ไม่ส่งผลต่อช่วงค่าที่เก็บได้
ความจริงของ BIGINT
| คุณสมบัติ | ค่า |
|---|---|
| Storage Size | 8 Bytes (64 bits) |
| Signed Range | -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807 |
| Unsigned Range | 0 ถึง 18,446,744,073,709,551,615 |
| Display Width (N) | ใช้สำหรับ ZEROFILL และการจัดรูปแบบแสดงผล |
ตัวอย่าง: BIGINT(8) ZEROFILL
1. สร้างตาราง
mysql> CREATE TABLE BigIntDemo8 (
-> Number1 BIGINT(8) NOT NULL,
-> Number2 BIGINT(8) UNSIGNED ZEROFILL NOT NULL
-> );
Query OK, 0 rows affected (0.59 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO BigIntDemo8 VALUES (1, 1), (11, 11), (111, 111),
-> (1111, 1111), (11111, 11111), (111111, 111111);
3. ผลลัพธ์
mysql> SELECT * FROM BigIntDemo8;
+---------+----------+
| Number1 | Number2 |
+---------+----------+
| 1 | 00000001 |
| 11 | 00000011 |
| 111 | 00000111 |
| 1111 | 00001111 |
| 11111 | 00011111 |
| 111111 | 00111111 |
+---------+----------+
6 rows in set (0.00 sec)
Number1 (ปกติ): แสดงค่าจริง
Number2 (UNSIGNED ZEROFILL): เติม 0 นำหน้าจนครบ 8 หลัก
Display Width (N) ทำอะไรได้บ้าง
- ZEROFILL: เติม 0 นำหน้าจนครบ N หลัก (บังคับ UNSIGNED อัตโนมัติ)
- Application Layer: บาง Driver/Connector ใช้ Metadata นี้จัดรูปแบบ UI
- ไม่ทำ: จำกัดค่า, ตัดทอนค่า, เปลี่ยน Storage Size, Affected Index
ชนิด Integer ทั้งหมดใน MySQL
| Type | Bytes | Signed Range | Unsigned Range |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 |
MySQL 8.0.17+ Deprecation Warning
ตั้งแต่ MySQL 8.0.17 Display Width สำหรับ Integer Types ถูก **Deprecated** (เตือนว่าจะลบในอนาคต)
-- ควรเขียนแค่
CREATE TABLE t (id BIGINT PRIMARY KEY);
-- แทน
CREATE TABLE t (id BIGINT(20) PRIMARY KEY);
สรุป
BIGINT(8)≠ จำกัด 8 หลัก → จริงเก็บได้ 19 หลัก (Signed) หรือ 20 หลัก (Unsigned)- ตัวเลขในวงเล็บ = Display Width สำหรับ ZEROFILL
- ใช้
BIGINTแบบไม่มีวงเล็บสำหรับ Schema ใหม่ - ใช้
UNSIGNEDหากไม่ต้องการค่าติดลบ (ได้ช่วงค่า 2 เท่า)