以 # 开头的行不被视为 H2 中 MySQL 的注释

Posted

技术标签:

【中文标题】以 # 开头的行不被视为 H2 中 MySQL 的注释【英文标题】:Line starting with # is not treated as a comment for MySQL in H2 【发布时间】:2020-04-29 18:18:06 【问题描述】:

我将flyway 与我的SpringBoot 应用程序一起使用。数据库是mysql。 flyway脚本中的cmets以#开头。

当我尝试编写 H2 测试时,它无法加载 ApplicationContext 并出现错误。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: 
Migration V0_0_1__init.sql failed
-------------------------------------------------
SQL State  : 42000
Error Code : 42000
Message    : Syntax error in SQL statement "[*]# types
INSERT INTO `users`.`TYPES` (NAME) VALUES (""Bob"") "; SQL statement:
# Types
INSERT INTO `users`.`types` (name) VALUES ("Bob") [42000-199]
Location   : db/migration/V0_0_1__init.sql (/myapp/target/classes/db/migration/V0_0_1__init.sql)
Line       : 1
Statement  : # Types
INSERT INTO `users`.`types` (name) VALUES ("Bob")

据我所知,H2 不会将以 # 开头的行视为 cmets,但 MySQL 会。有没有办法让H2SQL 脚本中的# 视为cmets?

我什至在我的application-test.properties 中将模式设置为MySQL,并使用h2-test 配置文件进行测试。

spring.datasource.url=jdbc:h2:myapp;MODE=MySQL;INIT=CREATE SCHEMA IF NOT EXISTS myapp;

【问题讨论】:

H2 仅支持标准的--/* */ cmets 以及非标准的// cmets,并且没有针对它们的配置设置。 MySQL 支持两种类型的标准 cmets 和非标准的# cmets。您应该只使用标准 cmets 来避免此类问题。当使用标准 SQL 可以轻松实现相同的目标时,不要使用供应商特定的功能,尤其是当您使用多个数据库系统时。 【参考方案1】:

正如 Evgenij Ryazanov 所说,H2 仅支持以下形式的 cmets:

-- anything
// anything
/* anything */

查看H2 documentation了解详情。

然后您应该坚持standard SQL92 注释,即--,并相应地修改您的 SQL 初始化脚本。

【讨论】:

以上是关于以 # 开头的行不被视为 H2 中 MySQL 的注释的主要内容,如果未能解决你的问题,请参考以下文章

sort uniq cut sed wc指令入门以及练习

MYSQL - 仅当 LEFT JOIN 中的行不存在时才选择

linux怎样用grep过滤

匹配 h2/postgres 中的文字百分比?

为啥“解释”返回的行不等于count()?

为啥“解释”返回的行不等于count()?