2012-05-28 14 views
17

H2 wydaje się odróżniać nazwisko od cytatu i nazwy bez cudzysłowu. Czy istnieje sposób, aby traktować je w ten sam sposób?Spraw, aby H2 traktował nazwę cytowaną i niecytowaną jako taką samą

Oto testy, które robiłem:

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

Oto pytania:

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 

Co mogę zrobić, aby te zapytania pracować z H2?

+0

Przeczytaj standard SQL i naucz się korzystać z UPPERCASE w zależności od potrzeb. Efektem cytatów jest zapobieganie domyślnemu odwzorowaniu od niższego do dużego. – bmargulies

+0

@bmargulies czy 'UPPERCASE' działa nawet z H2? Nie można go znaleźć w dokumentacji SQL H2. – Drahakar

+0

Nie jako funkcja, tylko przeliteruj je. "TEST" pasuje do zwykłego testu. – bmargulies

Odpowiedz

29

Quotes names in H2 are case sensitive, zgodnie z wymaganiami specyfikacji SQL. Oznacza to, że to będzie działać:

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

ale to nie będzie:

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

Unquotes names are not case sensitive in H2. Są one zwykle konwertowane na wielkie litery (tak jak w Oracle i innych bazach danych). Oznacza to, że oświadczenia

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

są takie same jak

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

W H2, że zachowuje się w taki sam sposób, jak Oracle. To trochę różni się od tego, jak inne bazy danych, takie jak MySQL i PostgreSQL, obsługują nazwy identyfikatorów. H2 ma funkcję kompatybilności: jeśli dodasz ;DATABASE_TO_UPPER=FALSE do adresu URL bazy danych, identyfikatory pustych danych nie zostaną przekonwertowane na wielkie litery, co oznacza, że ​​uwzględniają one również wielkość liter. Ale musisz to dodać podczas tworzenia bazy danych i za każdym razem, gdy ją używasz (jeśli dodasz ustawienia dla istniejących baz danych, identyfikatory istniejących obiektów są już konwertowane na wielkie).

Nawiasem mówiąc, nie ma to nic wspólnego z function UPPER, która jest przeznaczona dla danych. Twoje pytanie dotyczy identyfikatorów, a nie danych.

+0

Dziękuję za pomoc M. Mueller. – Drahakar

+0

Czy istnieje sposób na powiedzenie h2, aby traktować tabele utworzone przy użyciu nazw cytowanych, aby wielkość liter nie była rozróżniana? tj. jeśli utworzę test "create table", '' pozwoli 'select * from test' działać? –

+0

Patrząc na [sekcja kompatybilności] (http://www.h2database.com/html/features.html?highlight=IGNORECASE&search=ignorecase#compatibility) opisuje on dołączanie '; IGNORECASE = TRUE', które zrobiłem i ponownie utworzyłem tabele, jednak nadal są tworzone, ponieważ są cytowane i pozostają tak samo rozróżniane. Korzystanie z 1.4.191. –

Powiązane problemy