고급 데이터 형식 사용

Microsoft SQL Server JDBC 드라이버는 JDBC 고급 데이터 형식을 사용하여 SQL Server 데이터 형식을 Java 프로그래밍 언어가 인식할 수 있는 형식으로 변환합니다.

다음 표에서는 고급 SQL Server, JDBC 및 Java 프로그래밍 언어 데이터 형식 간의 기본 매핑을 나열합니다.

SQL Server 형식 JDBC 형식(java.sql.Types) Java 언어 형식

varbinary(최대값)

image

LONGVARBINARY

byte[](기본값), Blob, InputStream, String

text

varchar(최대값)

LONGVARCHAR

String(기본값), Clob, InputStream

ntext

nvarchar(최대값)

LONGVARCHAR

LONGNVARCHAR(Java SE 6.0)

String(기본값), Clob, NClob(Java SE 6.0)

xml

LONGVARCHAR

SQLXML(Java SE 6.0)

String(기본값), InputStream, Clob, byte[],Blob, SQLXML(Java SE 6.0)

udt

VARBINARY

String(기본값), byte[], InputStream

다음 섹션에서는 JDBC 드라이버와 고급 데이터 형식을 사용하는 방법의 예를 보여 줍니다.

BLOB, CLOB 및 NCLOB 데이터 형식

JDBC 드라이버는 java.sql.Blob, java.sql.Clob 및 java.sql.NClob 인터페이스의 모든 메서드를 구현합니다.

참고

CLOB 값은 SQL Server 2005 큰 값 데이터 형식과 함께 사용할 수 있습니다. 특히 CLOB 형식은 varchar(max)nvarchar(max) 데이터 형식과 함께 사용할 수 있고, BLOB 형식은 varbinary(max)image 데이터 형식과 함께 사용할 수 있으며, NCLOB 형식은 ntextnvarchar(max) 데이터 형식과 함께 사용할 수 있습니다.

큰 값 데이터 형식

SQL Server의 이전 버전에서는 큰 값 데이터 형식을 사용할 때 특별한 처리가 필요했습니다. 큰 값 데이터 형식은 최대 행 크기인 8KB를 초과하는 데이터 형식입니다. SQL Server에서는 varchar, nvarcharvarbinary 데이터 형식에 대해 최대값 지정자를 사용하여 값을 최대 2^31바이트까지 저장할 수 있습니다. 테이블 열 및 Transact-SQL 변수는 varchar(max), nvarchar(max) 또는 varbinary(max) 데이터 형식을 지정할 수 있습니다.

큰 값 형식을 사용하는 주요 시나리오는 큰 값 형식을 데이터베이스에서 검색하거나 데이터베이스에 추가하는 것입니다. 다음 섹션에서는 이러한 태스크를 수행하는 다양한 접근 방식에 대해 설명합니다.

데이터베이스에서 큰 값 형식 검색

varchar(max) 데이터 형식과 같이 이진이 아닌 큰 값 데이터 형식을 데이터베이스에서 검색할 때 사용할 수 있는 한 가지 방법은 해당 데이터를 문자 스트림으로 읽는 것입니다. 다음 예제에서는 SQLServerStatement 클래스의 executeQuery 메서드를 사용하여 데이터베이스에서 데이터를 검색하고 이를 결과 집합으로 반환합니다. 그런 다음 SQLServerResultSet 클래스의 getCharacterStream 메서드를 사용하여 결과 집합에서 큰 값 데이터를 읽습니다.

ResultSet rs = stmt.executeQuery("SELECT TOP 1 * FROM Test1");
rs.next();
Reader reader = rs.getCharacterStream(2);

참고

text, ntextnvarchar(max) 데이터 형식에도 같은 방법을 사용할 수 있습니다.

varbinary(max) 데이터 형식과 같은 이진 큰 값 데이터 형식을 데이터베이스에서 검색할 때 사용할 수 있는 방법에는 몇 가지가 있습니다. 가장 효율적인 방법은 다음과 같이 데이터를 이진 스트림으로 읽는 것입니다.

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
InputStream is = rs.getBinaryStream(2);

또한 다음과 같이 getBytes 메서드를 사용하여 데이터를 바이트 배열로 읽을 수도 있습니다.

ResultSet rs = stmt.executeQuery("SELECT photo FROM mypics");
rs.next();
byte [] b = rs.getBytes(2);

참고

뿐만 아니라 데이터를 BLOB로 읽는 방법도 있습니다. 하지만 이 방법은 앞의 두 방법에 비해 효율이 떨어집니다.

데이터베이스에 큰 값 데이터 형식 추가

JDBC 드라이버로 큰 데이터를 업로드할 때 메모리 크기의 작업인 경우 원활하게 수행되지만 메모리 크기를 초과하는 작업의 경우에는 스트리밍이 최선의 수단입니다. 하지만 큰 데이터를 업로드하는 가장 효율적인 방법은 스트림 인터페이스를 사용하는 것입니다.

다음과 같이 문자열 또는 바이트를 사용하는 것도 한 가지 방법입니다.

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (?, ?)");
pstmt.setInt(1, 1);
pstmt.setString(2, htmlStr);
pstmt.executeUpdate();

참고

이 방법은 text, ntextnvarchar(max) 열에 저장된 값에도 사용할 수 있습니다.

서버에 이미지 라이브러리가 있는데 전체 이진 이미지 파일을 varbinary(max) 열에 업로드해야 하는 경우 JDBC 드라이버를 사용하는 가장 효율적인 방법은 다음과 같이 스트림을 직접 사용하는 것입니다.

