Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL เก็บค่า Double และ Date ใน VARCHAR ได้ไหม? (ได้ แต่ไม่แนะนำ)

ได้ครับ 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/Decimalcol + 0.0 หรือ CAST(col AS DECIMAL(10,2))'150.50' + 0.0 = 150.5
DateSTR_TO_DATE(col, format)STR_TO_DATE('Oct 10,2019', '%M %d,%Y')
Integercol + 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