การแปลง VARCHAR เป็นตัวเลขทศนิยมด้วย CAST
ใช้ CAST() ฟังก์ชันมาตรฐาน SQL เพื่อแปลงสตริงเป็น DECIMAL (MySQL ใช้ DECIMAL แทน DOUBLE สำหรับความแม่นยำ)
ไวยากรณ์
SELECT CAST(yourVarcharColumn AS DECIMAL(precision, scale)) AS numeric_column
FROM yourTableName;
precision= จำนวนหลักทั้งหมด (สูงสุด 65)scale= จำนวนหลักหลังจุดทศนิยม (สูงสุด 30, ต้อง ≤ precision)
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE VarcharToDouble (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(10),
Amount VARCHAR(10),
PRIMARY KEY(Id)
);
เพิ่มข้อมูล:
INSERT INTO VarcharToDouble(Name, Amount) VALUES('John', '456.78');
INSERT INTO VarcharToDouble(Name, Amount) VALUES('Larry', '8465.98');
INSERT INTO VarcharToDouble(Name, Amount) VALUES('Mike', '9083.45');
INSERT INTO VarcharToDouble(Name, Amount) VALUES('Sam', '46475.50');
INSERT INTO VarcharToDouble(Name, Amount) VALUES('Carol', '10003.35');
แปลงและเรียงลำดับ:
SELECT Id, Name, CAST(Amount AS DECIMAL(10,2)) AS TotalAmount
FROM VarcharToDouble
ORDER BY TotalAmount DESC;
ผลลัพธ์:
+----+-------+-------------+
| Id | Name | TotalAmount |
+----+-------+-------------+
| 5 | Carol | 10003.35 |
| 4 | Sam | 46475.50 |
| 3 | Mike | 9083.45 |
| 2 | Larry | 8465.98 |
| 1 | John | 456.78 |
+----+-------+-------------+
ฟังก์ชันแปลงชนิดข้อมูลอื่นๆ
| ฟังก์ชัน | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| CAST(expr AS type) | มาตรฐาน SQL | CAST('123' AS UNSIGNED) |
| CONVERT(expr, type) | มาตรฐาน SQL (ODBC syntax) | CONVERT('123', UNSIGNED) |
| expr + 0 | MySQL shorthand (implicit conversion) | '123' + 0 = 123 |
ชนิดข้อมูลตัวเลขใน MySQL
| Type | ช่วงค่า (Signed) | Precision | ใช้เมื่อไหร่ |
|---|---|---|---|
| DECIMAL(p,s) | Exact, up to 65 digits | Exact | เงิน, การเงิน, ต้องแม่นยำ |
| DOUBLE | ~±1.79E+308 | ~15 digits | วิทยาศาสตร์, ประมาณการ |
| FLOAT | ~±3.40E+38 | ~7 digits | ประหยัดพื้นที่, ไม่ต้องแม่นยำ |
⚠️ ข้อควรระวัง
- ข้อมูลที่ไม่ใช่ตัวเลข (เช่น 'abc') จะกลายเป็น 0 พร้อม Warning
- ใช้
DECIMALสำหรับเงิน/การเงิน (หลีกเลี่ยง floating point error) - กำหนด precision/scale ให้พอดี (ใหญ่เกินไป = waste space)
จัดการข้อมูลผิดปกติ
-- แปลงเฉพาะที่เป็นตัวเลขได้
SELECT CAST(Amount AS DECIMAL(10,2))
FROM VarcharToDouble
WHERE Amount REGEXP '^[0-9]+(\.[0-9]+)?$';