Standard SQL per sfuggire ai nomi delle colonne?


96

Esiste uno standard SQL per eseguire l'escape di un nome di colonna? In caso contrario, cosa funziona per mysql e sqlite? funziona anche per sqlserver?

sql 

Risposte:


88

Virgolette "

Lo standard SQL: 1999 specifica che le virgolette doppie (") ( QUOTATION MARK ) vengono utilizzate per delimitare gli identificatori.

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

Oracle, PostgreSQL, MySQL, MSSQL e SQlite supportano tutti "come delimitatori di identificatori.

Non tutti usano "come "impostazione predefinita". Ad esempio, devi eseguire MySQL in modalità ANSI e SQL Server lo supporta solo quando lo QUOTED_IDENTIFIERè ON.


76

Secondo SQLite ,

  • 'foo' è una stringa SQL
  • "foo" è un identificatore SQL (colonna / tabella / ecc.)
  • [foo] è un identificatore in MS SQL
  • `foo` è un identificatore in MySQL

Per i nomi qualificati, la sintassi è: "t"."foo"o [t].[foo], ecc.

MySQL supporta lo standard "foo" quando l' ANSI_QUOTESopzione è abilitata.


3
Nota che SQLite consente 'foo'di essere interpretato come un identificatore se il contesto non consente una stringa e "foo"di essere interpretato come una stringa se il contesto non consente un identificatore, anche se c'è una nota che questo comportamento potrebbe essere rimosso in futuro versioni.
thomasrutter

Allora, come si fa a "t". *?
Loenix

2
@thomasrutter Sì, sono stato totalmente morso da questo comportamento ... Ho provato a usarlo WHERE "nonexistent_column" = 0e sqlite lo ha eseguito felicemente fingendo che la mia "nonexistent_column"fosse una stringa. Qualificare completamente il nome come "my_table"."nonexistent_column"obbliga sqlite a comportarsi in modo più rigoroso.
Rufflewind

foo, "foo"E 'foo'non ha funzionato per me con MySQL. Richiedeva backtick. E come se non bastasse, MySQL forniva messaggi di errore inutili .
jww

22

Per MySQL, usa i tick indietro `.

Per esempio:

SELECT `column`, `column2` FROM `table`

19

Per MS SQL utilizzare [e]

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

2
puoi avere spazi nei nomi delle colonne con ms sql!?!

3
Puoi! Non lo farei, però.
JMP

1
Sì, puoi avere spazi o parole riservate come nomi di entità in MSSQL. Hai solo bisogno di [] loro.
BoltBait

6
A proposito, se stai utilizzando [e] in MS SQL Server e desideri utilizzare il carattere] nel nome stesso (per qualsiasi motivo), devi eseguire l'escape con un altro] carattere (ad esempio, usa]] invece di] ).
Daniel James Bryars

2

Per DBASE / DBF utilizzare [e]

SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]

1

Mettendo insieme alcune risposte:

MS SQL (noto anche come 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"

Si prega di aggiungere / modificare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.