【问题标题】:Liquibase VARCHAR2 length in charsLiquibase VARCHAR2 字符长度
【发布时间】:2015-02-03 16:41:39
【问题描述】:

我想独立定义一个 VARCHAR2 列数据库,其大小在 chars 中定义。我需要至少支持 Oracle 和 PostgreSQL。我使用UTF8编码,所以没有机会使用字节定义。

我需要在 Oracle 中使用 VARCHAR2(255 CHAR) 定义,但 CHAR 修饰符在其他 dbms(如 PG)下无效。如果不向脚本添加 CHAR 修饰符,生成的 Oracle 定义使用字节作为长度:VARCHAR2(255)。

正确的定义是什么?

【问题讨论】:

  • Oracle 中的“正确”定义是使用 CHAR 修饰符,而在其他 DBMS 中使用这些 DMBS 中有效的任何内容。 (编写一些在所有 DBMS 中都有效的代码对您来说非常困难,并且不会在任何 DBMS 上很好地扩展。)但是如果您绝对必须这样做,那么您可能会查看会话级别参数NLS_LENGTH_SEMANTICS (docs.oracle.com/database/121/REFRN/refrn10124.htm#REFRN10124)。如果在执行CREATE TABLE 的会话中将其设置为CHAR,那么它将是该会话的默认设置。
  • 我们同意,我们必须在 Oracle 中使用 CHAR。问题是我如何在 liquibase xml 中以最少冗余和独立于数据库的方式定义它。
  • 啊,好的。我认为“独立于数据库”意味着您希望使用一种在 Oracle 和 Liquibase 中都有效的语法,在这种情况下,您可能不得不通过设置会话参数在 Oracle 中“作弊”,以便 VARCHAR2(255) 会默认自动为VARCHAR2(255 CHAR)。但如果问题真的更多是关于 Liquibase 语法,我会闭嘴 - 我对 Liquibase 一无所知,抱歉 ;-)

标签: database oracle rdbms database-migration liquibase


【解决方案1】:

在 liquibase 中没有内置方法可以将数据类型定义为“varchar 255,char 类型”并在 postgresql 上输出 VARCHAR(255),在 oracle 上输出 VARCHAR2(255 CHAR)。

Liquibase 设计为可扩展的 (liquibase.org/extensions),您应该能够覆盖更改日志中的字符串“VARCHAR(255)”如何转换为特定于数据库的类型,但需要一些 Java 编码。

或者,更改日志参数将允许您根据数据库动态地将 CHAR 添加到定义中。如果您将<property name="varcharUnit" value="CHAR" dbms="oracle"/> 添加到变更日志的顶部,那么您可以在变更日志文件中的任何位置使用type="VARCHAR(255 ${varcharUnit})",它将在oracle 和其他任何地方评估为“VARCHAR(255 CHAR)”和 VARCHAR(255)。与扩展方法相比,它更冗长,您需要记住始终添加变量,但它更直接。

【讨论】:

  • 确保有 两个 property 定义——一个用于 Oracle,另一个用于所有其他数据库。先列出 Oracle 一个。第二个应该看起来和第一个一样,但没有任何价值。
【解决方案2】:

这要归功于 Nathan 的灵感;我只是添加一些清晰度。

<property name="char" value="CHAR" dbms="oracle"/>
<property name="char" value=""/>
<changeSet … >
    <createTable tableName="User">
        <column
            name="guid"
            type="VARCHAR(32)"
        />
        <column
            name="name"
            type="VARCHAR(50 ${char})"
        />
        ⋮

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2019-06-24
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多