我有一个使用mysql数据库的应用程序,但我想在hsqldb内存数据库中运行应用程序的单元测试。问题是我的一些可持久模型对象有一些字段,我已经注释为columnDefinition =“TEXT”来强制mysql来满足长字符串值,但现在hsqldb不知道TEXT的含义。如果我将其更改为CLOB,那么hsqldb就可以了,但是mysql失败了。
是否有标准列定义可用于与mysql AND hsqldb兼容的长字符串?
答案 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)。