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

Chuyển đổi chuỗi (VARCHAR) sang DOUBLE trong MySQL

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ápCú phápƯu điểmNhược điểm
+ 0.0col + 0.0Ngắ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/scaleDài hơn
CONVERT()CONVERT(col, DECIMAL(10,2))Chuẩn ANSI, hỗ trợ charsetDài hơn

Lưu ý quan trọng

  • Chuỗi không phải số (ví dụ: 'abc') sẽ chuyển thành 0 vớ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ì DOUBLE cho 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;