레이블이 Types인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Types인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 13일 일요일

Database에 긴 Text를 입력하는 다양한 방법

Database에 Text를 저장할때 가장 많이 사용하는 방식은 VACHAR(N) - DB가 Oracle인 경우에는 VACHAR2(N)을 사용하는 방식이다.

DB마다 조금씩 다르기는 하지만 VACHAR 또는 VACHAR2의 길이는 4,000 character로 제한된다. (특이하게 Derby의 경우에는 32,672 characters이다)

그래서 많이 쓰는 방식이 CLOB 또는 LONG VACHAR 이다. 그런데 2가지의 경우의 특징은 다음과 같다.

CLOB TYPE 사용
  • 데이터의 제한이 거의 없다(일반적으로 2 Gigabytes 까지 지원한다.)
  • 지원하지 않는 DB의 경우에도 다른 Type으로 지원한다.( 예를 들면 TEXT가 대표적이다.)
  • JAVA에서 사용하기 위해서는 java.lang.String이 아닌 java.sql.Clob Class를 이용하여야 한다.

LONG VACHAR 사용
  • 가장 많이 쓰는 상용 DB인 Oracle 에서 LONG TYPE으로 지원하다가 최시버전에서 Depreciated 되었다.(VACHAR가 Depreciated 되고 VACHAR2 사용을 유도하는 이유와 동일한 이유에서 진행되었다.)
  • DB별로 데이터 제한이 다르다.(일반적으로 2 Gigabytes이나 Derby의 경우 32,700 characters 이다)
  • JAVA에서 사용하기 위해서 java.lang.String Class를 사용하면 되기 때문에 편하다.

많은 DB를 지원하기 위해서는 CLOB을 사용하는 것이 가장 편한 방법으로 판단되지만 CLOB을 자바에서 사용하기 위해서는 java.lang.String으로 변경하는 별도의 방법이 필요하다.( java.sql.Clob 의 경우 긴 데이터이기 때문에 당연한 방법이기는 하지만 Reder를 이용하여 데이터를 읽어오는 방식이기 때문에 짧은 데이터의 경우 java.lang.String을 사용하는 것보다 번거럽다.) 만약 30,000 내외의 CARACTER를 이용하는 경우라면 LONG VACHAR(Oracel의 경우 LONG을 사용하는 것 - Depreciated 되었다는 점이 찜찜하긴 하지만 ORACLE의 최신버전에서도 완전히 제거하기는 힘들것으로 판단된다.)도 괜찮은 대안으로 생각된다.

추가로 이제껏 Oracle을 사용하면서 VACHAR2를 많이 사용했는데 이 TYPE의 경우 ANSI-SQL에서 지원하는 TYPE은 아니라는 사실을 알게 되었다. 그리고 Oracle 에서는 VARCHAR TYPE이 Depreciated 되었다는 사실도 새롭게 알게되었다.


2009년 11월 12일 목요일

JDBC Types와 Java Types, Java Object Types 간의 Mapping

JDBC API를 사용하다 보면 Java Object를 DB TYPE에 맞게 값을 읽어오고 파라미터로 세팅해줄 일들이 많이 생긴다.

 

java,sql.ResultSet의 getXXX methods는 값을 읽어오는 대표적인 경우이고,

java.sql.PreparedStatement의 SetXXX methods 들은 값을 세팅하는 대표적인 경우라고 할 수있다.

 

Mapping이 어떻게 되는 지는  Getting Started with the JDBC APIMapping SQL and Java Types을 보면 테이블로 친절하게 정리가 되어 있어서 말하는 것을 생략하도록 하고 여기서 말하고 싶은 것은 Java Types과, Java Object Types인 경우 서로 Mapping이 다른 이유에 대하여 설명하고자 한다.

 

간단하게 설명하면 Java Object Types과 JDBC Types 타입간의 Mapping은 setObject 및 getObject 인 경우 사용하는 Mapping이다. 그외의 setString, setShort와 같은 Method를 사용할 경우에는 Java Type과 JDBC Types 간의 Mapping을 사용한다.

 

두가지가 거의 내용이 대동소이 하지만 JDBC Types이 BIT, TINYINT, SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE 인경우 차이가 나고 그 이유는 Java Type은 primitive  타입(ex int)과 매핑되고, Java Object Types은 wrpa Object(ex Integer)와 연결되는 식으로 변경된다는 점이다. 특히 특이한것은 TINYINT, SMALLINT인데 Java Type에서는 각각 byte와 short 로 Mapping 되나 Java Object Type에서는 모두 Integer로 연결된다. Byte와 Short가 있는데도 불구하고 이렇게 되는 이유는 솔직히 모른다. 나중에 알게되면 글을 수정하도록 하겠다.

 

참고로 JDBC Type은 java.sql.Types에 정의되어 있다.