Trong MySQL, NULL (chưa có giá trị) và '' (chuỗi rỗng) là **hai giá trị hoàn toàn khác nhau**. Cần kiểm tra riêng biệt từng trường hợp.
Cú pháp kiểm tra toàn diện (CASE WHEN)
SELECT *,
CASE
WHEN ten_cot = '' THEN 'Rỗng (empty string)'
WHEN ten_cot IS NULL THEN 'NULL'
ELSE CONCAT(ten_cot, ' là giá trị hợp lệ')
END AS TrangThai
FROM ten_bang;
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE checkFieldDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(10),
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (có NULL và chuỗi rỗng)
INSERT INTO checkFieldDemo(Name) VALUES(NULL);
INSERT INTO checkFieldDemo(Name) VALUES('John');
INSERT INTO checkFieldDemo(Name) VALUES(NULL);
INSERT INTO checkFieldDemo(Name) VALUES(''); -- Chuỗi rỗng
INSERT INTO checkFieldDemo(Name) VALUES('Carol');
INSERT INTO checkFieldDemo(Name) VALUES(''); -- Chuỗi rỗng
INSERT INTO checkFieldDemo(Name) VALUES(NULL);
3. Xem dữ liệu gốc
SELECT * FROM checkFieldDemo;
Kết quả:
+----+-------+
| Id | Name |
+----+-------+
| 1 | NULL |
| 2 | John |
| 3 | NULL |
| 4 | | -- Chuỗi rỗng (hiển thị trống)
| 5 | Carol |
| 6 | | -- Chuỗi rỗng
| 7 | NULL |
+----+-------+
4. Phân loại từng hàng
SELECT *,
CASE
WHEN Name = '' THEN 'It is an empty string'
WHEN Name IS NULL THEN 'It is a NULL value'
ELSE CONCAT(Name, ' is a Name')
END AS ListOfValues
FROM checkFieldDemo;
Kết quả:
+----+-------+-----------------------+
| Id | Name | ListOfValues |
+----+-------+-----------------------+
| 1 | NULL | It is a NULL value |
| 2 | John | John is a Name |
| 3 | NULL | It is a NULL value |
| 4 | | It is an empty string |
| 5 | Carol | Carol is a Name |
| 6 | | It is an empty string |
| 7 | NULL | It is a NULL value |
+----+-------+-----------------------+
Các cách kiểm tra khác
1. WHERE: Lọc hàng NULL HOẶC rỗng
-- Cả NULL và ''
SELECT * FROM bang WHERE ten_cot IS NULL OR ten_cot = '';
-- Chỉ NULL
SELECT * FROM bang WHERE ten_cot IS NULL;
-- Chỉ rỗng
SELECT * FROM bang WHERE ten_cot = '';
2. WHERE: Lọc hàng KHÔNG NULL VÀ KHÔNG rỗng
SELECT * FROM bang WHERE ten_cot IS NOT NULL AND ten_cot != '';
3. COALESCE gộp NULL và rỗng thành một giá trị
-- NULL → 'N/A', '' → 'N/A', khác → giữ nguyên
SELECT COALESCE(NULLIF(ten_cot, ''), 'N/A') FROM bang;
4. LENGTH() / CHAR_LENGTH() phát hiện rỗng
-- Chuỗi rỗng: LENGTH = 0
-- NULL: LENGTH = NULL
SELECT * FROM bang WHERE LENGTH(TRIM(ten_cot)) = 0 OR ten_cot IS NULL;
So sánh NULL vs Empty String
| Đặc điểm | NULL | Empty String ('') |
|---|---|---|
| Ý nghĩa | Chưa biết, thiếu dữ liệu | Biết chắc là "không có gì" |
| So sánh = | NULL = NULL → NULL (UNKNOWN) | '' = '' → TRUE |
| IS NULL | TRUE | FALSE |
| = '' | FALSE (NULL != '') | TRUE |
| COUNT(cot) | Không đếm | Đếm |
| CONCAT | Kết quả NULL | Kết quả chuỗi khác |
Best Practice
- Chuẩn hóa: Chỉ cho phép **một trong hai** (NULL HOẶC rỗng), không nên có cả hai
- Dùng
NOT NULL DEFAULT ''cho cột bắt buộc nhưng có thể "không có giá trị" - Dùng
NULLcho cột tùy chọn thực sự (có thể không áp dụng)
SET cot = NULLIF(TRIM(cot), '') để chuẩn hóa rỗng → NULL