尽管存在 SQL 的 ANSI 标准,但为什么 SQL 发行版如此不标准?SQL 数据库的工作方式是否真的存在许多有意义的差异,或者只是我一直使用的两个数据库:MS-SQL 和 PostgreSQL?为什么会出现这些差异?

有帮助吗?

解决方案

这是“隐形锁定”的一种形式。乔尔在这里进行了详细介绍:

公司最终将其业务功能与实施中的非标准或奇怪的不受支持的功能捆绑在一起,这限制了他们从供应商转向竞争对手的能力。

另一方面,这是非常短视的,因为任何有半个大脑的人都会倾向于抽象出专有部分,或者完全避免锁定,如果它变得太令人震惊的话。

其他提示

ANSI 标准仅指定一组有限的命令和数据类型。一旦超出这些范围,实施者就得靠自己了。并且一些非常重要的概念根本没有指定,例如自动递增列。SQLite 只选择第一个非空整数,MySQL 需要 AUTO INCREMENT, 、PostgreSQL使用序列等。乱七八糟的,而且还只是OSS数据库中的事!尝试让 Oracle、Microsoft 和 IBM 共同决定一些棘手的功能。

首先,我不认为数据库与浏览器或操作系统一样存在不兼容性。任何经过几个小时培训的人都可以开始在任何 SQL 数据库上进行选择、插入、删除和更新。同时,很难编写在每个浏览器上呈现相同的 HTML 或为多个操作系统编写系统代码。一般来说,SQL 中的差异与性能或相当深奥的功能有关。主要的例外似乎是日期格式和函数。

其次,数据库开发人员通常有动力添加使他们的产品与其他产品区分开来的功能。Oracle、MS SQL Server 和 MySQL 等产品是庞大的生态系统,在实践中很少交叉授粉。在我的工作场所,我们使用 Oracle 和 MySQL,但如果需要或愿意,我们可能会在大约一天内切换到 100% Oracle。所以我非常关心 Oracle 在每个版本中为我们提供的闪亮玩具,但我什至不知道我们使用的是哪个版本的 MySQL。IBM、微软、PostgreSQL 以及其他公司对于我们来说可能根本就不存在。拥有获得并留住客户和用户的功能比数据库世界中的兼容性重要得多。(我想,这就是“锁定”答案的积极一面。)

第三,不同公司以不同方式实施 SQL 是有正当理由的。例如,Oracle 有一个多版本控制系统,可以实现非常快速且可扩展的一致读取。其他数据库缺乏该功能,但通常插入行和回滚事务的速度更快。这是这些系统的根本区别。它并不会让一个比另一个更好(至少在一般情况下),只是不同。如果数据库引擎之上的 SQL 利用其优点并尝试尽量减少其缺点,人们不应感到惊讶。事实上,开发商不这样做是不负责任的。

约翰:该标准实际上涵盖了很多主题,包括身份列、序列、触发器、例程、更新插入等。但当然,许多标准组件的实施时间可能晚于第一次实施;这可能是 SQL 标准合规性普遍较低的一个原因。

尼尔:实际上,在某些领域,SQL 标准领先于实现。例如,如果有 CREATE ASSERTION 就很好了,但据我所知,还没有 DBMS 实现断言。

就我个人而言,我认为某些 ISO 标准(如 SQL 标准)的封闭性是问题的一部分:当标准无法在线获得时,实施者/规划者就不太可能了解该标准,并且很少有客户要求遵守,因为他们不知道要要求什么。

正如 1800 所说,这无疑是有效的锁定。但公平地说,对于数据库供应商来说,SQL 标准始终在追赶当前数据库的功能集。我们今天拥有的大多数数据库都具有相当古老的血统。如果您追溯 Microsoft SQL Server 的根源,我想您会发现 Ingres——70 年代编写的最早的关系数据库之一。Postgres 最初是由 80 年代的一些人编写的,作为 Ingres 的继承者。Oracle 的历史可以追溯到很久以前,我不确定 MySQL 是从哪里来的。

数据库的不可移植性确实很糟糕,但情况可能会更糟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top