Norme SQL pour échapper les noms de colonne?

98

Existe-t-il un standard SQL pour échapper un nom de colonne? Sinon, qu'est-ce qui fonctionne pour MySQL et SQLite? ça marche aussi pour SQL Server?

Dale K
la source

Réponses:

89

Guillemet "

Le SQL: 1999 norme spécifie que guillemet ( ") ( GUILLEMET ) est utilisé pour délimiter les identificateurs.

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

Oracle, PostgreSQL, MySQL, MSSQL et SQlite prennent tous en charge "le délimiteur d'identifiant.

Ils ne sont pas tous utilisés "par défaut. Par exemple, vous devez être en cours d' exécution MySQL en mode ANSI et SQL Server ne prend en charge quand QUOTED_IDENTIFIERest ON.

Dean Harding
la source
77

Selon SQLite ,

  • 'foo' est une chaîne SQL
  • "foo" est un identifiant SQL (colonne / table / etc)
  • [foo] est un identifiant dans MS SQL
  • `foo` est un identifiant dans MySQL

Pour les noms qualifiés, la syntaxe est: "t"."foo"ou [t].[foo], etc.

MySQL prend en charge le standard "foo" lorsque l' ANSI_QUOTESoption est activée.

tc.
la source
3
Notez que SQLite permet 'foo'd'être interprété comme un identifiant si le contexte n'autorise pas une chaîne, et "foo"d'être interprété comme une chaîne si le contexte ne permet pas un identifiant, bien qu'il y ait une note que ce comportement peut être supprimé à l'avenir versions.
thomasrutter
Alors, comment faites-vous "t". *?
Loenix
2
@thomasrutter Ouais, j'ai été totalement mordu par ce comportement… J'ai essayé d'utiliser WHERE "nonexistent_column" = 0et sqlite l'a simplement exécuté avec bonheur en prétendant que j'étais "nonexistent_column"une corde. Qualifier complètement le nom comme "my_table"."nonexistent_column"obligeant sqlite à se comporter de manière plus stricte.
Rufflewind
foo, "foo"et 'foo'n'a pas fonctionné pour moi avec MySQL. Cela nécessitait des backticks. Et pour aggraver les choses, MySQL fournissait des messages d'erreur inutiles .
jww
22

Pour MySQL, utilisez les graduations inverses `.

Par exemple:

SELECT `column`, `column2` FROM `table`
Kerry Jones
la source
20

Pour MS SQL, utilisez [et]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
BoltBait
la source
2
vous pouvez avoir des espaces dans les noms de colonnes avec ms sql!?!
3
vous pouvez! Mais je ne le ferais pas.
JMP
1
Oui, vous pouvez avoir des espaces ou des mots réservés comme noms d'entité dans MSSQL. Vous avez juste besoin de [] eux.
BoltBait
6
BTW, si vous utilisez [et] dans MS SQL Server et que vous souhaitez utiliser le caractère] dans le nom lui-même (pour une raison quelconque), vous devez l'échapper avec un autre caractère] (c'est-à-dire utiliser]] au lieu de] ).
Daniel James Bryars
2

Pour utilisation DBASE / DBF [et]

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

Rassembler quelques réponses:

MS SQL (alias 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"

Veuillez ajouter / modifier!

orangecaterpillar
la source