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

วิธี INSERT ค่า NULL ลงคอลัมน์ CHAR(1) ใน MySQL

การ 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