来自 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。
SUBSTR、SUBSTRING 返回类型与 source string 类型相同。如果 source string 为主变量,则依赖于结果的长度,返回类型为 NVARCHAR 或 NCHAR。
TRIM、LTRIM、RTRIM 返回类型依赖于源类型和返回的长度:
  • NVARCHAR 返回 NVARCHAR
  • VARCHAR 返回 VARCHAR
  • CHAR 返回 VARCHAR(如果 length <= 255 字节的话)
  • CHAR 返回 LVARCHAR(如果 length > 255 字节的话)
  • NCHAR 返回 NVARCHAR(如果 length <= 255 字节的话)
  • NCHAR 返回 LVARCHAR(如果 length > 255 字节的话)
  • LVARCHAR 返回 LVARCHAR
LPAD、RPAD 返回类型基于 source_string 和 pad_string 参数。如果未指定 pad_string,则返回类型基于 source_string 的数据类型。
REPLACE 返回类型基于 source_string 和 old_string 参数(以及基于 new_string 参数,如果指定了的话)。如果任何参数为主变量,则返回类型为 NCHAR。
ENCRYPT_AES、ENCRYPT_TDES、DECRYPT_BINARY、DECRYPT_CHAR 对于不是 BLOB 或 CLOB 变量的参数,返回类型基于 data 和 encrypted_data 参数的数据类型。请参考 表 1。