http://www.phpchina.com/archives/view-33860-1.html
各种流行的SQL引擎被用来测试,看它们是如何处理空值的。我的目的是想SQLite像其他引擎一样工作。志愿者们开发了SQL的测试脚本并使之在SQL RDBMSes上运行,运用测试的结果来推论空值在各种引擎上是如何被处理的。
我的目标是使SQLite用一种标准和顺从的方法来处理空值。但是在SQL标准中关于如何处理空值的描述似乎不太明确。从标准文档中,我们不太容易弄清楚空值在所有场合下是如何被处理的。 所以标准文档被取代,各种流行的SQL引擎被用来测试,看它们是如何处理空值的。我的目的是想SQLite像其他引擎一样工作。志愿者们开发了SQL的测试脚本并使之在SQL RDBMSes上运行,运用测试的结果来推论空值在各种引擎上是如何被处理的。最初的测试是在2002年5月运行的。测试脚本的副本在这篇文档的最后。 SQLite最初是这样编译的,对于下面表格中的所有问题,它的答案都是"Yes"。但是在其它SQL引擎上的测试表明没有一个引擎是这样工作的。所以SQLite被改进了,改进后它像Oracle,PostgreSQL,and DB2一样工作。改进后,对于SELECT DISTINCT 语句和SELECT中的UNIQUE操作符,空值是模糊的。在UNIQUE列中空值仍然是清晰的。这看起来有些独裁的意思,但是使SQLite和其它数据库引擎兼容似乎比这个缺陷更重要。 为了SELECT DISTINCT和UNION,使SQLite认为空值是清晰的是有可能的。但是你需要在sqliteInt.h原文件中改变NULL_ALWAYS_DISTINCT #define的值,并重新编译。 下面的表格显示了空处理实验的结果。
|