Có. Cột kiểu INT (và các kiểu số khác) trong MySQL **mặc định cho phép NULL** trừ khi bạn khai báo rõ ràng NOT NULL.
Cú pháp
-- Cho phép NULL (mặc định)
CREATE TABLE bang (cot_so INT);
-- Không cho phép NULL
CREATE TABLE bang (cot_so INT NOT NULL);
Ví dụ minh họa
1. Tạo bảng với cột INT cho phép NULL
CREATE TABLE nullableIntDemo (
Id INT NOT NULL AUTO_INCREMENT,
Price INT, -- Không có NOT NULL → cho phép NULL
PRIMARY KEY(Id)
);
2. Chèn dữ liệu có NULL
INSERT INTO nullableIntDemo(Price) VALUES(NULL);
INSERT INTO nullableIntDemo(Price) VALUES(100);
INSERT INTO nullableIntDemo(Price) VALUES(200);
INSERT INTO nullableIntDemo(Price) VALUES(NULL);
INSERT INTO nullableIntDemo(Price) VALUES(NULL);
3. Kiểm tra dữ liệu
SELECT * FROM nullableIntDemo;
Kết quả:
+----+-------+
| Id | Price |
+----+-------+
| 1 | NULL |
| 2 | 100 |
| 3 | 200 |
| 4 | NULL |
| 5 | NULL |
+----+-------+
So sánh: NULL vs 0 vs Rỗng
| Giá trị | Ý nghĩa | Kiểu dữ liệu |
|---|---|---|
NULL | Chưa biết, không có giá trị, missing | Tất cả kiểu |
0 | Giá trị số 0 (có nghĩa: bằng 0) | Số (INT, DECIMAL...) |
'' | Chuỗi rỗng (khác NULL) | Chuỗi (VARCHAR, TEXT) |
Xử lý NULL trong tính toán
Vấn đề: Mọi phép toán với NULL đều trả về NULL.
SELECT 10 + NULL; -- NULL
SELECT NULL > 5; -- NULL (không phải TRUE/FALSE)
SELECT AVG(Price) FROM nullableIntDemo; -- Bỏ qua NULL, tính TB của 100,200 = 150
Giải pháp: Dùng COALESCE hoặc IFNULL:
SELECT COALESCE(Price, 0) FROM nullableIntDemo; -- NULL → 0
SELECT SUM(COALESCE(Price, 0)) FROM nullableIntDemo;
Best Practice
- Mặc định NOT NULL cho cột số nếu logic nghiệp vụ không cần "chưa biết"
- Dùng
DEFAULT 0thay vì NULL cho các cột tiền tệ, số lượng, điểm số - Chỉ dùng NULL khi có ý nghĩa nghiệp vụ rõ ràng: "chưa cập nhật", "không áp dụng", "chưa biết"
- Index trên cột NULL: MySQL cho phép, nhưng giá trị NULL không được index trong một số engine
Kiểm tra định nghĩa cột
SHOW COLUMNS FROM nullableIntDemo LIKE 'Price';
Kết quả: Null = YES → cho phép NULL.