web-dev-qa-db-ja.com

SQL Serverデータベース名に有効な文字は何ですか?

クライアントに(特に)新しいSQL Serverデータベースを作成するツールを提供し、提供するデータベース名の基本的な検証を行えるようにしたいと考えています。 SQL Serverのドキュメントでは、データベース名に有効な文字について説明しています。ただし、ドキュメント化されたルールに違反する名前のデータベースを正常に作成できるため、ドキュメントは明らかに間違っています。

CREATE DATABASE に関するSQL Serverのドキュメントによると、データベース名は識別子の規則に従う必要があります。 identifiers のルールは、データベースの互換性レベルに依存します。互換性レベルが100(SQL Server Management Studioによれば「SQL Server 2008」を意味する)の場合、名前はUnicode文字、_@、または#で始まる必要があります。 1つ以上の文字、数字、@$#、または_が続きます。ドキュメントには、埋め込みスペースまたは特殊文字は許可されていないことが明確に記載されています。

これは、SQL Server Management Studioを使用して、名前がThis & That | "Other"であるデータベースを作成できるためです-埋め込みスペース(明示的に禁止されている)だけでなく、特殊文字(|")が含まれています'ファイル名でも有効ではありません。確認したところ、データベースの互換性レベルは、その名前がその互換性レベルで無効であると文書化されていたとしても、実際には「SQL Server 2008(100)」です。

ええと、CREATE DATABASE " "(はい、それは単一のスペースです)を行うこともできます。これは、最初の文字がnotである必要があることを証明します。

だから、私の質問は、SQL Serverデータベース名で有効な文字ですか? SQL Serverの実際の動作と一致する文書化されたルールはありますか?

48
Joe White

識別子の規則 最後の状態:

Transact-SQLステートメントで識別子を使用する場合、これらの規則に準拠しない識別子は、二重引用符または角かっこで区切る必要があります。

これらのルールに準拠しないデータベース名を選択することにより、常に二重引用符または括弧で囲む必要があります。

通常の識別子の規則が順守されている場合は、引用符/括弧なしでデータベース名を使用できます。

次の手順は大丈夫です

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

だがしかし

CREATE DATABASE This & That | "Other"

編集:

私はこれがリンクされたドキュメントを理解する方法ではないことに同意します:は識別子の規則に準拠する必要があります識別子が囲まれるとすぐに?適合しない識別子を囲むことに関するポイントは、ルールの一部である必要があります。

28
marapet

通常の識別子と区切られた識別子には違いがあります。通常の識別子は、言及されている制限によって制限されていますが、区切り識別子には任意の文字(区切り文字を除く)を含めることができます。

識別子を引用符で囲んでいるため、識別子は区切られており、通常の識別子の規則に制限されません。

区切り文字がないと、通常の識別子の規則に従う識別子を持つデータベースのみを作成できます。

create database db_name

区切り文字を使用すると、ほとんど何でも使用できます。

create database "That's a funny name, isn't it?"

create database [)(/%Q)/#&%¤)Q/#)!]
10
Guffa

個人的に私はそれらをアルファベットと数字に限定し、他には何もありません(おそらく_も)。スペース、面白い記号、改行などはありません。これは最も安全です。

7
HLGEM

区切り名-角括弧または二重引用符で囲まれている場合( QUOTED_IDENTIFIER がONに設定されている場合)-基本的に区切り文字以外のものを含めることができます。エスケープロジックを使用して、名前内で区切り文字を使用することもできます。ただし、エスケープする必要があるのは終了エスケープ文字のみであることに注意してください。以下の最初の例では、名前の開始エスケープ文字の単一インスタンスをエスケープする必要はありませんが、終了エスケープ文字はエスケープする必要があります(単一インスタンスを2に置き換えて)。ここでのロジックは、これらのステートメントを解析しているコードが閉じエスケープ文字を探していて、ネストされた開始エスケープ文字に興味がないということだと思います。

  • [テスト[テスト]->テスト[テスト
  • [テスト]]テスト]->テスト]テスト

以下は、SQL Server 2012で区切られていない(引用符で囲まれていない)識別子名を取り巻くルールの説明です。これは、ドキュメントからの抜粋です MySQLからSQL Server 2012への移行ガイド

スキーマオブジェクト名

SQL Server 2012では、オブジェクト名の最大長は128文字です。

引用符で囲まれていない識別子名は、次の規則に従う必要があります。

  • 最初の文字は、英数字、アンダースコア(_)、アットマーク(@)、または番号記号(#)でなければなりません。
  • 後続の文字には、英数字、アンダースコア、アット(@)記号、番号記号、またはドル記号を含めることができます。
  • 識別子は、Transact-SQLの予約語であってはなりません。 MySQLからSQL Server 2012 8への移行ガイド
  • 埋め込みスペースまたは特殊文字は使用できません。

@または番号記号で始まる識別子には特別な意味があります。 @で始まる識別子はローカル変数名です。シャープ記号で始まるものは一時的なテーブル名です。

Transact-SQLで識別子名を引用するには、角括弧([])を使用する必要があります。

4
Scott Munro