字符串分配
有两种类型的字符串分配:存储分配和检索分配。
存储分配是指将值分配给列或转换变量。
赋值是指为变量赋值,但过渡变量除外。
存储和检索任务的规则有所不同。
二进制字符串赋值
二进制字符串赋值包括二进制字符串的存储和检索。
- 存储分配
分配给列或过渡变量的字符串长度不能超过列或参数的长度属性。 如果字符串的长度大于该列或转换变量的长度属性,则返回错误。当字符串被分配给固定长度的二进制字符串列或函数或过程的参数时,如果字符串的长度小于该列或参数的长度属性,则字符串的右侧将填充必要数量的二进制零。

- 检索任务
- 分配给变量的字符串长度可以大于变量的长度属性。 当字符串被分配给一个变量,且字符串的长度大于变量的长度属性时,字符串将在右侧截断,截断的字节数由所需字节数决定。 出现这种情况时,系统会发出警告。
字符和图形字符串分配
当源字符串和目标字符串都是字符串时,存储和检索分配规则适用。
当涉及日期时间数据类型时,请参阅日期时间分配。 对于赋值涉及特殊类型(尤其是变量)时的特殊考虑,请参阅 “特殊类型赋值 ”。
- 字符串和图形字符串的存储分配
字符存储分配的基本规则是,分配给列或转换变量的字符串长度不能超过列或转换变量的长度属性。
拖尾空白包含在字符串长度中。 当字符串的长度大于列或参数的长度属性时,将执行以下操作:
- 如果为了使字符串符合目标而必须截断的所有尾随字符均为空格,且字符串为字符或图形字符串,则字符串将被截断并分配,且不会发出警告。
- 否则,字符串未分配,并出现错误,提示至少有一个多余字符不是空字符。
当字符串被分配给固定长度的列或参数,且字符串长度小于目标字符串的长度属性时,字符串将被右填充必要的SBCS或DBCS空格。 即使对于使用 FOR BIT DATA 属性定义的列或参数,垫字符始终为空。
- 字符和图形字符串的检索任务
分配给变量的字符串长度可以大于变量的长度属性。 当字符串的长度大于变量时,字符串将在右侧截断,截断长度为SBCS或DBCS字符的必要数量。
当发生截断时,会返回一条警告(SQLSTATE为'01004')。 如果变量是宿主变量,则将值“W”分配给SQLCA的 SQLWARN1 字段。 此外,如果提供了指示变量,且该变量的值不是来自LOB,则指示变量将设置为字符串的原始长度。 混合字符串的截断结果无法预测。 
当字符串被分配给一个固定长度的变量,且字符串的长度小于目标变量的长度属性时,字符串将被向右填充必要数量的空白。 即使对于使用 FOR BIT DATA 属性定义的字符串,垫字符始终为空。
当长度为n的字符串被分配给一个长度可变且最大长度大于n的字符串变量时,变量中第n个字符之后的字符将无法确定。
涉及混合数据字符串的任务
包含MBCS字符的混合数据字符串不能分配给SBCS列、SBCS参数或SBCS变量。
当混合数据字符串被分配给一个变量且字符串长度超过变量的长度属性时,适用以下规则:
- 如果字符串不是格式正确的混合数据,则将其视为位数据或图形数据进行处理。
- 如果字符串是格式正确的混合数据,则将其截断,使其成为格式正确的混合数据,长度与变量的长度属性相同,丢失的字符数最少。
涉及CNUL终止字符串的任务
CONNECT语句中引用的以NUL结尾的字符串变量不必包含NUL。 否则, Db2 将强制执行约定,即以NUL字符结尾的字符串变量(字符或图形)的值以NUL字符结尾。
输入变量中不能包含NUL,否则会导致错误。 分配给输出变量的值总是以NUL结尾,即使必须截断一个字符以腾出空间给NUL。
当长度为n的字符串被分配给一个以CNUL结尾的字符串变量,且该变量的长度大于 n+1 时,规则取决于源字符串是固定长度字符串还是可变长度字符串:
- 如果源字符串是固定长度的字符串,且安装面板 DSNTIP4 上的字段PAD NUL-TERMINATED的值为YES,则该字符串将在右侧填充 x-n-1个 空格 ,其中 x 是变量的长度。 然后将填充字符串分配给变量,并在变量末尾附加一个NUL。 如果字段PAD NUL-TERMINATED的值为NO,则字符串将被分配给变量的前n个字节 ,并在变量的末尾附加一个NUL。
- 如果源字符串的长度不固定,则将字符串分配给变量的前n个字节 ,并在变量的末尾附加一个NUL字符。
字符串赋值的转换规则
分配给列或变量的字符串或图形字符串在必要时首先转换为目标字符集的编码字符。 只有在满足特定条件的情况下,转换才是必要的。
只有在满足以下所有条件时,才需要进行转换:
- 字符串和目标的CCSID不同。
- CCSID 都不是 X'FFFF' (字符串和目标都不定义为位数据)。
- 该字符串既不为 Null 也不为空。
如果出现以下情况,则表明出现了错误:
- SYSSTRINGS表被使用,但其中不包含关于CCSID对的信息,而且 Db2 无法通过 z/OS® 对Unicode的支持进行转换。
- 字符串中的某个字符无法转换,且操作是赋值给没有指示变量的列或宿主变量。 例如,DBCS字符不能转换为SBCS CCSID变量。
在以下情况下会发出警告:
- 字符串中的一个字符被转换为替换字符。 当源字符集中的字符不属于目标字符集时,使用替代字符。 例如,假设目标字符集为EBCDIC,如果源字符集包含片假名字符,而目标字符集不包含,则片假名字符将转换为EBCDIC SUB X'3F'。
- 字符串中的字符不能转换,操作是将赋值给一个带有指示变量的变量。 例如,如果变量具有SBCS CCSID,则无法转换DBCS字符。 在这种情况下,字符串没有分配给变量,指示变量被设置为 -2。