新聞中心
如何在SQLite3中壓縮數(shù)據(jù)庫?

創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、網(wǎng)站制作、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團隊及專業(yè)的網(wǎng)站設(shè)計師團隊。
SQLite是一種輕型的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它采用自給自足的、零配置的、支持事務(wù)的SQL數(shù)據(jù)庫引擎。它的體積小、啟動速度快,是很多應用程序首選的數(shù)據(jù)庫引擎之一。但是,隨著使用時間的增加,SQLite3數(shù)據(jù)庫文件的體積可能會越來越大,這會對系統(tǒng)性能產(chǎn)生一些不利的影響。為了解決這個問題,我們可以對SQLite3數(shù)據(jù)庫進行壓縮,以減小文件體積,并提高系統(tǒng)的性能。本文將介紹如何在SQLite3中壓縮數(shù)據(jù)庫。
一、使用命令行工具壓縮數(shù)據(jù)庫
1.使用SQLite3的命令行工具打開數(shù)據(jù)庫
要使用SQLite3的命令行工具來壓縮數(shù)據(jù)庫,首先需要打開SQLite3的命令行工具,并使用“.open”命令來打開需要壓縮的數(shù)據(jù)庫。例如,假設(shè)需要壓縮的數(shù)據(jù)庫文件名為“mydatabase.db”,則可以在命令行中輸入以下命令:
sqlite3 mydatabase.db
這將打開SQLite3的命令行工具,并自動打開“mydatabase.db”數(shù)據(jù)庫。如果需要打開其他數(shù)據(jù)庫,也可以改變命令行參數(shù)中的數(shù)據(jù)庫文件名。
2.使用VACUUM命令壓縮數(shù)據(jù)庫
一旦打開了需要壓縮的數(shù)據(jù)庫,就可以使用SQLite3的VACUUM命令來壓縮數(shù)據(jù)庫了。VACUUM命令可以將未占用的磁盤空間釋放回操作系統(tǒng),并優(yōu)化數(shù)據(jù)庫文件存儲結(jié)構(gòu)。在SQLite3的命令行工具中,可以使用以下命令執(zhí)行VACUUM操作:
VACUUM;
注意,在執(zhí)行VACUUM命令時,需要確保沒有其他用戶正在訪問該數(shù)據(jù)庫。否則,VACUUM命令可能會出現(xiàn)錯誤,甚至導致數(shù)據(jù)丟失。
二、使用SQLite3 API壓縮數(shù)據(jù)庫
除了使用命令行工具來壓縮數(shù)據(jù)庫外,還可以使用SQLite3的API來實現(xiàn)數(shù)據(jù)庫壓縮。SQLite3提供了名為sqlite3_rekey()的API函數(shù),用于更改數(shù)據(jù)庫的加密密鑰,也可以用來壓縮數(shù)據(jù)庫。該函數(shù)的語法如下所示:
int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey);
其中,db參數(shù)是一個指向要壓縮的SQLite3數(shù)據(jù)庫的指針;pKey參數(shù)是一個指向密鑰字符串的指針,如果不需要使用密鑰,則可以設(shè)置為NULL;nKey參數(shù)是密鑰字符串的長度,如果pKey為NULL,則可以將nKey設(shè)置為零。
要使用sqlite3_rekey()函數(shù)壓縮數(shù)據(jù)庫,可以使用以下步驟:
1.打開SQLite3數(shù)據(jù)庫
與使用VACUUM命令一樣,使用sqlite3_rekey()函數(shù)壓縮數(shù)據(jù)庫之前,需要先打開它??梢允褂胹qlite3_open()函數(shù)打開數(shù)據(jù)庫,該函數(shù)的語法如下:
int sqlite3_open(const char *filename, sqlite3 **ppDb);
其中,filename參數(shù)是SQLite3數(shù)據(jù)庫文件的名稱;ppDb參數(shù)是一個指向指針的指針,用于返回打開的數(shù)據(jù)庫連接句柄。
2.壓縮數(shù)據(jù)庫
打開SQLite3數(shù)據(jù)庫后,可以使用sqlite3_rekey()函數(shù)執(zhí)行壓縮操作。例如,以下代碼將使用sqlite3_rekey()函數(shù)壓縮名為“mydatabase.db”的數(shù)據(jù)庫:
sqlite3 *db;
int rc = sqlite3_open(“mydatabase.db”, &db);
if(rc == SQLITE_OK){
rc = sqlite3_rekey(db, NULL, 0);
sqlite3_close(db);
}
在上述代碼中,將SQLITE_OK(0)與rc進行比較,以檢查sqlite3_open()函數(shù)是否成功打開了數(shù)據(jù)庫。如果成功打開,則調(diào)用sqlite3_rekey()函數(shù)壓縮數(shù)據(jù)庫,并在完成后關(guān)閉數(shù)據(jù)庫。
SQLite3是一種開源的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),支持在移動設(shè)備、桌面應用程序和Web應用程序等多個平臺上進行數(shù)據(jù)存儲和處理。當SQLite3數(shù)據(jù)庫文件體積較大時,為了提高系統(tǒng)性能,可以對它進行壓縮。本文介紹了兩種壓縮SQLite3數(shù)據(jù)庫的方法,即使用SQLite3的命令行工具和API函數(shù)。無論哪種方法,都可以在不影響數(shù)據(jù)庫完整性和安全性的前提下,將數(shù)據(jù)庫文件體積減小,提高系統(tǒng)性能。
相關(guān)問題拓展閱讀:
- 怎么打開 wxwidgets加密的數(shù)據(jù)庫
- sqlite的幾個常用方法
怎么打開 wxwidgets加密的數(shù)據(jù)庫
1.下載wxsqlite(我的是wxsqlite3-1.9.6),sqlite的amalgamation和source包(我的是sqlite-amalgamation-3_6_19.zip和sqlite-source-3_6_19.zip),解壓縮.
2.先編譯生成sqlite庫,解壓縮sqlite-amalgamation-*.zip和sqlite-source-*.zip到一個目錄,例如sqlite3,然緩爛頌后把wxsqlite自帶的sqlite\secure\src\codec-c目錄拷貝到sqlite3目錄擾鄭下,在sqlite3下建VC空白工程,添加文件codec-c里頭的sqlite3secure.c,打開codec.h在歷純#include
“rijndael.h”下面添加#include
“../sqliteInt.h”,在sqlite3secure.c中把#include
“sqlite3.c”改成#include
“../sqlite3.c”,改變工程編譯選項,加入/D
“THREADSAFE=1”
/D
“SQLITE_SOUNDEX”
/D
“SQLITE_ENABLE_COLUMN_METADATA”
/D
“SQLITE_HAS_CODEC”
/D
“SQLITE_SECURE_DELETE”
/D
“SQLITE_CORE”,記得生成的是.lib文件.build,生成.lib文件…
3.拷貝生成的.lib文件到wxsqlite\sqlite\lib目錄下,替換以前的sqlite3.lib
4.去wxsqlite\build目錄,我的是打開wxsqlite3_vc9.sln,修改include目錄,修改preprocessor:WXSQLITE3_HAVE_CODEC=1,編譯生成.lib…
5.打開wxsqlite自帶的sample,修改include目錄和library目錄,編譯看看是否成功…
搞定…
sqlite的幾個常用方法
Sqlite中判斷表、字段是否存在。
SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫的SQL命令。
SQLite:
SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領(lǐng)域項目。
它的設(shè)計目標是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。
SQLite之一個Alpha版本誕生于2023年5月。 至2023年已經(jīng)有15個年頭,SQLite也迎來了一個版本 SQLite 3已經(jīng)發(fā)布。
SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明。
開始
啟動sqlite3程序,僅僅需要敲入帶有SQLite數(shù)據(jù)庫名字的”sqlite3″命令即可。如果文件不存在,則創(chuàng)建一個新的(數(shù)據(jù)庫)文件。然后 sqlite3程序?qū)⑻崾灸爿斎隨QL。敲入SQL語句(以分號“;”結(jié)束),敲回車鍵之后,SQL語句就會執(zhí)行。
例如,創(chuàng)建一個包含一個表”tb11″名字為”ex1″的SQLite數(shù)據(jù)庫,你可以這樣做:
$sqlite3 ex1
SQLite version 3.3.17
Enter “.help” for instructions
sqlite> create table tbl1(one varchar(10), two allint);
sqlite> insert into tbl1 values(‘hello!’, 10);
sqlite> insert into tbl1 values(‘goodbye’, 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>
你可以通過敲你所用系統(tǒng)的文件結(jié)束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C)。來終止sqlite3程序。確定你在每個SQL語句結(jié)束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結(jié)束。如果你省略分號,sqlite3將給你一個連續(xù)的命令提示符并等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:
sqlite> create table tbl2(
…> f1 varchar(30) primary key,
…> f2 text,
…> f3 real
…> );
sqlite>
題外話:查詢SQLITE_MASTER表
SQLite數(shù)據(jù)庫的框架被保存在一個名叫”sqlite_master”的特殊的表中。你可以像查詢其它表一樣通過執(zhí)行“SELECT”查詢這個特殊的表。例如:
$ sqlite3 ex1
SQlite vresion 3.3.10
Enter “.help” for instructions
sqlite> select * from sqlite_master;
type = table
name = tbl1
tbl_name = tbl1
rootpage = 3
sql = create table tbl1(one varchar(10), two allint)
sqlite>
但你不能在sqlite_master表中執(zhí)行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng)建、刪除和索引數(shù)據(jù)庫時自動更新這個表。你不能手工更改sqlite_master表。
TEMPORARY表的結(jié)構(gòu)沒有存儲在”sqlite_master”表中,由于TEMPORARY表對應用是不可見的,而不是應用程序創(chuàng)建這個表。 TEMPORARY表結(jié)構(gòu)被存儲在另外一個名叫”sqlite_temp_master”的特定的表中?!眘qlite_temp_master”表是臨時表自身。
sqlite3的特殊命令
大多數(shù)候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那么這行將被sqlite3程序自己截取并解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執(zhí)行鞭個預封包(預定義prepackaged)的查詢語句。
你可以在任何時候輸入“.help”,列出可用的點命令。例如
sqlite> .help
.bail ON|OFFStop after hitting an error. Default OFF
.databasesList names and files of attached databases
.dump ?TABLE? … Dump the database in an SQL text format
.echo ON|OFFTurn command echo on or off
.exit Exit this program
.explain ON|OFFTurn output mode suitable for EXPLAIN on or off.
.header(s) ON|OFF Turn display of headers on or off
.help Show this message
.import FILE TABLE Import data from FILE into TABLE
.indices TABLEShow names of all indices on TABLE
.load FILE ?ENTRY? Load an extension library
.mode MODE ?TABLE? Set output mode where MODE is one of:
csv Comma-separated values
column Left-aligned columns. (See .width)
html HTML code
insert SQL insert statements for TABLE
line One value per line
list Values delimited by .separator string
tabs Tab-separated values
tcl TCL list elements
.nullvalue STRING Print STRING in place of NULL values
.output FILENAMESend output to FILENAME
.output stdoutSend output to the screen
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAMEExecute SQL in FILENAME
.schema ?TABLE?Show the CREATE statements
.separator STRING Change separator used by output mode and .import
.show Show the current values for various settings
.tables ?PATTERN? List names of tables matching a LIKE pattern
.timeout MSTry opening locked tables for MS milliseconds
.width NUM NUM … Set column widths for “column” mode
sqlite>
改變輸出格式
sqlite3程序可以以八種不同的格式顯示一個查詢的結(jié)果:”csv”, “列”, “html”, “插入”, “行”, “制表”和”tcl”。你可以用”.mode”點命令在這些輸出格式之間切換。
默認的輸出格式是“列表”。在列表模式下,每條查詢結(jié)果記錄被寫在一行中并且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結(jié)果到另外一個符加處理的程序(如AWK)中去是尤為有用。
sqlite> .mode list
sqlite> select * from tbl1;
hello|10
goodbye|20
sqlite>
你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:
sqlite> .separator “, ”
sqlite> select * from tbl1;
hello, 10
goodbye, 20
sqlite>
在“l(fā)ine”模式下,每一個位于條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數(shù)據(jù)組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:
sqlite> .mode line
sqlite> select * from tbl1;
one = hello
two = 10
one = goodbye
two = 20
sqlite>
在列模式下,每條記錄在一個單獨的行中以數(shù)據(jù)列對齊的方式顯示。列如:
sqlite> .mode column
sqlite> select * from tbl1;
onetwo
hello
goodbye
sqlite>
在默認的情況下,每列至少10個字符寬。太寬的數(shù)據(jù)將被截取。你可以用“.width”命令來調(diào)整列寬。如下所示:
sqlite> .width 12 6
sqlite> select * from tbl1;
onetwo
—–
hello
goodbye
sqlite>
上面例子中”.width”命令設(shè)置之一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結(jié)果需要的列數(shù)一樣多的“.width”參數(shù)。
如果你指定一列寬為0,那么這個列寬將自動以下面三個數(shù)字中的更大值做為列寬:10、表頭寬度和最寬的數(shù)據(jù)列的寬度。這可以讓列自動調(diào)整寬度。每列的默認設(shè)置為自動調(diào)整的0值。
出現(xiàn)在輸出開頭兩行的列標示可以用”.header”點命令關(guān)閉。在上面的例子中,列標示是打開的。可以用下面的方法關(guān)閉列標示:
sqlite> .header off
sqlite> select * from tbl1;
hello
goodbye
sqlite>
另外一個有用的輸出模式是”insert”。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產(chǎn)生文件(便于)以后用于不同數(shù)據(jù)庫的輸入。
當指定插入模式時,你必須給定一個特定參數(shù)就是要插入的表名。例如:
sqlite> .mode insert new_table
sqlite> select * from tbl1;
INSERT INTO ‘new_table’ VALUES(‘hello’,10);
INSERT INTO ‘new_table’ VALUES(‘goodbye’,20);
sqlite>
最新的輸出格式是“html”。在這種模式下,sqlite3把查詢的結(jié)果寫做XHTML表。開始的和結(jié)束的(標記)沒有寫出,但有、和等分界符。html輸出對 CGI來說是相當有用地。
把結(jié)果寫到文件中
默認情況下,sqlte3把結(jié)送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數(shù)然后所有后續(xù)查詢結(jié)果將被寫到那個文件中。用“.output stdout”再一次改為標準輸出。例如:
sqlite> .mode list
sqlite> .separator |
sqlite> .output test_file_1.txt
sqlite> select * from tbl1;
sqlite> .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$
查詢數(shù)據(jù)庫結(jié)構(gòu)
sqlite3程序提供幾個有用的用于查詢數(shù)據(jù)庫結(jié)構(gòu)的快捷命令。這些不是不可以用別的方式來實現(xiàn)。這些命令僅僅是一個快捷方式而已。
例如,為了查看數(shù)據(jù)庫的表列表,你可以敲入“.tables”。
sqlite> .tables
tbl1
tbl2
sqlite>
“.tables”命令相似于設(shè)置列表模式然后執(zhí)行接下來的查詢:
SELECT name FROM sqlite_master
WHERE type IN (‘table’,’view’) AND name NOT LIKE ‘sqlite_%’
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN (‘table’,’view’)
ORDER BY 1事實上,你可以查看sqlite3的源代碼(可以在源文件樹的src/shell.c中),你可找到上面的具體的查詢?!?indices”命令作用類似的方式是列出特定表的所有的索引?!?indics”命令須一個參數(shù)即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶任何參數(shù),“.schema”命令顯示原始的用于創(chuàng)建當前數(shù)據(jù)庫的CREATE TABLE和CREATE INDEX語句。如果你給”.schema”命令一個表名,它顯示原始的創(chuàng)建該表和它所有索引的CREATE語句。我們可以:sqlite> .schemacreate table tbl1(one varchar(10), two allint)CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real)sqlite> .schema tbl2CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real)sqlite> “.schema”命令可以用設(shè)置列表然后執(zhí)行以下查詢來實現(xiàn):
SELECT sql FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type!=’meta’
ORDER BY tbl_name, type DESC, name
.databases 列出數(shù)據(jù)庫文件名
.tables ?PATTERN? 列出?PATTERN?匹配的表名
.import FILE TABLE 將文件中的數(shù)據(jù)導入的文件中
.dump ?TABLE? 生成形成數(shù)據(jù)庫表的SQL腳本
.output FILENAME 將輸出導入到指定的文件中
.output stdout 將輸出打印到屏幕
.mode MODE ?TABLE? 設(shè)置數(shù)據(jù)輸出模式(csv,html,tcl…
.nullvalue STRING 用指定的串代替輸出的NULL串
.read FILENAME 執(zhí)行指定文件中的SQL語句
.schema ?TABLE? 打印創(chuàng)建數(shù)據(jù)庫表的SQL語句
.separator STRING 用指定的字符串代替字段分隔符
.show 打印所有SQLite環(huán)境變量的設(shè)置
.quit 退出命令行接口
關(guān)于sqlite3 壓縮數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
文章標題:如何在sqlite3中壓縮數(shù)據(jù)庫?(sqlite3壓縮數(shù)據(jù)庫)
當前路徑:http://www.fisionsoft.com.cn/article/cogpspc.html


咨詢
建站咨詢
