Hiểu về biểu thức SET + 0 trong MySQL
Khi cộng một tập hợp (SET) với 0 (set_col + 0), MySQL chuyển đổi giá trị SET thành số nguyên đại diện cho bitmask của các thành viên được chọn.
Cơ chế hoạt động
Kiểu SET lưu trữ dưới dạng bitmask. Mỗi thành viên tương ứng một bit (2^vị_trí).
Ví dụ minh họa
Tạo bảng có cột SET 5 thành viên:
mysql> CREATE TABLE SetZeroDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> TechnicalSkills SET('C','Spring Framework/Hibernate','Python','Django Framework','Core Java') NOT NULL
-> );
Chèn dữ liệu chọn tất cả 5 kỹ năng:
mysql> INSERT INTO SetZeroDemo(TechnicalSkills)
VALUES ('C,Spring Framework/Hibernate,Python,Django Framework,Core Java');
Dữ liệu:
+----+-----------------------------------------------------------------+ | Id | TechnicalSkills | +----+-----------------------------------------------------------------+ | 1 | C,Spring Framework/Hibernate,Python,Django Framework,Core Java | +----+-----------------------------------------------------------------+
Áp dụng + 0:
mysql> SELECT TechnicalSkills + 0 FROM SetZeroDemo;
Kết quả:
+-------------------+ | TechnicalSkills+0 | +-------------------+ | 31 | +-------------------+
Tính toán bitmask
5 thành viên → vị trí 0 đến 4:
= 2^0 + 2^1 + 2^2 + 2^3 + 2^4 = 1 + 2 + 4 + 8 + 16 = 31
| Thành viên | Vị trí | Giá trị bit (2^n) |
|---|---|---|
| C | 0 | 1 |
| Spring Framework/Hibernate | 1 | 2 |
| Python | 2 | 4 |
| Django Framework | 3 | 8 |
| Core Java | 4 | 16 |
Ứng dụng
- Kiểm tra thành viên:
(set_col + 0) & 4 > 0→ có Python không? - Đếm số thành viên:
BIT_COUNT(set_col + 0) - So sánh SET:
(set1 + 0) = (set2 + 0) - Lưu trữ compact: SET tối đa 64 thành viên → fit trong BIGINT
Lưu ý
- Thứ tự thành viên trong định nghĩa SET quyết định vị trí bit
- Không thể thay đổi thứ tự sau khi tạo bảng (cần ALTER TABLE)
- ENUM cũng hoạt động tương tự nhưng chỉ chọn 1 giá trị