例えば、'4aii'
という名前のビューを作成する場合、なぜ SQL Server は 4
で始まることを気にするのでしょうか?テーブルを Fouraii
や IVaii
と呼ぶこともできます。
さらに、任意の文字列を名前として使用できるようにするために、[]
は裏で何をするのですか?
文字列は文字列でしょう?
まず、数字(数値リテラル)、文字列(文字列リテラル)、識別子を区別する必要があります。4aii'は文字列リテラルで、何らかの "もの"の値にはなりますが、ものを特定(名前)するものではありません。4aii
や [4aii]
は(それが許されるなら)識別子になります。
クエリパーサは見ているトークンの意味を理解する必要があります。名前が数字で始まることを許可することは、ひいては数字だけで構成されることを許可することになります。では、select 12345 from mytable
が与えられたとき、12345
が整数リテラルなのかカラム名なのか、あなた(とパーサー)はどうやって知るのでしょう?
しかし、もし識別子が文字(またはアンダースコア文字)だけで始まることを許せば、識別子(abc123
)か文字列リテラル('abc123'
)かを曖昧にすることはできません(後者は引用符で囲みます)。
SQL Serverでは角括弧、MySQLではバックチック( `)、ANSI SQL準拠のエンジンではダブルクォートが識別子を表し、識別子が他のトークンと容易に区別できない場合、数字で始まる、スペースや他の特殊文字が入っている、などの場合に使用されます。したがって、[4aii]
や "4aii"
はパーサに識別子を扱っていることを明確に伝えることができます。
あなたが見ているのは、実装のレキサーのルールです。これは、字句解析と呼ばれる処理の一部で、物事の意味を理解することを意味します。理想的には、これはSQL仕様(<identifier>
)で指定された規則に準拠しています。これらのルールはすべて、MicrosoftがRules for Regular Identifiersとして公開しているものです。不規則な識別子を使用する場合は、引用符で囲むか、他のトークンとの間に区切り (Tsqlの []
または二重引用符 ""
) を入れなければなりません。
文字列は文字列なんです。
いや、例えばこんな感じ。
"いいえ、例えばこれです。
これは1文です。しかし、もっと重要なのは、これは5つの単語だということです。しかし、それよりも重要なのは、5つの単語であるということです。主語、目的語、音声を解析し、命令として意味を理解するためには、5語であることを知らなければなりません。