Как сделать схему базы данных MySQL совместимой с базой данных H2
В настоящее время я использую 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]
РЕДАКТИРОВАТЬ
У меня есть сотни сценариев SQL, который работает нормально в MySQL. Поэтому я не хочу ничего менять в этих скриптах. Есть ли способ разрешить h2 принимает сценарий mysql?
2 ответа
Согласно этому описанию, вы можете попытаться использовать базу данных H2 в режиме совместимости с MySQL, установив ее в строке подключения как MODE=MySQL
, Вот что именно сказано об этом:
Чтобы использовать режим MySQL, используйте URL базы данных
jdbc:h2:~/test;MODE=MySQL
или оператор SQLSET 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
,
Ваш вопрос можно увидеть на вашем примере
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 всегда.
Если у вас есть много операторов SQL DDL, которые были написаны на протяжении многих лет для MySQL, вы, вероятно, увидите много таких проблем.