GaussDB(DWS)中的字符截取三胞胎【这次高斯不是数学家】

我站在北方的天空下 发表于 2022/06/06 09:41:51 2022/06/06
【摘要】 在GaussDB(DWS)中关于字符截取功能的支持有个函数三胞胎,它们分别是substrb()、substr()、substring(),很多人大概只知道它们可以操作字符串截取,再深入一点可能就不是很清楚了,有的是参数截取长度、有的参数是结束位置、有的参数可以是负数、有的不能接受负数参数·····下面就来给大家介绍这三个函数在字符截取时的一些用法与区别吧。

在GaussDB(DWS)中关于字符截取功能的支持有个函数三胞胎,它们分别是substrb()、substr()、substring(),很多人大概只知道它们可以操作字符串截取,再深入一点可能就不是很清楚了,有的是参数截取长度、有的参数是结束位置、有的参数可以是负数、有的不能接受负数参数·····
下面就来给大家介绍这三个函数在字符截取时的一些用法与区别吧。

概述

substr,substrb,substring均为字符串截取函数,都可带两个或三个参数,用于提取字符串中指定位置开始的指定长度的字符。 函数定义如下:

函数形式:
    substrb(string, from [, count])
    substr(string, from [, count])
    substring(string, from [, count])
参数描述:
	从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的子字符串长度。
返回值类型:
	text

差异

1. 截取单位

substrb按字节截取,substr/substring按字符截取。以utf8编码为例,1个汉字占3个字节,当使用substrb截取长度3的子串时,只能截取到一个字符,而substr/substring可以截取到三个字符。

对比 substrb substr substring
截取单位 按字节截取 按字符截取 按字符截取
postgres=# select substrb('hwgs华为公司',3,5),substr('hwgs华为公司',3,5),substring('hwgs华为公司',3,5);
 substrb |  substr  | substring
---------+----------+-----------
 gs华    | gs华为公 | gs华为公
(1 row)

2. 截取规则

GaussDB(DWS)目前支持三种兼容模式:ORA、TD和MySQL,分别对友商的函数行为进行兼容,提升用户迁移体验。在不同兼容模式下,函数差异表现为:

substrb(string, s[, n]):各兼容模式行为一致

参数场景 ORA/TD/MySQL兼容
s > 0 从第s个字符位置开始,截取n个字节
s = 0 截取前n个字节
s < 0 从倒数第|s|个字节位置开始,截取n个字节
n > 0 截取n个字节
n <= 0 空串(ORA模式输出null)
postgres=# select substrb('hwgs华为公司',5,3),substrb('hwgs华为公司',8,3);
 substrb | substrb
---------+---------| 
(1 row)
postgres=# select substrb('hwgs华为公司',-6,3),substrb('hwgs华为公司',-3,3);
 substrb | substrb
---------+---------| 
(1 row)
postgres=# select substrb('hwgs华为公司',5,0),substrb('hwgs华为公司',8,-1);
 substrb | substrb
---------+---------
         |
(1 row)

substr(string, s[, n]):s=0时存在兼容行为差异

参数场景 ORA兼容 TD兼容 MySQL兼容
s > 0 从第s个字符位置开始,截取n个字符 从第s个字符位置开始,截取n个字符 从第s个字符位置开始,截取n个字符
s = 0 截取前n个字符 截取前n个字符 空串
s < 0 从倒数第|s|个字符位置开始,截取n个字符 从倒数第|s|个字符位置开始,截取n个字符 从倒数第|s|个字符位置开始,截取n个字符
n > 0 截取n个字符 截取n个字符 截取n个字符
n <= 0 空串(ORA模式输出null) 空串 空串
postgres=# select substr('hwgs华为公司',5,3),substr('hwgs华为公司',8,3);
 substr | substr
--------+--------
 华为公 | 
(1 row)
postgres=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3);
 substr | substr
--------+--------
 hwg    | hwg
(1 row)
mysql_db=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3);
 substr | substr
--------+--------
        |
(1 row)

substring(string, s[, n]):s<=0和n<0时存在兼容行为差异

参数场景 ORA兼容 TD兼容 MySQL兼容
s > 0 从s位置开始,截取n个字符 从s位置开始,截取n个字符 从s位置开始,截取n个字符
s = 0 截取前n - 1个字符 截取前n - 1个字符 空串
s < 0 截取前s + n - 1个字符 截取前s + n - 1个字符 从倒数第|s|个字符位置开始,截取n个字符
n > 0 截取n个字符 截取n个字符 截取n个字符
n = 0 空串(ORA模式输出null) 空串 空串
n < 0 报错 报错 空串
postgres=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
 substring | substring
-----------+-----------
 hw        | h
(1 row)
td_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
 substring | substring
-----------+-----------
 hw        | h
(1 row)

mysql_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
 substring | substring
-----------+-----------
           | 
(1 row)
td_db=# select substring('hwgs华为公司',0,-1);
ERROR:  negative substring length not allowed
CONTEXT:  referenced column: substring
mysql_db=# select substring('hwgs华为公司',0,-1);
 substring
-----------

(1 row)

小结

综上,详细介绍并总结了substrb()、substr()、substring()的差异和用法,日常使用中,如果遇到截取字符串为多字节字符,或者截取参数可能为特殊值的情况,那你就要特别注意了;这篇文章,希望能帮到迷茫的你!

【这次高斯不是数学家】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/351189

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。