data 和对应的 encrypted_data 参数可为任何内建的字符类型(CHAR、LVARCHAR、NCHAR、NVARCHAR 或 VARCHAR),或可为类型 BLOB 或 CLOB 的智能大对象。(使用 CLOB 替代这些函数不支持的 TEXT。)
要获取更多关于对于加密、解密和某些其他字符串操作函数返回的字符串的返回类型提升的信息,请参阅 从 CONCAT 函数的返回类型。那部分的第一张表格描述不是智能大对象的 data 或 encrypted_data 参数。(对于智能大对象参数,返回类型为 BLOB 或 CLOB 对象。)
然而,如果返回值超出对 CHAR、NCHAR 字符串的 32,767 字节限制,或超出对 LVARCHAR 的 32,739 字节限制,则加密或解密函数调用返回溢出错误 -881。当加密或解密操作需要的参数或返回值可能大于字符数据类型的限制(大约 32 Kb)时,要避免此错误,请使用 BLOB 或 CLOB 对象作为 data 或 encrypted_data 参数,而不是使用字符数据类型。
除了原始的 BLOB 或 CLOB 数据类型的 data 之外,encrypted_data 值以 BASE64 格式编码。加密的值需要比对应的明文更多的空间,因为数据库还必须存储解密所需要的信息(除了加密密钥之外)。如果使用 hint,则要将它加到 encrypted_data 的长度上。
BASE64 编码方案将 6 位的输入数据存储为 8 位的输出。要对 N 字节的数据编码,BASE64 需要至少 ((4N+3)/3) 字节的存储,此处的斜杠符(/)代表整除。填充以及头部可增加高于此 ((4N+3)/3) 比率的 BASE64 存储需求。列级别加密的示例 罗列估算以 BASE64 格式加密的数据值的大小。通常需要更改将要存储 BASE64 格式加密的数据的现有表的模式,特别是如果还要存储提示的话。
明文数据类型 | 加密的数据类型 | 解密函数 |
---|---|---|
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 值,在编码的加密的值中不带末尾的空格。
N + H + 24 bytes.对于 ENCRYPT_AES 加密的 BLOB 或 CLOB 值,开销更大:
N + H + 32 bytes.