Giới thiệu
Hàm CAST(expr AS type) chuyển đổi kiểu dữ liệu. Dùng CAST(Amount AS UNSIGNED) để chuyển cột chuỗi số thành số nguyên không dấu để sắp xếp/so sánh đúng kiểu số.
Ví dụ thực hành
1. Tạo bảng DemoTable868
mysql> CREATE TABLE DemoTable868 (Amount VARCHAR(100));
2. Chèn dữ liệu chuỗi số
mysql> INSERT INTO DemoTable868 VALUES ('781'),('990'),('1002'),('560'),('890'),('9890'),('8723');
3. Chuyển UNSIGNED và sắp xếp giảm dần
mysql> SELECT CAST(Amount AS UNSIGNED) AS Amount FROM DemoTable868 ORDER BY Amount DESC;
4. Kết quả (sắp xếp số: 9890 > 8723 > 1002 > 990...)
+--------+
| Amount |
+--------+
| 9890 |
| 8723 |
| 1002 |
| 990 |
| 890 |
| 781 |
| 560 |
+--------+
So sánh: Sắp xếp VARCHAR vs UNSIGNED
-- VARCHAR (lexicographic): '1002' < '781' vì '1' < '7'
SELECT Amount FROM DemoTable868 ORDER BY Amount DESC;
-- 990, 9890, 890, 8723, 781, 560, 1002 (SAI logic số)
-- UNSIGNED (numeric): đúng logic số
SELECT CAST(Amount AS UNSIGNED) FROM DemoTable868 ORDER BY 1 DESC;
-- 9890, 8723, 1002, 990, 890, 781, 560 (ĐÚNG)
Các kiểu đích phổ biến cho CAST
| Kiểu | Mô tả | Ví dụ |
|---|---|---|
UNSIGNED | Số nguyên không dấu (0..18446744073709551615) | CAST('123' AS UNSIGNED) |
SIGNED | Số nguyên có dấu (-9223372036854775808..9223372036854775807) | CAST('-123' AS SIGNED) |
DECIMAL(m,d) | Số thập phân chính xác | CAST('123.45' AS DECIMAL(10,2)) |
DATE, DATETIME, TIME | Ngày/giờ | CAST('2023-01-01' AS DATE) |
CHAR(N), BINARY | Chuỗi | CAST(123 AS CHAR) |
Lưu ý
CASTchuẩn SQL. MySQL cũng hỗ trợCONVERT(expr, type)(cú pháp ODBC).- Chuyển đổi thất bại (ví dụ 'abc' → UNSIGNED) → trả về 0 và warning.
- Nên lưu số als kiểu số (
INT,BIGINT,DECIMAL) thay vì VARCHAR để tránh cast lúc query. - Generated column:
amount_num INT GENERATED ALWAYS AS (CAST(Amount AS UNSIGNED)) STORED+ index.