我目前正在使用mysql作为我的数据库,并使用天桥管理数据库模式。我的所有单元测试都是针对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]
编辑
我有数百个sql脚本,它们在mysql中运行良好。所以我不想改变这些脚本中的任何东西。有没有一种允许h2接受mysql脚本的方法?
发布于 2016-07-29 09:01:36
根据这描述,通过将H2数据库在连接字符串中设置为MODE=MySQL
,您可以尝试在MySQL兼容性模式下使用它。以下是关于这一问题的确切说法:
若要使用MySQL模式,请使用数据库URL
jdbc:h2:~/test;MODE=MySQL
或SQL语句SET MODE MySQL
。
NOT NULL
和NULL
,则使用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
单独设置。这会影响使用=
、LIKE
、REGEXP
进行比较。
发布于 2016-07-29 11:59:11
从你的例子可以看出你的问题。
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语句,您可能会看到很多这样的问题。
https://stackoverflow.com/questions/38649370
复制相似问题