PreparedStatement pstmt = con.prepareStatement("INSERT INTO test1 (Col1, Col2) VALUES(?,?)");
File inputFile = new File("CLOBFile20mb.jpg");
FileInputStream inStream = new FileInputStream(inputFile);
int id = 1;
pstmt.setInt(1,id);
pstmt.setBinaryStream(2, inStream);
pstmt.executeUpdate();
inStream.close();

참고

CLOB 또는 BLOB 메서드 중 하나를 사용하는 방법은 큰 데이터를 업로드하는 데는 적합하지 않습니다.

데이터베이스에서 큰 값 데이터 형식 수정

대개의 경우 데이터베이스의 큰 값을 업데이트하거나 수정할 때 권장되는 방법은 UPDATE, WRITE 및 SUBSTRING과 같은 Transact-SQL 명령을 사용하여 SQLServerPreparedStatementSQLServerCallableStatement 클래스를 통해 매개 변수를 전달하는 것입니다.

보관된 HTML 파일처럼 큰 텍스트 파일에서 단어의 인스턴스를 바꾸려면 다음과 같이 Clob 개체를 사용합니다.

String SQL = "SELECT * FROM test1;";
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(SQL);
rs.next();

Clob clob = rs.getClob(2);
long pos = clob.position("dog", 1);
clob.setString(pos, "cat");
rs.updateClob(2, clob);
rs.updateRow();

또한 서버에서 모든 작업을 수행하고 준비된 UPDATE 문에 매개 변수만 전달하는 방법도 있습니다.

큰 값 형식에 대한 자세한 내용은 SQL Server 온라인 설명서의 "큰 값 형식 사용"을 참조하십시오.

XML 데이터 형식

SQL Server 2005 이상의 SQL Server에서는 XML 문서 및 조각을 SQL Server 데이터베이스에 저장하는 데 사용할 수 있는 xml 데이터 형식을 제공합니다. xml 데이터 형식은 SQL Server의 기본 제공 데이터 형식이며 intvarchar와 같은 다른 기본 제공 유형과 비슷합니다. 다른 기본 제공 유형과 마찬가지로 변수 유형, 매개 변수 유형, 함수 반환 유형 또는 Transact-SQL CAST 및 CONVERT 함수로 테이블을 만들 때 xml 데이터 형식을 열 유형으로 사용할 수 있습니다.

JDBC 드라이버에서 xml 데이터 형식은 문자열, 바이트 배열, 스트림, CLOB, BLOB 또는 SQLXML 개체로 매핑될 수 있습니다. 기본값은 문자열입니다. JDBC 드라이버 버전 2.0 이상에서는 SQLXML 인터페이스가 추가된 JDBC 4.0 API가 지원됩니다. SQLXML 인터페이스는 XML 데이터에 대한 상호 작용 및 조작을 수행하는 메서드를 정의합니다. SQLXML 데이터 형식은 SQL Server xml 데이터 형식에 매핑됩니다. SQLXML Java 데이터 형식으로 관계형 데이터베이스에서 XML 데이터를 읽고 쓰는 방법에 대한 자세한 내용은 XML 데이터 지원을 참조하십시오.

JDBC 드라이버의 xml 데이터 형식 구현에서는 다음을 지원합니다.

  • 가장 일반적인 프로그래밍 시나리오에서 표준 Java UTF-16 문자열로 XML에 액세스합니다.

  • UTF-8 및 다른 8비트 인코딩 XML 입력을 지원합니다.

  • 다른 XML 프로세서 및 디스크 파일과의 교환을 위해 UTF-16으로 인코딩된 경우 선행 BOM이 있는 바이트 배열로 XML에 액세스합니다.

SQL Server에서는 UTF-16으로 인코딩된 XML에 선행 BOM을 사용해야 합니다. XML 매개 변수 값이 바이트 배열로 제공되면 응용 프로그램에서 선행 BOM을 제공해야 합니다. SQL Server에서는 항상 BOM이나 포함된 인코딩 선언 없이 XML 값을 UTF-16 문자열로 출력합니다. XML 값을 byte[], BinaryStream 또는 BLOB로 검색하면 UTF-16 BOM이 값 앞에 붙습니다.

xml 데이터 형식에 대한 자세한 내용은 SQL Server 온라인 설명서에서 "xml 데이터 형식"을 참조하십시오.

사용자 정의 데이터 형식

SQL Server 2005에서는 UDT(사용자 정의 형식)를 도입하여 SQL Server 데이터베이스에 개체 및 사용자 지정 데이터 구조를 저장할 수 있도록 함으로써 SQL 형식 체계를 확장했습니다. UDT는 다중 데이터 형식과 동작이 포함될 수 있어 단일 SQL Server 시스템 데이터 형식으로 구성된 일반적인 별칭 데이터 형식과 차별화됩니다. UDT는 검증할 수 있는 코드를 생성하는 Microsoft .NET CLR(공용 언어 런타임)에서 지원하는 언어를 사용하여 정의합니다. 이러한 언어에는 Microsoft Visual C# 및 Visual Basic .NET 등이 있습니다. 데이터는 .NET Framework 기반 클래스 또는 구조의 필드와 속성으로 노출되며 동작은 클래스 또는 구조의 메서드로 정의됩니다.

SQL Server에서는 UDT를 테이블의 열 정의, Transact-SQL 일괄 작업의 변수 또는 Transact-SQL 함수나 저장 프로시저의 인수로 사용할 수 있습니다.

사용자 정의 데이터 형식에 대한 자세한 내용은 SQL Server 온라인 설명서의 "사용자 정의 형식 인스턴스 사용 및 수정"을 참조하십시오.

참고

관련 자료

JDBC 드라이버 데이터 형식 이해