StarRocks base64_decode_binary 函数详解语法、行为与底层实现【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksbase64_decode_binary是 StarRocks 自 v3.0 起提供的加解密类标量函数用于将 Base64 编码的字符串解码为 BINARYVARBINARY类型数据。本文以其官方文档docs/en/sql-reference/sql-functions/crytographic-functions/base64_decode_binary.md为骨架结合 FE 函数注册表与 BE 执行引擎源码完整讲解语法、参数约束、返回值规则、典型使用场景及底层实现原理帮助你在数据湖分析、协议解析与二进制数据处理场景中正确使用该函数。函数概述Base64 是一种基于 64 个可打印字符来表示二进制数据的编码方式广泛用于在文本协议、日志系统、消息队列和各类 API 载荷中传输二进制内容。在 StarRocks 中base64_decode_binary专门承担Base64 解码并输出二进制的职责其返回值类型为 VARBINARY可直接参与hex()、字符串比较等后续运算适合对以 Base64 形式存储/传输的二进制字段如指纹、哈希摘要、加密报文做下游加工。该函数与编码侧的to_base64互为逆操作to_base64将字符串或二进制编码为 Base64 字符串base64_decode_binary则把 Base64 字符串解码还原为 BINARY。语法base64_decode_binary(str);函数只接受一个参数。若传入多个输入字符串StarRocks 会直接报错。参数说明参数类型说明strVARCHAR待解码的 Base64 编码字符串参数必须是 VARCHAR 类型。从函数注册信息gensrc/script/functions.py可以看到该函数的输入签名被严格声明为[VARCHAR][120121, base64_decode_binary, False, False, VARBINARY, [VARCHAR], EncryptionFunctions::from_base64],返回值与行为规则返回类型为VARBINARY。具体行为规则如下输入为 NULL返回NULL。输入为无效的 Base64 字符串返回NULL解码失败不会抛出异常中断查询。输入为空字符串返回错误。参数个数错误多于一个输入字符串报错。NULL 以外的普通合法输入返回解码后的二进制字节序列。在 BE 端实现中be/src/exprs/encryption_functions.cppEncryptionFunctions::from_base64按行遍历输入列对 NULL 行直接append_null()对空字符串同样以 NULL 收尾随后调用底层base64_decode2解码当返回长度len 0时视为非法 Base64 输入并追加 NULL。也就是说非法输入不会导致查询失败而是以 NULL 静默降级这在批量清洗脏数据时非常有用。使用示例以下示例来自官方文档并可直接在mysql客户端执行示例 1解码并查看十六进制内容mysql select hex(base64_decode_binary(to_base64(Hello StarRocks))); --------------------------------------------------------- | hex(base64_decode_binary(to_base64(Hello StarRocks))) | --------------------------------------------------------- | 48656C6C6F2053746172526F636B73 | ---------------------------------------------------------这里先用to_base64(Hello StarRocks)得到 Base64 编码再经base64_decode_binary还原为二进制最后用hex()将二进制转为十六进制展示。输出48656C6C6F2053746172526F636B73恰好对应 ASCII 字符Hello StarRocks证明解码还原无损。示例 2NULL 输入mysql select base64_decode_binary(NULL); -------------------------------------------------------- | base64_decode_binary(NULL) | -------------------------------------------------------- | NULL | --------------------------------------------------------示例 3手工构造 Base64 后解码mysql select hex(base64_decode_binary(c3RhcnJvY2tz)); ------------------------------------------ | hex(base64_decode_binary(c3RhcnJvY2tz)) | ------------------------------------------ | 73746172726F636B73 | ------------------------------------------其中c3RhcnJvY2tz是字符串starrocks的 Base64 编码可参见 to_base64 文档 中的示例解码后的十六进制73746172726F636B73即为其 ASCII 码。与其他 Base64 相关函数的对比StarRocks 的 crytographic-functions 目录下共有 4 个与 Base64 直接相关的函数使用时应根据目标类型选择函数输入类型返回类型说明base64_decode_binary(str)VARCHARVARBINARY解码为二进制本文主角base64_decode_string(str)VARCHARVARCHAR解码为字符串见 base64_decode_string 文档from_base64(str)VARCHARVARCHAR解码为字符串的早期同名函数见 from_base64 文档to_base64(str)VARCHAR / VARBINARYVARCHAR编码为 Base64 字符串见 to_base64 文档从函数注册表gensrc/script/functions.py可以看到base64_decode_binaryID 120121与base64_decode_stringID 120122、from_base64ID 120120在 BE 端共享同一个实现EncryptionFunctions::from_base64三者差异主要体现在返回类型声明上分别声明为VARBINARY、VARCHAR与VARCHAR。因此当你的下游处理需要二进制原值例如对接hex()、位运算或二进制协议字段时应优先使用base64_decode_binary。底层实现原理FE 侧函数注册与签名base64_decode_binary由 FE 通过函数注册脚本gensrc/script/functions.py声明ID 120121关键字段含义如下返回类型VARBINARY参数类型VARCHAR实现函数EncryptionFunctions::from_base64BE 侧 C 实现。注册表还额外声明了一个针对 VARBINARY 输入的to_base64重载ID 120161返回 VARCHAR这意味着to_base64可以直接作用于二进制类型与base64_decode_binary形成完整的编解码闭环。BE 侧列式执行实现在 BE 执行引擎中函数位于 be/src/exprs/encryption_functions.cpp采用 StarRocks 典型的列式Column-oriented逐行处理模式使用ColumnViewerTYPE_VARCHAR读取输入列按行判断是否为 NULL对 NULL 或空字符串输入直接产出 NULL对非空输入按src_value.size 3预分配解码缓冲区Base64 解码长度不超过编码长度多出的 3 字节用于容纳尾部补齐字节调用底层base64_decode2(src_value.data, src_value.size, p.get())完成解码若返回负数则判定为非法 Base64 输入并输出 NULL将解码结果按行写入ColumnBuilderTYPE_VARCHAR并构建输出列。与之对称的编码实现EncryptionFunctions::to_base64be/src/exprs/encryption_functions.cpp则通过config::max_length_for_to_base64对超长输入进行限制超出限制会抛出异常防止超大字符串编码造成资源开销。使用注意事项版本前提该函数自StarRocks v3.0起支持使用前请确认集群版本不低于此版本。空字符串输入官方文档明确说明空字符串输入会返回错误实际业务中建议先对源数据做空值/空串清洗。非法输入降级为 NULL从源码实现看无法解码的 Base64 字符串会返回 NULL 而非报错做数据校验时需结合isnull等谓词主动过滤。参数个数限制函数仅接受一个参数多参数 SQL 会直接报错注意不要与可变参数类函数混用。与字符串解码的取舍若目标场景只需要可读文本可改用base64_decode_string直接得到 VARCHAR只有需要二进制原值时才用base64_decode_binary避免不必要的类型转换开销。延伸阅读base64_decode_string 官方文档from_base64 官方文档to_base64 官方文档函数实现源码be/src/exprs/encryption_functions.cpp函数注册脚本gensrc/script/functions.py【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考