2

我正在开发模式下使用内存数据库中的 H2,但我希望它的行为尽可能像 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;')

有没有办法让 h2 从 play 的框架 h2-browser 中表现得像 mysql?还是只是h2的限制?

4

1 回答 1

6

您提供的链接http://www.h2database.com/html/features.html#compatibility记录了 H2 支持的确切兼容性功能。不支持未记录的内容。在这种情况下,问题似乎是字符串文字中的“反斜杠”转义:

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

反斜杠不是 ANSI SQL 的转义字符;要转义单引号,您需要使用两个单引号。问题是这可能不适用于 MySQL,因为单个反斜杠仍然是转义字符:

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

对于这个问题,一种解决方案是对 MySQL 使用 ANSI 模式,另一种解决方案是始终对 String 字面量使用绑定变量(JDBC 中的 PreparedStatement)。

于 2012-09-10T05:00:05.447 回答