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

TINYINT(1) ใน MySQL: ขนาดเก็บข้อมูล 1 Byte ไม่ได้จำกัดค่าที่ 1

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

ข้อเท็จจริงของ TINYINT

คุณสมบัติค่า
Storage Size1 Byte (8 bits)
Signed Range-128 ถึง 127
Unsigned Range0 ถึง 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 อย่างไร

ชนิดStorageRangeSemanticแนะนำ
BOOLEAN / BOOL1 Byte0, 1 (แต่เก็บ -128~127 ได้)✅ True/False⭐ Best for Flags
TINYINT1 Byte-128~127NumberGeneral Small Int
TINYINT UNSIGNED1 Byte0~255Positive NumberCounter, Enum-like
BIT(1)1 Bit0, 1Bit FlagBitmask, Multiple Flags

ข้อสรุป: TINYINT(1) ไม่ได้จำกัดค่าที่ 0-1 มันเก็บ -128 ถึง 127 ได้ ใช้ BOOLEAN เพื่อความชัดเจนของเจตนา (Semantic)