การ INSERT NULL ลง CHAR(1) ใน MySQL ด้วย sql_mode STRICT_TRANS_TABLES
MySQL ในโหมด Strict อาจปฏิเสธการ INSERT NULL ลงคอลัมน์ NOT NULL แต่ CHAR(1) ที่ประกาศ NULL (Nullable) รับ NULL ได้ ต้องตั้ง sql_mode ให้ถูกต้อง
ตัวอย่าง: INSERT NULL ลง Gender CHAR(1)
1. สร้างตาราง (Gender อนุญาต NULL)
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(50),
Gender CHAR(1) NULL
);
2. ตั้ง sql_mode = STRICT_TRANS_TABLES
SET sql_mode = 'STRICT_TRANS_TABLES';
ผลลัพธ์: Query OK, 0 rows affected, 1 warning (0.00 sec)
3. INSERT NULL ลง Gender
INSERT INTO DemoTable (Name, Gender) SELECT 'Chris', NULL;
INSERT INTO DemoTable (Name, Gender) SELECT 'David', NULL;
INSERT INTO DemoTable (Name, Gender) SELECT 'Mike', 'M';
4. ดูข้อมูล
SELECT * FROM DemoTable;
ผลลัพธ์:
+----+-------+--------+
| Id | Name | Gender |
+----+-------+--------+
| 1 | Chris | NULL |
| 2 | David | NULL |
| 3 | Mike | M |
+----+--------+--------+
เกี่ยวกับ sql_mode STRICT_TRANS_TABLES
- โหมดนี้: ปฏิเสธค่าที่ไม่ถูกต้อง (Invalid) แต่ **อนุญาต NULL** ลงคอลัมน์ Nullable
- คำเตือน (Warning) อาจเกิดขึ้น แต่ข้อมูลยัง INSERT ได้
- โหมดอื่น:
TRADITIONAL(Strict + อื่นๆ),STRICT_ALL_TABLES
การ INSERT NULL แบบตรงไปตรงมา (ไม่ต้อง SELECT)
INSERT INTO DemoTable (Name, Gender) VALUES ('Anna', NULL);
INSERT INTO DemoTable (Name, Gender) VALUES ('Bob', 'F');
CHAR(1) vs VARCHAR(1) vs ENUM
| ชนิด | พื้นที่ | เหมาะสำหรับ |
|---|---|---|
| CHAR(1) | 1 ไบต์ (Fixed) | ค่าคงที่ 1 ตัวอักษร (M/F, Y/N) |
| VARCHAR(1) | 1-2 ไบต์ (Variable) | ค่าที่อาจว่าง/NULL บ่อย |
| ENUM('M','F') | 1 ไบต์ | ค่าคงที่จำกัด ใช้ได้เฉพาะ M/F |
| TINYINT(1) | 1 ไบต์ | Boolean (0/1) เร็วที่สุด |
Best Practice สำหรับ Gender
-- ตัวเลือกที่ดีที่สุด
Gender ENUM('M', 'F', 'O') NULL -- M=Male, F=Female, O=Other
-- หรือ Boolean
IsMale BOOLEAN NULL -- TRUE=Male, FALSE=Female, NULL=Unknown