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

Dra*_*kar 19 sql database h2 double-quotes

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

这是我做过的测试:

CREATE TABLE test (dummy INT);
CREATE TABLE "testquote" (dummy INT, "quotedDummy" INT);
Run Code Online (Sandbox Code Playgroud)

以下是查询:

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
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来使这些查询与H2一起使用?

Tho*_*ler 33

根据SQL规范的要求,H2中的引号名称区分大小写.这意味着这将有效:

CREATE TABLE "testquote" (dummy INT, "quotedDummy" INT); 
SELECT * FROM "testquote";
Run Code Online (Sandbox Code Playgroud)

但这不会:

SELECT * FROM "TestQuote";
SELECT * FROM "TESTQuote";
SELECT * FROM "TESTQUOTE";
Run Code Online (Sandbox Code Playgroud)

取消引用名称在H2中不区分大小写.它们通常转换为大写(如在Oracle和其他数据库中).这意味着陈述

CREATE TABLE test (dummy INT);
SELECT * FROM test;
Run Code Online (Sandbox Code Playgroud)

是一样的

CREATE TABLE "TEST" ("DUMMY" INT);
SELECT * FROM "TEST";
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,这与UPPER功能无关,UPPER是用于数据的.您的问题是关于标识符,而不是数据.