如何在sqlite3中压缩数据库? (sqlite3 压缩数据库)

如何在SQLite3中压缩数据库?

SQLite是一种轻型的关系型数据库管理系统,它采用自给自足的、零配置的、支持事务的SQL数据库引擎。它的体积小、启动速度快,是很多应用程序首选的数据库引擎之一。但是,随着使用时间的增加,SQLite3数据库文件的体积可能会越来越大,这会对系统性能产生一些不利的影响。为了解决这个问题,我们可以对SQLite3数据库进行压缩,以减小文件体积,并提高系统的性能。本文将介绍如何在SQLite3中压缩数据库。

一、使用命令行工具压缩数据库

1.使用SQLite3的命令行工具打开数据库

要使用SQLite3的命令行工具来压缩数据库,首先需要打开SQLite3的命令行工具,并使用“.open”命令来打开需要压缩的数据库。例如,假设需要压缩的数据库文件名为“mydatabase.db”,则可以在命令行中输入以下命令:

sqlite3 mydatabase.db

这将打开SQLite3的命令行工具,并自动打开“mydatabase.db”数据库。如果需要打开其他数据库,也可以改变命令行参数中的数据库文件名。

2.使用VACUUM命令压缩数据库

一旦打开了需要压缩的数据库,就可以使用SQLite3的VACUUM命令来压缩数据库了。VACUUM命令可以将未占用的磁盘空间释放回操作系统,并优化数据库文件存储结构。在SQLite3的命令行工具中,可以使用以下命令执行VACUUM操作:

VACUUM;

注意,在执行VACUUM命令时,需要确保没有其他用户正在访问该数据库。否则,VACUUM命令可能会出现错误,甚至导致数据丢失。

二、使用SQLite3 API压缩数据库

除了使用命令行工具来压缩数据库外,还可以使用SQLite3的API来实现数据库压缩。SQLite3提供了名为sqlite3_rekey()的API函数,用于更改数据库的加密密钥,也可以用来压缩数据库。该函数的语法如下所示:

int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey);

其中,db参数是一个指向要压缩的SQLite3数据库的指针;pKey参数是一个指向密钥字符串的指针,如果不需要使用密钥,则可以设置为NULL;nKey参数是密钥字符串的长度,如果pKey为NULL,则可以将nKey设置为零。

要使用sqlite3_rekey()函数压缩数据库,可以使用以下步骤:

1.打开SQLite3数据库

与使用VACUUM命令一样,使用sqlite3_rekey()函数压缩数据库之前,需要先打开它。可以使用sqlite3_open()函数打开数据库,该函数的语法如下:

int sqlite3_open(const char *filename, sqlite3 **ppDb);

其中,filename参数是SQLite3数据库文件的名称;ppDb参数是一个指向指针的指针,用于返回打开的数据库连接句柄。

2.压缩数据库

打开SQLite3数据库后,可以使用sqlite3_rekey()函数执行压缩操作。例如,以下代码将使用sqlite3_rekey()函数压缩名为“mydatabase.db”的数据库:

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()函数是否成功打开了数据库。如果成功打开,则调用sqlite3_rekey()函数压缩数据库,并在完成后关闭数据库。

SQLite3是一种开源的关系型数据库管理系统,支持在移动设备、桌面应用程序和Web应用程序等多个平台上进行数据存储和处理。当SQLite3数据库文件体积较大时,为了提高系统性能,可以对它进行压缩。本文介绍了两种压缩SQLite3数据库的方法,即使用SQLite3的命令行工具和API函数。无论哪种方法,都可以在不影响数据库完整性和安全性的前提下,将数据库文件体积减小,提高系统性能。

相关问题拓展阅读:

怎么打开 wxwidgets加密的数据库

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的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。

SQLite:

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。

它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

SQLite之一个Alpha版本诞生于2023年5月。 至2023年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。本文档提供一个样使用sqlite3的简要说明。

开始

启动sqlite3程序,仅仅需要敲入带有SQLite数据库名字的”sqlite3″命令即可。如果文件不存在,则创建一个新的(数据库)文件。然后 sqlite3程序将提示你输入SQL。敲入SQL语句(以分号“;”结束),敲回车键之后,SQL语句就会执行。

例如,创建一个包含一个表”tb11″名字为”ex1″的SQLite数据库,你可以这样做:

$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>

你可以通过敲你所用系统的文件结束符(通常是Ctrl + D)或者中断字符(通常是Ctrl + C)。来终止sqlite3程序。确定你在每个SQL语句结束敲入分号!sqlite3程序通过查找分号来决定一个SQL语句的结束。如果你省略分号,sqlite3将给你一个连续的命令提示符并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句,例如:

sqlite> create table tbl2(

…> f1 varchar(30) primary key,

…> f2 text,

…> f3 real

…> );

sqlite>

题外话:查询SQLITE_MASTER表

