한글을 30 바이트로 잘라서 오른쪽 정렬로 나타내려면 어떻게 하면 될까여? 0 4 152

by 대영아빠 [2021.01.11 20:17:06]



/*=======================
    학과
-------------------
모바일통신학과    
정보통신학과     
스마트통신학과계열소프트웨어공학  
===============================*/


과 같은 학과명이 있는경우

한글을 30 바이트로 잘라서 오른쪽 정렬로 나타내려면 어떻게 하면 될까여?


 select substrb('모바일통신학과', 1, 30)
       ,LENGTHB(substrb('모바일통신학과', 1, 30)) as  길이 
       ,RPAD(substrb('모바일통신학과', 1, 30),30,' ') AS RPAD_TWO    
       ,LENGTHB(RPAD(substrb('모바일통신학과', 1, 30),30,' ')) as  길이2
   from dual;

이렇게 등등 하고 있는데 답이 안 나오네요..

by pajama [2021.01.11 22:27:44]

오른쪽 정렬은 lpad를 사용하면 되지 않을까요..?

with t as (
select '모바일통신학과' 학과 from dual union all
select '정보통신학과' from dual union all
select '스마트통신학과계열소프트웨어공학' from dual
)
select lpad(학과,30,' ') from t;

 


by 대영아빠 [2021.01.11 22:56:29]

with t as (
select '모바일통신학과' 학과 from dual union all
select '정보통신학과' from dual union all
select '스마트통신학과계열소프트웨어공학' from dual
)
select rpad(학과,30,' ') as data
      ,LENGTHB(rpad(학과,30,' ') )as length
  from t;

(결과)

DATA                               LENGTH
------------------------------ ----------
모바일통신학과                          37
정보통신학과                             36
스마트통신학과계열소프트웨어공    45

 

LENGTH가 30 BYTE가 나와야 하는데... 어렵네요 ?????

 

 


by pajama [2021.01.11 23:51:24]

캐릭터셋이 utf8일때도 lpad가 한글을 2바이트로 처리하는 것 같습니다. 억지로 30바이트에 맞춰봤습니다...

 

select case when lengthb(학과) - 30 <  0 then lpad(학과, length(학과)*2+(30-length(학과)*3),' ') 
            when lengthb(학과) - 30 >= 0 then lpad(학과, 20) end tmp
from t

 


by 마농 [2021.01.12 09:21:48]

현재 한글이 1자당 3 Byte 를 차지합니다.
보통 출력시 보여질 때는 두자리를 차지합니다.
출력 길이를 맞출 것인지? 바이트를 맞출 것인지?
어떤 것이 맞는 것인지 고민해 보시기 바랍니다.

그리고
substr을 하셨는데?
예시 자료는 30자가 안되는 자료 뿐이네요.
30자가 넘는 자료를 자를 경우에도 문제가 되기는 마찬가지입니다.
한글이 2byte(KSC5601, MSWIN949) 를 차지하는 경우와 3byte(UTF8) 를 차지하는 경우가 있고
띄어쓰기나 영문, 기호 등 1Byte 와 섞여 있다 보면
마지막 글자가 한글일 경우 경계선에 걸쳐 있는 한글이 잘려나가는 현상도 있을 수 있습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입