ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

StarRocks right 字符串函数详解:从右侧截取指定长度字符

StarRocks right 字符串函数详解:从右侧截取指定长度字符 数据库OLAP数据仓库大数据湖仓一体数据分析【免费下载链接】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点击查看免费下载本文以 StarRocks 官方文档 right 为骨架深入解析right字符串函数的语法、语义、UTF-8 字符长度单位、与strright的别名关系并结合 BE 端 C 源码实现与单元测试揭示其底层执行原理与边界行为帮助开发者在 SQL 查询中正确、高效地使用该函数。函数概述right是 StarRocks 提供的字符串截取函数用于从给定字符串的右侧末尾返回指定长度的字符。其长度单位是UTF-8 字符utf8 character而非字节数。这意味着对于包含中文、emoji 等多字节字符的字符串right按字符而不是字节进行截取与许多以字节为单位的数据库函数存在本质区别。该函数的一个关键特性是strright是right的别名二者完全等价可以互换使用。语法与参数VARCHAR right(VARCHAR str, INT len)参数类型说明strVARCHAR源字符串即被截取的对象lenINT需要从右侧返回的字符个数返回值类型VARCHAR在 FE 端的函数注册表中见 gensrc/script/functions.pyright与strright注册为两条独立的函数名但共享同一个 BE 端实现StringFunctions::right函数 ID30030名称right签名VARCHAR(VARCHAR, INT)实现指向StringFunctions::right函数 ID30031名称strright签名VARCHAR(VARCHAR, INT)实现同样指向StringFunctions::right。两者还共享相同的生命周期钩子StringFunctions::left_or_right_prepare与StringFunctions::left_or_right_close用于在查询执行前的常量折叠与参数校验准备阶段做状态初始化。使用示例基础用法ASCII 字符串MySQL select right(Hello starrocks,9); ----------------------------- | right(Hello starrocks, 9) | ----------------------------- | starrocks | -----------------------------上例中字符串Hello starrocks共 15 个字符right(..., 9)从右侧截取 9 个字符得到starrocks。别名 strright 的等价性MySQL select strright(Hello starrocks,9); -------------------------------- | strright(Hello starrocks, 9) | -------------------------------- | starrocks | --------------------------------strright与right返回完全一致的结果两种写法在功能上无任何差别。多字节字符UTF-8场景由于长度单位是 UTF-8 字符而非字节以下查询按字符计数-- 字符串你好StarRocks共 11 个字符2 个中文 9 个英文字母 SELECT right(你好StarRocks, 9); -- 返回 arRocks即从右数 9 个字符 SELECT right(你好StarRocks, 2); -- 返回 kslen 大于字符串长度时的行为与substr系列不同当len大于源字符串的字符数时right返回整个源字符串而不是空串。从源码注释见 be/src/exprs/string_functions.cpp可以明确看到这一语义约定right(s, n)equals tosubstr(s, -n, n)except the caselen(s) nunder whichright(s, n)returns the entires.也就是说right可视为substr(s, -n, n)的特殊形式唯一例外是当n超过字符串长度时返回完整字符串。底层实现原理统一的字符串截取框架在 BE 端right的实现位于 be/src/exprs/string_functions.cpp其函数入口为StatusOrColumnPtr StringFunctions::right(FunctionContext* context, const Columns columns) { RETURN_IF_COLUMNS_ONLY_NULL(columns); auto state reinterpret_castSubstrState*(context-get_function_state(FunctionContext::FRAGMENT_LOCAL)); if (state ! nullptr state-is_const) { return right_const(state, columns); } else { return right_not_const(context, columns); } }可以看到right与left、substr共享同一套SubstrState状态机与执行框架right_const当第二个参数长度len为编译期常量时走常量路径string_functions.cpp内部调用utf8_substr_from_righttrueright_not_const当len是逐行变化的列时走动态路径string_functions.cpp内部根据字符串是否包含多字节字符进一步分派ascii_right_not_const纯 ASCII 场景的快速路径utf8_right_not_constUTF-8 多字节场景的通用路径。UTF-8 逐字符扫描核心字符级截取由utf8_substr_from_right_per_slicestring_functions.cpp与utf8_substr_from_rightstring_functions.cpp完成。其特点是从右向左按 UTF-8 字符边界扫描从而保证不会把多字节字符从中劈开这与长度单位是 UTF-8 字符的文档语义完全一致。一个值得注意的工程细节是allow_out_of_left_bound标志string_functions.cpp对于substr和left该标志恒为false而对于right恒为true——这正是源码注释中n char_length(s)是合法输入、应返回整个字符串这一特殊语义的实现载体。常量折叠优化left_or_right_preparestring_functions.cpp在 Fragment 本地作用域内检查第二个参数是否为常量若为常量则创建对应的SubstrState从而在向量化执行时走常量专用路径避免逐行重复解析提升执行效率。left_or_right_closestring_functions.cpp负责在查询结束时释放相关状态。测试验证right的行为在 BE 单元测试中得到充分覆盖rightTest越界场景验证be/test/exprs/string_fn_test.cpp 中的rightTest构造了 20 组(字符串, len)输入对每一行断言当k s.size()len小于字符串长度时结果等于字符串末尾的k个字符当k s.size()len不小于字符串长度时结果等于整个字符串。这从测试层面再次印证了right的越界返回完整字符串的语义。left_and_right 系列测试test_left_and_right_not_conststring_fn_test.cpp与test_left_and_right_conststring_fn_test.cpp则分别覆盖了动态长度与常量长度两条执行路径验证right_const与right_not_const的结果一致性确保向量化常量优化不会改变函数语义。与其他字符串函数的对比函数截取方向边界行为len 超长时单位right(str, len)从右侧返回整个字符串UTF-8 字符strright(str, len)从右侧返回整个字符串等价别名UTF-8 字符left(str, len)从左侧视实现而定见 leftUTF-8 字符substr(str, pos, len)从指定位置按位置语义处理见 substringUTF-8 字符值得强调的是right与substr(s, -n, n)在数学上几乎等价唯一的差异点len(s) n时返回整个s已通过源码与测试双重确认这是理解right行为边界的关键。使用建议正确处理多字节数据因为单位是 UTF-8 字符处理中文字符串时无需担心按字节截断产生乱码善用常量参数当len为字面量常量时StarRocks 会自动走常量折叠路径建议在 SQL 中直接写死长度值而非通过表达式动态计算注意越界语义差异right在len超过字符串长度时返回整串若你的业务期望返回空串或 NULL需要自行加IF判断或改用substr并显式处理可读性选择right与strright完全等价建议统一使用right以保证代码可读性。相关资源right 函数官方文档strright 别名文档left 函数文档substring 函数文档底层实现be/src/exprs/string_functions.cpp函数注册定义gensrc/script/functions.py单元测试be/test/exprs/string_fn_test.cpp赞分享数据库OLAP数据仓库大数据湖仓一体数据分析【免费下载链接】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点击查看免费下载相关推荐StarRocks strleft 函数详解从左侧截取字符串的语法、行为与底层实现StarRocks strleft 函数详解从左侧截取字符串的语法、行为与底层实现 strleft str, len 是 StarRocks 中的字符串截取函数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks get_json_double 函数详解从 JSON 字符串中提取浮点数值StarRocks get_json_double 函数详解从 JSON 字符串中提取浮点数值 get_json_double 是 StarRocks 提供的数据库OLAP数据仓库大数据湖仓一体数据分析StarRocks char_length / character_length 函数详解按字符统计字符串长度的 UTF-8 语义与实现原理StarRocks char_length / character_length 函数详解按字符统计字符串长度的 UTF 8 语义与实现原理 characte数据库OLAP数据仓库大数据湖仓一体数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表