如何使mysql数据库模式与h2数据库兼容

时间:2016-07-29 01:59:20

标签: mysql database h2 flyway

我目前正在使用mysql作为我的数据库,并使用flyway来管理数据库架构。我的所有单元测试都是针对mysql运行的,并且在添加更多单元测试时运行速度非常慢。现在我想在单元测试中将数据库从mysql更改为h2内存数据库。以下是我对h2 db连接的设置:

#Datasource
spring.datasource.url=jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=true
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.default-transaction-isolation-level=1

当我运行flywayMigrate时,我遇到了一些sql错误。下面是一个例子,这个sql用于在mysql上创建一个表,但无法在h2上运行。

CREATE TABLE `file_storage` (
  `id` BIGINT(64) NOT NULL AUTO_INCREMENT,
  `file_name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
DEFAULT CHARACTER SET = utf8;

下面是我从h2得到的错误。我不知道我的SQL有什么问题。有没有办法让h2接受mysql数据库架构?

Execution failed for task ':dbschema:flywayMigrate'.
> Error occurred while executing flywayMigrate

  Migration V2016_02_26_12_59__create_file_storage.sql failed
  -----------------------------------------------------------
  SQL State  : 42000
  Error Code : 42000
  Message    : Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
    ""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT,
    ""FILE_NAME"" VARCHAR(45) NULL,
    PRIMARY KEY (""ID""))
  DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement:
  CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT,
    `file_name` VARCHAR(45) NULL,
    PRIMARY KEY (`id`))
  DEFAULT CHARACTER SET = utf8 [42000-190]
  Location   : db/migration/V2016_02_26_12_59__create_file_storage.sql (/Users/yzzhao/dev/cooltoo/cooltoo_backend/dbschema/build/resources/main/db/migration/V2016_02_26_12_59__create_file_storage.sql)
  Line       : 1
  Statement  : CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT,
    `file_name` VARCHAR(45) NULL,
    PRIMARY KEY (`id`))
  DEFAULT CHARACTER SET = utf8

  Syntax error in SQL statement "CREATE TABLE ""FILE_STORAGE"" (
    ""ID"" BIGINT(64) NOT NULL AUTO_INCREMENT,
    ""FILE_NAME"" VARCHAR(45) NULL,
    PRIMARY KEY (""ID""))
  DEFAULT CHARACTER[*] SET = UTF8 "; SQL statement:
  CREATE TABLE `file_storage` (
    `id` BIGINT(64) NOT NULL AUTO_INCREMENT,
    `file_name` VARCHAR(45) NULL,
    PRIMARY KEY (`id`))
  DEFAULT CHARACTER SET = utf8 [42000-190]

修改

我有数百个在mysql中运行良好的sql脚本。所以我不想改变这些脚本中的任何内容。有没有办法让h2接受mysql脚本?

2 个答案:

答案 0 :(得分:1)

根据this描述,您可以尝试在MySQL兼容模式下使用H2数据库,方法是在连接字符串中将其设置为MODE=MySQL。以下是关于它的内容:

  

要使用MySQL模式,请使用数据库URL jdbc:h2:~/test;MODE=MySQL或SQL语句SET MODE MySQL

     
      
  • 插入数据时,如果列被定义为NOT NULL且插入了NULL,则使用0(或空字符串,或时间戳列的当前时间戳)值。通常,不允许此操作并抛出异常。

  •   
  • 允许使用CREATE TABLEINDEX(..)KEY(..)语句中创建索引。示例:create table test(id int primary key, name varchar(255), key idx_name(name));

  •   
  • 元数据调用以小写形式返回标识符。

  •   
  • 将浮点数转换为整数时,小数位不会被截断,但值会四舍五入。

  •   
  • NULL与其他值连接会产生另一个值。

  •   
     

默认情况下,MySQL中的文本比较不区分大小写,而在H2中,它区分大小写(与大多数其他数据库一样)。 H2确实支持不区分大小写的文本比较,但需要使用SET IGNORECASE TRUE单独设置。这会影响使用=LIKEREGEXP的比较。

答案 1 :(得分:1)

您的问题可以通过示例

看到
CREATE TABLE `file_storage`
(
   'id` BIGINT(64) NOT NULL AUTO_INCREMENT, 
   `file_name` VARCHAR(45) NULL, 
   PRIMARY KEY (`id`)
)
DEFAULT CHARACTER SET = utf8;

最后一行“DEFAULT CHARACTER SET = utf8”正在设置mySQL表选项。 H2在表或模式级别没有这样的选项,因为它始终使用Unicode进行操作。

如果你有很多针对MySQL编写的SQL DDL语句,你很可能会发现很多这样的问题。