【问题标题】:TEXT field that is compatible in mysql and hsqldbmysql 和 hsqldb 中兼容的 TEXT 字段
【发布时间】:2011-06-27 20:03:54
【问题描述】:

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

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

【问题讨论】:

  • 您可以使用 H2 database 代替 HSQLDB。免责声明:我是 H2 提交者之一。
  • 或者看看 testcontainers.org 在你的测试中使用你真正的数据库供应商。

标签: mysql hibernate hsqldb


【解决方案1】:

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

【讨论】:

  • MySQL 兼容模式是在 2.2 版中添加的(需要 Hibernate 3.5.6)。
  • 完美,但是如何在spring嵌入式数据库中转呢?
【解决方案2】:

对于 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

【讨论】:

    【解决方案3】:

    不是真的。 MySQL 有 TEXT 和 BLOB,有各种大小前缀来指示它们的最大大小。 hsqldb 似乎只有 clob 和各种 varchars。大多数情况下,您必须根据所访问的数据库对测试进行特殊处理。

    如果您的文本字符串足够短,您可以使用 varchars,但在 mysql 中这些限制在 64k 以下,这是一行的最大大小,因此 varchar 越大,其他字段的空间就越少。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 2018-10-15
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多