DB2 10.5 for Linux, UNIX, and Windows

VARCHAR2 和 NVARCHAR2 数据类型

VARCHAR2 和 NVARCHAR2 数据类型支持使用 Oracle VARCHAR2 和 NVARCHAR2 数据类型的应用程序。

启用

在创建需要 VARCHAR2 和 NVARCHAR2(后来统称为 VARCHAR2)支持的数据库之前,在数据库级别启用该支持。 要启用此支持,请将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为十六进制值 0x20(位位置 6),然后停止并重新启动该实例以使新设置生效。
db2set DB2_COMPATIBILITY_VECTOR=20
   db2stop
   db2start
要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

创建启用了 VARCHAR2 支持的数据库之后,将 varchar2_compat 数据库配置参数设置为 ON。

如果创建启用了 VARCHAR2 支持的数据库,那么无法禁用该数据库的 VARCHAR2 支持,即使重置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。同样,如果创建启用了 VARCHAR2 支持的数据库,那么以后无法启用该数据库的 VARCHAR2 支持,即使通过设置 DB2_COMPATIBILITY_VECTOR 注册表变量也是如此。

要使用 NVARCHAR2 数据类型,数据库必须是 Unicode 数据库。

作用

varchar2_compat 数据库配置参数设置为 ON 的效果如下所示。

在 SQL 语句中显式遇到 VARCHAR2 数据类型时,会将该数据类型隐式映射至 VARCHAR 数据类型。VARCHAR2 的最大长度是 32672 BYTE 或 8168 CHAR,这与 VARCHAR 的最大长度 32672 OCTETS 或 8168 CODEUNITS32 相同。同样,当 SQL 语句显式遇到了 NVARCHAR2 数据类型时,此数据类型将隐式映射至(遵循相同的规则)NVARCHAR 数据类型。

字符串文字可以具有 CHAR 或 VARCHAR 数据类型,这取决于长度和环境的字符串单位。环境(254 OCTETS 或 63 CODEUNITS32)的字符串单位中最大长度为一个 CHAR 的字符串文字具有 CHAR 数据类型。环境的字符串单位中长度大于一个 CHAR 的最大长度的字符串文字具有 VARCHAR 数据类型。

涉及可变长度字符串类型的比较操作都使用不填充比较语义,而只涉及固定长度字符串类型的比较操作将继续使用空格填充比较语义,但有两种例外情况:
  • 如果比较操作涉及目录视图中的字符串列信息,那么将始终使用具有空格填充比较语义的 IDENTITY 整理规则,而不考虑数据库整理规则。
  • 如果字符串比较操作涉及具有 FOR BIT DATA 属性的数据类型,那么将始终使用具有空格填充比较语义的 IDENTITY 整理规则。
如下所示,对结果数据类型的规则进行修改:
表 1. 有关涉及 字符串的结果数据类型的修改规则
如果一个操作数是... 而另一个操作数是... 则结果的数据类型是...
CHAR(x) CHAR(x) CHAR(x)
CHAR(x) CHAR(y) VARCHAR(z),其中 x != y 而 z = max(x,y)
GRAPHIC(x) GRAPHIC(x) GRAPHIC(x)
GRAPHIC(x) GRAPHIC(y) VARGRAPHIC(z),其中 x != y 而 z = max(x,y)
GRAPHIC(x) CHAR(y) VARGRAPHIC(z),其中 z = max(x,y)

如果 IN 谓词的 IN 立标的结果类型可以解析为定长字符串数据类型并且 IN 谓词的左操作数是变长字符串数据类型,则将 IN 列表表达式视作具有变长字符串数据类型。

通常,长度为零的字符串值(LOB 值除外)被视为 null 值。对 CHAR、NCHAR、VARCHAR 或 NVARCHAR 指定空字符串值或者将空字符串值强制类型转换为这些数据类型,都将生成 NULL 值。

