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

BIGINT(8) ใน MySQL: ความหมายของตัวเลขในวงเล็บและขอบเขตค่า

หลายคนเข้าใจผิดว่า BIGINT(8) จำกัดค่าสูงสุดได้แค่ 8 หลัก แต่จริงๆ ตัวเลขในวงเล็บ เป็น Display Width เท่านั้น** ไม่ส่งผลต่อช่วงค่าที่เก็บได้

ความจริงของ BIGINT

คุณสมบัติค่า
Storage Size8 Bytes (64 bits)
Signed Range-9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807
Unsigned Range0 ถึง 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

TypeBytesSigned RangeUnsigned Range
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32,768 ~ 32,7670 ~ 65,535
MEDIUMINT3-8,388,608 ~ 8,388,6070 ~ 16,777,215
INT / INTEGER4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
BIGINT8-9.22e18 ~ 9.22e180 ~ 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 เท่า)