2016-07-29 822 views
3

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

#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] 

编辑

我有上百个SQL脚本这是在mysql中运行良好。所以我不想在这些脚本中改变任何东西。有没有办法让h2接受mysql脚本?

+0

替换或删除';或尝试http://topnew.net/sidu单击表desc,然后复制过去创建表SQL,不需要'当不需要时 – SIDU

+0

我试图删除所有'但SQL'中的'语法错误'错误。我有超过一百个sql脚本,我不想一个接一个地改变它们。所有这些sql在mysql中工作良好。所以我徘徊是否有办法配置h2 db来接受这些语法。 –

回答

1

根据this说明,您可以尝试在MySQL兼容模式下使用H2数据库,方法是在连接字符串中将其设置为MODE=MySQL。这里到底是什么说一下吧:

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

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

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

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

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

  • 用另一个值连接NULL会产生另一个值。

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

+0

在描述中它看起来不错。根据我的经验,如果没有重新工作,这是行不通的 –

1

您的问题可以用你的榜样

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

最后一行的“默认字符集= UTF8”树立了一个MySQL表选项中可以看出。H2在表或模式级别没有这样的选项,因为它始终使用Unicode进行操作。

如果你有很多年来为MySQL编写的SQL DDL语句,你很可能会看到很多这样的问题。