回答

收藏

使H2引用的名称和未引用的名称相同

技术问答 技术问答 289 人阅读 | 0 人回复 | 2023-09-14

H2似乎在带引号的名称和不带引号的名称之间有所不同。有没有办法让他们以相同的方式对待他们?/ Q2 N* d7 o$ h. Z$ e
这是我已经完成的测试:
  r: N& E: Y. G8 q: CCREATE TABLE test (dummy INT);) m  L( V: c) i3 z
CREATE TABLE "testquote" (dummy INT, "quotedDummy" INT);
! ]% O8 E" g) ?$ R6 @8 H( B这是查询:. p7 R3 h7 ~3 h( I3 d6 J$ k
SELECT * FROM test; --work
6 ^2 x; c, X- l0 F$ K% {SELECT * FROM "test"; -- doesn't work
1 O7 G4 g) i; n& t9 WSELECT * FROM "testquote"; --work7 d8 c0 O* Y1 X$ V: j; U
SELECT * FROM testquote; --doesn't work
" [3 k" {/ H) USELECT dummy FROM "testquote"; --work; p7 g. k. Z% P" d8 O1 S
SELECT quotedDummy FROM "testquote"; --doesn't work
# s: J5 {" y$ N8 LSELECT "quotedDummy" FROM "testquote"; --work% [6 l+ V6 {$ B+ o' n6 J
我该怎么做才能使这些查询与H2一起使用?
7 m3 R, b4 f3 k+ A- K                & l2 S! b  Z) ]
解决方案:7 o  p5 t4 ]  i9 U1 G- S5 A# _1 a, U
                9 L' k" k/ c0 O* J8 B3 R% Q

1 ]5 u2 X" y7 T# r& P
9 `  M+ u; i3 @4 p# I% G                根据SQL规范的要求,H2中的引号名称区分大小写。这意味着它将起作用:
. z# ~0 K" G( g$ J& R5 [8 ^8 c* ~1 XCREATE TABLE "testquote" (dummy INT, "quotedDummy" INT); : x6 |6 b4 c1 `4 ~( ~! L" U
SELECT * FROM "testquote";- v$ c; q: m. y" o
但这不会:
; I* A4 B7 o; a' `SELECT * FROM "TestQuote";5 _& W/ W7 a$ B
SELECT * FROM "TESTQuote";
# J( l2 n2 s; ~. PSELECT * FROM "TESTQUOTE";1 |8 R7 S# }9 \$ k, i2 r9 Y
在H2中,不带引号的名称不区分大小写。它们通常会转换为大写字母(例如在Oracle和其他数据库中)。这意味着声明
* r- x" n! w( p$ m) HCREATE TABLE test (dummy INT);8 D4 g" G7 D4 ^- c4 w4 m  Q
SELECT * FROM test;
! N( Z# k; {/ }# k9 p与…相同  w5 t) @$ {7 f8 H
CREATE TABLE "TEST" ("DUMMY" INT);, C! U: G- b9 ?  t9 H, a) R
SELECT * FROM "TEST";
; l* \! s0 D6 v6 E( W- d因此,H2的行为与Oracle相同。这与其他数据库(例如MySQL和PostgreSQL)如何处理标识符名称有所不同。H2具有兼容性功能:如果附加;DATABASE_TO_UPPER=FALSE到数据库URL,则取消引号标识符不会转换为大写,这意味着它们也区分大小写。但是在创建数据库时以及每次使用数据库时都需要附加此内容(如果附加现有数据库的设置,则现有对象的标识符已转换为大写)。
. d) b0 e+ m0 i  C# t1 p顺便说一下,这与用于数据的功能UPPER无关。您的问题是关于标识符,而不是数据。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则