Heero's Blog

Heero's Blog » 数据库

分析MySQL的授权许可

MySQL是开源软件,但开源不意味着免费,开源软件的使用应遵循该软件提供的使用授权许可。MySQL的授权许可是英文的,而且一直以来没有权威的中文译本,所以很多人都不清楚其中的细节。

最近我在做一些ASP.NET+MySQL的应用,特地对MySQL的授权许可进行了研究。

(以下说明,如有错误,欢迎指正)

使用MySQL作为数据库的应用是否会“被GPL”

MySQL开源软件(包括MySQL社区版数据库服务器、驱动程序和链接库等)是在GPL许可下提供的。GPL(General Public License)是一种开源许可,其大概的内容是:只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品也必须采用GPL协议,即必须也开源。

应用程序是否也必须采用GPL进行开源,是由

SQLite Expert 3.0 & 个人免费版

自从用上SQLite数据库以来,就一直在用SQLite Expert作为图形化管理工具。这个工具的功能非常强大,但糟糕的是,它是一款收费软件,因此之前用的都是破解版。近来在忙前端的工作,好久没打开这个工具了。今天一开,提示版本更新了,而且最新的版本号是3.0.20,比我当前用的2.3.9要高出一个大版本号。

访问官网后发现,SQLite Expert已经分为个人版和专业版两个版本,个人版是免费的,专业版售价$59。下载了个人版并安装好后,立刻开始试用。3.x版本的图标变了:

SQLite Expert 3启动界面

但界面还是老样子,没有太大的区别:

使用参数化查询防止SQL注入漏洞

SQL注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。

SQL注入的原理

以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:

string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" + password + "'";

其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下,这自然没有问题,但是用户输入是不可信的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。

假设password的值是"1' or '1' = '1",userName的值随便取,比如是"abc",那变量sql的值就是:

"SELECT TOP 1 * FROM [Use

重置SQLite中的自动编号列

目前流行的数据库都提供了自动编号类型,SQLite也不例外。当数据库中包含自动编号的字段时,SQLite会自动建立一个名为 sqlite_sequence 的表。这个表包含两个字段:nameseq 。name字段记录了自动编号字段所在的表,seq字段记录了当前用到的序号(下一条记录的编号就是当前序号加1)。

在开发过程中,我们经常要把表重置。也就是说把表中的记录全部清空,并把自动编号归0。在SQLite中,只需要修改 sqlite_sequence 表就可以了:

UPDATE sqlite_sequence SET seq = 0 WHERE name = 'TableName'

也可以直接把该记录删掉:

DELETE FROM sqlite_sequence WHERE name = 'TableName'

要是想重置所有表,那直接把 sqlite_sequence

SQLite在字符串比较中的大小写问题

大部分数据库在进行字符串比较的时候,对大小写是不敏感的。但是,最近使用SQLite的时候,却发现它的情况恰好相反。

假设表User的结构和值如下:

UserName
1 User1

执行下面的SQL语句:

SELECT * FROM [User] WHERE UserName = 'user1'

结果是没有找到任何记录。明显地,SQLite在进行字符串比较的时候,默认对大小写是敏感的。这会对应用程序造成不良的影响。比如