SQLite 中文指南之FAQ第6/6頁
更新時(shí)間:2008年09月12日 18:09:17 作者:
sqllite使用過程中碰到的一些問題解決,中文版
(14) 我刪除了很多數(shù)據(jù)但是數(shù)據(jù)庫文件并沒有減小,是不是 Bug?
不是的。當(dāng)你從 SQLite 刪除數(shù)據(jù)之后,未使用的磁盤空間被添加到一個(gè)內(nèi)在的“空閑列表”中用于存儲(chǔ)你下次插入的數(shù)據(jù)。磁盤空間并沒有丟失,但是也不向操作系統(tǒng)返回磁盤空間。
如果你刪除了大量的數(shù)據(jù)且想要減小數(shù)據(jù)庫文件,執(zhí)行 VACUUM命令。VACUUM 命令會(huì)清空“空閑列表”,把數(shù)據(jù)庫尺寸縮到最小。注意, VACUUM 會(huì)耗費(fèi)一些時(shí)間(在 Linux 系統(tǒng)下大約0.5秒/兆)并且要使用兩倍于數(shù)據(jù)庫文件大小的磁盤空間。
對(duì)于SQLite version 3.1, 替代VACUUM命令的一個(gè)方法是auto-vacuum模式,用 auto_vacuum pragma語法開啟該模式。
(15) 是否能將 SQLite 用于商業(yè)用途而不用交版權(quán)費(fèi)用?
可以。SQLite 是公開的。代碼的任何部分都沒有聲明所有權(quán)。你可以用它來做你想要的任何事情。
(16) 如何插入有單引號(hào)(')的字符串?
使用雙單引號(hào)即可,例如:
INSERT INTO xyz valueS('5 O''clock');
插入數(shù)據(jù)庫的是:5 0'clock。
(17) SQLITE_SCHEMA 錯(cuò)誤代表什么?
在 SQLite 版本3中,當(dāng)一個(gè)預(yù)處理 SQL 語句不合法不能執(zhí)行時(shí)就會(huì)返回一個(gè) SQLITE_SCHEMA 錯(cuò)誤。當(dāng)這個(gè)錯(cuò)誤發(fā)生時(shí),該語句應(yīng)當(dāng)用 sqlite3_prepare() API函數(shù)重新編譯。在 SQLite 版本3中,只有使用 sqlite3_prepare ()/sqlite3_step()/sqlite3_finalize() API函數(shù)執(zhí)行 SQL 才會(huì)發(fā)生這個(gè)錯(cuò)誤,而使用 sqlite3_exec(). 則不會(huì)。這與版本2不同。
大部分發(fā)生這個(gè)錯(cuò)誤的原因是當(dāng) SQL 預(yù)處理完時(shí)數(shù)據(jù)庫已經(jīng)改變了(可能是被另一個(gè)進(jìn)程改變的)。還可能有如下原因:
* 對(duì)一個(gè)數(shù)據(jù)庫進(jìn)行DETACH操作
* 對(duì)一個(gè)數(shù)據(jù)庫進(jìn)行VACUUM操作
* 一個(gè)用戶函數(shù)定義被刪除或改變了。
* 一個(gè)排序定義被刪除或改變了。
* 一個(gè)授權(quán)函數(shù)改變了。
解決的辦法是重新編譯并再次嘗試執(zhí)行。所有涉及 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 函數(shù)的都應(yīng)當(dāng)重新編譯。參見下例:
int rc;
sqlite3_stmt *pStmt;
char zSql[] = "SELECT .....";
do {
/* Compile the statement from SQL. Assume success. */
sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);
while( SQLITE_ROW==sqlite3_step(pStmt) ){
/* Do something with the row of available data */
}
/* Finalize the statement. If an SQLITE_SCHEMA error has
** occured, then the above call to sqlite3_step() will have
** returned SQLITE_ERROR. sqlite3_finalize() will return
** SQLITE_SCHEMA. In this case the loop will execute again.
*/
rc = sqlite3_finalize(pStmt);
} while( rc==SQLITE_SCHEMA );
(18) 為什么ROUND(9.95,1) 返回 9.9 而不是 10.0? 難道9.95 不該向上進(jìn)位么?
SQLite 內(nèi)部使用二進(jìn)制運(yùn)算,9.95用 64-bit IEEE 浮點(diǎn)數(shù) ( SQLite 內(nèi)部使用的) 表示為 9.949999999999999289457264239899814128875732421875。所以當(dāng)你輸入 "9.95"時(shí), SQLite 就理解為上述的數(shù)字,進(jìn)而四舍五入得到9.9。這個(gè)問題在處理浮點(diǎn)二進(jìn)制數(shù)總會(huì)產(chǎn)生。通常的規(guī)則是十進(jìn)制的有限浮點(diǎn)數(shù)通常無法表示為二進(jìn)制有限浮點(diǎn)數(shù),只能由最接近的二進(jìn)制數(shù)來代替。這個(gè)近似數(shù)會(huì)非常接近原數(shù),但總一些細(xì)微的不同,所以可能無法得到你預(yù)期的結(jié)果。
相關(guān)文章
SQLite中的B-Tree實(shí)現(xiàn)細(xì)節(jié)分析
本文將詳細(xì)介紹SQLite中的B-Tree實(shí)現(xiàn)細(xì)節(jié),需要了解更多的朋友可以參考下2012-11-11