在 JDBC 中,为啥准备好的语句的参数索引从 1 而不是 0 开始?

Posted

技术标签:

【中文标题】在 JDBC 中,为啥准备好的语句的参数索引从 1 而不是 0 开始?【英文标题】:In JDBC, why do parameter indexes for prepared statements begin at 1 instead of 0?在 JDBC 中,为什么准备好的语句的参数索引从 1 而不是 0 开始? 【发布时间】:2010-10-11 14:18:16 【问题描述】:

在 Java 中的其他任何地方,任何索引都从 0 开始。这里的更改是否有原因,或者这只是糟糕的设计?

【问题讨论】:

我也想知道同样的事情,特别是因为结果集也是 1 索引的。 【参考方案1】:

很可能 JDBC 是以 ODBC 为模型的。

【讨论】:

我认为两者都是在 X/Open 接口上建模的。【参考方案2】:

也许更人性化?此外,Java 的正则表达式 Matcher 的组以 1 作为第一个匹配组开始。

【讨论】:

这是正则表达式的标准,因为 0 用于表示整个匹配。【参考方案3】:

我个人认为这是糟糕的设计。

【讨论】:

【参考方案4】:

从历史上看,数据库对绑定参数使用从 1 开始的索引。这可能反映了集合论和数学中关系数据库的起源,它索引元素以 1 开头,并使用 0 来表示 null 或空集。

在 shell 脚本和正则表达式中,零索引通常意味着“特殊”。例如,在 shell 脚本的情况下,第零个“参数”实际上是被调用的命令。

选择 JDBC 是经过深思熟虑的,但最终可能会导致比它解决的更多的困惑和困难。

【讨论】:

在数学中,使用零索引通常更容易(根据我的经验(三等 BSc))。 我不认为从零开始的索引是一个数学工件。我拥有的每一本线性代数书都以 1 开始对行/列进行编号。如果我没记错的话,FORTRAN 默认从 1 开始。我认为从零开始的索引是 C 和指针算法的遗产。 就我个人而言,我认为基于 0 的索引是 C 指针算法的倒退,它似乎已经卡住了......对我们所有人来说都是不幸的。 使用从 0 开始索引的美妙之处在于:您可以将包含连续 N 元素的区间用作 [0, N)[N, 2N)[2N, 3N) 等等。因此,所有主流语言,如 C、C++、Java、javascript、Python,都使用最初在 C 编程语言中使用的从 0 开始的索引约定。这个原则也适用于像[a, b) 这样的通用索引,其中a 是包含的,b 是排除的。【参考方案5】:

我了解 JDBC 和 ODBC 都基于 X/Open 调用级别接口。所以,它是 Java 之前的历史,比如从 0 开始的月份数字。

【讨论】:

【参考方案6】:

这是原始语言设计者为淘汰弱者而策划的阴谋的一部分。在原始规范中,数组从 -1 开始编号,具有 1 个元素的列表返回长度 =0。

今天,这个恶魔般的情节只剩下 java Calendar API。

【讨论】:

以上是关于在 JDBC 中,为啥准备好的语句的参数索引从 1 而不是 0 开始?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jdbc 准备好的语句传递可变数量的参数?

使用 neo4j jdbc 驱动程序和 neo4j 4 准备好的语句中的密码查询参数的语法是啥?

在哪里使用 JDBC 创建准备好的语句?

为啥 JDBC 不支持批量获取数据?

将字符串参数插入准备好的语句的问题

为啥使用 mysql 准备好的语句比使用常见的转义函数更安全?