23

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で機能させるにはどうすればよいですか?

4

2 に答える 2

38

SQL仕様で要求されているように、H2の引用符の名前では大文字と小文字が区別されます。これは、これが機能することを意味します。

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

しかし、これはしません:

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

H2では、引用符で囲まれていない名前では大文字と小文字が区別されません。これらは通常、大文字に変換されます(Oracleや他のデータベースの場合と同様)。それはステートメントを意味します

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

と同じです

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

その点で、H2はOracleと同じように動作します。これは、MySQLやPostgreSQLなどの他のデータベースが識別子名を処理する方法とは少し異なります。H2には互換性機能があります。データベースのURLに追加する場合;DATABASE_TO_UPPER=FALSE、引用符で囲まれていない識別子は大文字に変換されません。つまり、大文字と小文字が区別されます。ただし、データベースを作成するときにこれを追加する必要があり、使用するたびに(既存のデータベースの設定を追加すると、既存のオブジェクトの識別子はすでに大文字に変換されています)。

ちなみに、これはデータ用のUPPER関数とは関係ありません。あなたの質問は、データではなく識別子に関するものです。

于 2012-05-29T05:10:21.070 に答える
0

HibernateとH2で奇妙な問題が発生していました。@Tableアノテーションでカタログ名とスキーマ名を指定すると、生成されたSQLが引用符で囲まれたテーブル名に間違った大文字と小文字を使用して失敗していました。これはおそらく欠陥ですが、ここで共有している回避策を見つけました。

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;

public class H2IdentifierNamingStrategy extends PhysicalNamingStrategyStandardImpl {
    private static final long serialVersionUID = 1L;

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        if(name==null) return null;
        else return new Identifier(name.getText().toLowerCase(), name.isQuoted());
    }
}
于 2022-02-06T19:27:26.690 に答える