Giới thiệu
Khi so sánh cột kiểu INT với giá trị, nên dùng số nguyên intvalue=1 thay vì chuỗi intvalue='1'. MySQL sẽ tự ép kiểu chuỗi sang số, nhưng có overhead và rủi ro.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable1566 (
-> intvalue int
-> );
Query OK, 0 rows affected (0.64 sec)
mysql> insert into DemoTable1566 values(1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1566 values(55);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1566 values(75);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable1566 values(90);
Query OK, 1 row affected (0.19 sec)
2. So sánh với số nguyên (khuyên dùng)
mysql> select * from DemoTable1566 where intvalue=1;
+----------+ | intvalue | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
3. So sánh với chuỗi (tự động CAST)
mysql> select * from DemoTable1566 where intvalue='1';
+----------+ | intvalue | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
Cơ chế nội bộ: MySQL chuyển intvalue='1' thành CAST('1' AS SIGNED) rồi so sánh.
Tại sao nên dùng số nguyên?
- Hiệu suất: Tránh ép kiểu ngầm, optimizer có thể dùng index tốt hơn
- An toàn:
intvalue='1abc'→ ép thành 1 (cảnh báo), có thể khớp sai - Rõ ràng: Code thể hiện đúng kiểu dữ liệu
- Chuẩn SQL: ANSI SQL yêu cầu kiểu khớp nhau
Khi nào bắt buộc dùng chuỗi? Khi giá trị đến từ tham số ứng dụng (prepared statement) tự động bind kiểu, hoặc cột là VARCHAR/CHAR.
Tóm tắt: Luôn viết WHERE int_col = 1, không phải WHERE int_col = '1'.