Khi cột kiểu chuỗi (VARCHAR, CHAR) chứa số (ví dụ: '3', '20', '100'), sắp xếp mặc định ORDER BY col sẽ theo thứ tự từ điển (lexicographical): '100' < '20' < '3'. Để sắp xếp theo giá trị số thực, hãy ép kiểu (CAST) sang số.
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (Id VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES ('3'), ('20'), ('34'), ('21'), ('78'), ('90');
Sắp xếp mặc định (chuỗi) - SAI
mysql> SELECT * FROM DemoTable ORDER BY Id;
+------+
| Id |
+------+
| 20 |
| 21 |
| 3 |
| 34 |
| 78 |
| 90 |
+------+
Sắp xếp đúng (số) với CAST(... AS SIGNED/UNSIGNED)
mysql> SELECT * FROM DemoTable ORDER BY CAST(Id AS SIGNED) DESC;
+------+
| Id |
+------+
| 90 |
| 78 |
| 34 |
| 21 |
| 20 |
| 3 |
+------+
Các kiểu CAST phổ biến
CAST(col AS SIGNED): Số nguyên có dấu (cho phép âm).CAST(col AS UNSIGNED): Số nguyên không dấu (0 đến 18446744073709551615).CAST(col AS DECIMAL(10,2)): Số thập phân.CAST(col AS DATE),DATETIME,TIME.
Cú pháp thay thế: CONVERT()
SELECT * FROM DemoTable ORDER BY CONVERT(Id, SIGNED) DESC;
CONVERT là chuẩn SQL, CAST cũng là chuẩn SQL. MySQL hỗ trợ cả hai.
Lưu ý hiệu năng
CASTtrongORDER BYlàm mất index trên cột gốc (filesort).- Nếu truy vấn thường xuyên, cân nhắc:
- Thay đổi kiểu cột sang
INT(nếu dữ liệu sạch). - Thêm Generated Column
Id_num INT AS (CAST(Id AS UNSIGNED)) STOREDvà index trên cột đó.
- Thay đổi kiểu cột sang