【SQL开源代码栏目提醒】:网学会员鉴于大家对SQL开源代码十分关注,论文会员在此为大家搜集整理了“sqllite数据库 - 数据库”一文,供大家参考学习
Sqllite数据库类型最新版本1、oracle 11g2、sybase153、Informix / DB2 11.5/9 4、sqlserver 20085、mysql5.5.156、firebird 2.1.37、access 20078、sqllite3.7.8 oracle 是目前使用最广泛的大型数据库企业级的数据库??支持大数据库、多用户的高性能的事务处理??Oracle遵守数据存取语言、操作系统、用户接口和网络
通信协议的工业标准??实施安全性控制和完整性控制??支持分布式数据库和分布处理??具有可移植性、可兼容性和可连接性??全球化、跨平台的数据库Sybase主要有三种版本一是UNIX操作系统下运行的版本二是Novell Netware环境下运行的版本三是Windows NT环境下运行的版本。
对UNIX操作系统目前应用最广泛的是SYBASE 10及SYABSE 11 for SCO UNIX。
Sybase数据库的特点1它是基于客户/服务器体系结构的数据库。
2它是真正开放的数据库。
3它是一种高性能的数据库。
目的是为Unix等开放操作系统提供专业的关系型数据库产品。
公司的名称Informix便是取自Information 和Unix的结合。
Informix第一个真正支持
SQL语言的关系数据库产品是Informix SEStandardEngine。
InformixSE是在当时的微机Unix环境下主要的数据库产品。
它也是第一个被移植到Linux上的商业数据库产品。
1987 年微软和IBM合作开发完成OS/2IBM 在其销售的OS/2 ExtendedEdition系统中绑定了OS/2Database Manager而微软产品线中尚缺少数据库产品。
为此微软将目光投向Sybase同Sybase 签订了合作协议使用Sybase的技术开发基于OS/2平台的关系型数据库。
1989年微软发布了
SQL Server 1.0 版。
SQL Server是由微软开发的数据库管理
系统是Web上最流行的用于存储数据的数据库它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。
目前最新版本是
SQL Server 2008它只能在Windows上运行操作系统的系统稳定性对数据库十分重要。
并行实施和共存模型并不成熟很难处理日益增多的用户数和数据卷伸缩性有限。
SQL Server 提供了众多的Web和电子商务功能如对XML和Internet标准的丰富支持通过Web对数据进行轻松安全的访问具有强大的、灵活的、基于Web的和安全的应用程序管理等。
而且由于其易操作性及其友好的操作界面深受广大用户的喜爱。
MySQL是一个小型关系型数据库
管理系统开发者为瑞典MySQLAB公司。
在2008年1月16号被Sun公司收购。
而2009年SUN又被Oracle收购。
MySQL是一种关联数据库管理系统关联数据库将数据保存在不同的表中而不是将所有数据放在一个大仓库内。
与其他的大型数据库例如Oracle、DB2、
SQL Server等相比MySQL自有它的不足之处如规模小、功能有限MySQLCluster的功能和效率都相对比较差等但是这丝毫也没有减少它受欢迎的程度。
对于一般的个人使用者和中小型企业来说MySQL提供的功能已经绰绰有余而且由于MySQL是开放源码
软件因此可以大大降低总体拥有成本。
PostgreSQLfirebird 支持对用户组授权
mysql只能对单独用户进行授权优点1、Firebird是
开源免费的数据库且诞生很多年了比较稳定。
2、支持单机嵌入式开发单机版支持存储过程和触发器。
3、单机版和服务器版数据库文件格式相同升级至网络版简单。
4、跨平台支持window、
linux缺点1、oledb驱动是收费的因此不能使用ado连接数据库了。
2、
Sql语法与微软的T-
sql有些差别特别是存储过程有一定的
学习量。
3、需要发布几个dll文件。
优点1、可以使用ado访问不是说ado好而是比较熟悉用了多年了。
2、发布简单无需附带任何驱动文件谁让是微软的呢oledb驱动已经集成到操作系统中了。
3、有一个office access的管理器可用建表和修改结构比较容易。
缺点1、库文件易损坏。
数据打开时断电非常容易损坏很麻烦。
2、不支持存储过程和触发器。
3、不支持
网络版。
这个是最要命的将来升级到网络版要改sqlserver工作量不小。
??SQLite的发展2000年由D.RichardHipp开始开发2001年发布2.0v2004年发布3.0v采用了不同的数据文件格式以及编程接口??目标易于管理、操作、维护、自定义以及提供易用的编程接口SQLite的优势内存占用量小核心
代码控制在250KB可以缩小比MySQL2倍 PostgreSQL20倍快ACID兼容原子性一致性独立性可持久性支持视图子查询触发器单个库文件中包含数据库引擎与接口且其运行不依赖其它库可以将数据放进单个文件为C/C Perl
PHP等应用提供了接口
免费代码完全开放允许为
SQL命令集动态添加自定义函数简单函数及聚集函数而无需重编SQLite库SQLite的缺点事务处理并发性SQLite通过数据库级上的独占性和共享锁来实现独立事务处理这意味着当多个进程或线程在同一时间可以从数据库读取数据但是只能有一个可以同时写入在写入之前必须获得独占锁其它的读操作不允许发生。
性能在创建索引 CREATE INDEX和删除表 DELTE TABLE时明显比其它数据库慢用户管理/安全数据库的访问是基于操作系统对文件的控制来控制的不能通过用户来区分数据库中的不同数据库.举例将数据库文件去写权限然后向其中插入或删除数据条目将提示写失败。
但是不能通过数据库本身的来对权限进行设置。
在网上已经有一些SQLite的安全
问题的解决
方案但大多数是商业化的有些提供在整个数据库上的加密有些提供在数据级别的加密。
比如secure SQLite之类。
在内部SQLite由以下几个组件组成
SQL 编译器、内核、后端以及附件。
SQLite通过利用虚拟机和虚拟数据库引擎VDBE使调试、修改和扩展SQLite的内核变得更加方便。
所有
SQL 语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。
1、接口将
SQL语句传给
SQL编译器2、
SQL编译器选将
SQL分解成为Token3、将Token传递给解析器进行解析4、由
代码生成器生成虚拟机
代码5、由虚拟机执行生成的程序6、SQLite库在磁盘上以B树形式组织每个表和索引都有自己单独的B树所有的B树都保存的同一个文件里面7、OS层的操作大多数的
SQL内建函数可以在func.c date.c里面找到。
用户自定义函数编写可以参考这里面的实现。
无论内内建函数还是用户自定义函数都是用C的回调方式实现稍后再做介绍SQLite与其他数据库最大不同是它对数据类型的支持其他常见数据库支持强类型的数据即必须指定每一列具体的、严格的数据类型。
但SQLite采用的是弱类型的数据。
SQLite2.0版本把所有列的值都存储成ASCII文本格式SQLite3.0版本支持更多的数据类型。
为了增强SQLite数据库和其他数据库列类型的兼容性SQLite支持列的quot类型亲和性quot。
列的亲和性是为该列所存储的数据建议一个类型注意是建议而不是强迫。
理论上讲任何列依然可以存储任何类型的数据只是针对某些列如果给出了建议类型数据库将按建议的类型先转换再存储这个被优先使用的数据类型则被称为quot亲和类型quot。
在SQLite3.0版中数据库中的列类型有五种类型亲和性文本类型、数字类型、整数类型、浮点类型、NULL无类型。
1一个具有文本类型亲和性的列可以使用NULL、TEXT、BLOB值类型存储数据。
比如数字数据被插入一个具有文本类型亲和性的列在存储之前数字将被转换成文本。
2一个具有数字类型亲和性的列可以使用NULL、INTEGER、REAL、TEXT、BLOB五种值类型保存数据。
比如一个文本类型数据被插入到一个具有数字类型亲和性的列在存储之前将被转变成整型或浮点型。
3一个具有整数亲和性的列在转换方面和具有数字亲和性的列是一样的但也有些区别比如浮点型的值将被转换成整型。
4一个具有浮点亲和性的列可以使用REAL、FLOAT、DOUBLE值类型保存数据。
5一个具有无类型亲和性的列不会选择用哪个类型保存数据数据不会进行任何转换。
1如果列的数据类型包括字符串quotINTquot它被定义为具有整数型亲和性2如果列的数据类型包括字符串quotCHARquot、quotCLOBquot、quotTEXTquot它被定义为具有文本亲和性注意VARCHAR类型包括字符串quotCHARquot因此具有文本类型亲和性3如果列的数据类型包括字符串quotBLOBquot或没有指定类型它被定义为无类型亲和性4如果列的数据类型包括字符串quotREALquot、quotFLOAquot、quotDOUBquot它被定义为浮点型亲和性5其他的都被定义为数字型亲和性。
TEXT存储可变长度的数据最大长度为231-12147483647个字符。
设置主键使用INTEGER PRIMARY KEY不能用INT。
自动增加是AUTOINCREMENT不同于MySQL的AUTO_INCREMENT。
SQLite函数接口SQLite应用编程接口API非常简单易用只需要三个用来执行
SQL和获得数据的函数。
它还是可以扩展的允许
程序员自定义函数然后以callback的形式集合进去。
C语言API是其它接口的基础开放源码团体基于此已经扩展了众多的客户接口使得其他语言对sqlite的使用也成为可能。
创建或打开数据库intsqlite3_openconst char sqlite3关闭数据库intsqlite3_closesqlite3执行语句typedefintsqlite_callbackvoidintchar charintsqlite3_execsqlite3 const char
sql sqlite_callback void charintsqlite3_get_table sqlite3 db const char zSqlchar pazResultintpnRowintintpnColumn char pzErrmsg void sqlite3_free_tablechar result主函数分析sqlite3 pDb NULL const char create_table quotCREATE TABLE usersid INTEGER PRIMARY KEY name TEXT password TEXT group_idINTEGERquotchar insert_table512 0const char query_table quotSELECT FROM usersquotchar errmsg NULLsqlite3_stmt statement NULL void mainsqlite3_openquotAAA_DB.dbquot amppDbsqlite3_exec pDb create_table NULLNULLamperrmsgiferrmsg NULLprintfquotERROR: snquoterrmsgsqlite3_freeerrmsgerrmsg NULL/INSERT TABLE/introw_idforrow_id 1row_idlt10 row_idsprintfinsert_tablequotINSERT INTO users valuesdssNULL“row_idquotyangwenqiang“quotpassword”sqlite3_execpDb insert_table NULLNULL amperrmsgiferrmsg NULLprintfquotERROR: snquoterrmsgsqlite3_freeerrmsgerrmsg NULL/QUERY TABLE/sqlite3_execpDb / An open database /query_table /
SQL to be evaluated /callback_query_users/ Callback function /NULL / 1st argument to callback /amperrmsg/ Error msgwritten here /iferrmsg NULLprintfquotERROR: snquoterrmsgsqlite3_freeerrmsgerrmsg NULLintcallback_query_usersvoid unusedintcolumn_number //列数char column_text //列值char column_name//列名printfquotID: st NAME: st PASSWORD: st GROUP_ID:snquotcolumn_text0NULL column_text0:quotNULLquotcolumn_text1NULL column_text1:quotNULLquotcolumn_text2NULL column_text2:quotNULLquotcolumn_text3NULL column_text3:quotNULLquotreturn 0sqlite3_exec包含一个回叫callback机制提供了一种从SELECT 语句得到结果的方法。
这个机制由sqlite3_exec函数的第3和第4 个参数实现。
第3 个参数是一个指向回叫函数的指针如果提供了回叫函数SQLite则会在执行SELECT 语句期间在遇到每一条记录时调用回叫函数。
回叫函数的声明如下typedefintsqlite3_callbackvoid / Data provided in the 4th argument of sqlite3_exec /int / The number of columns in row /char / An array of strings representing fields in the row /char / An array of strings representing column names /函数sqlite3_exec的第4 个参数是一个指向任何应用程序指定的数据的指针这个数据是你准备提供给回叫函数使用的。
SQLite将把这个数据作为回叫函数的第1 个参数传递。
总之sqlite3_exec允许你处理一批命令并且你可以使用回叫函数来收集所有返回的数据。
例如先向episodes 表插入一条记录再从中
查询所有记录所有这些都在一个sqlite3_exec调用中完成完整的程序
代码见下页。
include ltstdlib.hgtinclude quotutil.hquotpragmacommentlib quotsqlite3.libquotintcallbackvoid data intncols char values char headersintmainintargc char argvsqlite3 dbintrcchar sqlchar zErrchar datarc sqlite3_openquottest.dbquot ampdbifrcfprintfstderr “Can??t open database: sn” sqlite3_errmsgdb sqlite3_closedbexit1data quotCallback function calledquotsql quotinsert into episodes name cid values Mackinaw Peaches 1quotquotselect from episodesquotrc sqlite3_execdb
sql callback data ampzErrifrc SQLITE_OK if zErr NULLfprintfstderr quotSQL error: snquot zErrsqlite3_freezErr
sqlite3_closedbreturn 0intcallbackvoid data intncols char values char headersintifprintfstderr quots: quot const chardatafori0 ilt ncols ifprintfstderr quotss “headersivaluesifprintfstderr quotnquotreturn 0intgetColumnValue sqlite3_stmt stmt intcol void valueinttype sqlite3_column_typestmt colswitchtypecase SQLITE_NULL: return 0case SQLITE_INTEGER:intvalue sqlite3_column_intstatement colbreakcase SQLITE_FLOAT:double value sqlite3_column_doublestatement colbreakcase SQLITE_TEXT:case SQLITE_BLOB:strcpyvalue sqlite3_column_textstatement colbreakdefault:return -1return 1sqlite3_preparepDb/ Database handle /query_table/
SQL statement UTF-8 encoded /strlenquery_table1 / Maximum length of zSqlin bytes. /ampstatement / OUT: Statement handle /NULL/ OUT: Pointer to unused portion of zSql/forintret sqlite3_stepstatementifSQLITE_ROW retintid 0 char buffer256 0 char name256 0 char pass
word256 0 intgroup_id 0 intret4 0000ret0 getColumnValuestatement 0 ampidret1 getColumnValuestatement 1 nameret2 getColumnValuestatement 2 passwordret3 getColumnValuestatement 3 ampgroup_idprintf quotID: st NAME: st PASSWORD: st GROUP_ID:snquotret01 itoaidbuffer10:quotNULL“ret11 name:quotNULLquotret21 password:quotNULL“ret31 itoagroup_idbuffer10:quotNULL”else if SQLITE_DONE retbreakelsesqlite3_finalizestatement跟sqlite3_exec相似sqlite3_prepare也可以接受一个包括多个
SQL 语句的字符串。
不同的是sqlite3_prepare只处理字符串中的第1 个语句。
sprintfsql quotSELECT FROM tbl_usrWHERE usr_name s LIMIT 1quot pcUsrNameiRet sqlite3_get_tabledb
sql ampaszResult ampnrow ampncolumn 0if SQLITE_OK iRetreturn ERR_DAO_EXCEPTIONif 0 nrow//没有符合条件的数据return ERR_DAO_USER_NOT_EXISTptUsrInfo-gtdwUsrId strtoulaszResultncolumn NULL DAO_RADIX_10strncpyu8 ptUsrInfo-gtszUsrName aszResultncolumn 1 DAO_NAME_LEN -1ptUsrInfo-gtszUsrNameDAO_NAME_LEN -1 0strncpyu8 ptUsrInfo-gtszPasswd aszResultncolumn 2 DAO_PASSWD_LED -1ptUsrInfo-gtszPasswdDAO_PASSWD_LED -1 0ptUsrInfo-gtdwUgrpId strtoulaszResultncolumn 3 NULL DAO_RADIX_10is_group strtoulaszResultncolumn 4 NULL DAO_RADIX_10ptUsrInfo-gtdwPri strtoulaszResultncolumn 5 NULL DAO_RADIX_10sqlite3_free_tableaszResult你可以使用sqlite3_column_name来取得各字段的名称const char sqlite3_column_name sqlite3_stmt / statement handle /intiCol/ column ordinal /类似地你可以使用sqlite3_column_type取得各字段的存储类intsqlite3_column_type sqlite3_stmt / statement handle / intiCol/ column ordinal /这个函数返回一个整数值代表5 个存储类的
代码定义如下define SQLITE_INTEGER 1define SQLITE_FLOAT 2define SQLITE_TEXT 3define SQLITE_BLOB 4define SQLITE_NULL 5这些是SQLite本身的类型或称存储类型。
你可以使用sqlite3_column_decltype函数获得字段声明的数据类型const char sqlite3_column_decltype sqlite3_stmt / statement handle /int/ column ordinal /如果结果集中的一列不是来自一个实际的字段如来自于表达式、函数或聚合的结果这个函数将返回NULL。
字段的详细信息可以从一个独立的query 获得使用sqlite3_table_column_metadata函数声明如下SQLITE_API intsqlite3_table_column_metadatasqlite3 db / Connection handle /const char zDbName / Database name or NULL /const char zTableName / Table name /const char zColumnName / Column name /char const pzDataType / OUTPUT: Declared data type /char const pzCollSeq / OUTPUT: Collation sequence name /intpNotNull / OUTPUT: True if NOT NULL constraint exists / intpPrimaryKey / OUTPUT: True if column part of PK /intpAutoinc/ OUTPUT: True if column is auto-increment /这个函数包含输入和输出参数。
它不在statement 句柄下
工作但需要提供连接句柄、数据库名、表名和列名。
可选的数据库名指明附加的逻辑数据库名一个连接上可能附加多个数据库。
表名和字段名是必须的。
有些API 是很可能出错的在编码时总要记得3 件事错误、忙状态和schema 改变。
处理错误很多API 函数返回整数结果码这表示它们可以返回错误码。
在使用一个函数之前应该仔细阅读关于该函数的说明看它可能引发什么错误。
API 中定义了大约23 种错误。
可以使用函数sqlite3_errmsg获得附加的错误信息其声明如下const char sqlite3_errmsgsqlite3 它以一个连接句柄作参数返回该连接最近的一条错误信息。
如果还没有发生错误它返回“not an error”。
intsqlite3_errcodesqlite3 dbconst char sqlite3_errmsgsqlite3const void sqlite3_errmsg16sqlite3出错处理函数有上面的三个函数。
第一个函数返回错误
代码 第二个函数获取最近一次操作错误信息 对应的是UTF-8 编码格式 第三个函数获取最近一次操作错误信息 对应的是UTF-16 编码格式。
处理忙状态操作控制API 提供了几个函数可以用来监视或管理编译期间和运行时的
SQL 命令。
这些函数允许你建立回叫函数并以此对不同的数据库事件进行监视和控制当事件发生时。
提交Hook函数使用sqlite3_commit_hook函数可以在特定连接提交事务时对其进行监视。
其声明如下void sqlite3_commit_hook sqlite3 cnx / atabasehandle /intxCallbackvoid data / callback function /void data / application data /回卷Hook函数回卷Hook 函数与提交Hook 函数相类似但它在特定连接回卷事务时对其进行监视。
void sqlite3_rollback_hooksqlite3 cnx voidxCallbackvoid data void data修改Hook函数函数sqlite3_update_hook用来监视特定数据库连接所有的UPDATE、INSERT 和DELETE操作对这些操作中所涉及的每一行都进行监视其声如下void sqlite3_update_hooksqlite3 cnxvoidvoid int char const .