@H_
404_8@
sqlite in PHP
BinzyWu@phpe/文
@H_
404_8@关键词:
sqlite,
MysqL,
PHP4,
PHP5,Pear,触发器,视图,
sql
@H_
404_8@
(一)sqlite介绍
@H_
404_8@
@H_
404_8@
sqlite第一个Alpha版本诞生于2000年5月.至今已经有4个年头了.而在今年的5月
sqlite也迎来了一个新的里程:
sqlite 3.
@H_
404_8@下面是你访问
sqlite官方网站: www.
sqlite.org时第一眼看到关于
sqlite的特性.
@H_
404_8@1.ACID事务
@H_
404_8@2.零配置–无需安装和管理配置
@H_
404_8@3.储存在单一磁盘
文件中的一个完整的
数据库
@H_
404_8@4.
数据库文件可以在不同字节顺序的机器间自由的共享
@H_
404_8@5.
支持数据库大小至2TB
@H_
404_8@6.足够小,大致3万行C
代码,250K
@H_
404_8@7.比一些流行的
数据库在大部分普通
数据库操作要快
@H_
404_8@8.简单,轻松的API
@H_
404_8@9.包含TCL绑定,同时通过Wrapper
支持其他语言的绑定
@H_
404_8@10.良好注释的源
代码,并且有着90%以上的测试覆盖率
@H_
404_8@11.独立:没有额外依赖
@H_
404_8@12.Source完全的Open,你可以用于任何用途,
包括出售它
@H_
404_8@从
代码架构图你可以轻松的看出,是的,
sqlite非常简单.对,
sqlite的设计思想就是简单:
@H_
404_8@1.简单的管理
@H_
404_8@2.简单的操作
@H_
404_8@3.简单的在程序中使用它
@H_
404_8@4.简单的维护和客制化
@H_
404_8@因为简单所以它
快速,但虽然简单,却仍非常可靠.适合
sqlite的应用场所有,网站,嵌入式设备和应用,应用程序
文件格式,代替特别的
文件,内部或临时
数据库,命令行数据集分析工具,在演示或测试中代替企业级
数据库,
数据库教学,试验
sql语言扩展等.但并不是所有都合适,比如在使用Server/Client结构的时候,高负荷的网站,高并发等情况下并不建议使用
sqlite.
@H_
404_8@本文重点在于介绍
sqlite在
PHP中的应用,
PHP作为Web应用中一个重要力量一直在不断的前进和发展.在马上就要Release的
PHP的第五个版本中,不再将
MysqL作为默认
支持,而转为将
sqlite的扩展作为默认
支持.从某种程度上说
MysqL的广泛应用有
PHP的很大功劳.虽然说
PHP改变默认
支持有
MysqL的授权改变的原因,但选择
sqlite也是有原因的,理由就在于上面所提到的那些特性.其实
MysqL从来就不是完全免费的,你无法用于商业用途.而
sqlite是完全的open的.
@H_
404_8@
(二)sqlite sql
@H_
404_8@
sqlite的
sql从很大程度上实现了ANSI
sql92标准.特别的
sqlite
支持视图,事务,
支持嵌套
sql.这些都会在下面应用的过程中讲到,故这边先暂时放下,而主要说说
sqlite所
不支持的一些
sql.
@H_
404_8@1.
不支持Exists,虽然
支持in(in是Exists的一种情况)
@H_
404_8@2.
不支持多
数据库,如: create table db1.table1 as select * from db2.table1;
@H_
404_8@3.
不支持存储过程
@H_
404_8@4.
不支持Alter View/Trigger/Table
@H_
404_8@5.
不支持Truncate,在
sqlite中Delete不带Where字句时和Truncate的
效果是一样的.
@H_
404_8@6.
不支持Floor和Ceiling
函数,还有其他蛮多的
函数
@H_
404_8@7.没有Auto Increment(自增)字段,但是
sqlite其实是
支持Auto Increment的,即在将该字段设置为”INTEGER PRIMARY KEY”的时候.
@H_
404_8@8.
不支持If Exists
@H_
404_8@……
@H_
404_8@详细的
sql支持可以访问: http://www.
sqlite.org/lang.htm
@H_
404_8@详细的
不支持sql可以访问:
http://www.sqlite.org/cvstrac/wiki?p=UnsupportedSql
@H_
404_8@
(三) sqlite的数据类型
@H_
404_8@首先你会接触到一个让你惊讶的名词: Typelessness(无类型).对!
sqlite是无类型的.这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,无论这列声明的数据类型是什么(只有在一种情况下不是,稍后解释).对于
sqlite来说对字段不指定类型是完全有效的.如:
@H_404_8@Create Table ex1(a,b,c); |
@H_
404_8@诚然
sqlite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型.因为数据类型对于你和其他的程序员交流,或者你准备换掉你的
数据库引擎.
sqlite
支持常见的数据类型,如:
@H_404_8@CREATE TABLE ex2( @H_404_8@a VARCHAR(10), @H_404_8@b NVARCHAR(15), @H_404_8@c TEXT, @H_404_8@d INTEGER, @H_404_8@e FLOAT, @H_404_8@f BOOLEAN, @H_404_8@g CLOB, @H_404_8@h BLOB, @H_404_8@i TIMESTAMP, @H_404_8@j NUMERIC(10,5) @H_404_8@k VARYING CHARACTER (24), @H_404_8@l NATIONAL VARYING CHARACTER(16) @H_404_8@); |
@H_
404_8@前面提到在某种情况下,
sqlite的字段并不是无类型的.即在字段类型为”Integer Primary Key”时.
@H_
404_8@
四的Wrapper
@H_
404_8@由于
sqlite有别于其他
数据库引擎的TCP/IP或RPC访问方式,完全地是本地的操作,从某种角度来说你可以说
sqlite和MS的Access很相似,但是更小更强大.所谓Wrapper即使对
sqlite提供的接口进行封装,使其他语言可以访问,使用
sqlite.
@H_
404_8@
sqlite本身是提供C和Tcl的接口的.所以可以非常轻易的和
PHP相结合.除了
PHP的Wrapper以外,还有许多世界各地的程序员提供了各种语言的
sqlite的接口封装,如Python,C++,Java,.Net……所流行的语言基本都有.
@H_
404_8@
@H_
404_8@
五) PHP的环境下使用sqlite
@H_
404_8@1.
PHP下的安装
@H_
404_8@在
PHP5中,
sqlite已作为默认
支持的模块.在
PHP4中你需要进行安装.首先去http://pecl.
PHP.net/package/
sqlite去下载到
sqlite的扩展,注意Windows下的版本需要去http://snaps.
PHP.net/win32/PECL_STABLE/
PHP_
sqlite.dll下载,当然你也可以下载
代码自己编译.事实上在linux下只需要使用命令: ‘pear install
sqlite’就可以完成安装,而在Win下需要
修改PHP.ini,同样的使
PHP4
支持sqlite.
@H_
404_8@此时你已经无需再安装任何东西了,而你也已经完全
支持sqlite了,一个简单,
快速,可靠的
数据库.
@H_
404_8@如果你需要一个管理软件,那么你可以尝试使用
sqliteManager (www.
sqlitemanager.org),一个与
PHPMyAdmin类似的针对
sqlite的
数据库管理系统.
@H_
404_8@该系统的界面大致如下:
@H_
404_8@2.第一个使用
sqlite的
PHP程序.
@H_
404_8@我们创建一个叫binzy的
数据库,并创建一个叫Binzy的Table,有2个字段,分别是ID,Title.而其中ID为INTEGER PRIMARY KEY,即自增三主键.并在其中插入了2条数据”Binzy”,“Jasmin”.
@H_
404_8@打开并
显示数据:
@H_404_8@if ($db = sqlite_open('../binzy.db',0666,$sqliteerror)) @H_404_8@{//打开 @H_404_8@sqlite$result = sqlite_query($db,'select * from Binzy'); //查询while($row = sqlite_fetch_array($result)) //获得结果 @H_404_8@{ @H_404_8@print 'ID=>'.$row['MyID'].',Name=>'.$row['Name'].'<br />'; @H_404_8@} @H_404_8@} else {die ($sqliteerror);} |
@H_
404_8@结果如下,
@H_
404_8@接下来Insert一条记录,其中我们会使用到
sqlite的事务.
@H_404_8@if ($db = sqlite_open('../binzy.db',$sqliteerror)) { @H_404_8@sqlite_query($db,'BEGIN TRANSACTION'); //开始事务 @H_404_8@if (@sqlite_query($db,'insert into Binzy (Name) values (/'Binzy&Jasmin/')')) @H_404_8@{ @H_404_8@print 'Execute Successfully'; @H_404_8@sqlite_query($db,'COMMIT TRANSACTION'); //提交事务 @H_404_8@} @H_404_8@else @H_404_8@{ @H_404_8@print sqlite_error_string(sqlite_last_error($db)); @H_404_8@sqlite_query($db,'ROLLBACK TRANSACTION'); //回滚事务 @H_404_8@} @H_404_8@} else { @H_404_8@die ($sqliteerror); @H_404_8@} |
@H_
404_8@如果执行失败,便会出现这样的画面,
@H_
404_8@成功则是这样的,
@H_
404_8@是的,如果你已经熟悉使用
PHP对
MysqL之类的
数据库进行操作,那么
sqlite几乎是一样的,而且更为简洁.
@H_
404_8@3.使用Pear::DB (
PHP4中)
@H_
404_8@上面的例子中我们是使用
PHP的
函数直接对
sqlite进行访问,这样的访问方式是不推荐使用的.更好的方式是使用某种数据访问抽象层,如Pear的DB.下面是2中
查询例子的重写.使用某个数据访问抽象层会更方便更安全,并且可以在需要进行
数据库迁移的时候尽可能减小成本.
@H_404_8@require_once('DB.PHP'); @H_404_8@$dbh = DB::connect('sqlite://@localhost/../binzy.db?mode=0666'); //打开 @H_404_8@$dbh->setFetchMode(DB_FETCHMODE_ASSOC); @H_404_8@if (!DB::isError($dbh)) @H_404_8@{ @H_404_8@$result = $dbh->query('select * from Binzy'); //查询 @H_404_8@if (!DB::isError($result)) @H_404_8@{ @H_404_8@while($row = $result->fetchRow()) //读取 @H_404_8@{print 'ID=>'.$row['MyID'].',Name=>'.$row['Name'].'<br />'; @H_404_8@} @H_404_8@$dbh->disconnect(); @H_404_8@} @H_404_8@else @H_404_8@{ @H_404_8@print($dbh->message); @H_404_8@$dbh->disconnect(); @H_404_8@} @H_404_8@} @H_404_8@else @H_404_8@{ @H_404_8@print($dbh->message); @H_404_8@$dbh->disconnect(); @H_404_8@} |
@H_
404_8@4.使用Creole (
PHP5中)
@H_
404_8@Creole是由
PHPdb.org开发的面向
PHP5的数据访问抽象层.关于Creole可参考本期中的《Creole:新兴数据抽象层》.
@H_
404_8@Pear::DB并没有针对
PHP5进行改变,只是因为
PHP5对
PHP4良好的兼容性,使得Pear::DB在
PHP5下仍能很好的工作.所以在你使用
PHP5的时候推荐使用Creole.
@H_404_8@require_once('creole/Creole.PHP'); @H_404_8@$Connection = null; @H_404_8@try{ @H_404_8@$Connection = Creole::getConnection('sqlite://@localhost/../binzy.db?mode=0644'); //获得Connection @H_404_8@$rs = $Connection->executeQuery('select * from Binzy'); // Get ResultSetwhile($rs->next()) @H_404_8@{ @H_404_8@print 'ID=>'.$rs->getInt('myid').',Name=>'.$rs->getString('name').'<br />'; @H_404_8@} @H_404_8@$Connection->close(); @H_404_8@} @H_404_8@catch(sqlException $exception) // Catch Exception @H_404_8@{ @H_404_8@$Connection->close(); @H_404_8@print $exception->getMessage(); @H_404_8@} |
@H_
404_8@
六)总结
@H_
404_8@随着
PHP5的即将到来,给我们带来了许多新的语言特性,使
PHP更加适合于构建强大健壮的各类系统.而随着
PHP5一起走进
PHP开发人员视线的
sqlite则给我们带来了有别于
MysqL的惊喜.是的,他简单却又强大,稳定.而在刚刚过去的六月底新版本的
sqlite3已经Release了第一个测试版本,不仅仅带来了新的
文件结构,也带来了许多新的特性.