데이터 형식 변환 이해

JDBC 드라이버 다운로드

Java 프로그래밍 언어 데이터 형식을 SQL Server 데이터 형식으로 쉽게 변환할 수 있도록 Microsoft JDBC Driver for SQL Server는 JDBC 사양에 필요한 데이터 형식 변환을 제공합니다. 유연성을 더하기 위해 모든 형식을 개체, 문자열, 바이트[] 데이터 형식으로 변환할 수 있습니다.

참고 항목

Always Encrypted를 사용하는 경우 데이터 형식 변환에 대해 특별히 고려해야 합니다. 자세한 내용은 지원되지 않는 데이터 형식 변환 오류를 참조하세요.

getter 메서드 변환

SQL Server 데이터 형식을 기반으로 하는 다음 차트에는 SQLServerResultSet 클래스의 get<Type>() 메서드에 대한 JDBC 드라이버의 변환 맵과 SQLServerCallableStatement 클래스의 get<Type> 메서드에서 지원되는 변환 등이 나와 있습니다.

JDBC to SQL Server type conversion matrix

다음은 JDBC 드라이버의 getter 메서드에서 지원하는 세 가지 변환 범주입니다.

  • 손실 없음(x): getter 형식이 원본 서버 유형과 동일하거나 작은 경우의 변환입니다. 예를 들어 기본 서버 10진수 열에서 getBigDecimal을 호출하는 경우 변환이 필요하지 않습니다.

  • 변환(y): 변환이 일반적이고 Java 언어 변환 규칙을 따르는 경우 숫자 서버 유형을 Java 언어 형식으로 변환하는 것입니다. 이러한 변환의 경우 전체 자릿수는 항상 잘리고 반올림되지 않으며 오버플로는 더 작은 대상 형식의 모듈로로 처리됩니다. 예를 들어 "1.9999"를 포함하는 기본 decimal 열에서 getInt를 호출하면 "1"이 반환되고, 기본 decimal 값이 "3000000000"이면 int 값이 "-1294967296"으로 오버플로됩니다.

  • 데이터 의존(z): 기본 문자 형식에서 숫자 형식으로 변환하려면 문자 형식에 해당 형식으로 변환할 수 있는 값이 포함되어야 합니다. 그 외 다른 변환은 수행되지 않습니다. 값이 getter 형식에 비해 너무 크면 값이 유효하지 않습니다. 예를 들어 getInt가 "53"을 포함하는 varchar(50) 열에서 호출되면 값이 int로 반환되지만 기본 값이 "xyz" 또는 "3000000000"인 경우 오류가 발생합니다.

binary, varbinary, varbinary(max) 또는 image 열 데이터 형식에 대해 getString이 호출되는 경우 해당 값은 16진수 문자열 값으로 반환됩니다.

updater 메서드 변환

SQLServerResultSet 클래스의 update<Type>() 메서드에 전달되는 Java 형식 데이터의 경우 다음 변환이 적용됩니다.

JDBCUpdaterConversions

다음은 JDBC 드라이버의 updater 메서드에서 지원하는 세 가지 변환 범주입니다.

  • 손실 없음(x): updater 형식이 원본 서버 유형과 동일하거나 작은 경우의 변환입니다. 예를 들어 기본 서버 10진수 열에서 updateBigDecimal을 호출하는 경우 변환이 필요하지 않습니다.

  • 변환(y): 변환이 일반적이고 Java 언어 변환 규칙을 따르는 경우 숫자 서버 유형을 Java 언어 형식으로 변환하는 것입니다. 이러한 변환의 경우 전체 자릿수는 항상 잘리고(반올림되지 않음) 오버플로는 대상(더 작음) 형식의 모듈로로 처리됩니다. 예를 들어 "1.9999"를 포함하는 기본 int 열에서 updateDecimal을 호출하면 "1"이 반환되고, 기본 decimal 값이 "3000000000"이면 int 값이 "-1294967296"으로 오버플로됩니다.

  • 데이터 의존(z): 원본 데이터 형식에서 대상 데이터 형식으로 변환하려면 포함된 값을 대상 형식으로 변환할 수 있어야 합니다. 그 외 다른 변환은 수행되지 않습니다. 값이 getter 형식에 비해 너무 크면 값이 유효하지 않습니다. 예를 들어 "53"이 포함된 int 열에서 updateString이 호출되면 업데이트가 성공합니다. 그러나 기본 문자열 값이 "foo" 또는 "3000000000"인 경우 오류가 발생합니다.

