Kiểu dữ liệu Boolean trong MySQL
MySQL không có kiểu BOOLEAN riêng. Các từ khóa sau là đồng nghĩa với TINYINT(1):
BOOLBOOLEANTINYINT(1)
Kiểm tra biểu diễn nội bộ
1. Tạo bảng với BOOL
mysql> CREATE TABLE AddBoolDemo ( -> isToggle BOOL -> ); Query OK, 0 rows affected (1.24 sec)
2. Xem định nghĩa thực tế (DDL)
mysql> SHOW CREATE TABLE AddBoolDemo\G
*************************** 1. row *************************** Table: AddBoolDemo Create Table: CREATE TABLE `addbooldemo` ( `isToggle` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
Giá trị True/False
| Giá trị nhập | Lưu trữ | Ý nghĩa |
|---|---|---|
| TRUE / true | 1 | True |
| FALSE / false | 0 | False |
| 1 | 1 | True |
| 0 | 0 | False |
| Số khác 0 (-1, 5, 100) | Giá trị đó | True (trong điều kiện) |
| NULL | NULL | Unknown |
Ví dụ chèn và truy vấn
Chèn các giá trị
mysql> INSERT INTO AddBoolDemo VALUES(TRUE); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO AddBoolDemo VALUES(FALSE); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO AddBoolDemo VALUES(1); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO AddBoolDemo VALUES(0); Query OK, 1 row affected (0.18 sec)
Kết quả
mysql> SELECT * FROM AddBoolDemo;
+----------+ | isToggle | +----------+ | 1 | | 0 | | 1 | | 0 | +----------+ 4 rows in set (0.00 sec)
Ứng dụng thực tế
Tạo bảng với Boolean mặc định FALSE
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
is_active BOOLEAN DEFAULT FALSE,
is_verified BOOLEAN DEFAULT FALSE,
is_deleted BOOLEAN DEFAULT FALSE
);
Truy vấn điều kiện Boolean
-- Cách 1: So sánh trực tiếp
SELECT * FROM users WHERE is_active = TRUE;
-- Cách 2: Rút gọn (MySQL cho phép)
SELECT * FROM users WHERE is_active;
-- Cách 3: Chuyển thành text
SELECT
username,
CASE is_active WHEN 1 THEN 'Hoạt động' ELSE 'Khóa' END AS status
FROM users;
Cập nhật Boolean
UPDATE users SET is_verified = TRUE WHERE id = 123; UPDATE users SET is_deleted = NOT is_deleted WHERE id = 123; -- Toggle
Lưu ý quan trọng
- MySQL đánh giá bất kỳ số ≠ 0 là TRUE trong điều kiện WHERE
- Index trên cột BOOLEAN/TINYINT(1) có độ chọn lọc thấp (chỉ 0/1) → ít hiệu quả
- Kết hợp với cột khác cho composite index:
INDEX (is_active, created_at) - Ứng dụng (PHP, Java, Python...) thường map 0/1 ↔ false/true tự động