加密的值的数据类型、编码和大小

data 和对应的 encrypted_data 参数可为任何内建的字符类型(CHAR、LVARCHAR、NCHAR、NVARCHAR 或 VARCHAR),或可为类型 BLOB 或 CLOB 的智能大对象。(使用 CLOB 替代这些函数不支持的 TEXT。)

加密或解密函数返回的对应的 dataencrypted_data 值有相同的字符、BLOB 或 CLOB 数据类型,除了 VARCHAR 或 NVARCHAR 字符串的加密可能返回溢出错误的情况之外。对于 CHAR、LVARCHAR、NCHAR、NVARCHAR 或 VARCHAR 数据上的和 encrypted_data 值上的操作,加密和解密函数遵循 CONCAT 和对于它们的返回值的数据类型的其他 SQL 字符串操纵函数的数据类型提升规则,如下例中所示。

要获取更多关于对于加密、解密和某些其他字符串操作函数返回的字符串的返回类型提升的信息,请参阅 从 CONCAT 函数的返回类型。那部分的第一张表格描述不是智能大对象的 dataencrypted_data 参数。(对于智能大对象参数,返回类型为 BLOB 或 CLOB 对象。)

然而,如果返回值超出对 CHAR、NCHAR 字符串的 32,767 字节限制,或超出对 LVARCHAR 的 32,739 字节限制,则加密或解密函数调用返回溢出错误 -881。当加密或解密操作需要的参数或返回值可能大于字符数据类型的限制(大约 32 Kb)时,要避免此错误,请使用 BLOB 或 CLOB 对象作为 dataencrypted_data 参数,而不是使用字符数据类型。

除了原始的 BLOB 或 CLOB 数据类型的 data 之外,encrypted_data 值以 BASE64 格式编码。加密的值需要比对应的明文更多的空间,因为数据库还必须存储解密所需要的信息(除了加密密钥之外)。如果使用 hint,则要将它加到 encrypted_data 的长度上。

BASE64 编码方案将 6 位的输入数据存储为 8 位的输出。要对 N 字节的数据编码,BASE64 需要至少 ((4N+3)/3) 字节的存储,此处的斜杠符(/)代表整除。填充以及头部可增加高于此 ((4N+3)/3) 比率的 BASE64 存储需求。列级别加密的示例 罗列估算以 BASE64 格式加密的数据值的大小。通常需要更改将要存储 BASE64 格式加密的数据的现有表的模式,特别是如果还要存储提示的话。

下列表格展示输入字符串的数据类型如何对应于 ENCRYPT_AESENCRYPT_TDES 返回的值的数据类型:
表 1. ENCRYPT_AES 和 ENCRYPT_TDES 函数的数据类型
明文数据类型 加密的数据类型 解密函数
CHAR CHAR DECRYPT_CHAR
NCHAR NCHAR DECRYPT_CHAR
VARCHAR VARCHAR 或 CHAR DECRYPT_CHAR
NVARCHAR NVARCHAR 或 NCHAR DECRYPT_CHAR
LVARCHAR LVARCHAR DECRYPT_CHAR
BLOB BLOB DECRYPT_BINARY
CLOB BLOB DECRYPT_CHAR

类型 VARCHAR 和 NVARCHAR 的列存储不多于 255 字节。对于这些数据类型,如果 data 字符串太长以至于不能同时存储加密的数据和加密开销,则由加密函数返回的值自动地由 VARCHAR 或 NVARCHAR 更改为固定的 CHAR 或 NCHAR 值,在编码的加密的值中不带末尾的空格。

类型 BLOB 或 CLOB 的加密的值不是 BASE64 编码格式的,且在加密之后,它们的大小增长与原始数据大小无关。对于 BLOB 或 CLOB 值,加密的大小(以字节计)有下列公式,其中 N 为明文的原始大小,H 为未加密的提示字符串的大小,如果通过 ENCRYPT_TDES 执行加密的话:
N + H + 24 bytes.
对于 ENCRYPT_AES 加密的 BLOB 或 CLOB 值,开销更大:
N + H + 32 bytes.