解析SQLite中的常見問題與總結詳解

2021-08-02 12:27:30 字數 4311 閱讀 8174

1、 建立資料

如果不往資料庫裡面新增任何的表,這個資料庫等於沒有建立,不會在硬碟上產生任何檔案,如果資料庫已經存在,則會開啟這個資料庫。 

2、 如何通過sqlite3.dll與sqlite3.def生成sqlite3.lib檔案

lib /def:sqlite3.def /machine:ix86

3、 sqlite3_open開啟乙個資料庫時,如果資料庫不存在就會新生成乙個資料庫檔案。如果接著執行其他查詢語句就會失敗,比如sqlite3_prepare,程式設計中出現明明指定了資料庫而且裡面也有資料,為什麼查詢失敗了,

主要是資料庫名路徑不對引起的。一般的做法是先檢查資料庫檔案是否存在

,如果存在就使用sqlite3_open開啟資料庫;否則建立乙個新的資料庫。

4、 如何建立自動增長字段

宣告為integer primary key的列將會自動增長。

5、sqlite3支援何種資料型別?

null

integer

real

text

blob

但實際上,sqlite3也接受如下的資料型別:

smallint 16位元的整數。

interger 32位元的整數。

decimal(p,s) p精確值和s大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為p=5; s=0。

float 32位元的實數。

double 64位元的實數。

char(n) n長度的字串,n不能超過254。

varchar(n)長度不固定且其最大長度為n的字串,n不能超過4000。

graphic(n)和char(n)一樣,不過其單位是兩個字元double-bytes,n不能超過127。這個形態是為了支援兩個字元長度的字型,例如中文字。

vargraphic(n)可變長度且其最大長度為n的雙字元字串,n不能超過2000。

date包含了年份、月份、日期。

time包含了小時、分鐘、秒。

timestamp包含了年、月、日、時、分、秒、千分之一秒。

6、sqlite允許向乙個integer型字段中插入字串

