首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使mysql数据库模式与h2数据库兼容

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

Stack Overflow用户
提问于 2016-07-29 01:59:19
回答 2查看 7.9K关注 0票数 7

我目前正在使用mysql作为我的数据库,并使用天桥管理数据库模式。我的所有单元测试都是针对mysql运行的,随着添加更多的单元测试,它们运行得非常慢。现在,我想在单元测试中将数据库从mysql更改为h2内存数据库。下面是我对h2 db连接的设置:

代码语言:javascript
运行
复制
#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上运行。

代码语言:javascript
运行
复制
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数据库模式的方法?

代码语言:javascript
运行
复制
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脚本的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-29 09:01:36

根据描述,通过将H2数据库在连接字符串中设置为MODE=MySQL,您可以尝试在MySQL兼容性模式下使用它。以下是关于这一问题的确切说法:

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

  • 当插入数据时,如果将列定义为NOT NULLNULL,则使用0(或空字符串,或时间戳列的当前时间戳)值。通常,不允许进行此操作,并引发异常。
  • 允许在CREATE TABLE语句中使用INDEX(..)KEY(..)创建索引。示例:create table test(id int primary key, name varchar(255), key idx_name(name));
  • 元数据调用小写的返回标识符。
  • 将浮点数转换为整数时,小数位数不会被截断,但值是四舍五入的。
  • NULL与另一个值相连接会产生另一个值。

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

票数 4
EN

Stack Overflow用户

发布于 2016-07-29 11:59:11

从你的例子可以看出你的问题。

代码语言:javascript
运行
复制
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语句,您可能会看到很多这样的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38649370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档