SQLite数据库的框架被保存在一个名叫”sqlite_master”的特殊的表中。你可以像查询其它表一样通过执行“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表中执行诸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你创建、删除和索引数据库时自动更新这个表。你不能手工更改sqlite_master表。

TEMPORARY表的结构没有存储在”sqlite_master”表中,由于TEMPORARY表对应用是不可见的,而不是应用程序创建这个表。 TEMPORARY表结构被存储在另外一个名叫”sqlite_temp_master”的特定的表中。”sqlite_temp_master”表是临时表自身。

sqlite3的特殊命令

大多数候,sqlite3读入输入行,并把它们传递到SQLite库中去运行。但是如果输入行以一个点(“.”)开始,那么这行将被sqlite3程序自己截取并解释。这些“点命令”通常被用来改变查询输出的格式,或者执行鞭个预封包(预定义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程序可以以八种不同的格式显示一个查询的结果:”csv”, “列”, “html”, “插入”, “行”, “制表”和”tcl”。你可以用”.mode”点命令在这些输出格式之间切换。

默认的输出格式是“列表”。在列表模式下,每条查询结果记录被写在一行中并且每列之间以一个字符串分割符隔开。默认的分隔符是一个管道符号(“|”)。列表符号在当你输出查询结果到另外一个符加处理的程序(如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>

在“line”模式下,每一个位于条记录中的列在它自己那行显示。每行由列名、一个等号和列数据组成。下一条记录以一个空行隔开。这是一个行模式输出的例子:

sqlite> .mode line

sqlite> select * from tbl1;

one = hello

two = 10

one = goodbye

two = 20

sqlite>

在列模式下,每条记录在一个单独的行中以数据列对齐的方式显示。列如:

sqlite> .mode column

sqlite> select * from tbl1;

onetwo

hello

goodbye

sqlite>

在默认的情况下,每列至少10个字符宽。太宽的数据将被截取。你可以用“.width”命令来调整列宽。如下所示:

sqlite> .width 12 6

sqlite> select * from tbl1;

onetwo

—–

hello

goodbye

sqlite>

上面例子中”.width”命令设置之一列宽为12第二列宽为6。其它的列宽不变。你可以指定与你查询结果需要的列数一样多的“.width”参数。

如果你指定一列宽为0,那么这个列宽将自动以下面三个数字中的更大值做为列宽:10、表头宽度和最宽的数据列的宽度。这可以让列自动调整宽度。每列的默认设置为自动调整的0值。

出现在输出开头两行的列标示可以用”.header”点命令关闭。在上面的例子中,列标示是打开的。可以用下面的方法关闭列标示:

sqlite> .header off

sqlite> select * from tbl1;

hello

goodbye

sqlite>

另外一个有用的输出模式是”insert”。在插入模式下,被子格式化为看起来像SQL INSERT语句的样式。你可以用插入模式来产生文件(便于)以后用于不同数据库的输入。

当指定插入模式时,你必须给定一个特定参数就是要插入的表名。例如:

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把查询的结果写做XHTML表。开始的和结束的(标记)没有写出,但有、和等分界符。html输出对 CGI来说是相当有用地。

把结果写到文件中

默认情况下,sqlte3把结送到标准输出。你可以用“.output”命令改变它。只须把输出文件名做为.output命令的输出参数然后所有后续查询结果将被写到那个文件中。用“.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

$

查询数据库结构

sqlite3程序提供几个有用的用于查询数据库结构的快捷命令。这些不是不可以用别的方式来实现。这些命令仅仅是一个快捷方式而已。

例如,为了查看数据库的表列表,你可以敲入“.tables”。

sqlite> .tables

tbl1

tbl2

sqlite>

“.tables”命令相似于设置列表模式然后执行接下来的查询:

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”命令须一个参数即所要索引表的表名。最后,但不是至少,是“.schema”命令。不带任何参数,“.schema”命令显示原始的用于创建当前数据库的CREATE TABLE和CREATE INDEX语句。如果你给”.schema”命令一个表名,它显示原始的创建该表和它所有索引的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”命令可以用设置列表然后执行以下查询来实现:

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 列出数据库文件名

.tables ?PATTERN? 列出?PATTERN?匹配的表名

.import FILE TABLE 将文件中的数据导入的文件中

.dump ?TABLE? 生成形成数据库表的SQL脚本

.output FILENAME 将输出导入到指定的文件中

.output stdout 将输出打印到屏幕

.mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl…

.nullvalue STRING 用指定的串代替输出的NULL串

.read FILENAME 执行指定文件中的SQL语句

.schema ?TABLE? 打印创建数据库表的SQL语句

.separator STRING 用指定的字符串代替字段分隔符

.show 打印所有SQLite环境变量的设置

.quit 退出命令行接口

关于sqlite3 压缩数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 如何在sqlite3中压缩数据库? (sqlite3 压缩数据库)