ได้ครับ MySQL อนุญาตให้เก็บค่า Double และ Date ในคอลัมน์ VARCHAR แต่ ไม่แนะนำ เพราะสูญเสียการตรวจสอบชนิดข้อมูล ประสิทธิภาพ Index และฟังก์ชันวันที่/ตัวเลข
ตัวอย่างการเก็บใน VARCHAR
1. สร้างตาราง VARCHAR
mysql> CREATE TABLE DemoTable (
Amount VARCHAR(20),
JoiningDate VARCHAR(20)
);
Query OK, 0 rows affected (0.96 sec)
2. เพิ่มข้อมูล (Double และ Date เป็นสตริง)
mysql> INSERT INTO DemoTable VALUES('150.50', 'Oct 10,2019');
mysql> INSERT INTO DemoTable VALUES('173.45', 'Sept 11,2018');
mysql> INSERT INTO DemoTable VALUES('173.90', 'Jan 01,2017');
3. แสดงข้อมูลดิบ
mysql> SELECT * FROM DemoTable; +--------+--------------+ | Amount | JoiningDate | +--------+--------------+ | 150.50 | Oct 10,2019 | | 173.45 | Sept 11,2018 | | 173.90 | Jan 01,2017 | +--------+--------------+
4. แปลงกลับเป็นชนิดข้อมูลจริงเมื่อ Query
mysql> SELECT
Amount + 0.0 AS DoubleValue,
STR_TO_DATE(JoiningDate, '%M %d,%Y') AS Date
FROM DemoTable;
5. ผลลัพธ์หลังแปลง
+-------------+------------+ | DoubleValue | Date | +-------------+------------+ | 150.5 | 2019-10-10 | | 173.45 | 2018-09-11 | | 173.9 | 2017-01-01 | +-------------+------------+
เทคนิคการแปลง
| ชนิดข้อมูล | วิธีแปลงจาก VARCHAR | ตัวอย่าง |
|---|---|---|
| Double/Decimal | col + 0.0 หรือ CAST(col AS DECIMAL(10,2)) | '150.50' + 0.0 = 150.5 |
| Date | STR_TO_DATE(col, format) | STR_TO_DATE('Oct 10,2019', '%M %d,%Y') |
| Integer | col + 0 หรือ CAST(col AS UNSIGNED) | '123' + 0 = 123 |
ข้อเสียของการเก็บใน VARCHAR
- ❌ ไม่มี Validation: เก็บ 'abc' ใน Amount ได้
- ❌ เรียงลำดับผิด: '100' < '20' (String Sort)
- ❌ Index ไม่มีประสิทธิภาพสำหรับ Range Query
- ❌ ไม่ใช้ฟังก์ชัน Date/Time/คณิตศาสตร์ได้โดยตรง
- ❌ ใช้พื้นที่มากกว่า (เก็บเป็นตัวอักษร)
Best Practice: ใช้ชนิดข้อมูลที่ถูกต้อง
CREATE TABLE DemoTable (
Amount DECIMAL(10,2), -- สำหรับเงิน/ทศนิยม
JoiningDate DATE, -- สำหรับวันที่ (YYYY-MM-DD)
CreatedAt DATETIME -- สำหรับวันที่เวลา
);
สรุป
MySQL ยอมให้เก็บ Double/Date ใน VARCHAR ได้ (Implicit Conversion) แต่ควรใช้ชนิดข้อมูลที่เหมาะสม (DECIMAL, DATE, DATETIME) เพื่อ Data Integrity, Performance และความสะดวกในการ Query