H2数据库2.0.202版本MySQL模式下如何避免SQL语句使用反引号
问题原因
H2 2.0+版本新增了大量SQL标准保留关键字,你用到的name、value都属于新增的保留关键字,即使开启MySQL兼容模式,H2默认也会将识别到的保留关键字当做语法标识符处理,因此直接作为字段名使用会触发语法错误。
可用解决方案
不需要修改原有SQL语句,仅调整JDBC连接参数即可解决问题:
方案1:添加NON_KEYWORDS参数排除冲突关键字
这是影响范围最小、最推荐的方案,你只需要在连接串中添加NON_KEYWORDS配置,将所有和业务字段名冲突的保留关键字列进去即可,多个关键字用英文逗号分隔。
修改后的JDBC连接串如下:
"jdbc:h2:mem:database;TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=0;DATABASE_TO_UPPER=false;MODE=MySQL;NON_KEYWORDS=NAME,VALUE";
注意:NON_KEYWORDS后面的关键字需统一使用大写,即使你开启了DATABASE_TO_UPPER=false配置也不影响生效
方案2:使用H2的MySQL兼容扩展参数
如果你使用的H2版本≥2.1.210,还可以在连接串中添加DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH配置,和原有的MODE=MySQL搭配后可以最大程度对齐MySQL的标识符处理规则,MySQL本身允许非保留关键字直接作为字段名使用,这套配置可以覆盖绝大多数关键字冲突场景,不需要单独逐个指定排除的关键字。
修改后的JDBC连接串如下:
"jdbc:h2:mem:database;TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=0;DATABASE_TO_UPPER=false;MODE=MySQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH";
内容的提问来源于stack exchange,提问作者Sviatlana
相关产品推荐
相关产品推荐

