Текстовое поле, совместимое в mysql и hsqldb

У меня есть приложение, которое использует базу данных mysql, но я хотел бы запустить модульные тесты для приложения в базе данных hsqldb в памяти. Проблема в том, что некоторые из моих постоянных объектов модели имеют поля, которые я аннотировал как columnDefinition = "TEXT", чтобы заставить mysql обслуживать длинные строковые значения, но теперь hsqldb не знает, что означает TEXT. Если я изменю его на CLOB, то hsqldb в порядке, но mysql завершается ошибкой.

Есть ли стандартное определение столбца, которое я могу использовать для длинных строк, которое совместимо с mysql И hsqldb?

4 ответа

Решение

Для меня было достаточно включить режим совместимости с MySQL, изменив URL-адрес соединения на jdbc:hsqldb:mem:testdb;sql.syntax_mys=true

Вы можете использовать то же решение, что и в этом посте, для столбцов PostgreSQL TEXT и HSQLDB с Hibernate:

Hibernate postgresql / hsqldb TEXT проблема несовместимости столбцов

Поскольку HSQLDB позволяет вам определять TEXT как TYPE или DOMAIN, это может быть решением, если вы узнаете, как выполнить оператор, такой как приведенный ниже, перед каждым запуском теста с HSQLDB через Hibernate.

CREATE TYPE TEXT AS VARCHAR(1000000)

Обновление для HSQLDB 2.1 и более поздних версий: эта версия поддерживает режим совместимости с MySQL. В этом режиме тип MySQL TEXT поддерживается и переводится в LONGVARCHAR. LONGVARCHAR по умолчанию является длинным VARCHAR, но свойство (sql.longvar_is_lob) позволяет интерпретировать его как CLOB. Увидеть:

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

http://hsqldb.org/doc/2.0/guide/compatibility-chapt.html

Вы также можете решить некоторые проблемы на уровне JPA-вендора (Hibernate и т. Д.).

Например, для @Lob тип long/large определяется во время выполнения в зависимости от поставщика (longvarchar/longtext MySql против clob в H2).

На самом деле, нет. В MySQL есть TEXT и BLOB с префиксами различного размера, указывающими их максимальный размер. hsqldb имеет только clob и различные varchars. Скорее всего, вам понадобятся специальные тесты в зависимости от того, с какой базой данных вы разговариваете.

Если ваши текстовые строки достаточно короткие, вы можете использовать varchars, но в mysql их размер не должен превышать 64 КБ, и это максимальный размер строки, поэтому чем больше varchar, тем меньше места для других полей.

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