บทนำ: SQLite Data Types และ MEDIUMTEXT
SQLite ใช้ Dynamic Typing (Type Affinity) ไม่บังคับชนิดข้อมูลอย่างเคร่งครัด แต่รับคีย์เวิร์ด MEDIUMTEXT เพื่อความเข้ากันได้กับ MySQL
ตัวอย่าง: ใช้ MEDIUMTEXT สำหรับคอลัมน์ name
ขั้นตอนที่ 1-3: โปรเจกต์, Layout, MainActivity
โครงสร้างเดียวกับตัวอย่าง SQLite ก่อนหน้า
ขั้นตอนที่ 4: DatabaseHelper.java - ใช้ MEDIUMTEXT
@Override
public void onCreate(SQLiteDatabase db) {
try {
// MEDIUMTEXT สำหรับ name, BIGINT(8) สำหรับ salary
db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
"(id INTEGER PRIMARY KEY, name MEDIUMTEXT, salary BIGINT(8), datetime DEFAULT CURRENT_TIMESTAMP)");
} catch (SQLiteException e) {
try { throw new IOException(e); }
catch (IOException e1) { e1.printStackTrace(); }
}
}
SQLite Type Affinity System
SQLite จัดกลุ่ม Type เป็น 5 Affinity:
| Affinity | คีย์เวิร์ดที่ตรง | คำอธิบาย |
|---|---|---|
| TEXT | TEXT, VARCHAR, CHAR, CLOB, MEDIUMTEXT, LONGTEXT, TINYTEXT | ข้อความ |
| NUMERIC | NUMERIC, DECIMAL, BOOLEAN, DATE, DATETIME | ตัวเลข/วันที่ |
| INTEGER | INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, BIGINT(8) | จำนวนเต็ม (64-bit) |
| REAL | REAL, DOUBLE, FLOAT | ทศนิยม |
| BLOB | BLOB (ไม่มีคีย์เวิร์ดอื่น) | ข้อมูลไบนารี |
MEDIUMTEXT ใน SQLite vs MySQL
| คุณสมบัติ | MySQL | SQLite |
|---|---|---|
| ขนาดสูงสุด | 16,777,215 ตัวอักษร (~16MB) | 1,000,000,000+ ตัวอักษร (ขึ้นกับหน่วยความจำ) |
| การจัดเก็บ | แยกเก็บหากใหญ่ | เก็บในหน้าหลัก (B-tree) จนเต็ม |
| Performance | มี overhead | เร็วกว่าสำหรับขนาดเล็ก-ปานกลาง |
เมื่อไหร่ควรใช้ MEDIUMTEXT?
- ข้อความยาว: บทความ, คำอธิบาย, JSON ขนาดใหญ่, Log
- ต้องการความเข้ากันได้กับ MySQL Schema
- ใน SQLite: ใช้
TEXTก็ได้ผลเหมือนกัน (Affinity เดียวกัน)
ตัวอย่างการ Insert ข้อมูลยาว
String longText = "ข้อความยาวมาก... ".repeat(1000); // ~10,000 ตัวอักษร helper.insert(longText, "50000");
ผลลัพธ์
ListView แสดงข้อมูลที่ name เป็น MEDIUMTEXT (ข้อความยาว) ได้ปกติ
ข้อแนะนำ
- ใน SQLite ใช้
TEXTแทน MEDIUMTEXT/LONGTEXT/TINYTEXT ก็ได้ (เหมือนกันทุกประการ) - ใช้ MEDIUMTEXT เฉพาะต้องการ port จาก MySQL หรือทีมคุ้นเคย
- สำหรับขนาดใหญ่มาก (>1MB) ควรพิจารณาเก็บไฟล์แยก + path ใน DB