很早就聽說過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,因為直接用源碼比較簡單: