列名をエスケープするSQL標準?


96

列名をエスケープするSQL標準はありますか?mysqlとsqliteで何が機能しないのですか?sqlserverでも機能しますか?

sql 

回答:


88

クォーテーションマーク "

SQL:1999標準を指定し、二重引用符( ")(というQUOTATION MARKが)の境界を定める識別子に使用されています。

<delimited identifier> ::= <double quote> <delimited identifier body> <double quote>

Oracle、PostgreSQL、MySQL、MSSQL、およびSQliteはすべて"、識別子の区切り文字としてサポートされています。

すべて"が「デフォルト」として使用されるわけではありません。たとえば、MySQLをANSIモードで実行している必要があり、SQL Serverがサポートしているのは、の場合のみQUOTED_IDENTIFIERですON


76

SQLiteによると、

  • 'foo' SQL文字列です
  • "foo" SQL識別子(列/テーブル/その他)
  • [foo] MS SQLの識別子です
  • `foo` MySQLの識別子です

修飾名の場合、構文は次のとおりです:"t"."foo"または[t].[foo]、など。

MySQLは、ANSI_QUOTESオプションが有効な場合、標準の「foo」をサポートします。


3
SQLiteでは'foo'、コンテキストが文字列を許可しない場合は識別子として解釈され、コンテキストが識別子を許可しない"foo"場合は文字列として解釈されることに注意してください。ただし、この動作は将来削除される可能性があります。バージョン。
thomasrutter 2016

では、「t」を行うにはどうすればよいでしょうか。*?
Loenix 2016年

2
@thomasrutterええ、私はこの振る舞いに完全に噛まれました…使用しようとしましたがWHERE "nonexistent_column" = 0、sqliteは私"nonexistent_column"が文字列であるふりをして喜んで実行しました。名前を完全に修飾すると、"my_table"."nonexistent_column"sqliteはより厳密に動作するようになります。
Rufflewind 2017年

foo"foo"および'foo'MySQLのと私のために動作しませんでした。バッククォートが必要です。さらに悪いことに、MySQLは役に立たないエラーメッセージを提供していました
jww


19

MS SQLの場合[および]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]

2
ms sqlを使用して列名にスペースを含めることができます!?!

3
あなたはできる!しかし、私はしません。
JMP

1
はい、MSSQLではエンティティ名としてスペースまたは予約語を使用できます。それらを[]するだけです。
BoltBait 2010年

6
ところで、MS SQL Serverで[および]を使用していて、名前自体に]文字を使用したい場合は(何らかの理由で)、他の]文字でエスケープする必要があります(つまり、]ではなく]]を使用します。 )。
ダニエル・ジェームズBryars


1

いくつかの答えをまとめます:

MS SQL(別名T-SQL)、Microsoft Access SQL、DBASE / DBF: SELECT [COLUMN], [COLUMN2] FROM [TABLE]

MySQL: SELECT `COLUMN`, `COLUMN2` FROM `TABLE`

SQLite、Oracle、Postgresql: SELECT "COLUMN", "COLUMN2" FROM "TABLE"

追加/編集してください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.