binary, varbinary, varbinary(max) 또는 image 열 데이터 형식에서 updateString이 호출되는 경우 16진수 문자열 값으로 String 값을 처리합니다.

SQL Server 열 데이터 형식이 XML인 경우 데이터 값은 유효한 XML이어야 합니다. updateBytes, updateBinaryStream 또는 updateBlob 메서드를 호출할 때 데이터 값은 XML 문자의 16진수 문자열 표현이어야 합니다. 예시:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

XML 문자가 특정 문자 인코딩에 있는 경우 BOM(바이트 순서 표시)이 필요합니다.

setter 메서드 변환

SQLServerPreparedStatement 클래스 및 SQLServerCallableStatement 클래스의 set<Type>() 메서드에 전달되는 Java 형식 데이터에 대해서는 다음과 같은 변환이 적용됩니다.

JDBCSetterConversions

서버에서 모든 변환을 시도하고, 실패 시 오류를 반환합니다.

문자열 데이터 형식의 경우 값이 VARCHAR의 길이를 초과 하는 경우에는이 값이 값이 LONGVARCHAR (가) (으)로 매핑됩니다. 마찬가지로 NVARCHAR는 값이 지원되는 NVARCHAR 길이를 초과하는 경우 LONGNVARCHAR에 매핑됩니다. byte[]의 경우도 마찬가지입니다. VARBINARY보다 긴 값은 LONGVARBINARY가 됩니다.

다음은 JDBC 드라이버의 setter 메서드에서 지원하는 두 가지 변환 범주입니다.

  • 손실 없음(x): setter 형식이 원본 서버 유형과 동일하거나 작은 경우의 숫자 변환입니다. 예를 들어 기본 서버 decimal 열에서 setBigDecimal을 호출하는 경우 변환이 필요하지 않습니다. 숫자에서 문자로 변환하는 경우 Java 숫자 데이터 형식은 문자열로 변환됩니다. 예를 들어, 값이 "53"인 varchar(50) 열에 setDouble을 호출하면 해당 대상 열에 문자 값 "53"이 생성됩니다.

  • 변환(y): Java 숫자 형식을 보다 작은 원본 서버 숫자 형식으로 변환하는 경우입니다. 이 변환은 일반이며 SQL Server 변환 규칙을 따릅니다. 전체 자릿수는 항상 잘리고(반올림되지 않음) 오버플로는 지원되지 않는 변환 오류를 발생시킵니다. 예를 들어 기본 정수 열에서 값이 "1.9999"인 updateDecimal을 사용하면 대상 열에 "1"이 나타납니다. 그러나 "3000000000"이 전달되면 드라이버에서 오류를 발생시킵니다.

  • 데이터 종속(z): Java 문자열 형식에서 기본 SQL Server 데이터 형식으로 변환하는 작업은 드라이버가 문자열 값을 SQL Server로 보내고 필요한 경우 SQL Server에서 변환을 수행하는 조건에 따라 달라집니다. sendStringParametersAsUnicode가 true로 설정되어 있고 기본 SQL Server 데이터 형식이 image인 경우 SQL Server는 nvarcharimage로 변환하는 것을 허용하지 않으며 SQLServerException을 발생시킵니다. sendStringParametersAsUnicode가 false로 설정되어 있고 기본 SQL Server 데이터 형식이 image인 경우 SQL Server는 varcharimage로 변환하도록 허용하며 SQLServerException을 발생시키지 않습니다.

SQL Server는 변환을 수행하고 문제가 있는 경우 오류를 JDBC 드라이버에 다시 전달합니다.

SQL Server 열 데이터 형식이 XML인 경우 데이터 값은 유효한 XML이어야 합니다. updateBytes, updateBinaryStream 또는 updateBlob 메서드를 호출할 때 데이터 값은 XML 문자의 16진수 문자열 표현이어야 합니다. 예시:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

