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.