본문 바로가기

Languages/Java

JAVA - PreparedStatement 로 한글 2000자 입력하기.

  • 오라클의 VARCHAR2 타입에서 입력 가능한 최대 크기는 4KB(4000Byte)인데, 영문은 1Byte로서 4,000자. 한글은 2Byte로서 2,000자를 넣을 수 있습니다.
  • 하지만, 문자열의 길이를 byte로 계산하기 때문에 한글과 같이 2바이트 이상을 사용하는 경우에는 실제 이론상의 길이보다 훨씬 적게 들어갑니다.
  • PreparedStatement 인스턴스에서 setString() 으로 문자열을 지정할 경우에 그러한데, 내부적으로 문자를 UTF-8로 변환해서 길이가 4KB를 넘는지 보게 됩니다.
  • 영문의 경우 2바이트로 계산해서 최대 2천자까지 들어가나, 한글의 경우 UTF-8에서 문자당 3바이트(?)를 차지하므로 입력 가능한 문자의 개수는 666자(1998 바이트)에 불과합니다.

해결책은 setString()이 아니라, setCharacterStream을 사용하면 됩니다.

StringReader contentreader = new StringReader(content);
...
...
...
pstmt.setCharacterStream(1,contentreader,content.getBytes().length);

위와 같은 방법으로 사용하면 많이 많이 넣을 수 있습니다.

자세한 설명은 아래의 사이트를 참고하세요.

[1] http://javafreak.tistory.com/entry/PreparedStatement%EB%A1%9C-varchar24000%EC%97%90-%ED%95%9C%EA%B8%80-2000%EC%9E%90-%EC%9E%85%EB%A0%A5

[2]

ref : http://blog.naver.com/rockmg?Redirect=Log&logNo=90008680601
ref : http://apmtip.com/board/zboard.php?id=mysql&no=79

[3]

ref : http://www.jee1.name/blog/186?TSSESSION=40ea754930d07fc940a26c7c2b2bdf9f

마지막으로 삽으로 퍼온 예제

Connection conn = null;

PreparedStatement pstmt = null;

StringBuffer query = new StringBuffer();

query.append(" insert into ").append(" EVENT_LOTTORY_LOG ").append(

" (CUST_SEQ,EDATE,ETIME,EPATH,CONTENT) ").append(" values(?,?,?,?,?)");

DbConnect dbCon = new DbConnect();

try {

StringReader contentreader = new StringReader(content);

conn = dbCon.getConnection();

pstmt = conn.prepareStatement(query.toString());

pstmt.setString(++index, cust_seq);

pstmt.setString(++index, W3sliUtil.getToday("yyyyMMdd"));

pstmt.setString(++index, W3sliUtil.getToday("HHmm"));

pstmt.setString(++index, path);

pstmt.setCharacterStream(++index, contentreader,content.getBytes().length);

pstmt.executeUpdate();

return true;

catch (Exception e) {

e.printStackTrace();

return false;

finally {

dbCon.release(pstmt);

dbCon.release(conn);

}