這 是乙個特性,而不是乙個bug。sqlite不強制資料型別約束。任何資料都可以插入任何列。你可以向乙個整型列中插入任意長度的字串,向布林型列中插 入浮點數,或者向字元型列中插入日期型值。在create table中所指定的資料型別不會限制在該列中插入任何資料。任何列均可接受任意長度的字串(只有

一種情況除外:

標誌為integer primary key的列只能儲存64位整數,當向這種列中插資料除整數以外的資料時,將會產生錯誤。

但sqlite確實使用宣告的列型別來指示你所期望的格式。所以,

例如你向乙個整型列中插入字串時,sqlite會試圖將該字串轉換成乙個整數。如果可以轉換,它將插入該整數;否則,將插入字串。這種特性有時被稱為型別或列親和性

(type or column affinity).

7、為什麼sqlite不允許在同乙個表不同的兩行上使用0和0.0作主鍵?

主鍵必須是數值型別,將主鍵改為text型將不起作用。

每一行必須有乙個唯一的主鍵。

對於乙個數值型列,sqlite認為'0'和'0.0'是相同的

,因為他們在作為整數比較時是相等的(參見上一問題)。所以,這樣值就不唯一了。

8、多個應用程式或乙個應用程式的多個例項可以同時訪問同乙個資料庫檔案嗎?

多個程序可同時開啟同乙個資料庫。多個程序可以

同時進行select操作

,但在任一時刻,

只能有乙個程序對資料庫進行更改。

sqlite使用讀、寫鎖控制對資料庫的訪問。(在win95/98/me等不支援讀、寫鎖的系統下,使用乙個概率性的模擬來代替。)但使用時要注意:

如果資料庫檔案存放於乙個nfs檔案系統上,這種鎖機制可能不能正常工作。

這 是因為fcntl()檔案鎖在很多nfs上沒有正確的實現。在可能有多個程序同時訪問資料庫的時候,應該避免將資料庫檔案放到nfs上。在windows 上,microsoft的文件中說:如果使用fat檔案系統而沒有執行share.exe守護程序,那麼鎖可能是不能正常使用的。那些在windows上 有很多經驗的人告訴我:對於網路檔案,檔案鎖的實現有好多bug,是靠不住的。如果他們說的是對的,那麼在兩台或多台windows機器間共享資料庫可能 會引起不期望的問題。

我們意識到,沒有其它嵌入式的sql資料庫引擎能象sqlite這樣處理如此多的併發。

sqlite允許多個程序同時開啟乙個資料庫,同時讀乙個資料庫。

當有任何程序想要寫時,

它必須在更新過程中鎖住資料庫檔案。

但那通常只是幾毫秒的時間。其它程序只需等待寫程序幹完活結束。典型地,其它嵌入式的sql資料庫引擎同時只允許乙個程序連線到資料庫。

但 是,client/server資料庫引擎(如postgresql, mysql,或oracle)通常支援更高階別的併發,並且允許多個程序同時寫同乙個資料庫。這種機制在client/server結構的資料庫上是可能 的,因為總是有乙個單一的伺服器程序很好地控制、協調對資料庫的訪問。如果你的應用程式需要很多的併發,那麼你應該考慮使用乙個 client/server結構的資料庫。但經驗表明,很多應用程式需要的併發,往往比其設計者所想象的少得多。

當sqlite試圖訪問乙個被其它程序鎖住的檔案時,預設的行為是返回sqlite_busy。

可以在c**中使用

sqlite3_busy_handler()

或sqlite3_busy_timeout() 

api函式調整這一行為。

9、sqlite執行緒安全嗎?

執行緒是魔鬼(threads are evil)。避免使用它們。

sqlite 是執行緒安全的。由於很多使用者會忽略我們在上一段中給出的建議,我們做出了這種讓步。但是,為了達到執行緒安全,sqlite在編譯時必須將 sqlite_threadsafe預處理巨集置為1。在windows和linux上,已編譯的好的二進位制發行版中都是這樣設定的。如果不確定你所使用的 庫是否是執行緒安全的,可以呼叫sqlite3_threadsafe()介面找出。

10、在sqlite資料庫中如何列出所有的表和索引?

如果你執行sqlite3命令列來訪問你的資料庫,可以鍵入「.tables」來獲得所有表的列表。或者,你可以輸入「.schema」來看整個資料庫模式,包括所有的表的索引。輸入這些命令,後面跟乙個like模式匹配可以限制顯示的表。

11、sqlite資料庫有已知的大小限制嗎?

在windows和unix下,版本2.7.4的sqlite可以達到2的41次方位元組(

2t位元組

)。老版本的為2的31次方位元組(2g位元組)。

sqlite版本2.8限制乙個記錄的容量為1m。

sqlite版本3.0則對單個記錄容量沒有限制。

表名、索引表名、檢視名、觸發器名和欄位名沒有長度限制。但sql函式的名稱(由sqlite3_create_function() api函式建立)不得超過255個字元。

12、在sqlite中,varchar欄位最長是多少?

sqlite不強制varchar的長度。你可以在sqlite中宣告乙個varchar(10),sqlite還是可以很高興地允許你放入500個字元。並且這500個字元是原封不動的,

它永遠不會被截斷。

13、在sqlite中,如何在乙個表上新增或刪除一列?

sqlite有有限地alter table支援。你可以使用它來在表的末尾增加一列,可更改表的名稱。如果需要對錶結構做更複雜的改變,則必須重新建表。重建時可以先將已存在的資料放到乙個臨時表中,刪除原表,建立新錶,然後將資料從臨時表中複製回來。

如,假設有乙個t1表,其中有"a", "b", "c"三列,如果要刪除列c,以下過程描述如何做:

begin transaction;

create temporary table t1_backup(a,b);

insert into t1_backup select a,b from t1;

drop table t1;

create table t1(a,b);

insert into t1 select a,b from t1_backup;

drop table t1_backup;

commit;

14、在sqlite中支援分頁嗎?

sqlite分頁是世界上最簡單的。如果我要去11-20的account表的資料select * from account limit 9 offset 10;

以上語句表示從account表獲取資料,跳過10行,取9行。這個特性足夠讓很多的web中型**使用這個了。也可以這樣寫 select * from account limit10,9和上面的的效果一樣。這種寫法mysql也支援。

SQLite 常見問題(FAQ)

1 如何建立自動增長字段?整型主鍵列 integer primary key 如果向主鍵插入null,那麼null會自動轉換成乙個比插入前此列最大值大1的整數,如果達到最大值,則隨機選擇未使用的值 如果想讓生成的主鍵值不是原先刪除過的值,則需要在定義主鍵時新增autoincrement關鍵字。2 s...

SQL中與IP相關的常見問題

2 得到網絡卡的實體地址 create table tb re varchar 255 insert into tb exec master.xp cmdshell ipconfig all select 網絡卡實體地址 substring re,charindex re 1,255 from tb...

面試常見問題 1 this的常見問題

this 的含義 this關鍵字是乙個非常重要的語法點。毫不誇張地說,不理解它的含義,大部分開發任務都無法完成。前一章已經提到,this可以用在建構函式之中,表示例項物件。除此之外,this還可以用在別的場合。但不管是什麼場合,this都有乙個共同點 它總是返回乙個物件。簡單說,this就是屬性或方...