在 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 开始?的主要内容,如果未能解决你的问题,请参考以下文章