播放框架2:内存数据库中的h2 mysql兼容模式:转义字符

Posted

技术标签:

【中文标题】播放框架2:内存数据库中的h2 mysql兼容模式:转义字符【英文标题】:play framework 2: h2 in memory database mysql compatibility mode: escaping characters 【发布时间】:2012-09-10 03:17:59 【问题描述】:

我正在开发模式下使用内存数据库中的 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的限制?

【问题讨论】:

似乎只在mysql和h2上都使用双单引号... ANSI SQL 标准定义了一个字符串中需要使用两个单引号,所以' ... \' ... '不正确,需要使用' ... '' ... '。这是记录在案的。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于播放框架2:内存数据库中的h2 mysql兼容模式:转义字符的主要内容,如果未能解决你的问题,请参考以下文章

Mysql兼容的内存数据库中的查询错误(h2)

播放 2 框架单元测试 - java.lang.RuntimeException: DataSource 用户为空?

H2 在 MySQL 模式下,内存 DB 对 ORDER BY 的处理方式不同

Spring boot jpa H2兼容模式MYSQL不起作用

内省 H2 内存数据库

H2 功能特点