oracle的substrb(str2||str1,1+lengthb(str1),6)如何在tidb中实现

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 场景 + 问题概述函数改造

【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

【附件】 相关日志及监控

应该是一样的吧?你是特指substrb和substr的区别么?

SELECT SUBSTRING(CONCAT(str2, str1), LENGTH(str1) + 1, 6) FROM your_table;

1 个赞

tidb是兼容mysql的,改写成mysql的函数就可以

真没用过。

select substrb(‘hello’||‘tidb’,1+lengthb(‘tidb’),6) from dual;
SELECT SUBSTRING(CONCAT(‘hello’, ‘tidb’), LENGTH(‘tidb’) + 1, 6) ;
这不就是oracle改mysql吗?

从函数名理解应该是按字节数和字符数区别

1 个赞

:joy:看来大家都没有关注 substrb 和 substr 的区别啊~

substr(cast(concat(str2,str1) as binary),1+length(cast(str1 as binary)),6)

这是记录的啥,能这么写SQL :joy_cat:

一个字节一个字符 :joy:

:+1:我是百度之后才知道的~ :yum:

这些基础函数没个数据库都基本有对应的,自己最清楚自己需求查一下改很简单,前段时间跟一个腾讯的dba看oracle的函数改成tdsql的,拆分成一堆小存储过程也改成了

对于英文这样的单字节编码,substr跟substrb是一样的,但是用在汉字这种多字节中,substrb就有可能出现乱码。既然oracle迁移到tidb,那么顺手改掉了,不必强求。

字面上看,是字符串和字符串byte的区别?

字节与字符。

是字节和字符的区别,我特意百度才知道的~之前都没注意

SELECT SUBSTRING(CONCAT(str2, str1), LENGTH(str1) + 1, 6) FROM table_name;这么写没啥性能可言,除非你结果集过滤的很小。

1 个赞

没听说过

参照mysql语法