【问题标题】:how to make mysql database schema to be compatible with h2 database如何使mysql数据库模式与h2数据库兼容
【发布时间】:2016-12-03 14:43:15
【问题描述】:

我目前使用 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脚本?

【问题讨论】:

  • 替换或删除 ` ;或者试试topnew.net/sidu点击表desc,然后复制过去create table SQL,不需要的时候不要```
  • 我已尝试删除所有 ` 但出现“SQL 中的语法错误”错误。我有一百多个sql脚本,我真的不想一一更改。所有这些 sql 在 mysql 中运行良好。所以我徘徊是否有办法配置 h2 db 来接受这些语法。

标签: mysql database h2 flyway


【解决方案1】:

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

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

  • 插入数据时,如果将列定义为NOT NULL 并插入NULL,则使用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。这会影响使用=LIKEREGEXP 进行比较。

【讨论】:

  • 在描述中看起来很棒。根据我的经验,不返工是行不通的
  • 这部分工作。如果你有“简单”的 .sql 文件,一切都会好起来的。如果你有更复杂的语句 if 不能正常工作。
【解决方案2】:

您的问题可以通过您的示例看到

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 语句,您可能会看到很多此类问题。

【讨论】:

    猜你喜欢
    • 2017-05-13
    • 2017-05-23
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多