使H2处理引用的名称和不带引号的名称相同

时间:2012-05-28 20:15:34

标签: sql database h2 double-quotes

H2似乎在带引号的名称与没有引号的名称之间产生差异。有没有办法让它以同样的方式对待它们?

以下是我所做的测试:

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

以下是查询:

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

如何使这些查询与H2一起使用?

1 个答案:

答案 0 :(得分:32)

Quotes names in H2 are case sensitive,根据SQL规范的要求。这意味着这将有效:

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

但这不会:

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

Unquotes names are not case sensitive in H2。它们通常转换为大写(如在Oracle和其他数据库中)。这意味着陈述

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

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

因为H2的行为方式与Oracle相同。这与MySQL和PostgreSQL等其他数据库如何处理标识符名称略有不同。 H2具有兼容性功能:如果将;DATABASE_TO_UPPER=FALSE附加到数据库URL,则取消引用标识符不会转换为大写,这意味着它们也区分大小写。但是在创建数据库时需要附加它,并且每次使用它时(如果附加现有数据库的设置,现有对象的标识符已经转换为大写)。

顺便说一下,这与用于数据的function UPPER无关。您的问题是关于标识符,而不是数据。