摘要:下面就來給大家介紹這三個函數在字符截取時的一些用法與區別。
本文分享自華爲雲社區《GaussDB(DWS)中的字符截取三胞胎》,作者:我站在北方的天空下 。
在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可以截取到三個字符。
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]):各兼容模式行爲一致
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時存在兼容行爲差異
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時存在兼容行爲差異
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()的差異和用法,日常使用中,如果遇到截取字符串爲多字節字符,或者截取參數可能爲特殊值的情況,那你就要特別注意了;這篇文章,希望能幫到迷茫的你!