Để sắp xếp đúng thứ tự số học cho cột VARCHAR chứa số (có thể có số 0 dẫn đầu như '085', '090'), dùng biểu thức column*1 (ép kiểu sang số) trong ORDER BY.
Ví dụ minh họa
Tạo bảng:
mysql> create table DemoTable (
Value varchar(100)
);
Chèn dữ liệu (có '045', '085', '090' với 0 dẫn đầu):
mysql> insert into DemoTable values('90');
mysql> insert into DemoTable values('86');
mysql> insert into DemoTable values('45');
mysql> insert into DemoTable values('85');
mysql> insert into DemoTable values('085');
mysql> insert into DemoTable values('090');
mysql> insert into DemoTable values('045');
Hiển thị dữ liệu gốc (sắp xếp chuỗi mặc định - sai thứ tự số):
mysql> select * from DemoTable;
Kết quả (string sort):
+-------+ | Value | +-------+ | 90 | | 86 | | 45 | | 85 | | 085 | | 090 | | 045 | +-------+
Truy vấn ORDER BY Value*1, Value (sắp xếp số học, tie-break bằng chuỗi)
mysql> select * from DemoTable order by Value*1, Value;
Kết quả (numeric sort đúng):
+-------+ | Value | +-------+ | 045 | | 45 | | 085 | | 85 | | 86 | | 090 | | 90 | +-------+
Giải thích:
Value*1: Ép kiểu VARCHAR → NUMBER (MySQL tự động cast). '045'*1 = 45, '45'*1 = 45ORDER BY Value*1, Value: Sắp xếp chính theo giá trị số, nếu bằng nhau (45 và 045) thì sắp xếp phụ theo chuỗi gốc ('045' < '45' lexicographically)- Kết quả: 45 (045, 45), 85 (085, 85), 86, 90 (090, 90)
Lưu ý: Cách này không dùng index trên cột Value (do có biểu thức). Với bảng lớn, cân nhắc: thêm cột INT computed/generated column, hoặc lưu số dưới dạng INT riêng biệt.