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

Chuyển đổi VARCHAR sang UNSIGNED INTEGER trong MySQL với CAST

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ểuMô tảVí dụ
UNSIGNEDSố nguyên không dấu (0..18446744073709551615)CAST('123' AS UNSIGNED)
SIGNEDSố nguyên có dấu (-9223372036854775808..9223372036854775807)CAST('-123' AS SIGNED)
DECIMAL(m,d)Số thập phân chính xácCAST('123.45' AS DECIMAL(10,2))
DATE, DATETIME, TIMENgày/giờCAST('2023-01-01' AS DATE)
CHAR(N), BINARYChuỗiCAST(123 AS CHAR)

Lưu ý

  • CAST chuẩ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.