[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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述