字符串
字符串是由字节组成的序列。 字符串的长度是序列中的字节数。 如果长度为零,则该值称为空字符串。 空字符串不应与空值混淆。
字符串的默认CCSID
字段MIXED DATA(在安装面板DSNTIPF上)的值决定字符串的默认CCSID。
| 编码方案 | 混合数据字段的值 | 缺省属性 |
|---|---|---|
| ASCII或EBCDIC | 否 | 字符:SBCS 安装面板上的ASCII CCSID或EBCDIC CCSID字段值决定SBCS数据的系统CCSID。 |
| ASCII或EBCDIC | YES | 性格:混合型 安装面板DSNTIPF上的ASCII CCSID或EBCDIC CCSID字段值决定了SBCS数据、MIXED数据和图形数据的系统CCSID。 |
| Unicode | 不适用 | 性格:混合型 CCSID包括:
|
混合数据字段不适用于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谓词指定的模式匹配。
在混合字符串中表示DBCS和MBCS字符的方法因编码方案而异。
- ASCII为SBCS字符保留了一组代码点,为DBCS字符的前半部分保留了一组代码点。 当遇到DBCS字符的前半部分时,系统会读取下一个字节,以获得完整的字符。
- EBCDIC使用两个特殊代码点:
- 换码字符( X'0E' )用于引入一串双字节字符集字符。
- 换码字符( X'0F' )来结束DBCS字符串。
- UTF-8 是字节序列的一种长度可变的编码。 高位表示字节所属的序列部分。 第一个字节表示字节序列中后续字节的个数。
字符编码方案的示例
相同的混合日期字符串可以用不同的编码方案表示为字符和十六进制数据。
| 数据类型和编码方案 | 字符表示 | 十六进制表示法(用空格分隔每个字符) |
|---|---|---|
| 9个ASCII字节 | 8CB3 67 65 69 6E 8B43 6B | |
| EBCDIC 13字节 | 0E 4695 87 85 95 92 89 0F 0E 45B9 0F | |
| Unicode 11字节 UTF-8 | E58583 67 65 69 6E E6B097 6B |
由于ASCII、EBCDIC和Unicode对混合数据字符串的表示方式不同,混合数据无法透明地移植。 为了尽量减少这些差异的影响,在需要混合数据的应用程序中,请使用不同长度的字符串,并使用ASCII、EBCDIC和Unicode数据。
线束单元规格
通过为某些内置函数指定字符串单元,并使用CAST规范,您可以以“基于字符”的方式处理字符串数据,而不是“基于字节”的方式。 字符串单元决定操作的长度。 更多信息,请参阅字符串单元规格。