Vấn đề
Khi cột số được lưu trữ dưới dạng chuỗi (VARCHAR), sắp xếp mặc định sẽ theo thứ tự chữ cái (lexicographic), dẫn đến kết quả sai: 10, 100, 11, 78, 89, 97 thay vì 10, 11, 78, 89, 97, 100.
Giải pháp: Sử dụng CAST()
Hàm CAST() chuyển đổi kiểu dữ liệu, cho phép sắp xếp đúng theo giá trị số.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score INT
);
mysql> INSERT INTO DemoTable(Score) VALUES(10);
mysql> INSERT INTO DemoTable(Score) VALUES(100);
mysql> INSERT INTO DemoTable(Score) VALUES(11);
mysql> INSERT INTO DemoTable(Score) VALUES(97);
mysql> INSERT INTO DemoTable(Score) VALUES(78);
mysql> INSERT INTO DemoTable(Score) VALUES(89);
Dữ liệu gốc
mysql> SELECT * FROM DemoTable; +----+-------+ | Id | Score | +----+-------+ | 1 | 10 | | 2 | 100 | | 3 | 11 | | 4 | 97 | | 5 | 78 | | 6 | 89 | +----+-------+
Truy vấn sắp xếp đúng với CAST()
mysql> SELECT * FROM DemoTable
-> ORDER BY CAST(Score AS SIGNED INTEGER) ASC;
Kết quả đúng
+----+-------+ | Id | Score | +----+-------+ | 1 | 10 | | 3 | 11 | | 5 | 78 | | 6 | 89 | | 4 | 97 | | 2 | 100 | +----+-------+
Các tùy chọn CAST() khác
CAST(Score AS UNSIGNED): Số nguyên không dấuCAST(Score AS DECIMAL(10,2)): Số thập phânScore + 0: Cách viết tắt chuyển chuỗi thành số
Lưu ý
Nếu cột đã là kiểu số (INT, DECIMAL), không cần CAST(). Chỉ cần ORDER BY Score ASC.