在mysql和hsqldb中兼容的TEXT字段

时间:2011-02-15 18:37:31

标签: mysql hibernate hsqldb

我有一个使用mysql数据库的应用程序,但我想在hsqldb内存数据库中运行应用程序的单元测试。问题是我的一些可持久模型对象有一些字段,我已经注释为columnDefinition =“TEXT”来强制mysql来满足长字符串值,但现在hsqldb不知道TEXT的含义。如果我将其更改为CLOB,那么hsqldb就可以了,但是mysql失败了。

是否有标准列定义可用于与mysql AND hsqldb兼容的长字符串?

4 个答案:

答案 0 :(得分:29)

对我来说有用的是通过将连接URL更改为jdbc来启用MySQL兼容模式:hsqldb:mem:testdb; sql.syntax_mys = true

答案 1 :(得分:9)

对于PostgreSQL TEXT列和使用Hibernate的HSQLDB,您可以使用本文中提供的相同解决方案:

Hibernate postgresql/hsqldb TEXT column incompatibility problem

由于HSQLDB允许您将TEXT定义为TYPE或DOMAIN,如果您在通过Hibernate使用HSQLDB进行每次测试运行之前了解如何执行下面的语句,这可能是一个解决方案。

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#dpc_sql_conformance

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

答案 2 :(得分:1)

不是真的。 MySQL有TEXT和BLOB,各种大小的前缀表示它们的最大大小。 hsqldb似乎只有clob和各种varchars。大多数情况下,您需要根据您正在与之交谈的数据库进行特殊情况测试。

如果你的文本字符串足够短,你可以使用varchars,但是那些在mysql中仅限于64k以下,并且这是行的最大大小,因此varchar越大,其他字段的空间越小。 / p>

答案 3 :(得分:0)

您还可以在JPA供应商(休眠等)级别解决一些问题。

例如,使用 @Lob ,long / large类型是在运行时根据供应商确定的(longvarchar / longtext MySql与H2中的clob)。