来自 CONCAT 和字符串函数的返回类型

从成功的 CONCAT 函数调用(或从串联(||)操作符,或对于确定他们的返回类型所遵循的规则与 CONCAT 相同的其他内建的字符串操纵函数)的返回值的数据类型依赖于参数的数据类型以及结果字符串的长度。在确定返回类型时,两个参数的顺序的意义不大。

对于来自串联多个数据类型指定的值的串联操作的返回类型, GBase 8s 应用下列规则:
  • 如果其中一个类型为“国家语言支持”(也就是 NCHAR 和 NVARCHAR):
    • 如果结果的长度小于 255 字节,则返回类型为 NVARCHAR
    • 否则,返回类型为 NCHAR。
  • 如果其中一个参数为 VARCHAR 或数值类型,则
    • 如果结果的长度小于 255 字节,则返回类型为 VARCHAR
    • 否则,返回类型为 LVARCHAR。
  • 然而,在某些在本地执行远程例程的跨服务器操作中,可发生针对这些规则的例外,且在将串联表达式的返回值发送到远程数据库服务器之前,在本地对它求值。对于不支持在分布式事务中的 LVARCHAR 数据类型的远程服务器,如果发送 LVARCHAR 类型返回错误,则作为 CHAR 数据类型发送串联的结果。在此情境下,早于 Version 11.10 的 GBase 8s 数据库服务器实例需要 CHAR 返回值。

在下列表格中,各行罗列 CONCAT 函数的第一个参数的有效的数据类型,各列罗列第二个参数的类型。每一行与列交叉处的单元展示可能的一个或多个返回类型。标明其他的行和列表示求值为非字符类型的参数,诸如数值或像 DECIMAL 或 DATE 一样的时间数据类型。

表 1. 来自两个参数上的操作的返回类型(在 Version 11.50.xC2 或更新版本中)
  NCHAR NVARCHAR CHAR VARCHAR LVARCHAR 其他
NCHAR nchar nvarchar nchar nchar nvarchar nchar nvarchar nchar nvarchar nchar
NVARCHAR nvarchar nchar nvarchar nchar nvarchar nchar nvarchar nchar nvarchar nchar nvarchar nchar
CHAR nchar nvarchar nchar char varchar lvarchar lvarchar varchar lvarchar
VARCHAR nvarchar nchar nvarchar nchar varchar lvarchar varchar lvarchar lvarchar varchar lvarchar
LVARCHAR nvarchar nchar nvarchar nchar lvarchar lvarchar lvarchar lvarchar
其他 nvarchar nchar nvarchar nchar varchar lvarchar varchar lvarchar lvarchar varchar lvarchar

对于 CONCAT 之外的其他字符串操纵函数,DATE、DATETIME 或 MONEY 数据类型的参数往往返回 NVARCHAR 或 NCHAR 值,这依赖于结果字符串的长度。

此表格是对称的,因为参数的顺序对返回数据类型没有影响。对于内建的字符串操纵函数或运算符,用户定义的数据类型、大对象类型、复合的类型和其他扩展的数据类型不是有效的参数。

此表格还描述使用串联(||)运算符的表达式的返回数据类型。

对于 CHAR、NCHAR 和 LVARCHAR 数据类型,此处没有展示在其中的参数长度的总和超出大约 32 KB 限度的串联操作的结果。这会返回错误 -881,而不是串联的数据值。由于最大的 LVARCHAR 大小为 32,739 字节,且 CHAR 和 NCHAR 的限度都是 32,767 字节,因此错误 -881 总是与其限度为 255 字节的 VARCHAR 和 NVARCHAR 对象相关联,但自动的返回类型提升可降低此错误的发生几率。

对于返回类型提升,下列字符串操纵函数支持与 CONCAT 相同的规则:
  • LPAD
  • RPAD
  • REPLACE
  • SUBSTR
  • SUBSTRING
  • TRIM
  • LTRIM
  • RTRIM

下列表格总结 GBase 8s 如何基于参数类型,来确定来自这些字符串操纵函数的返回类型:

表 2. 支持返回类型提升的字符串操纵函数
函数 如何确定函数的返回类型
CONCAT、|| 返回类型基于两个参数。请参考 表 1
SUBSTRSUBSTRING 返回类型与 source string 类型相同。如果 source string 为主变量,则依赖于结果的长度,返回类型为 NVARCHAR 或 NCHAR。
TRIMLTRIMRTRIM 返回类型依赖于源类型和返回的长度:
  • NVARCHAR 返回 NVARCHAR
  • VARCHAR 返回 VARCHAR
  • CHAR 返回 VARCHAR(如果 length <= 255 字节的话)
  • CHAR 返回 LVARCHAR(如果 length > 255 字节的话)
  • NCHAR 返回 NVARCHAR(如果 length <= 255 字节的话)
  • NCHAR 返回 LVARCHAR(如果 length > 255 字节的话)
  • LVARCHAR 返回 LVARCHAR
LPADRPAD 返回类型基于 source_stringpad_string 参数。如果未指定 pad_string,则返回类型基于 source_string 的数据类型。
REPLACE 返回类型基于 source_stringold_string 参数(以及基于 new_string 参数,如果指定了的话)。如果任何参数为主变量,则返回类型为 NCHAR。
ENCRYPT_AESENCRYPT_TDESDECRYPT_BINARYDECRYPT_CHAR 对于不是 BLOB 或 CLOB 变量的参数,返回类型基于 dataencrypted_data 参数的数据类型。请参考 表 1