XML 문자가 특정 문자 인코딩에 있는 경우 BOM(바이트 순서 표시)이 필요합니다.

setObject의 변환

참고 항목

Microsoft JDBC Driver 4.2 for SQL Server 이상에서는 JDBC 4.1 및 4.2를 지원합니다. 4.1 및 4.2 데이터 형식 매핑 및 변환에 대한 자세한 내용은 아래 정보와 더불어 JDBC 드라이버의 JDBC 4.1 준수JDBC 드라이버의 JDBC 4.2 준수를 참조하세요.

SQLServerPreparedStatement 클래스의 setObject(<Type>) 메서드에 전달되는 Java 형식 데이터에 대해서는 다음과 같은 변환이 적용됩니다.

JDBCSetObjectConversions

지정된 대상 형식이 없는 setObject 메서드는 기본 매핑을 사용합니다. 문자열 데이터 형식의 경우 값이 VARCHAR의 길이를 초과 하는 경우에는이 값이 값이 LONGVARCHAR (가) (으)로 매핑됩니다. 마찬가지로 NVARCHAR는 값이 지원되는 NVARCHAR 길이를 초과하는 경우 LONGNVARCHAR에 매핑됩니다. byte[]의 경우도 마찬가지입니다. VARBINARY보다 긴 값은 LONGVARBINARY가 됩니다.

다음은 JDBC 드라이버의 setObject 메서드에서 지원하는 세 가지 변환 범주입니다.

  • 손실 없음(x): setter 형식이 원본 서버 유형과 동일하거나 작은 경우의 숫자 변환입니다. 예를 들어 기본 서버 decimal 열에서 setBigDecimal을 호출하는 경우 변환이 필요하지 않습니다. 숫자에서 문자로 변환하는 경우 Java 숫자 데이터 형식은 문자열로 변환됩니다. 예를 들어, 값이 "53"인 varchar(50) 열에 setDouble을 호출하면 해당 대상 열에 문자 값 "53"이 생성됩니다.

  • 변환(y): Java 숫자 형식을 보다 작은 원본 서버 숫자 형식으로 변환하는 경우입니다. 이 변환은 일반이며 SQL Server 변환 규칙을 따릅니다. 전체 자릿수는 항상 잘리고 반올림되지 않으며 오버플로는 지원되지 않는 변환 오류를 발생시킵니다. 예를 들어 기본 정수 열에서 값이 "1.9999"인 updateDecimal을 사용하면 대상 열에 "1"이 나타납니다. 그러나 "3000000000"이 전달되면 드라이버에서 오류를 발생시킵니다.

  • 데이터 종속(z): Java 문자열 형식에서 기본 SQL Server 데이터 형식으로 변환하는 작업은 드라이버가 문자열 값을 SQL Server로 보내고 필요한 경우 SQL Server에서 변환을 수행하는 조건에 따라 달라집니다. sendStringParametersAsUnicode 연결 속성이 true로 설정되어 있고 기본 SQL Server 데이터 형식이 image인 경우 SQL Server는 nvarcharimage로 변환하는 것을 허용하지 않으며 SQLServerException을 발생시킵니다. sendStringParametersAsUnicode가 false로 설정되어 있고 기본 SQL Server 데이터 형식이 image인 경우 SQL Server는 varcharimage로 변환하도록 허용하며 SQLServerException을 발생시키지 않습니다.

SQL Server는 집합 변환의 대부분을 수행하고 문제가 있을 때 오류를 JDBC 드라이버에 다시 전달합니다. 클라이언트 쪽 변환은 예외이며 날짜, 시간, 타임스탬프, 부울, 문자열 값의 경우에만 수행됩니다.

SQL Server 열 데이터 형식이 XML인 경우 데이터 값은 유효한 XML이어야 합니다. setObject(byte[], SQLXML), setObject(inputStream, SQLXML) 또는 setObject(Blob, SQLXML) 메서드를 호출할 때 데이터 값은 XML 문자의 16진수 문자열 표현이어야 합니다. 예시:

<hello>world</hello> = 0x3C68656C6C6F3E776F726C643C2F68656C6C6F3E

XML 문자가 특정 문자 인코딩에 있는 경우 BOM(바이트 순서 표시)이 필요합니다.

참고 항목

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