หลายคนเข้าใจผิดว่า TINYINT(1) เก็บได้แค่ 0 และ 1 แต่จริงๆ ตัวเลขในวงเล็บ เป็น Display Width เท่านั้น** ไม่ส่งผลต่อช่วงค่าที่เก็บได้
ข้อเท็จจริงของ TINYINT
| คุณสมบัติ | ค่า |
|---|---|
| Storage Size | 1 Byte (8 bits) |
| Signed Range | -128 ถึง 127 |
| Unsigned Range | 0 ถึง 255 |
| Display Width (N) | ใช้กับ ZEROFILL เท่านั้น |
สูตรคำนวณช่วงค่า
Signed:
Max = 2^(8-1) - 1 = 2^7 - 1 = 128 - 1 = 127
Min = -2^(8-1) = -128
Unsigned:
Max = 2^8 - 1 = 256 - 1 = 255
Min = 0
ตัวอย่าง: ทดสอบขอบเขตค่า
1. สร้างตาราง TINYINT(1)
mysql> CREATE TABLE Display (rangeOfId TINYINT(1));
Query OK, 0 rows affected (0.67 sec)
2. ลอง Insert ค่าที่เกินขอบเขต (128)
mysql> INSERT INTO Display VALUES (128);
ERROR 1264 (22003): Out of range value for column 'rangeOfId' at row 1
3. Insert ค่าสูงสุดและต่ำสุดที่รับได้
mysql> INSERT INTO Display VALUES (127);
mysql> INSERT INTO Display VALUES (-128);
4. ตรวจสอบ
mysql> SELECT * FROM Display;
+-----------+
| rangeOfId |
+-----------+
| 127 |
| -128 |
+-----------+
2 rows in set (0.00 sec)
BOOLEAN / BOOL = TINYINT(1)
ใน MySQL BOOLEAN และ BOOL เป็น **Alias ของ TINYINT(1)** ทุกประการ
CREATE TABLE t (flag BOOLEAN);
-- เทียบเท่า
CREATE TABLE t (flag TINYINT(1));
แต่ Application/Connector บางตัว (เช่น MySQL Connector/J, Python) จะ Map BOOLEAN → Boolean Type ในภาษานั้น
ZEROFILL กับ TINYINT(1)
mysql> CREATE TABLE zf_test (val TINYINT(3) ZEROFILL);
mysql> INSERT INTO zf_test VALUES (1), (12), (123);
mysql> SELECT * FROM zf_test;
+------+
| val |
+------+
| 001 |
| 012 |
| 123 |
+------+
3 rows in set (0.00 sec)
ZEROFILL บังคับ UNSIGNED อัตโนมัติ (Range กลายเป็น 0-255)
MySQL 8.0.17+ Deprecation
Display Width สำหรับ Integer Types ถูก Deprecated:
-- แนะนำ
CREATE TABLE flags (is_active BOOLEAN); -- หรือ TINYINT
-- ไม่แนะนำ (Warning ใน 8.0.17+)
CREATE TABLE flags (is_active TINYINT(1));
สรุป: เลือกชนิดข้อมูล Flag อย่างไร
| ชนิด | Storage | Range | Semantic | แนะนำ |
|---|---|---|---|---|
BOOLEAN / BOOL | 1 Byte | 0, 1 (แต่เก็บ -128~127 ได้) | ✅ True/False | ⭐ Best for Flags |
TINYINT | 1 Byte | -128~127 | Number | General Small Int |
TINYINT UNSIGNED | 1 Byte | 0~255 | Positive Number | Counter, Enum-like |
BIT(1) | 1 Bit | 0, 1 | Bit Flag | Bitmask, Multiple Flags |
ข้อสรุป: TINYINT(1) ไม่ได้จำกัดค่าที่ 0-1 มันเก็บ -128 ถึง 127 ได้ ใช้ BOOLEAN เพื่อความชัดเจนของเจตนา (Semantic)