บทนำ: LONGTEXT ใน SQLite
LONGTEXT เป็นคีย์เวิร์ดที่ SQLite รับเพื่อความเข้ากันได้กับ MySQL แมปไปที่ TEXT Affinity เหมือน MEDIUMTEXT/TINYTEXT
ตัวอย่าง: ใช้ LONGTEXT สำหรับคอลัมน์ name
ขั้นตอนที่ 1-3: โปรเจกต์, Layout, MainActivity
โครงสร้างเดียวกับตัวอย่าง SQLite ก่อนหน้า
ขั้นตอนที่ 4: DatabaseHelper.java - ใช้ LONGTEXT
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
"(id INTEGER PRIMARY KEY, name LONGTEXT, salary BIGINT(8), datetime DEFAULT CURRENT_TIMESTAMP)");
} catch (SQLiteException e) {
try { throw new IOException(e); }
catch (IOException e1) { e1.printStackTrace(); }
}
}
LONGTEXT ใน SQLite vs MySQL
| คุณสมบัติ | MySQL | SQLite |
|---|---|---|
| ขนาดสูงสุด | 4,294,967,295 ตัวอักษร (~4GB) | ไม่มีข้อจำกัดเฉพาะ (ขึ้นกับ RAM/Storage) |
| Affinity | TEXT | TEXT |
| Performance | มี overhead สำหรับขนาดใหญ่ | จัดเก็บแบบต่อเนื่องใน B-tree |
SQLite ไม่มีข้อจำกัดขนาดจริง
- ขนาดสูงสุดของ Row: ~1GB (SQLITE_MAX_LENGTH default 1,000,000,000)
- สามารถปรับได้ด้วย
PRAGMA max_page_countและpage_size - ในทางปฏิบัติ: จำกัดโดยพื้นที่เก็บข้อมูลและหน่วยความจำ
เมื่อไหร่ใช้ LONGTEXT?
- Porting จาก MySQL ที่ใช้ LONGTEXT
- ทีมคุ้นเคยกับคำศัพท์ MySQL
- ใน SQLite ใช้ TEXT ธรรมดาได้ผลเหมือนกัน
ตัวอย่างข้อมูลขนาดใหญ่
// JSON ขนาดใหญ่
String largeJson = "{\"data\":[" + "\"item\"," .repeat(10000) + "]}";
helper.insert(largeJson, "100000");
ข้อแนะนำ Best Practices
- ใช้
TEXTแทน LONGTEXT/MEDIUMTEXT/TINYTEXT ใน SQLite Native - ข้อมูล > 100KB: พิจารณาเก็บเป็นไฟล์ (Internal Storage) + เก็บ path ใน DB
- ใช้ Index บนคอลัมน์ TEXT ได้ (แต่ช้าและใหญ่)
- Full-text Search: ใช้ FTS5 Extension แทน
ผลลัพธ์
ListView แสดงข้อมูล LONGTEXT ได้ปกติ เหมือน TEXT ทุกประการ