Functions

為什麼基於 SQL 的數據庫伺服器上的字元串函式從位置 1 而不是 0 開始?

  • November 17, 2017

這一直困擾著我。似乎基於 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 次迭代發生一次,等等),使用從零開始的數組很方便 - 而且速度更快。

另請參閱:

引用自:https://dba.stackexchange.com/questions/125950