การแปลง Empty String ('') ให้เป็น NULL ด้วย LENGTH() และ UPDATE
ใช้ LENGTH() ตรวจสอบความยาวสตริง หากเป็น 0 แสดงว่าเป็น Empty String แล้วค่อย SET ให้เป็น NULL
รูปแบบคำสั่ง
UPDATE table_name SET column_name = NULL WHERE LENGTH(column_name) = 0;
ตัวอย่าง: แปลงชื่อที่เป็น Empty String ให้เป็น NULL
1. สร้างตารางและเพิ่มข้อมูล (มี Empty String)
CREATE TABLE DemoTable (Name VARCHAR(50));
INSERT INTO DemoTable VALUES ('Chris'), (''), ('David'), ('');
2. ดูข้อมูลก่อนอัปเดต
SELECT * FROM DemoTable;
ผลลัพธ์: แถวที่ 2 และ 4 เป็น Empty String (แสดงว่าง)
+-------+
| Name |
+-------+
| Chris |
| |
| David |
| |
+-------+
3. อัปเดต Empty String ให้เป็น NULL
UPDATE DemoTable SET Name = NULL WHERE LENGTH(Name) = 0;
ผลลัพธ์การรัน: Query OK, 2 rows affected (0.12 sec) Rows matched: 2 Changed: 2 Warnings: 0
4. ตรวจสอบหลังอัปเดต
SELECT * FROM DemoTable;
ผลลัพธ์:
+-------+
| Name |
+-------+
| Chris |
| NULL |
| David |
| NULL |
+-------+
วิธีอื่น: ใช้ NULLIF() (สั้นกว่าและมาตรฐาน)
UPDATE DemoTable SET Name = NULLIF(Name, '');
NULLIF(expr1, expr2) คืนค่า NULL หาก expr1 = expr2 มิฉะนั้นคืนค่า expr1
วิธีนี้ทำงานได้ในคำสั่งเดียว ไม่ต้องใช้ WHERE
ความแตกต่าง: Empty String vs NULL
| ลักษณะ | Empty String ('') | NULL |
|---|---|---|
| LENGTH() | 0 | NULL |
| IS NULL | FALSE | TRUE |
| = '' | TRUE | UNKNOWN (ไม่ใช่ TRUE) |
| COUNT(col) | นับ | ไม่นับ |
| CONCAT | ต่อได้ปกติ | คืน NULL |
ข้อดีของการใช้ NULL แทน Empty String
- Semantic correctness: "ไม่มีค่า" vs "มีค่าว่าง"
COUNT(column)ไม่นับ NULL → 统计准确UNIQUE Indexอนุญาต NULL หลายค่า (ในบาง Engine) แต่ Empty String ถือซ้ำ- Function เหล่านี้จัดการ NULL ได้ดี:
COALESCE, IFNULL, NULLIF
ป้องกัน Empty String ตอน INSERT
-- ใช้ Trigger
CREATE TRIGGER before_insert_demo
BEFORE INSERT ON DemoTable
FOR EACH ROW
SET NEW.Name = NULLIF(TRIM(NEW.Name), '');