본문 바로가기

Programming/JAVA

DB튜닝시 varchar2로 입력가능한 글자수 계산에 대해 유의할 점.

varchar2 타입에서 입력 가능한 최대 크기는 4KB이며 이는 영문은 4천자, 한글은 2천자라고 다들 계산합니다.
위 기준대로라면 한글은 2천자가 들어가야 하나, 사실은 그보다 훨씬 적게 들어가는 상황이 존재합니다.

PreparedStatement 인스턴스에서 setString() 으로 문자열을 지정할 경우에 그러한데,
내부적으로 문자를 UTF-8로 변환해서 길이가 4KB를 넘는지를 보게됩니다.
영문의 경우 2바이트로 계산해서 최대 2천자까지 들어가나, 한글의 경우 UTF-8에서 문자당 3바이트(?)를 차지하므로
입력 가능한 문자의 개수는 666자(1998 바이트)에 불과합니다.
하지만 Statement 로 할 경우에 이런 제약은 없으나, 쿼리가 외부에 노출되는 보안상의 문제때문에
PreparedStatement 를 사용하는게 좋겠죠.
해결책은 setString() 이 아니라 setCharacterStream을 사용하면 됩니다. 이렇게하면 한글 2천자를 넣을 수 있음. 

참고 : http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=jdbc&c=r_p&n=1152605190

추가로 위와같이 setCharacterStream을 사용시엔 리턴값이 Reader 임도 유의해야겟습니다.