2

H2 in memory データベースを使用して開発モードで作業していますが、可能な限り mysql データベースのように動作させたいと考えています ( http://www.h2database.com/html/features.html#compatibilityを参照) 。

これは、application.conf ファイルでの私の構成です。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play;MODE=MYSQL;DB_CLOSE_DELAY=-1"

それをテストするには、「play」を実行し、play のコンソールから「h2-browser」を発行し、URL jdbc フィールドに「jdbc:h2:mem:play;MODE=MYSQL;DB_CLOSE_DELAY=-1」と入力します。

次のステートメントは mysql で正常に機能します。

CREATE TABLE `tmp` (
  `name` varchar(50) NOT NULL
);
insert into tmp (name) values ('slash: \\, simple quotes \', double quotes \" -');
select * from tmp;

しかし、h2コンソールではエラーが発生し、エスケープできる唯一の文字は単一引用符であり、その前に別の一重引用符を付けるだけです。(「SET MODE MySQL;」も入力してみました)

play のフレームワーク h2-browser の mysql のように h2 を動作させる方法はありますか? それともh2の制限ですか?

4

1 に答える 1

6

あなたが提供したリンクhttp://www.h2database.com/html/features.html#compatibilityは、H2がサポートする正確な互換性機能を文書化しています。文書化されていないものはサポートされていません。この場合、問題は文字列リテラル内でエスケープする「バックスラッシュ」にあるようです:

'slash: \\, simple quotes \', double quotes \" -'

バックスラッシュは ANSI SQL のエスケープ文字ではありません。一重引用符をエスケープするには、2 つの一重引用符を使用する必要があります。問題は、単一のバックスラッシュがまだエスケープ文字であるため、MySQL ではこれが機能しない可能性があることです。

'slash: \, simple quotes '', double quotes " -'

この問題の解決策は、MySQLに ANSI モードを使用することです。別の解決策は、常に文字列リテラル (JDBC 内の PreparedStatement) にバインド変数を使用することです。

于 2012-09-10T05:00:05.447 に答える