尽管SQL存在针对SQL的标准,为什么SQL发行版如此非标准?SQL数据库的工作方式确实存在很多有意义的差异,还是我一直在使用的两个数据库:MS-SQL和PostgreSQL?为什么会出现这些差异?
ANSI标准仅指定一组有限的命令和数据类型.一旦超越这些,实现者就会独立完成.并且根本没有指定一些非常重要的概念,例如自动递增列.SQLite只选择第一个非空整数,MySQL需要AUTO INCREMENT
,PostgreSQL使用序列等等.这是一个混乱,而且只是在OSS数据库中!尝试让Oracle,Microsoft和IBM共同决定一些棘手的功能.
这是"隐形锁定"的一种形式.乔尔在这里详细介绍:
http://www.joelonsoftware.com/articles/fog0000000056.html
http://www.joelonsoftware.com/articles/fog0000000052.html
公司最终将其业务功能与其实施中的非标准或奇怪的不支持功能捆绑在一起,这限制了他们从供应商转移到竞争对手的能力.
另一方面,它是非常短视的,因为任何半脑的人都会倾向于抽象掉专有的部分,或者如果它过于严重则完全避免锁定.
首先,我发现数据库不兼容浏览器或操作系统.任何有几个小时训练的人都可以开始对任何SQL数据库进行选择,插入,删除和更新.同时,很难编写在每个浏览器上呈现相同的HTML或为多个操作系统编写系统代码的HTML.通常,SQL的差异与性能或相当深奥的功能有关.主要的例外似乎是日期格式和功能.
其次,数据库开发人员通常会积极地添加能够将其产品与其他人区分开来的功能.Oracle,MS SQL Server和MySQL等产品是一个庞大的生态系统,很少在实践中交叉授粉.在我的工作场所,我们使用Oracle和MySQL,但如果需要或需要,我们可能会在大约一天内切换到100%Oracle.所以我非常关心Oracle在每个版本中为我们提供的闪亮玩具,但我甚至不知道我们使用的MySQL版本.就我们而言,IBM,微软,PostgreSQL以及其余部分可能都不存在.拥有获取和保留客户和用户的功能远比数据库世界中的兼容性重要得多.(我认为这是"锁定"答案的积极旋转.)
第三,不同公司以不同方式实施SQL是有正当理由的.例如,Oracle有一个多版本系统,允许非常快速和可扩展的一致读取.其他数据库缺少该功能,但通常更快插入行和回滚事务.这是这些系统的根本区别.它不会比另一个更好(至少在一般情况下),只是不同.如果数据库引擎的SQL ontop利用其优势并尝试最小化其弱点,那么不应该感到惊讶.事实上,开发人员不这样做是不负责任的.