对于那些将返回字符串自变量或者基于具有字符串数据类型的参数的函数来说,它们也将空字符串 CHAR、NCHAR、VARCHAR 或 NVARCHAR 值视为 NULL 值。 因此,返回字符或图形字符串的一些内置函数和强制转型的结果可能是空值,即使并非所有自变量全为空值也是如此。varchar2_compat 数据库配置参数设置为 ON 时,注意某些函数适用的特殊注意事项,如下所示:
  • CONCAT 函数和并置运算符。在并置结果中,null 值或空字符串值将被忽略。下表列示了并置结果类型。
    表 2. 并置的操作数的数据类型和长度
    操作数 组合的长度属性1 结果1
    CHAR(A) CHAR(B) <=S CHAR(A+B)
    CHAR(A) CHAR(B) >S VARCHAR(A+B)
    CHAR(A) VARCHAR(B) - VARCHAR(MIN(A+B, W))
    VARCHAR(A) VARCHAR(B) - VARCHAR(MIN(A+B, W))
    CLOB(A) CHAR(B) - CLOB(MIN(A+B, X))
    CLOB(A) VARCHAR(B) - CLOB(MIN(A+B X))
    CLOB(A) CLOB(B)   CLOB(MIN(A+B, X))
    GRAPHIC(A) GRAPHIC(B) <=T GRAPHIC(A+B)
    GRAPHIC(A) GRAPHIC(B) >T VARGRAPHIC(A+B)
    GRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC(MIN(A+B, Y))
    VARGRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC(MIN(A+B, Y))
    DBCLOB(A) CHAR(B) - DBCLOB(MIN(A+B, Z))
    DBCLOB(A) VARCHAR(B) - DBCLOB(MIN(A+B, Z))
    DBCLOB(A) DCLOB(B)   DBCLOB(MIN(A+B, Z))
    1. 请参阅下表中斜体变量的值。
    表 3. 上表中的斜体变量具有以下值
    变量 如果所有操作数的字符串单位都不是
    CHAR(或 CODEUNITS32)
    如果任一操作数的字符串单位是
    CHAR(或 CODEUNITS32
    S 254 63
    T 127 63
    W 32672 8168
    X 2G 536870911
    Y 16336 8168
    Z 1G 536870911
  • DECODE 函数如果第一个结果表达式是部分类型的空值,则假定它为 VARCHAR(0)。如果第一个结果表达式是 CHAR 或 GRAPHIC,则将它升级为 VARCHAR 或 VARGRAPHIC。
  • GREATEST 函数如果第一个表达式是 CHAR 或 GRAPHIC,则将它升级为 VARCHAR 或 VARGRAPHIC。
  • INSERT 函数。如果第四个自变量是 null 值或者空字符串,那么将致使从第一个自变量中由第二个自变量指示的字节位置开始删除由第三个自变量指示的字节数。
  • LEAST 函数如果第一个表达式是 CHAR 或 GRAPHIC,则将它升级为 VARCHAR 或 VARGRAPHIC。
  • LENGTH 函数。LENGTH 函数返回的值是字符串中的字节数。空字符串值将返回 null 值。
  • NVL 函数如果第一个表达式是 CHAR 或 GRAPHIC,则将它升级为 VARCHAR 或 VARGRAPHIC。
  • NVL2 函数如果结果表达式是部分类型的空值,则假定它为 VARCHAR(0)。如果结果表达式是 CHAR 或 GRAPHIC,则将它升级为 VARCHAR 或 VARGRAPHIC。
  • REPLACE 函数。如果所有自变量值的数据类型都是 CHAR、VARCHAR、GRAPHIC 或 VARGRAPHIC,那么:
    • 作为第二个自变量的 null 值或空字符串将被视为空字符串,其结果是,将第一个自变量作为结果返回。
    • 作为第三个自变量的 null 值或空字符串将被视为空字符串,其结果是,没有任何内容替换第二个自变量从源字符串中除去的字符串。

    如果任何自变量值的数据类型为 CLOB 或 BLOB,并且任何自变量是 null 值,那么结果为 null 值。您必须指定 REPLACE 函数的全部三个自变量。

  • SUBSTR 函数。对 SUBSTR 的引用将根据第一个自变量替换为以下函数调用:
    • SUBSTRB(当第一个自变量是字符串单位已定义为 OCTETS 的字符串时)。
    • SUBSTR2(当第一个自变量是字符串单位已定义为 CODEUNITS16 的图形字符串时)。
    • SUBSTR4(当第一个自变量是字符串单位已定义为 CODEUNITS32 的字符串或图形字符串时)。
  • TO_CHAR 函数。如果指定了两个变量,且第一个变量为字符串,那么第一个变量会强制转换为十进制浮点。 此行为适用于 V10.5 FP3 和更高版本的修订包。
  • TO_NCHAR 函数。如果指定了两个变量,且第一个变量为字符串,那么第一个变量会强制转换为十进制浮点。 此行为适用于 V10.5 FP3 和更高版本的修订包。
  • TRANSLATE 函数。源字符串表达式 是第二个自变量,目标字符串表达式 是第三个自变量。如果 目标字符串表达式源字符串表达式 短,那么将除去 源字符串表达式 中的那些能够在 字符串表达式(第一个自变量)中找到的额外字符;即,除非在第四个自变量中指定另一个填充字符,否则缺省的 填充字符 自变量实际上是空字符串。
  • TRIM 函数。如果 TRIM 函数调用中的除去字符自变量是 null 值或空字符串,那么此函数将返回 null 值。
  • VARCHAR_FORMAT 函数。如果指定了两个变量,且第一个变量为字符串,那么第一个变量会强制转换为十进制浮点。 此行为适用于 V10.5 FP3 和更高版本的修订包。

在 ALTER TABLE 语句或 CREATE TABLE 语句中,如果指定了 DEFAULT 子句,但没有为数据类型已定义为 VARCHAR 或 VARGRAPHIC 的列指定显式的值,那么缺省值是空白字符。

当数据库配置参数 varchar2_compat 设置为 ON 时,对话框视图列中的空字符串将转换为空白字符。例如:
  • 数据分区可视时,SYSCAT.DATAPARTITIONS.STATUS 包含单一空白字符。
  • 未显式设置程序包版本时,SYSCAT.PACKAGES.PKGVERSION 包含单一空白字符。
  • 未设置编译选项时,SYSCAT.ROUTINES.COMPILE_OPTIONS 包含 null 值。

如果 SQL 语句使用了参数标记,那么可能会发生将会影响到 VARCHAR2 的使用的数据类型转换。例如,如果输入值是长度为零的 VARCHAR,并且它被转换为 LOB,那么结果将是 null 值。但是,如果输入值是长度为零的 LOB,并且它被转换为 LOB,那么结果将是长度为零的 LOB。输入值的数据类型可能会受延迟准备影响。

定义数据类型时,CHAR 可以用作 CODEUNITS32 的同义词,BYTE 可以用作 OCTETS 的同义词。

限制

VARCHAR2 数据类型以及相关联的字符串处理支持具有下列限制:
  • 只有在 Unicode 数据库中,才接受 VARCHAR2 长度属性限定符 CHAR 作为 CODEUNITS32 的同义词。
  • varchar2_compat 数据库配置参数设置为 ON 时,不支持 LONG VARCHAR 和 LONG VARGRAPHIC 数据类型(但不会显式地将其禁用)。
  • 如果未指定 VARCHAR2 参数的最大长度,那么缺省值为 4000 字节。