¿Estándar SQL para escapar de los nombres de columna?

98

¿Existe un estándar SQL para escapar de un nombre de columna? Si no, ¿qué funciona para MySQL y SQLite? ¿también funciona para SQL Server?

Dale K
fuente

Respuestas:

89

Comillas "

El estándar SQL: 1999 especifica que se utilizan comillas dobles (") ( COMPROMISO ) para delimitar los identificadores.

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

Oracle, PostgreSQL, MySQL, MSSQL y SQlite son compatibles "como delimitadores de identificadores.

No todos se utilizan "como "predeterminados". Por ejemplo, debe ejecutar MySQL en modo ANSI y SQL Server solo lo admite cuando lo QUOTED_IDENTIFIERestá ON.

Dean Harding
fuente
77

Según SQLite ,

  • 'foo' es una cadena SQL
  • "foo" es un identificador SQL (columna / tabla / etc.)
  • [foo] es un identificador en MS SQL
  • `foo` es un identificador en MySQL

Para nombres calificados, la sintaxis es: "t"."foo"o [t].[foo], etc.

MySQL admite el estándar "foo" cuando la ANSI_QUOTESopción está habilitada.

tc.
fuente
3
Tenga en cuenta que SQLite permite 'foo'ser interpretado como un identificador si el contexto no permite una cadena, y "foo"puede ser interpretado como una cadena si el contexto no permite un identificador, aunque hay una nota de que este comportamiento puede eliminarse en el futuro. Versiones
thomasrutter
Entonces, ¿cómo se hace "t". *?
Loenix
2
@thomasrutter Sí, este comportamiento me mordió totalmente ... Intenté usar WHERE "nonexistent_column" = 0y sqlite lo ejecutó felizmente pretendiendo que mi "nonexistent_column"era una cadena. Calificar completamente el nombre como "my_table"."nonexistent_column"obliga a sqlite a comportarse de manera más estricta.
Rufflewind
foo, "foo"y 'foo'no me funcionó con MySQL. Requería comillas inversas. Y para empeorar las cosas, MySQL estaba proporcionando mensajes de error inútiles .
jww
22

Para MySQL, use ticks `.

Por ejemplo:

SELECT `column`, `column2` FROM `table`
Kerry Jones
fuente
20

Para uso de MS SQL [y]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
BoltBait
fuente
2
puede tener espacios en los nombres de las columnas con ms sql!?!
3
¡usted puede! Aunque no lo haría.
JMP
1
Sí, puede tener espacios o palabras reservadas como nombres de entidad en MSSQL. Solo necesitas [] ellos.
BoltBait
6
Por cierto, si está usando [y] en MS SQL Server y desea usar el carácter] en el nombre mismo (por el motivo que sea), entonces debe escapar con otro carácter] (es decir, use]] en lugar de] ).
Daniel James Bryars
2

Para uso de DBASE / DBF [y]

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

Juntando algunas respuestas:

MS SQL (también conocido 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"

¡Agregue / edite!

oruga naranja
fuente