티스토리 뷰

반응형

한글이 포함된 문자열을 바이트로 자르면 바이트 수에 따라 마지막 문자가 깨져 보이는 경우가

있습니다. 한글이 2바이트로 사용되기 때문이죠. (문자셋에 따라 다르지만 일반적으로....)

그래서 특정 바이트로 문자열을 자르려고 하는 경우에 마지막 문자가 깨질 경우엔 1바이트를

자동으로 덜 자르게 해서 문자가 깨져보이지 않게 하는 함수를 만들어 보았습니다.


1.FN_SUBSTRB_KOR() 함수

-------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION FN_SUBSTRB_KOR(ps_korStr IN VARCHAR2

                                         ,pi_byteCnt IN PLS_INTEGER

                                          ) RETURN VARCHAR2 

IS

/************************************************************************************

VERSION: v1.0

DATE   : 

AUTHOR : 

DESCRIPTION: 한글이 포함된 문자열을 원하는 바이트로 자르는 함수.

             ps_korStr: 대상문자열

             pi_byteCnt: CUTOFF BYTE 수

PLSQL_CODE_TYPE: NATIVE             

************************************************************************************/


ls_korStr VARCHAR2(1000) := '';


BEGIN


IF ps_korStr IS NULL OR LENGTHB(ps_korStr) = 0 THEN 

   RETURN NULL;

END IF;


IF pi_byteCnt = 0 OR pi_byteCnt >= 1000 THEN 

   RETURN NULL; 

END IF;


IF LENGTHB(ps_korStr) <= pi_byteCnt THEN 

   RETURN ps_korStr;

END IF;   


SELECT DECODE(MOD_NUM,0,SUBSTRB(ps_korStr,1,pi_byteCnt)

                       ,SUBSTRB(ps_korStr,1,pi_byteCnt-1)

             )

       INTO  ls_korStr                

FROM

(

   SELECT MOD(SUM(DECODE(ASCII(TO_SINGLE_BYTE(SUBSTRB(ps_korStr, ROWNUM, 1))),32,1,0)),2) MOD_NUM

   FROM  

   (

      SELECT LEVEL

      FROM DUAL

      CONNECT BY LEVEL <= pi_byteCnt

   )

)

;


RETURN ls_korStr;


END;

-------------------------------------------------------------------------------


2. 사용법

SELECT FN_SUBSTRB_KOR('가1나',4)

            ,LENGTHB(FN_SUBSTRB_KOR('가1나',4))

           ,SUBSTRB('가1나',1,4)

FROM DUAL;

==> 함수를 통하면 3바이트가 리턴된고, SUBSTRB로 하면 당연히 4바이트가 리턴됩니다.




PS/ 생각해보니 위 함수에 쓸데없는 부분이 있네요. 마지막 2바이트만 검사해도 될 것을 ~~~

     



반응형