ตั้งแต่ MySQL 5.7+ รองรับชนิดข้อมูล JSON แบบ Native ซึ่งจัดเก็บในรูปแบบ Binary ที่ปรับปรุงแล้ว ทำให้ค้นหา, ดึงข้อมูล, และตรวจสอบความถูกต้องได้อย่างมีประสิทธิภาพ
ตัวอย่างการใช้งาน
สร้างตารางพร้อมคอลัมน์ JSON:
mysql> CREATE TABLE DemoTable1438 (
-> EmployeeDetails JSON
-> );
เพิ่มข้อมูล JSON Array:
mysql> INSERT INTO DemoTable1438 VALUES (
-> '[{"EmployeeId":"EMP-101","EmployeeName":"Chris"},
-> {"EmployeeId":"EMP-102","EmployeeName":"David"},
-> {"EmployeeId":"EMP-103","EmployeeName":"Sam"}]'
-> );
ดูข้อมูล (MySQL จะจัดรูปแบบ Pretty-print อัตโนมัติ):
mysql> SELECT * FROM DemoTable1438;
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EmployeeDetails |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [{"EmployeeId": "EMP-101", "EmployeeName": "Chris"}, {"EmployeeId": "EMP-102", "EmployeeName": "David"}, {"EmployeeId": "EMP-103", "EmployeeName": "Sam"}] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
ฟังก์ชัน JSON ที่ใช้บ่อย
| ฟังก์ชัน | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| JSON_EXTRACT(col, path) | ดึงค่าจาก JSON | JSON_EXTRACT(EmployeeDetails, '$[0].EmployeeName') → "Chris" |
| ->> | Shortcut สำหรับ JSON_EXTRACT + UNQUOTE | EmployeeDetails->>'$[0].EmployeeName' |
| JSON_CONTAINS(col, val, path) | เช็คว่ามีค่าใน JSON | JSON_CONTAINS(EmployeeDetails, '"EMP-101"', '$.EmployeeId') |
| JSON_ARRAY_APPEND() | เพิ่มสมาชิกใน Array | UPDATE t SET col = JSON_ARRAY_APPEND(col, '$', '{"id":"EMP-104"}') |
| JSON_ARRAY_INSERT() | แทรกสมาชิกในตำแหน่งที่กำหนด | |
| JSON_REMOVE() | ลบสมาชิก | |
| JSON_LENGTH(col, path) | นับจำนวนสมาชิก | JSON_LENGTH(EmployeeDetails) → 3 |
การสร้าง Index สำหรับ JSON (MySQL 8.0+)
ไม่สามารถสร้าง Index บนคอลัมน์ JSON โดยตรงได้ แต่สามารถสร้าง Generated Column แล้ว Index คอลัมน์นั้น:
ALTER TABLE DemoTable1438
ADD COLUMN first_emp_id VARCHAR(20) GENERATED ALWAYS AS (EmployeeDetails->>'$[0].EmployeeId') STORED,
ADD INDEX idx_first_emp_id (first_emp_id);
ข้อดีของ JSON Data Type
- ตรวจสอบความถูกต้อง (Valid JSON) อัตโนมัติตอน INSERT/UPDATE
- จัดเก็บแบบ Binary - เร็วกว่า TEXT/VARCHAR
- ฟังก์ชัน JSON มากมายสำหรับ Query และ Manipulate
- รองรับ Partial Update (ไม่ต้องเขียนทับทั้ง Document)
ข้อจำกัด
- ไม่รองรับ Foreign Key โดยตรง
- ไม่สามารถ Index โดยตรง (ต้องใช้ Generated Column)
- ขนาดสูงสุด 1GB (ตัวแปร
max_allowed_packet)