Sắp xếp số thực lưu dưới dạng VARCHAR trong MySQL
Vấn đề: Sắp xếp chuỗi '10.5', '11', '10' theo chữ cái cho '10', '10.5', '11', '20', '20.5' (sai). Giải pháp: Ép kiểu sang DECIMAL.
Tạo bảng và dữ liệu
mysql> create table DemoTable ( Value varchar(20) );
mysql> insert into DemoTable values('20'), ('10.5'), ('11'), ('10'), ('20.5');
Sắp xếp mặc định (chuỗi)
+-------+ | Value | +-------+ | 20 | | 10.5 | | 11 | | 10 | | 20.5 | +-------+
Sắp xếp đúng số học với CAST
mysql> select * from DemoTable order by CAST(Value AS DECIMAL) ASC;
Kết quả đúng
+-------+ | Value | +-------+ | 10 | | 10.5 | | 11 | | 20 | | 20.5 | +-------+
Giải thích:
CAST(Value AS DECIMAL): Chuyển chuỗi thành số thập phân để so sánhDECIMALgiữ độ chính xác tuyệt đối (khác FLOAT/DOUBLE có sai số)- Có thể dùng
CAST(Value AS UNSIGNED)cho số nguyên, nhưng sẽ cắt phần thập phân
Cách khác: ORDER BY Value+0 (MySQL tự ép kiểu khi phép toán số học) - ngắn gọn nhưng kém rõ ràng.
Khuyến nghị thiết kế: Nên lưu số thực ở cột DECIMAL(10,2) hoặc FLOAT thay vì VARCHAR để tránh vấn đề này.