Padrão SQL para escapar dos nomes das colunas?

96

Existe um padrão SQL para escapar de um nome de coluna? Se não, o que funciona para mysql e sqlite? também funciona para sqlserver?


fonte

Respostas:

88

Aspa "

O padrão SQL: 1999 especifica que aspas duplas (") ( QUOTATION MARK ) são usadas para delimitar identificadores.

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

Oracle, PostgreSQL, MySQL, MSSQL e SQlite são compatíveis "como delimitadores de identificador.

Nem todos eles usam "como 'padrão'. Por exemplo, você precisa estar executando o MySQL no modo ANSI e o SQL Server só oferece suporte quando QUOTED_IDENTIFIERestiver ON.

Dean Harding
fonte
76

De acordo com SQLite ,

  • 'foo' é uma string SQL
  • "foo" é um identificador SQL (coluna / tabela / etc)
  • [foo] é um identificador no MS SQL
  • `foo` é um identificador no MySQL

Para nomes qualificados, a sintaxe é: "t"."foo"ou [t].[foo], etc.

O MySQL suporta o padrão "foo" quando a ANSI_QUOTESopção está habilitada.

tc.
fonte
3
Observe que o SQLite permite 'foo'ser interpretado como um identificador se o contexto não permitir uma string, e "foo"ser interpretado como uma string se o contexto não permitir um identificador, embora haja uma observação de que este comportamento pode ser removido no futuro versões.
thomasrutter
Então, como você faz "t". *?
Loenix
2
@thomasrutter Sim, fui totalmente mordido por esse comportamento ... Tentei usar WHERE "nonexistent_column" = 0e o sqlite executou-o felizmente fingindo que "nonexistent_column"era uma string. Qualificar totalmente o nome como "my_table"."nonexistent_column"força o sqlite a se comportar de maneira mais restrita.
Rufflewind de
foo, "foo"e 'foo'não funcionou para mim com MySQL. É necessário backticks. E para piorar as coisas, o MySQL estava fornecendo mensagens de erro inúteis .
jww
22

Para MySQL, use back ticks `.

Por exemplo:

SELECT `column`, `column2` FROM `table`
Kerry Jones
fonte
19

Para MS SQL, use [e]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
BoltBait
fonte
2
você pode ter espaços nos nomes das colunas com ms sql!?!
3
você pode! Eu não faria, no entanto.
JMP
1
Sim, você pode ter espaços ou palavras reservadas como nomes de entidades no MSSQL. Você só precisa [] deles.
BoltBait
6
BTW, se você estiver usando [e] no MS SQL Server e quiser usar o caractere] no próprio nome (por qualquer motivo), você precisa escapar dele com um outro caractere] (ou seja, use]] em vez de] )
Daniel James Bryars
2

Para uso DBASE / DBF [e]

SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]
Serhii Matrunchyk
fonte
1

Juntando algumas respostas:

MS SQL (também conhecido como 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"

Adicione / edite!

laranjeira
fonte