Как сделать схему базы данных 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 или оператор 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,

Ваш вопрос можно увидеть на вашем примере

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, вы, вероятно, увидите много таких проблем.

Другие вопросы по тегам