2012-05-28 7 views
17

H2 sembra fare la differenza tra nome con preventivo e nome senza preventivo. C'è un modo per farli trattare allo stesso modo?Fare H2 trattare nome quotato e nome non quotato come lo stesso

Ecco le prove che ho fatto:

CREATE TABLE test (dummy INT); 
CREATE TABLE "testquote" (dummy INT, "quotedDummy" INT); 

Ecco le domande:

SELECT * FROM test; --work 
SELECT * FROM "test"; -- doesn't work 
SELECT * FROM "testquote"; --work 
SELECT * FROM testquote; --doesn't work 
SELECT dummy FROM "testquote"; --work 
SELECT quotedDummy FROM "testquote"; --doesn't work 
SELECT "quotedDummy" FROM "testquote"; --work 

Cosa posso fare per rendere le query lavorare con H2?

+0

Leggere lo standard SQL e imparare a utilizzare MAIUSCOLE come appropriato, penso. L'effetto delle virgolette è quello di impedire il mapping predefinito da minuscolo a maiuscolo. – bmargulies

+0

@bmargulies fa 'UPPERCASE' funziona anche con H2? Impossibile trovarlo sulla documentazione SQL di H2. – Drahakar

+0

Non come una funzione, basta scriverli. "TEST" è ciò che corrisponde alla prova semplice. – bmargulies

risposta

29

Quotes names in H2 are case sensitive, come richiesto dalle specifiche SQL. Ciò significa che questo funzionerà:

CREATE TABLE "testquote" (dummy INT, "quotedDummy" INT); 
SELECT * FROM "testquote"; 

ma questo non sarà:

SELECT * FROM "TestQuote"; 
SELECT * FROM "TESTQuote"; 
SELECT * FROM "TESTQUOTE"; 

Unquotes names are not case sensitive in H2. Normalmente vengono convertiti in maiuscolo (come in Oracle e altri database). Ciò significa che le dichiarazioni

CREATE TABLE test (dummy INT); 
SELECT * FROM test; 

sono le stesse

CREATE TABLE "TEST" ("DUMMY" INT); 
SELECT * FROM "TEST"; 

Al H2 si comporta nello stesso modo come Oracle. Questo è un po 'diverso su come altri database come MySQL e PostgreSQL gestiscono i nomi degli identificatori. H2 ha una caratteristica di compatibilità: se si aggiunge ;DATABASE_TO_UPPER=FALSE all'URL del database, gli identificatori non quotati non vengono convertiti in lettere maiuscole, il che significa che sono anche case sensitive. Ma è necessario aggiungere questo quando si crea il database e ogni volta che lo si utilizza (se si aggiunge l'impostazione per i database esistenti, gli identificatori degli oggetti esistenti sono già convertiti in maiuscolo).

A proposito, questo non ha nulla a che fare con lo function UPPER, che è pensato per i dati. La tua domanda riguarda gli identificatori, non i dati.

+0

Grazie per il vostro aiuto M. Mueller. – Drahakar

+0

C'è un modo per dire a h2 di trattare le tabelle create usando i nomi quotati senza distinzione tra maiuscole e minuscole? Ad esempio, se creo la tabella "test" 'permetterò che' select * from test' funzioni? –

+0

Guardando [la sezione sulla compatibilità] (http://www.h2database.com/html/features.html?highlight=IGNORECASE&search=ignorecase#compatibility) descrive l'aggiunta di '; IGNORECASE = TRUE' che ho fatto e ho ricreato le tabelle, tuttavia sono ancora creati mentre vengono citati e rimangono come maiuscole e minuscole. Utilizzando 1.4.191. –