Giới thiệu
Khi cột lưu số nhưng kiểu dữ liệu là VARCHAR, hàm MAX() sẽ so sánh theo thứ tự từ điển (lexicographical), dẫn đến kết quả sai (ví dụ: '9' > '10001'). Giải pháp là ép kiểu (CAST) sang số trước khi lấy max.
Cú pháp
SELECT MAX(CAST(cot_varchar AS UNSIGNED)) FROM ten_bang;
Ví dụ minh họa
Bước 1: Tạo bảng và chèn dữ liệu
CREATE TABLE DemoTable2030 (Value VARCHAR(20));
INSERT INTO DemoTable2030 VALUES ('8'), ('1'), ('10001'), ('901');
Bước 2: Sai nếu dùng MAX trực tiếp
SELECT MAX(Value) FROM DemoTable2030; -- Kết quả: '901' (sai về mặt số)
Bước 3: Đúng khi ép kiểu
SELECT MAX(CAST(Value AS UNSIGNED)) FROM DemoTable2030;
Kết quả:
+------------------------------+
| max(cast(Value as unsigned)) |
+------------------------------+
| 10001 |
+------------------------------+
Lưu ý: UNSIGNED dành cho số không âm. Nếu có số âm, dùng SIGNED. Cách này cũng áp dụng cho MIN, ORDER BY, v.v.