news 2026/9/20 5:55:52

StarRocks strright 函数详解:从右侧提取子串的用法、别名与 UTF-8 底层实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
StarRocks strright 函数详解:从右侧提取子串的用法、别名与 UTF-8 底层实现

StarRocks strright 函数详解:从右侧提取子串的用法、别名与 UTF-8 底层实现

【免费下载链接】starrocksThe world's 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

strright是 StarRocks 字符串函数族中用于从字符串右侧截取指定长度子串的函数,其语义与right完全等价,可视为right的别名。本文基于 strright 官方文档,结合 FE 函数注册与 BE 向量化执行源码,完整讲解语法、示例、边界行为、UTF-8 字符计数规则及其底层实现原理,帮助你写出精确、可预期的字符串截取 SQL。

函数概述与别名关系

strright(str, len)的作用是:从字符串str最右侧开始,按指定长度len提取子串。长度单位是UTF-8 字符(character),而非字节(byte),因此对中文等多字节字符同样安全。

该函数同时注册为right,两者完全等价:

  • FE 端在 FunctionSet.java 中分别定义了RIGHT = "right"STRRIGHT = "strright"两个函数名,指向同一套内置函数实现;
  • 你可以根据团队 SQL 风格任意选择strright(...)right(...),执行结果完全一致。

官方文档明确注明:"This function is also named as right",对应文档见 right.md。

语法与参数说明

VARCHAR strright(VARCHAR str, INT len)
参数类型说明
strVARCHAR源字符串,即被截取的对象
lenINT从右侧开始提取的字符个数(UTF-8 字符为单位)
返回值VARCHAR截取得到的子串

行为要点:

  • len小于等于字符串长度时,返回最右侧的len个字符;
  • len大于字符串长度时,返回整个原字符串(越界不报错,也不会返回 NULL)。

示例演示

官方文档给出了如下示例:

MySQL > select strright("Hello starrocks",9); +--------------------------------+ | strright('Hello starrocks', 9) | +--------------------------------+ | starrocks | +--------------------------------+

"Hello starrocks"共 15 个字符,取最右侧 9 个字符,即得到starrocks

结合参数行为,还可以验证以下边界场景:

-- len 大于字符串长度,返回整个字符串 SELECT strright('starrocks', 100); -- starrocks -- len 为 0,返回空字符串 SELECT strright('starrocks', 0); -- (empty) -- 多字节 UTF-8 字符按字符计数,而非按字节 SELECT strright('StarRocks 数据库', 3); -- 数据库(3 个中文字符) -- 与 right 完全等价 SELECT strright('StarRocks', 5), right('StarRocks', 5); -- Rocks | Rocks

底层实现与边界语义

BE 端向量化实现

在 BE 端,strright/right的实现位于 string_functions.cpp:

// right // right(s, n) equals to substr(s, -n, n) except the case len(s) < n under which // right(s, n) return the entire s. StatusOr<ColumnPtr> StringFunctions::right(FunctionContext* context, const Columns& columns) { ... if (state != nullptr && state->is_const) { return right_const(state, columns); } else { return right_not_const(context, columns); } }

源码注释明确了其与substr的关系:right(s, n)等价于substr(s, -n, n),唯一的例外是当len(s) < n时,right(s, n)返回整个s(而substr在越界时可能返回空串)。这一语义由模板参数allow_out_of_left_bound控制:

  • right函数,allow_out_of_left_bound恒为true,即允许越过左边界、直接返回完整字符串;
  • substr/left函数,该参数恒为false

相关核心逻辑见 string_functions.cpp 的ascii_substr_per_slice与 utf8_substr_from_right_per_slice:当负偏移(即从右往左数)导致from_pos < 0时,allow_out_of_left_boundtrue则直接输出整个字符串,否则输出空串。

常量折叠优化(const optimization)

执行引擎对right/strright做了专门的常量优化。当两列在 Fragment 局部范围内均为非空常量时,会走left_or_right_prepare预计算路径:

Status StringFunctions::left_or_right_prepare(FunctionContext* context, FunctionContext::FunctionStateScope scope) { ... state->is_const = true; int len = ColumnHelper::get_const_value<TYPE_INT>(len_column); // right_const ignores state->pos, just use state->len state->pos = 1; state->len = len; ... }

见 string_functions.cpp。由于strright('xxx', 9)这类 SQL 中两个参数往往都是字面量,该优化可将截取结果在 prepare 阶段直接计算出来,显著降低执行期开销。

ASCII 与 UTF-8 双路径

BE 实现按字符串内容自动分派两条路径:

  • ASCII 快速路径:若字符串为纯 ASCII,可直接通过指针算术from_pos + s->size定位起点,无需逐字符扫描(见 ascii_substr_per_slice);
  • UTF-8 慢速路径:若包含多字节字符,则从右向左扫描 UTF-8 字符边界,确保按“字符”而非“字节”截取(见 utf8_right_not_const)。对不超过 32 字节的短串,还会使用栈上small_index缓存每个 UTF-8 字符的字节偏移以加速定位。

这也解释了文档中“The unit for length: utf-8 character”的底层原因:长度的单位始终是字符个数,中英文混排时不会出现半个字符的截断。

使用建议与注意事项

  1. 别名互换strrightright完全等价,新旧代码风格切换无任何兼容风险;
  2. 越界安全len大于字符串长度时返回原串,不会报错;len = 0返回空串,可安全用于清洗场景;
  3. 字符单位:涉及中文、Emoji 等多字节字符时,务必理解长度单位是字符而非字节,与substr的负偏移语义一致;
  4. NULL 处理:任一参数为 NULL 时结果返回 NULL(由RETURN_IF_COLUMNS_ONLY_NULL等空值短路机制统一处理);
  5. 相关函数:与left(从左侧截取,见 left.md)、substr/substringlength/char_length等函数组合使用,可完成各类字符串处理需求。

小结

strright是 StarRocks 提供的一个语义简洁、实现高效的右侧子串截取函数,与right互为别名。从 FE 的 FunctionSet.java 注册到 BE 的 StringFunctions::right 向量化执行,再到 ASCII/UTF-8 双路径与常量折叠优化,整条链路保证了该函数在多字节场景下的正确性与高性能。需要从字符串右侧提取固定数量字符时,直接使用strright(str, len)即可。

keyword

STRRIGHT, RIGHT, 字符串函数, 右侧截取, UTF-8, StarRocks

【免费下载链接】starrocksThe world's 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 5:55:20

AI智能体架构拆解:某验四滑块前端JS反混淆实操全流程

前阵子被一个需求卡了两天&#xff1a;项目里要接手一套前端验证逻辑&#xff0c;代码是从生产环境抽出来的压缩混淆版本&#xff0c;变量名全是_0x1a2b这种&#xff0c;字符串被拆成一段段编码&#xff0c;函数嵌套七八层。更麻烦的是&#xff0c;这份代码来自某验四滑块验证码…

作者头像 李华
网站建设 2026/9/20 5:54:07

LLVM 15.0.7工程实践:IR设计、Pass机制与后端指令选择深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 5:53:57

深度学习驱动的智能交通信号灯控制与车流量预测系统

简介&#xff1a;一份基于深度学习的AIT智能交通系统PDF文档&#xff0c;面向交通工程、人工智能及数据分析方向的研究者与从业者&#xff0c;针对城市交通拥堵治理与智能管控场景&#xff0c;系统阐述路线规划、数据采集、深度学习处理及指令控制三个核心模块的设计思路。全文…

作者头像 李华
网站建设 2026/9/20 5:53:43

微信Windows版历史版本归档:找回旧版本的全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华