これはいつも私を悩ませてきました。 SQLベースのサーバーの文字列関数は常に1の位置から始まるようです(少なくとも、これはMySQL、SQL Server、Oracle、およびPostgresの場合です)。たとえば、次のクエリを使用して、名前データベースのfirst_nameという列の最初の文字を選択します。
SELECT SUBSTRING(first_name,1,1) FROM names;
文字列関数の位置が、ほとんどすべてのプログラミング言語の標準である0から始まっていないのはなぜですか?
これはANSI規格だけではありません。なぜ標準なのですか?
編集:さて、以下で指摘されているように、0は「ほぼすべてのプログラミング言語の標準」ではありません。 1も使用されます。
コンピュータの外部の文字列には0番目の位置がないことを考えると、問題は本当のはずではありません。なぜより一般的なプログラミング言語の一部で文字列が0ベースであるのでしょうか。 (「ほとんどすべてのプログラミング言語」の記述については、ほとんどの人が認識しているよりもはるかに多くの言語があるため、私にはわかりません)
Cおよび他の言語の文字列は、単なる文字の配列です(つまり、char[]
)はnull
で終了します。これが、インデックス表記を使用して個々の文字を参照できる理由です(つまり、stringVariable[index]
)。変数は、メモリ内の場所へのアドレスです。インデックスは、配列の開始アドレスへのオフセットです。したがって、文字列が配列であるという観点から考えると、文字列を0ベースの方法で操作することは十分に理にかなっています。
SQLでこれが異なるのはなぜですか? SQLはメモリの割り当てよりも物理的なストレージに関係しているのではないかと思います。一部のRDBMSは配列(PostgreSQLなど)をサポートしていますが、これは標準ではありません。 SQLは、クエリエンジンが実際に行っている操作の詳細を隠す高レベルの宣言型言語でもあるため、アドレスとポインタの概念はありません。したがって、SQLを使用する場合、0ベースのインデックスの観点から考えることは実際には意味がありません。
別の投稿者が指摘しているように、ゼロベースのインデックス付けのソースはアドレス指定です。データブロックの最初のアドレスはゼロで終わります(物理メモリの最後の桁を占めるかどうかに関係なく)。そして、それは単なるコンピュータではありません-あなたの近所のブロックの最初の家の住所は、300ではなく、おそらく301のような数字です。
係数が使用される反復関数をプログラミングする場合(5回の反復ごとに何かが起こるようにするためなど)、ゼロベースの配列を操作するのが便利で、高速です。
こちらもご覧ください: