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?

sql 

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.


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.


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`

19

Para MS SQL, use [e]

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

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]

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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.