SQLite和其它數據庫一個大的不同在于其數據庫引擎本身.不象其它數據庫,SQLite是松散型的. SQLite中所有數據庫都以空字符串結尾而不是對特定的列類型用特定的二進制表現.為了兼容性的原因,SQLite仍然在表創建時支持一些類型規范, 比如INT, CHAR, FLOAT, TEXT如此等等,但是實際上并沒有用到這些數據類型.在內部,SQLite僅僅對字符串和整形在排序期間作了區分.因此,如果你不是有意地排序數據,你 可以無需在CREATE TABLE語句 中指定數據類型.
SQLite的類型無關特性也在一定程度上降低了其數據排序和數據比較的 速度.因為,每一次比較SQLite都需要判斷數據,然后來決定是用字符串還是用數字型比較的機制.SQL表格也提供了自動增長的鍵值以對數據行快速訪 問. 同時也意味著對最后插入的一行的引用的訪問.在SQLite里,這有一個不太常見的語法規則. 要創建這樣一個自動增長的鍵值的字段,你必須將字段聲明為INTEGER PRIMARY KEY, 而不是將其指定為一個特殊類型,并賦值以附加屬性來指出這是一個自增長的字段.
鏈式查詢
正如你所想象的.SQLite擁有許多提高其效能和擴展其功能的新的特性.這些特性的其中這五就是執行鏈式查詢的能 力.這就意味著你可以通過一個查詢函數來執行多條查詢.這大大地減少了你需要運行的PHP函數的量.也提高了腳本運行的速度.這也允許你在事特處理中包含 查詢語句塊.大大提高性能.這是當執行多條寫查詢時提高性能的重要因素.當然,運用這個功能時也需要考慮到一些帶來混亂的問題.
如果 SQLite中的任何查詢用到了用戶指定的輸入,你必須仔細地驗證用戶的輸入以防止SQL注射攻擊.不像MySQL,SQL注射僅僅導致一個令人難堪的查 詢錯誤.在SQLite中,允許攻擊者在你的服務器上執行查詢,可能導致潛在的災難性的后果.如果查詢展示會中包含了插入語句,并且你希望獲得id, sqlite_last_insert_rowid() 函數可以達到這個目的,僅僅取得最后一次插入的id.另外一方面,當試圖知道多少行受到查詢影響時,可以用sqlite_changes(),這個函數的 結果 就是所有執行的查詢所影響的總行數.如果你的查詢塊中包含了SELECT,請確保它是第一個查詢.否則你的結果集將不包含查詢中所存取的行.
// 創建一個僅在內存中的數據庫(不存為文件的)
$db = new SQLiteDatabase(":memory:");
// 創建一個兩列的表 bar ,并且在其中插入兩行.
/* 為了提高性能,整個查詢塊封裝在 一個事物中. */
$db->query("BEGIN;
CREATE TABLE bar ( id INTEGER PRIMARY KEY, id2 );
INSERT INTO bar (id2) VALUES(1);
INSERT INTO bar (id2) VALUES(2);
COMMIT;");
// 將輸出"2 insert queries"
echo $db->changes()." insert queries/n";
// 將輸出 "last inserted row id: 2"
echo "last inserted row id: ".$db->lastInsertRowid();
?>
新函數
除了向后前進的特性,(back end features), SQLite 也提供了一系統簡化和提供數據存取速度的函數.
$db = new SQLiteDatabase(