Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp mục trong MySQL với dấu chấm (số thập phân dạng chuỗi)

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ánh
  • DECIMAL giữ độ 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.