为什么基于 SQL 的数据库服务器上的字符串函数从位置 1 而不是 0 开始?

VKK*_*VKK 8 functions string substring

这一直困扰着我。基于 SQL 的服务器中的字符串函数似乎总是从位置 1 开始(至少 MySQL、SQL Server、Oracle 和 Postgres 是这种情况)。例如,以下查询将用于选择名称数据库中名为 first_name 的列的第一个字母:

SELECT SUBSTRING(first_name,1,1) FROM names;
Run Code Online (Sandbox Code Playgroud)

为什么字符串函数的位置不像几乎所有编程语言的规范那样从 0 开始?

我正在寻找的不仅仅是 ANSI 标准。为什么是标准?

编辑:好的,所以 0 不是“几乎所有编程语言中的规范”,正如下面所指出的。1 也被使用。

Sol*_*zky 9

考虑到计算机之外的字符串中没有第零位置,问题真的不应该是:为什么在一些更常见的编程语言中字符串是基于 0 的?(我不确定“几乎所有编程语言”的说法,因为有比大多数人意识到的更多的语言)

C 和其他语言中的字符串只是一个以 - 结尾的字符数组(即char[]null。这就是为什么您可以使用索引符号(即stringVariable[index])来引用单个字符的原因。变量是内存中某个位置的地址。索引是数组起始地址的偏移量。因此,当将字符串视为数组时,以基于 0 的方式与它们交互就足够有意义了,因为它至少是一致的,即使有时有点尴尬。

为什么这在 SQL 中有所不同?我猜这与 SQL 更多地涉及物理存储而不是内存分配有关。虽然一些 RDBMS 确实支持数组(例如 PostgreSQL),但这不是标准的。SQL 也是一种高级声明性语言,它隐藏了查询引擎真正在做什么的操作细节,因此地址和指针的概念并不存在。因此,在使用 SQL 时考虑基于 0 的索引并没有什么意义。

正如另一位发帖人所指出的,基于零的索引的来源是寻址。任何数据块中的第一个地址都以零结尾(无论它是否占据物理内存中的最后一位)。而且不仅仅是计算机——你附近街区的第一所房子的地址可能是一个像 300 这样的数字——而不是 301。

在编程使用模数的迭代函数时(每 5 次迭代发生一些事情,等等),使用从零开始的数组很方便 - 并且速度更快。

另请参阅: