SQLite 是一個零配置、無伺服器、單一檔案、跨平台的嵌入式關聯式資料庫引擎,廣泛應用於行動裝置、桌面應用、瀏覽器、IoT 設備、邊緣運算等場景。
| # | 特性 | 說明 |
|---|---|---|
| 1 | ACID 交易 | 完整支援原子性、一致性、隔離性、持久性,崩潰安全 |
| 2 | 零配置 | 無安裝、無設定檔、無服務程序,直接連線檔案即用 |
| 3 | 單一檔案 | 完整資料庫 (結構+資料+索引) 封裝在單一磁碟檔案 |
| 4 | 跨平台檔案格式 | 大小端序、32/64 位元平台間自由複製移植 |
| 5 | 大容量支援 | 理論上限 281 TB (實際受檔案系統限制),實務可達 TB 級 |
| 6 | 極輕量 | 核心庫約 600KB (含所有功能),嵌入式系統首選 |
| 7 | 高效能 | 常見操作比許多客戶端/伺服器資料庫更快 (無網路開銷) |
| 8 | 簡單 API | C/C++ 核心 API 不超過 100 個函數,語言綁定豐富 |
| 9 | 多語言支援 | C/C++, PHP, Python, Java, .NET, Node.js, Go, Rust, Swift 等 |
| 10 | 高測試覆蓋 | 超過 90% 程式碼覆蓋率,數百萬測試案例,極高可靠度 |
| 11 | 無外部相依 | 標準 C 庫即可編譯運行,適合受限環境 |
| 12 | 公開領域授權 | Public Domain,可自由用於任何用途 (含商業、封閉源碼) |
| 13 | SQL 標準相容 | 支援大部份 SQL-92 標準,含觸發器、檢視、索引、子查詢 |
SQLite 採用顯式型別親和性 而非強制型別限制:
| 親和性類別 | 宣告型別關鍵字 | 儲存類別優先順序 |
|---|---|---|
| TEXT | CHAR, CLOB, TEXT, VARCHAR | NULL → TEXT → BLOB |
| NUMERIC | DECIMAL, BOOLEAN, DATE, DATETIME | NULL → INTEGER → REAL → TEXT → BLOB |
| INTEGER | INT, INTEGER, TINYINT, BIGINT | NULL → INTEGER → REAL → TEXT → BLOB |
| REAL | REAL, FLOAT, DOUBLE | NULL → REAL → INTEGER → TEXT → BLOB |
| BLOB (NONE) | BLOB, 無型別宣告 | NULL → BLOB → TEXT → INTEGER → REAL |
特殊規則:INTEGER PRIMARY KEY 欄位別名為 ROWID,自動指派 64 位元有號整數,唯一且不重複。
lastErrorMsg());
}
echo "資料庫連線成功!\n";
// 建立資料表
$sql = <<exec($sql)) {
die('建表失敗: ' . $db->lastErrorMsg());
}
echo "資料表建立成功\n";
?>
query('SELECT name, sql FROM sqlite_master WHERE type="table" ORDER BY name;');
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
echo "Table: {$row['name']}\n";
echo "SQL: {$row['sql']}\n";
echo "-----\n";
}
?>
query('SELECT name, email FROM users;', SQLITE3_ASSOC);
echo "Users:\n";
while ($row = $result->fetchArray()) {
echo " Name: {$row['name']}, Email: {$row['email']}\n";
}
?>
prepare('INSERT INTO users (name, email) VALUES (:name, :email);');
$stmt->bindValue(':name', 'User' . $i, SQLITE3_TEXT);
$stmt->bindValue(':email', "user{$i}@example.com", SQLITE3_TEXT);
$stmt->execute();
// 批次新增 (交易包裝提升效能)
$db->exec('BEGIN TRANSACTION;');
for ($i = 1; $i <= 100; $i++) {
$stmt = $db->prepare('INSERT INTO users (name, email) VALUES (?, ?);');
$stmt->bindValue(1, "Batch User $i", SQLITE3_TEXT);
$stmt->bindValue(2, "batch{$i}@example.com", SQLITE3_TEXT);
$stmt->execute();
}
$db->exec('COMMIT;');
// 修改
$stmt = $db->prepare('UPDATE users SET email = :email WHERE name = :name;');
$stmt->bindValue(':email', 'new@example.com', SQLITE3_TEXT);
$stmt->bindValue(':name', 'User1', SQLITE3_TEXT);
$stmt->execute();
// 刪除
$stmt = $db->prepare('DELETE FROM users WHERE name = :name;');
$stmt->bindValue(':name', 'User99', SQLITE3_TEXT);
$stmt->execute();
?>
sqlite3 - 內建互動式 Shell,支援 .schema、.tables、.dump、.backup 等點命令-- 啟用 WAL 模式 (預設 DELETE 模式)
PRAGMA journal_mode = WAL;
-- 效果:
-- 讀取不阻塞寫入,寫入不阻塞讀取
-- 多讀單寫並發效能大幅提升
-- 檢查點自動/手動控制 (PRAGMA wal_autocheckpoint)
PRAGMA synchronous = NORMAL; -- 平衡安全/效能 (FULL 最安全、OFF 最快)
PRAGMA cache_size = -32768; -- 32MB 快取 (負值 = KB,正值 = 頁數)
PRAGMA temp_store = MEMORY; -- 暫存表/索引放記憶體
PRAGMA foreign_keys = ON; -- 啟用外鍵約束 (預設 OFF)
PRAGMA page_size = 4096; -- 頁面大小 (建庫前設定,1024-65536)
PRAGMA auto_vacuum = INCREMENTAL; -- 自動回收空間
VACUUM (非 WAL 模式) 或 PRAGMA incremental_vacuum 整理碎片PRAGMA synchronous = OFF; PRAGMA journal_mode = OFF; 匯入後恢復並 REINDEX| 適用場景 | 不適用場景 |
|---|---|
| 行動 App 本地儲存 (Android/iOS 內建) | 高併發寫入伺服器端應用 (> 100 寫入/秒持續) |
| 桌面應用程式設定/快取/資料檔 | 多機器共享存取 (需網路檔案系統,鎖效能差) |
| 網站低流量/靜態內容/Session 儲存 | 大型企業級 OLTP 系統 (需備份/複寫/高可用/安全審計) |
| IoT/邊緣裝置本地資料收集 | 複雜預存程序/觸發器/使用者定義函數邏輯 |
| 資料分析/ETL 中繼暫存 | TB 級以上資料倉儲 (建議 DuckDB/ClickHouse/PostgreSQL) |
| 測試/原型開發/教學示範 | 需要嚴格型別強制約束的應用 |