Chuyển đổi VARCHAR sang kiểu số (DOUBLE/DECIMAL) trong MySQL
MySQL tự động chuyển đổi chuỗi sang số trong ngữ cảnh số học. Cách đơn giản nhất: cộng 0.0 hoặc dùng CAST()/CONVERT().
Ví dụ minh họa
Tạo bảng DemoTable731 lưu số dạng chuỗi:
mysql> CREATE TABLE DemoTable731 (Value VARCHAR(100)); Query OK, 0 rows affected (0.50 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable731 VALUES('4.50');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable731 VALUES('7.83');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable731 VALUES('8.91');
Query OK, 1 row affected (0.25 sec)
mysql> INSERT INTO DemoTable731 VALUES('560.34');
Query OK, 1 row affected (0.21 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable731;
+--------+ | Value | +--------+ | 4.50 | | 7.83 | | 8.91 | | 560.34 | +--------+ 4 rows in set (0.00 sec)
Cách 1: Cộng 0.0 (ngắn gọn, MySQL tự ép kiểu):
mysql> SELECT Value + 0.0 AS demo FROM DemoTable731;
+-----------+ | demo | +-----------+ | 4.5 | | 7.83 | | 8.91 | | 560.34 | +-----------+ 4 rows in set (0.28 sec)
Cách 2: CAST() - Chuẩn SQL, rõ ràng:
SELECT CAST(Value AS DECIMAL(10,2)) FROM DemoTable731;
Cách 3: CONVERT() - Chuẩn SQL khác:
SELECT CONVERT(Value, DECIMAL(10,2)) FROM DemoTable731;
So sánh các phương pháp
| Phương pháp | Cú pháp | Ưu điểm | Nhược điểm |
|---|---|---|---|
| + 0.0 | col + 0.0 | Ngắn, nhanh viết | Ít rõ ràng, precision tùy context |
| CAST() | CAST(col AS DECIMAL(10,2)) | Chuẩn ANSI, kiểm soát precision/scale | Dài hơn |
| CONVERT() | CONVERT(col, DECIMAL(10,2)) | Chuẩn ANSI, hỗ trợ charset | Dài hơn |
Lưu ý quan trọng
- Chuỗi không phải số (ví dụ:
'abc') sẽ chuyển thành0với warning - Chuỗi có tiền tố số (
'123abc') sẽ lấy phần số đầu (123) - Dùng
DECIMAL(p,s)thay vìDOUBLEcho dữ liệu tài chính/tiền tệ (tránh lỗi floating point) - MySQL 8.0+:
CAST(col AS DECIMAL(10,2))là khuyến nghị
Ví dụ xử lý dữ liệu bẩn
SELECT
Value,
CASE
WHEN Value REGEXP '^[0-9]+(\.[0-9]+)?$' THEN CAST(Value AS DECIMAL(10,2))
ELSE NULL
END AS CleanValue
FROM DemoTable731;