这一直困扰着我。似乎基于 SQL 的服务器中的字符串函数总是从位置 1 开始(至少 MySQL、SQL Server、Oracle 和 Postgres 是这种情况)。例如,以下查询将用于选择名称数据库中名为 first_name 的列的第一个字母:
SELECT SUBSTRING(first_name,1,1) FROM names;
为什么字符串函数的位置不像几乎所有编程语言的标准那样从 0 开始?
我正在寻找的不仅仅是 ANSI 标准。为什么是标准?
编辑:好的,所以 0 不是“几乎所有编程语言中的规范”,如下所述。1也被使用。
考虑到在计算机之外的字符串中没有第零位,问题不应该是:为什么在一些更常见的编程语言中字符串是从 0 开始的?(我不确定“几乎所有编程语言”的说法,因为语言比大多数人知道的要多得多)
C 和其他语言中的字符串只是一个以 - 结尾的字符数组(即
char[]
)null
。这就是为什么您可以使用索引符号(即 )来引用单个字符的原因stringVariable[index]
。变量是内存中某个位置的地址。索引是数组起始地址的偏移量。因此,当考虑字符串是一个数组时,以基于 0 的方式与它们交互是有意义的,因为它至少是一致的,即使有时有点尴尬。为什么这在 SQL 中有所不同?我猜想这与 SQL 更多关于物理存储而不是内存分配有关。虽然一些 RDBMS 确实支持数组(例如 PostgreSQL),但这不是标准的。SQL 也是一种高级声明性语言,它隐藏了查询引擎实际执行的操作细节,因此不存在地址和指针的概念。因此,在使用 SQL 时考虑基于 0 的索引是没有意义的。
正如另一张海报所指出的,从零开始的索引的来源是寻址。任何数据块中的第一个地址都以零结尾(无论它是否占据物理内存中的最后一位)。不仅仅是电脑——你附近街区的第一所房子的地址可能是一个像 300 这样的数字,而不是 301。
在编写使用模数的迭代函数时(每 5 次迭代发生一次,等等),使用从零开始的数组很方便 - 而且速度更快。
另请参阅: