工作原理,功能特性,語言綁定,數據類型,客戶端管理,使用技巧,用PHP操作sqlite資料庫,用JAVA連線SQLite,使用.NET操作SQLLITE,使用linux下的C操作SQLLITE,SQLite 常用函式,歷史版本,注意事項,
工作原理
不像常見的客戶-伺服器範例,SQLite
引擎不是個
程式與之通信的獨立進程,而是連線到程式中成為它的一個主要部分。所以主要的通信協定是在
編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個資料庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的檔案中。它的簡單的設計是通過在開始一個事務的時候鎖定整個
數據檔案而完成的。
功能特性
1. ACID事務
2. 零配置 – 無需安裝和管理配置
6. 足夠小, 大致13萬行C代碼, 4.43M
7. 比一些流行的資料庫在大部分普通資料庫操作要快
8. 簡單, 輕鬆的API
9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
10. 良好注釋的
原始碼, 並且有著90%以上的測試覆蓋率
11. 獨立: 沒有額外依賴
12. 源碼完全的開源, 你可以用於任何用途, 包括出售它
13. 支持多種開發語言,C, C++, PHP, Perl, Java, C#,Python, Ruby等
SQLite雖然很小巧,但是支持的SQL語句不會遜色於其他開源資料庫,它支持的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同時它還支持
事務處理功能等等。也有人說它象Microsoft的Access,有時候真的覺得有點象,但是事實上它們區別很大。比如SQLite 支持跨平台,操作簡單,能夠使用很多語言直接創建資料庫,而不象Access一樣需要Office的支持。如果你是個很小型的套用,或者你想做
嵌入式開發,沒有合適的
資料庫系統,那么你可以考慮使用SQLite。到2013年10月17日最新版本是 3.8.1 。能在上面獲得
原始碼和文檔。同時因為資料庫結構簡單,系統
原始碼也不是很多,也適合想研究
資料庫系統開發的專業人士.
語言綁定
可以從C/C++程式中使用這個庫,還可以獲得對Tcl和一些其他腳本語言的綁定。
在CPAN的DBD::SQLite上有一個Perl的DBI/DBD模組,它不是到SQLite的接口,而是包括整個SQLite資料庫引擎在其中並不需要任何額外的軟體。
還有一個Python模組叫做PySQLite。
PHP從PHP5.0開始包含了SQLite,但是自5.1版之後開始成為一個延伸函式庫。SQLite能與PHP4一起工作但不包含在其中。
Rails2.0.3將預設的資料庫配置改為了SQLite 3。
數據類型
SQLite的數據類型
首先你會接觸到一個讓你驚訝的名詞: Typelessness(無類型). 對! SQLite是無類型的. 這意味著你可以保存任何類型的數據到你所想要保存的任何表的任何列中, 無論這列聲明的
數據類型是什麼(只有在一種情況下不是, 稍後解釋). 對於SQLite來說對欄位不指定類型是完全有效的. 如:
Create Table ex1(a, b, c);
誠然SQLite允許忽略
數據類型, 但是仍然建議在你的Create Table語句中指定數據類型. 因為數據類型對於你和其他的程式設計師交流, 或者你準備換掉你的資料庫引擎時能起到一個提示或幫助的作用. SQLite支持常見的數據類型, 如:
CREATE TABLE ex2
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
前面提到在某種情況下, SQLite的欄位並不是無類型的. 即在欄位類型為”Integer Primary Key”時.
客戶端管理
SQLite亦可以作為桌面資料庫使用,以下為第三方SQLite的GUI軟體。例如:
SQLiteMan,使用QT開發的一個SQLite客戶端,支持多語言、跨平台。
SQLiteSpy 輕量級的SQLite客戶端,免費,單檔案,界面設計緊湊,很穩定, 功能相對較少,創建表與添加數據均需sql語句,作為數據瀏覽和修改工具極佳。
SQLite Manager, 以火狐瀏覽器的擴展形式提供的SQLite客戶端。
SQLite Database Browser, a graphical client to access SQLite databases
SqlPro SQL Client, another graphical client to work with SQLite databases。
使用技巧
用PHP操作sqlite資料庫
a、 如何連線sqlite資料庫?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
select * from sqlite_master;
echo "資料庫連線成功!";
} else {
die($sqliteerror);
}
b、 如何列出資料庫中所有的表?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select * from sqlite_master;');
foreach ($result as $entry) {
echo 'talbe name='.$entry['name']."
n";
echo 'sql='.$entry['sql']."
n";
echo "
--------------------------------------------------------------------------------
";
}
sqlite_close($db);
} else {
die($sqliteerror);
}}
c、 對sqlite資料庫的查詢,以及
結果集的顯示
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);
echo "user表查詢結果:
n";
echo " n name email
n";
foreach ($result as $entry) {
echo ' '.$entry['name']." " $entry['email']."
n";
}
echo ' ';
sqlite_close($db);
} else {
die($sqliteerror);
}
sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");
sqlite_query($db, "delete from user where user=’user99’");
sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');
用JAVA連線SQLite
先下載SQLite資料庫的JDBC
這裡給出一個中文站點的URL:(參見擴展閱讀)
將下載到的包解壓後得到jar包 sqlitejdbc-v033-nested.jar 放到%JAVA_HOME%\lib 下,
並且將其添加到classpath系統
環境變數中,我的classpath系統環境變數為:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar
在你的代碼中引用這個驅動:
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");//filename為你的SQLite數據名稱
// ... use the database ...
conn.close();
示例程式如下:
importjava.sql.*;
importorg.sqlite.JDBC;
/**
* 這是個非常簡單的SQLite的Java程式,
* 程式中創建資料庫、創建表、然後插入數據,
* 最後讀出數據顯示出來
*/
publicclass TestSQLite
{
publicstaticvoid main(String[] args)
{
try
{
//連線SQLite的JDBC
Class.forName("org.sqlite.JDBC");
//建立一個資料庫名zieckey.db的連線,如果不存在就在當前目錄下創建之
Connection conn =DriverManager.getConnection("jdbc:sqlite:zieckey.db");
Statement stat = conn.createStatement();
stat.executeUpdate("create table tbl1(name varchar(20), salary int);");//創建一個表,兩列
stat.executeUpdate("insert into tbl1values('ZhangSan',8000);");//插入數據
stat.executeUpdate("insert into tbl1values('LiSi',7800);");
stat.executeUpdate("insert into tbl1values('WangWu',5800);");
stat.executeUpdate("insert into tbl1values('ZhaoLiu',9100);");
ResultSet rs = stat.executeQuery("select * from tbl1;");//查詢數據
while(rs.next()){//將查詢到的數據列印出來
System.out.print("name = "+ rs.getString("name")+" ");//列屬性一
System.out.println("salary = "+ rs.getString("salary"));//列屬性二
}
rs.close();
conn.close();//結束資料庫的連線
}
catch(Exception e )
{
e.printStackTrace();
}
}
}
E:\Coding\java\test>javac TestSQLite.java編譯運行:
E:\Coding\java\test>java TestSQLite
name = ZhangSan salary = 8000
name = LiSi salary = 7800
name = WangWu salary = 5800
name = ZhaoLiu salary = 9100
總結:本文介紹了嵌入式資料庫SQLite在Java中的套用,
通過創建表、插入數據、查詢等操作介紹了在Java中對資料庫的操縱。
使用.NET操作SQLLITE
先下載ADO.NET2.0 Provider for SQLite。下載binaries zip版就可以了。下載完後解壓縮,可以在bin目錄下找到System.Data.SQLite.DLL。在vs2008中用Add Reference(添加引用)功能把System.Data.SQLite.DLL加到工程里就可以了。運行下面代碼試試:
string datasource = "e:/tmp/test.db";
System.Data.SQLite.SQLiteConnection.CreateFile(datasource);
//連線資料庫
System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection();
System.Data.SQLite.SQLiteConnectionStringBuilder connstr = new System.Data.SQLite.SQLiteConnectionStringBuilder();
connstr.DataSource = datasource;
connstr.Password = "admin";//設定密碼,SQLite ADO.NET實現了資料庫密碼保護
conn.ConnectionString = connstr.ToString();
conn.Open();
//創建表
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand();
string sql = "CREATE TABLE test(username varchar(20),password varchar(20))";
cmd.CommandText = sql;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
//插入數據
sql = "INSERT INTO test VALUES('a','b')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//取出數據
sql = "SELECT * FROM test";
cmd.CommandText = sql;
System.Data.SQLite.SQLiteDataReader reader = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
while (reader.Read())
{
sb.Append("username:").Append(reader.GetString(0)).Append("\n")
.Append("password:").Append(reader.GetString(1));
}
MessageBox.Show(sb.ToString());
使用linux下的C操作SQLLITE
由於linux下側重使用命令,沒有win的操作容易上手,所以在測試C操作SQLITE時會比較容易出現錯誤,給大家做一個簡單的程式進行測試,演示怎么套用。
#include <stdio.h>
#include <sqlite3.h>
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打開指定的資料庫檔案,如果不存在將創建一個同名的資料庫檔案
rc = sqlite3_open("zieckey.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
sqlite3_close(db); //關閉資料庫
return 0;
}
退出,保存。(代碼輸入完成後,按下 Esc 鍵,然後輸入: :wq ,回車就好拉)
好拉,編譯:[root@localhost temp]# gcc opendbsqlite.c -o db.out
或者遇到這樣的問題:
[root@localhost temp]# gcc opendbsqlite.c -o db.out
opendbsqlite.c:11:21: sqlite3.h: 沒有那個檔案或目錄
opendbsqlite.c: In function `main':
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function)
opendbsqlite.c:19: (Each undeclared identifier is reported only once
opendbsqlite.c:19: for each function it appears in.)
opendbsqlite.c:19: `db' undeclared (first use in this function)
這是由於沒有找到頭檔案的原因。
也許會碰到類似這樣的問題:
[root@localhost temp]# gcc opendbsqlite.c -o db.out
/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main':
: undefined reference to `sqlite3_errmsg'
/tmp/ccTkItnN.o(.text+0x67): In function `main':
: undefined reference to `sqlite3_close'
/tmp/ccTkItnN.o(.text+0x8f): In function `main':
: undefined reference to `sqlite3_close'
collect2: ld returned 1 exit status
這是個沒有找到庫檔案的問題。
[root@localhost temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include
這樣編譯應該就可以了
如果還是有錯誤的話請搜尋:(一)Sqlite資料庫連線。有更詳細的說明解釋
SQLite 常用函式
SQLite 有許多內置函式用於處理字元串或數字數據。下面列出了一些有用的 SQLite 內置函式,且所有函式都是大小寫不敏感,這意味著您可以使用這些函式的小寫形式或大寫形式或混合形式。欲了解更多詳情,請查看 SQLite 的官方文檔:
序號 函式 & 描述
1 SQLite COUNT 函式 SQLite COUNT 聚集函式是用來計算一個資料庫表中的行數。
2 SQLite MAX 函式 SQLite MAX 聚合函式允許我們選擇某列的最大值。
3 SQLite MIN 函式 SQLite MIN 聚合函式允許我們選擇某列的最小值。
4 SQLite AVG 函式 SQLite AVG 聚合函式計算某列的平均值。
5 SQLite SUM 函式 SQLite SUM 聚合函式允許為一個數值列計算總和。
6 SQLite RANDOM 函式 SQLite RANDOM 函式返回一個介於 -9223372036854775808 和 +9223372036854775807 之間的偽隨機整數。
7 SQLite ABS 函式 SQLite ABS 函式返回數值參數的絕對值。
8 SQLite UPPER 函式 SQLite UPPER 函式把字元串轉換為大寫字母。
9 SQLite LOWER 函式 SQLite LOWER 函式把字元串轉換為小寫字母。
10 SQLite LENGTH 函式 SQLite LENGTH 函式返回字元串的長度。
11 SQLite sqlite_version 函式 SQLite sqlite_version 函式返回 SQLite 庫的版本。
歷史版本
從某種程度上說,SQLite最初的構思是在一條軍艦上進行的。當時在通用動力工作的SQLite的作者D. Richard Hipp正在為美國海軍編制一種使用在飛彈驅逐艦上的程式。那個程式最初運行在Hewlett-Packard UNIX(HPUX)上,後台使用Informix資料庫。對那個具體套用而言,Informix有點兒太強大了。一個有經驗的資料庫管理員(DBA)安裝或升級Informix可能需要一整天,如果是沒經驗的程式設計師,這個工作可能永遠也做不完。真正需要的只是一個自我包含的資料庫,它易使用並能由程式控制傳導,另外,不管其他軟體是否安裝,它都可以運行。
2000年1月,Hipp開始和一個同事討論關於創建一個簡單的嵌入式SQL資料庫的想法,這個資料庫將使用GNU DBM哈希庫(gdbm)做後台,同時這個資料庫將不需要安裝和管理支持。後來,一有空閒時間,Hipp就開始實施這項工作,2000年8月,SQLite 1.0版發布了。
按照原定計畫,SQLite 1.0用gdbm作為存儲管理器。然而,Hipp不久就用自己實現的能支持事務和記錄按主鍵存儲的B-tree替換了gdbm。隨著第一次重要升級的進行,SQLite有了穩定的發展,功能和用戶也在增長。2001年中期,很多項目--開源的或商業的--都開始使用SQLite。在隨後的幾年中,開源社區的其他成員開始為他們喜歡的腳本語言和程式庫編寫SQLite擴展。一個接著一個,既Perl、Python、Ruby、Java和其他主流的程式設計語言的擴展之後,新的擴展如SQLite的ODBC接口出現並證明了SQLite的廣泛套用和實用功能。
2004年,SQLite從版本2升級到版本3,這是一次重大升級。
以下是之後的版本更新歷史,可以在官網查詢到。
2004-06-09 - Version 2.8.14
2004-06-18 - Version 3.0.0
2007-09-04 - Version 3.5.0
2008-07-16 - Version 3.6.0
2008-11-19 - Version 3.6.6
2009-11-04 - Version 3.6.20
2010-03-09 - Version 3.6.23
2010-07-22 - Version 3.7.0
2010-08-24 - Version 3.7.2
2011-02-01 - Version 3.7.5
2012-06-11 - Release 3.7.13
2012-09-03 - Release 3.7.14
2012-12-12 - Release 3.7.15
2013-03-18 - Release 3.7.16
2013-05-20 - Release 3.7.17
2013-08-26 - Release 3.8.0
2013-10-17 - Release 3.8.1
2013-12-06 - Release 3.8.2
2014-02-03 - Release 3.8.3
2014-03-10 - Release 3.8.4
2014-06-04 - release 3.8.5
2014-08-15 - Release 3.8.6
2014-10-08 - Release 3.8.7
2015-01-16 - Release 3.8.8
注意事項
在確定是否在應用程式中使用 SQLite 之前,應該考慮以下幾種情況:
有沒有可用於 SQLite 的網路伺服器。從應用程式運行位於其他計算機上的 SQLite 的惟一方法是從網路共享運行。這樣會導致一些問題,像 UNIX® 和 Windows® 網路共享都存在檔案鎖定問題。還有由於與訪問網路共享相關的延遲而帶來的性能下降問題。
SQLite 只提供資料庫級的鎖定。雖然有一些增加並發的技巧,但是,如果應用程式需要的是表級別或行級別的鎖定,那么 DBMS 能夠更好地滿足您的需求。
正如前面提到的,SQLite 可以支持每天大約 100,00 次點擊率的 Web 站點 —— 並且,在某些情況下,可以處理 10 倍於此的通信量。對於具有高通信量或需要支持龐大瀏覽人數的 Web 站點來說,應該考慮使用 DBMS。
SQLite 沒有用戶帳戶概念,而是根據檔案系統確定所有資料庫的許可權。這會使強制執行存儲配額發生困難,強制執行用戶許可變得不可能。
SQLite 支持多數(但不是全部)的 SQL92 標準。不受支持的一些功能包括完全觸發器支持和可寫視圖。
如果您感到其中的任何限制會影響您的應用程式,那么您應該考慮使用完善的 DBMS。如果您可以解除這些限制問題,並且對快速靈活的嵌入式開源資料庫引擎很感興趣,則應重點考慮使用 SQLite。
一些能夠真正表現 SQLite 優越性能的領域是 Web 站點,可以使用 SQLite 管理應用程式數據、快速應用程式原型製造和培訓工具。
由於資源占用少、性能良好和零管理成本,嵌入式資料庫有了它的用武之地,它將為那些以前無法提供用作持久數據的後端的資料庫的應用程式提供了高效的性能。如今沒有必要使用文本檔案來實現持久存儲。SQLite 之類的嵌入式資料庫的易於使用性可以加快應用程式的開發,並使得小型應用程式能夠完全支持複雜的 SQL。這一點對於對於小型設備空間的應用程式來說尤其重要。
嵌入式資料庫對於加快應用程式開發也很重要,尤其是在用於資料庫抽象層(例如PEAR::DB或ezSQL)時。最後,SQLite 正在積極開發中,未來一定會有新的功能,會對開源社區更有用。