以 # 开头的行不被视为 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
会。有没有办法让H2
将SQL
脚本中的#
视为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 的注释的主要内容,如果未能解决你的问题,请参考以下文章