PostgreSQLOracle相容性-substrb-orafcesubstrb適配Oraclesubstrb
標籤
PostgreSQL , substrb , 按位元組截斷 , 不截斷多位元組字元
背景
在orafce提供的substrb中,當截斷到某個多位元組字元時,如果字元被中間截斷,會導致亂碼。
為了相容oracle substrb,不截斷多位元組字元,可以在orafce包的substrb基礎之上再寫一個plpgsql函式來代替。
相容oracle substrb
下面是阿里雲提供的方法。
create extension orafce;
CREATE OR REPLACE FUNCTION substrb_new(v_text text, start integer, count integer)
RETURNS character varying AS
$BODY$
DECLARE
ret text default ``;
len integer default 0;
len1 integer default 0;
start1 integer default 0;
end1 integer;
cc varchar;
BEGIN
-- execute `select substrb(``123中國123``,3,2)` into v_text;
len = NVL(length(v_text), 0);
end1 = start + count;
for pos in 0..len-1 loop
if len1 >= start - 1 THEN
exit;
end if;
len1 = len1 + octet_length(SUBSTR (v_text, pos+1, 1));
start1 = start1 + 1;
end loop;
for pos in start1..len-1 loop
cc = SUBSTR (v_text, pos+1, 1);
len1 = len1 + octet_length(cc);
if len1 > end1 - 1 THEN
exit;
end if;
ret = ret || cc;
end loop;
return ret;
END;
$BODY$
LANGUAGE `plpgsql` VOLATILE;
UTF8字符集,中不會被截斷。
postgres=# select octet_length(substrb_new(`123中國123`,3,2));
octet_length
--------------
1
(1 row)
postgres=# select octet_length(substrb_new(`123中國123`,3,3));
octet_length
--------------
1
(1 row)
postgres=# select octet_length(substrb_new(`123中國123`,3,4));
octet_length
--------------
4
(1 row)
postgres=# select octet_length(substrb_new(`123中國123`,3,1));
octet_length
--------------
1
(1 row)
postgres=# select substrb_new(`123中國123`,3,1);
substrb_new
-------------
3
(1 row)
postgres=# select substrb_new(`123中國123`,3,2);
substrb_new
-------------
3
(1 row)
postgres=# select substrb_new(`123中國123`,3,3);
substrb_new
-------------
3
(1 row)
postgres=# select substrb_new(`123中國123`,3,4);
substrb_new
-------------
3中
(1 row)
orafce提供的substrb截斷多位元組字元時,可能產生亂碼或不可見字元。
postgres=# select substrb(`123中國123`,3,1)::bytea;
substrb
---------
x33
(1 row)
postgres=# select substrb(`123中國123`,3,2)::bytea;
substrb
---------
x33e4
(1 row)
postgres=# select substrb(`123中國123`,3,3)::bytea;
substrb
----------
x33e4b8
(1 row)
postgres=# select substrb(`123中國123`,3,4)::bytea;
substrb
------------
x33e4b8ad
(1 row)
相關文章
- PostgreSQLOracle相容性之NUMTODSINTERVALSQLOracle
- PostgreSQLOracle相容性-synonym匿名SQLOracle
- PostgreSQLOracle相容性之-roundintervalSQLOracle
- PostgreSQLOracle相容性-connectby2SQLOracle
- PostgreSQLOracle相容性-Analysis函式之keepSQLOracle函式
- Android 裝置音影片相容性適配Android
- PostgreSQLOracle相容性之-全域性臨時表globaltemptableSQLOracle
- PostgreSQLOracle相容性之-PartitionByOuterJoin實現稠化報表SQLOracle
- Android外掛化的相容性(上):Android O的適配Android
- Android外掛化的相容性(中):Android P的適配Android
- 新版本系統適配: Android 12 中的相容性變更Android
- Android適配: 拉伸適配的缺點Android
- flutter 螢幕尺寸適配 字型大小適配Flutter
- PostgreSQLOracle相容性之-系統列(ctid,oid,cmin,cmax,xmin,xmax)SQLOracle
- Android適配Android
- iOS 11適配iOS
- https適配HTTP
- 適配iphone XiPhone
- PostgreSQLoracle相容性-字串內嵌NULL字元(空字元)chr(0)轉換為chr(32)SQLOracle字串Null字元
- PostgreSQLOracle相容性之-PL/SQLDETERMINISTIC與PG函式穩定性(immutable,stable,volatile)SQLOracle函式
- android螢幕適配三:通過畫素密度適配Android
- Android螢幕適配(理論適配100%機型)Android
- Flutter螢幕適配Flutter
- Rem 等比適配始末REM
- Flutter深色模式適配Flutter模式
- h5適配H5
- rem 適配佈局REM
- Viewport 等比適配始末View
- iOS11 適配iOS
- iphone 適配的sdkiPhone
- UIWebView 適配螢幕UIWebView
- (原創)高DPI適配經驗系列:(四)高DPI適配示例
- 【移動適配】移動Web怎麼做螢幕適配(一)Web
- 【移動適配】移動Web怎麼做螢幕適配(三)Web
- (原創)高DPI適配經驗系列:(二)按DPI範圍適配
- ios11 劉海屏 安全區域 適配 彈框區域適配iOS
- 應用適配資料庫還是資料庫適配應用資料庫
- Unity適配iPhone X---關於Home鍵指示器適配UnityiPhone