[try it] 使用sqlite
很早就听说过sqlite这个数据库引擎,但鉴于我一贯好逸恶劳,纸上谈兵的恶劣行径,一直没着手玩过它。记得老东家当年做CAD系统的标准库时,用的就是sqlite来存储那些标准零件 - 作为desktop版本的标准库,作为数据库安装发布到单机,sqlite的确是不二之选。并且按照sqlite支持的容量上限2TB来看,如果每个标准库零件要5M,可以存2*1024*1024/5 = 419430个,应该是足够的!
这次用sqlite,主要有两个原因:
- 最近想写一个android下微博知识管理器,对于保存离线数据,sqlite是不二之选
- csdn泄露的密码,把它导入数据库,一是可以做一些分析,二是可以练习一下sql
陈硕同学总结最常用的10个密码的shell命令: awk '{print $3}' www.csdn.net.sql |sort |uniq -c |sort -nr |head
基本概念
sqlite是一个相当有名的单机数据库系统,据说是世界上被部署的最多的数据库系统了 - 那到不意外,作为serverless的单机版数据库,其已经被部署到无数pc,智能设备中,相比那些只部署在强劲服务器上的MS SQLSERVER, MYSQL, ORACLE,DB2等,自然要占很大的优势,相对于这些大型数据库系统,其优势是:资源占用非常少,配置极其简单(无需配置),进程内数据库操作,效率较高;当然,相对的就是其不适合高并发,大数据(>2TB)的应用。这篇文章比较详细的分析了sqlite适合于不适合的场景。
sqlite支持windows,linux和mac,当然也支持Android,android.database.sqlite是android sdk中提供的api。sqlite除了提供编程接口之外,也提供了一个命令行工具sqlite3来管理数据库:通过它你可以创建数据库、表;插入、查询数据等等。
另外,sqlite网站上列出的关于sql语法与pragma内容,也是非常值得参考的。
下载安装
sqlite,正如其宣称的一样,是zero-configuration的,所以一旦你下载解压好了,它就可以用了。一般可以认为sqlite包含3个部分吧:
- SDK
- sqlite3命令行工具
- sqlite3_analyzer命令行工具
你需要在这里下载不同的zip包获得,简单验证一下sqlite3是否工作:
D:\Source\Data\Password
$ sqlite3 my.db
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table company(name varchar(50) primary key, address varchar(50));
sqlite> insert into company values("Morgan Stanley", "Huamu Road");
sqlite> insert into company values("Autodesk", "Caobao Road");
sqlite> select * from company;
Morgan Stanley|Huamu Road
Autodesk|Caobao Road
操作实践
可以用两个例子
一、使用sqlite3命令行工具进行数据分析
对象自然是csdn密码库,首先,将密码文本导入数据库:
D:\Source\Data\Password
$ sqlite3 csdn.db
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table user(id varchar(50) primary key, pwd varchar(50), mail varchar(50));
sqlite> .separator " # "
sqlite> .import csdn/www.csdn.net.sql user
这里先创建user表,然后用.separator命令设置列分隔符,并使用.import命令导入,因为源数据的格式为:userid # password # mail,当然,如果有人的密码中用了" # ",导入就会失败 - 但貌似csdn的密码库并没有这种情况。(或许黑客同志们事先把这些行去掉了)。
数据有了,看看有多少行:
sqlite> select count(*) from user;
6428632
现在,我要找出csdn中使用最多的10个密码:
sqlite> select pwd, count(*) from user group by pwd order by count(*) desc limit 10;
123456789|235012
12345678|212749
11111111|76346
dearbook|46053
00000000|34952
123123123|19986
1234567890|17790
88888888|15033
111111111|6995
147258369|5965
可以看到,都是一些比较符合键盘分布密码,至于dearbook,那是csdn的另一个子网站,不知道为什么有那么多人选他;而147258369,则很明显是用小键盘敲入的,看来用先键盘的程序员也不在少数。
二、是简单是使用sqlite3的C/C++编程接口。
你可以直接使用源代码,也可以使用预编译好的dll文件(windows),这里采用dll,因为直接用源码比较简单:
- 下载dll包,里面包含一个sqlite3.def和sqlite3.dll两个文件。
- 下载source code包,需要里面的sqlite3.h头文件
- 把sqlite3.def转换成lib文件:
$ lib /def:sqlite3.def /machine:x86
Microsoft (R) Library Manager Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Creating library sqlite3.lib and object sqlite3.exp - 创建VC++工程,拷贝这里的C代码,设置additonal include directories和additonal include libraries, 编译并把sqlite3.dll所在目录加入path