บทนำ: TINYINT ใน SQLite
TINYINT เป็นคีย์เวิร์ดที่ SQLite รับเพื่อความเข้ากันได้กับ MySQL แมปไปที่ INTEGER Affinity (จำนวนเต็ม 64-bit ใน SQLite)
ตัวอย่าง: ใช้ TINYINT สำหรับคอลัมน์ salary
ขั้นตอนที่ 1-3: โปรเจกต์, Layout, MainActivity
โครงสร้างเดียวกับตัวอย่าง SQLite ก่อนหน้า
ขั้นตอนที่ 4: DatabaseHelper.java - ใช้ TINYINT
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
"(id INTEGER PRIMARY KEY, name TEXT, salary TINYINT, datetime DEFAULT CURRENT_TIMESTAMP)");
} catch (SQLiteException e) {
try { throw new IOException(e); }
catch (IOException e1) { e1.printStackTrace(); }
}
}
TINYINT ใน SQLite vs MySQL
| คุณสมบัติ | MySQL | SQLite |
|---|---|---|
| ช่วงค่า (Signed) | -128 ถึง 127 (1 byte) | -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807 (8 bytes) |
| ช่วงค่า (Unsigned) | 0 ถึง 255 | ไม่มี UNSIGNED แยก |
| Affinity | INTEGER | INTEGER |
| Boolean | TINYINT(1) ใช้แทน Boolean | INTEGER 0/1 ใช้แทน Boolean |
⚠️ ความแตกต่างสำคัญ
- MySQL: TINYINT = 1 byte, จำกัดค่า -128 ถึง 127
- SQLite: TINYINT = INTEGER = 8 bytes, ไม่จำกัดค่า
- SQLite ไม่ Enforce ขนาดจากคีย์เวิร์ด (TINYINT, SMALLINT, MEDIUMINT, BIGINT = INTEGER ทั้งหมด)
การใช้ TINYINT แทน Boolean
ใน SQLite ไม่มี Boolean Type ใช้ INTEGER แทน:
-- Schema
CREATE TABLE settings (
id INTEGER PRIMARY KEY,
key TEXT,
value TINYINT DEFAULT 0 -- 0 = false, 1 = true
);
-- Insert
INSERT INTO settings (key, value) VALUES ('dark_mode', 1);
INSERT INTO settings (key, value) VALUES ('notifications', 0);
-- Query
SELECT key, CASE value WHEN 1 THEN 'ON' ELSE 'OFF' END as status FROM settings;
CHECK Constraint สำหรับจำกัดค่า (แนะนำ)
หากต้องการจำกัดให้เป็น 0/1 หรือ -128 ถึง 127 จริงๆ:
-- Boolean (0 หรือ 1)
CREATE TABLE flags (
id INTEGER PRIMARY KEY,
name TEXT,
enabled TINYINT CHECK (enabled IN (0, 1)) DEFAULT 0
);
-- Tinyint Range (-128 ถึง 127)
CREATE TABLE small_numbers (
id INTEGER PRIMARY KEY,
value TINYINT CHECK (value >= -128 AND value <= 127)
);
ข้อแนะนำ Best Practices
- ใช้
INTEGERแทน TINYINT/SMALLINT/MEDIUMINT/BIGINT ใน SQLite Native - ใช้
CHECK constraintหากต้องการ Validate Range - Boolean: ใช้ INTEGER + CHECK (0,1) หรือ ใช้
BOOLEANkeyword (แมปเป็น NUMERIC) - Porting จาก MySQL: ระวังค่าที่เกิน Range ของ MySQL TINYINT
ผลลัพธ์
ListView แสดง salary เป็น TINYINT (เก็บค่าได้มากกว่า 127 ใน SQLite)