字符串

字符串是由字节组成的序列。 字符串的长度是序列中的字节数。 如果长度为零,则该值称为空字符串。 空字符串不应与空值混淆。

字符串的默认CCSID

字段MIXED DATA(在安装面板DSNTIPF上)的值决定字符串的默认CCSID。

下表显示了混合数据(在安装面板DSNTIPF上)字段如何确定字符串的默认CCSID。
表 1. 字符串的默认CCSID
编码方案 混合数据字段的值 缺省属性
ASCII或EBCDIC 字符:SBCS

安装面板上的ASCII CCSID或EBCDIC CCSID字段值决定SBCS数据的系统CCSID。

ASCII或EBCDIC YES 性格:混合型

安装面板DSNTIPF上的ASCII CCSID或EBCDIC CCSID字段值决定了SBCS数据、MIXED数据和图形数据的系统CCSID。

Unicode 不适用 性格:混合型

CCSID包括:

  • 367为SBCS数据
  • 1208 用于混合数据
  • 1200用于图形数据

混合数据字段不适用于EBCDIC表中的Unicode列。 这些列遵循与上表中的Unicode编码方案相同的规则。 更多信息,请参阅 EBCDIC表中的Unicode列

固定长度的字符串

当定义了固定长度的字符串、不同类型、列和变量时,长度属性被指定,并且所有值具有相同的长度。 对于定长字符串, 长度属性必须在 1-255 范围内 (包括 1-255)。

长度不同的字符串

长度不同的字符串类型包括VARCHAR和字符大对象(CLOB)。 CLOB是一种LOB。 CLOB列可用于存储大量字符数据,例如使用单一字符集编写的文档。

当定义了不同长度的字符串、不同类型、列和变量时,会指定最大长度,该长度将成为长度属性,但以CNUL结尾的字符串除外。 实际数值可能更小。 对于长度不同的字符串,长度指定字节数。

对于VARCHAR字符串, 长度属性必须在1-32704之间。 对于VARCHAR列,长度属性的最大值由与表关联的记录大小决定,如CREATE TABLE语句描述中的最大记录大小所述。 对于CLOB字符串, 长度属性必须在1-2147483647(含)的范围内。 有关CLOB的更多信息,请参阅大型对象(LOB )。

字符串变量

  • 除REXX和Java™外,所有语言均可使用固定长度的字符串变量。在C语言中,CHAR字符串变量的长度限制为1。
  • 除以下例外情况外,所有主机语言均可使用长度可变的字符串变量:
    • Fortran :不能使用长度不等的非LOB字符串。
    • 汇编语言、C语言和 COBOL :如嵌入式SQL编程中各语言章节所述,对长度可变的非大对象字符串进行模拟。 在C语言中,也可以使用以NUL结尾的字符串。
    • REXX:不能使用CLOB和DBCLOB。

字符串编码方案

在混合字符串中表示DBCS和MBCS字符的方法因编码方案而异。

每个字符串进一步定义为以下子类型之一:
BIT DATA
与编码字符集无关的数据,因此不会被转换。 位数据的CCSID为 X'FFFF' (65535)。 字节不代表字符。

位数据是字符数据的一种形式。 对于位数据赋值,垫字符为空;对于二进制数据赋值,垫字符为 X'00'。 建议使用二进制数据代替位数据的字符。

如果谓词中的两个操作数都是EBCDIC,则两个操作数都用 X'40' 填充。 否则,两个操作数都将被填充为 X'20'。 例如,如果两个操作数都是ASCII码,或者一个操作数是ASCII码,另一个是EBCDIC码,则两个操作数都用 X'20' 填充。

SBCS 数据
其中每个字符用单字节表示的数据。 每个SBCS字符串都有一个关联的CCSID。 如有必要,在将 SBCS 字符串用于具有不同 CCSID 的字符串操作之前,会对其进行转换。
混合数据
数据可以包含单字节字符集(SBCS)和多字节字符集(MBCS)的混合字符。 每个混合字符串都有一个关联的CCSID。 如有必要,在处理具有不同CCSID的字符串之前,会先转换混合字符串。 如果混合数据字符串包含MBCS字符,则无法转换为SBCS数据。

EBCDIC混合数据可能包含非MBCS数据的换码字符。

当编码方案为Unicode或 Db2 安装被定义为支持混合数据时, Db2 在执行字符敏感操作时,可以识别混合数据字符串中的MBCS序列。 这些操作包括解析、字符转换以及由LIKE谓词指定的模式匹配。

CLOB数据类型的字符串只能是SBCS或MIXED。 BLOB 应该用于二进制字符串。

在混合字符串中表示DBCS和MBCS字符的方法因编码方案而异。

  • ASCII为SBCS字符保留了一组代码点,为DBCS字符的前半部分保留了一组代码点。 当遇到DBCS字符的前半部分时,系统会读取下一个字节,以获得完整的字符。
  • EBCDIC使用两个特殊代码点:
    • 换码字符( X'0E' )用于引入一串双字节字符集字符。
    • 换码字符( X'0F' )来结束DBCS字符串。
    混合数据字符串中的双字节字符集(DBCS)序列从左到右读取时会被识别。 在任何时候,字符串的读取都是SBCS模式或DBCS模式。 在SBCS模式下(初始模式),除换行外的任何字节都被解释为SBCS字符。 当读出换档指令时,模式切换为DBCS模式。 在双字节字符集(DBCS)模式下,下一个字节以及该字节之后的每个第二字节都被解释为双字节字符的第一个字节,除非它是一个转换字符。 如果字节是移位输出,则会发生错误。 如果字节是移入,则模式将返回到SBCS模式。 如果在处理字符串的最后一个字节后,模式仍然是DBCS模式,则会发生错误。 由于转换字符,EBCDIC混合数据比ASCII混合数据需要更多的存储空间。
  • UTF-8 是字节序列的一种长度可变的编码。 高位表示字节所属的序列部分。 第一个字节表示字节序列中后续字节的个数。

字符编码方案的示例

相同的混合日期字符串可以用不同的编码方案表示为字符和十六进制数据。

对于相同的混合数据字符串,下表显示了不同编码方案中字符串的字符和十六进制表示形式。 在EBCDIC中,需要使用移位字符来描述双字节字符。
表 2. 不同编码方案中的字符串示例
数据类型和编码方案 字符表示 十六进制表示法(用空格分隔每个字符)
9个ASCII字节
开始图描述。 一个字符串由一个汉字、拉丁文小写字母gen、另一个汉字和拉丁文小写字母ki组成。 结束图描述。
8CB3 67 65 69 6E 8B43 6B
EBCDIC 13字节
开始图描述。 字符串是移出、一个汉字、移入、字符 g e n、移出、一个汉字、移入和字符 k i。 结束图描述。
0E 4695 87 85 95 92 89 0F 0E 45B9 0F
Unicode 11字节 UTF-8
开始图描述。 一个字符串由一个汉字、拉丁文小写字母gen、另一个汉字和拉丁文小写字母ki组成。 结束图描述。
E58583 67 65 69 6E E6B097 6B

由于ASCII、EBCDIC和Unicode对混合数据字符串的表示方式不同,混合数据无法透明地移植。 为了尽量减少这些差异的影响,在需要混合数据的应用程序中,请使用不同长度的字符串,并使用ASCII、EBCDIC和Unicode数据。

线束单元规格

通过为某些内置函数指定字符串单元,并使用CAST规范,您可以以“基于字符”的方式处理字符串数据,而不是“基于字节”的方式。 字符串单元决定操作的长度。 更多信息,请参阅字符串单元规格