So sánh chuỗi đại diện số trong MySQL
Khi cột VARCHAR chứa số nhưng cần so sánh theo giá trị số, dùng CAST(... AS UNSIGNED) hoặc CAST(... AS SIGNED).
Ví dụ: So sánh chuỗi số
Tạo bảng:
mysql> CREATE TABLE compareTwoStringsDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value VARCHAR(100)
-> );
Chèn dữ liệu:
mysql> INSERT INTO compareTwoStringsDemo(Value) VALUES
('1235667'), ('999999'), ('999888'), ('567433'), ('2345123');
Dữ liệu:
+----+---------+ | Id | Value | +----+---------+ | 1 | 1235667 | | 2 | 999999 | | 3 | 999888 | | 4 | 567433 | | 5 | 2345123 | +----+---------+
So sánh dưới dạng số (tìm 999999):
mysql> SELECT * FROM compareTwoStringsDemo WHERE CAST(Value AS UNSIGNED) = 999999;
Kết quả:
+----+--------+ | Id | Value | +----+--------+ | 2 | 999999 | +----+--------+
Tại sao cần CAST?
- So sánh chuỗi:
'999999' < '1235667'(lexicographic, '9' > '1') - So sánh số:
999999 < 1235667(numeric, đúng toán học) - Không CAST: WHERE Value = '999999' chỉ khớp chuỗi chính xác
Các kiểu CAST hữu ích
| Kiểu | Phạm vi | Dùng cho |
|---|---|---|
| UNSIGNED | 0 đến 18446744073709551615 | Số nguyên dương (ID, count) |
| SIGNED | -9223372036854775808 đến 9223372036854775807 | Số nguyên có dấu |
| DECIMAL(p,s) | Số thập phân chính xác | Tiền tệ, đo lường |
| DOUBLE | Số thực dấu phẩy động | Khoa học, ước lượng |
Lưu ý hiệu năng
CAST()trong WHERE làm mất index trên cột VARCHAR- Giải pháp: Tạo generated column
Value_num INT AS (CAST(Value AS UNSIGNED)) STOREDrồi index trên cột đó - Hoặc lưu trực tiếp kiểu số nếu không cần định dạng chuỗi