播放框架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兼容模式:转义字符的主要内容,如果未能解决你的问题,请参考以下文章
播放 2 框架单元测试 - java.lang.RuntimeException: DataSource 用户为空?
H2 在 MySQL 模式下,内存 DB 对 ORDER BY 的处理方式不同