데이터 형식 변환(데이터베이스 엔진)
데이터 형식은 다음 시나리오에서 변환할 수 있습니다.
한 개체의 데이터가 다른 개체의 데이터로 이동하거나 그 데이터와 비교되거나 결합되면 데이터는 그 개체의 데이터 형식에서 다른 개체의 데이터 형식으로 변환되어야 합니다.
Transact-SQL 결과 열, 반환 코드 또는 출력 매개 변수의 데이터가 프로그램 변수로 이동되면 데이터를 SQL Server 시스템 데이터 형식에서 변수의 데이터 형식으로 변환해야 합니다.
데이터 형식은 암시적으로 또는 명시적으로 변환할 수 있습니다.
암시적 변환은 사용자에게 보이지 않습니다.
SQL Server는 데이터 형식을 자동으로 변환합니다. 예를 들어 smallint를 int와 비교하는 경우 smallint는 비교되기 전에 암시적으로 int로 변환됩니다.
명시적 변환은 CAST 또는 CONVERT 함수를 사용합니다.
CAST 및 CONVERT 함수는 값(지역 변수, 열 또는 다른 식)의 데이터 형식을 변환합니다. 예를 들어 다음 CAST 함수는 $157.27의 숫자 값을 '157.27'의 문자열로 변환합니다.
CAST ( $157.27 AS VARCHAR(10) )
Transact-SQL 프로그램 코드를 ISO에 맞추려면 CONVERT 대신 CAT를 사용하고, CONVERT의 스타일 기능을 사용하려면 CAST 대신 CONVERT를 사용합니다.
SQL Server 개체의 데이터 형식을 변환할 때 일부 암시적 및 명시적 데이터 형식 변환은 지원되지 않습니다. 예를 들면 nchar 값은 image 값으로 변환할 수 없습니다. nchar는 명시적 변환을 사용하여 binary로만 변환할 수 있습니다. binary로의 암시적 변환은 지원되지 않습니다. 그러나 nchar는 암시적으로나 명시적으로 nvarchar로 변환할 수 있습니다.
sql_variant 데이터 형식을 처리할 때 SQL Server는 개체의 데이터 형식을 sql_variant 형식으로 암시적으로 변환할 수 있습니다. 그러나 SQL Server는 sql_variant 데이터에서 다른 데이터 형식의 개체로의 암시적 변환을 지원하지 않습니다.
SQL Server 개체 간에 지원되는 변환에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하십시오.
응용 프로그램 변수와 SQL Server 결과 집합 열, 반환 코드, 매개 변수 또는 매개 변수 표식 간에 변환할 때는 데이터베이스 API에 따라 지원되는 데이터 형식 변환이 정의됩니다. 자세한 내용은 프로그램 변수로 데이터 이동을 참조하십시오.
데이터 형식 변환 동작
이 항목의 다음 섹션에서는 아래 데이터 형식이 나타내는 변환 동작에 대해 설명합니다.
binary 및 varbinary 데이터 |
money 데이터 |
bit 데이터 |
decimal 및 numeric 데이터 |
문자 데이터 |
OLE 자동화 저장 프로시저를 사용하여 데이터 형식 변환 |
date 및 time 데이터 |
integer 데이터 |
float 및 real 데이터 |
binary 및 varbinary 데이터 변환
데이터가 문자열 데이터 형식(char, varchar, nchar, nvarchar, binary, varbinary, text, ntext 또는 image)에서 길이가 다른 binary 또는 varbinary 데이터 형식으로 변환되면 SQL Server는 데이터 오른쪽을 채우거나 자릅니다. 기타 데이터 형식이 binary 또는 varbinary로 변환되면 데이터 왼쪽이 채워지거나 잘립니다. 패딩은 16진수 0을 사용하여 수행됩니다.
binary 데이터가 데이터를 이동하는 가장 쉬운 방법일 경우 데이터를 binary 및 varbinary 데이터 형식으로 변환하는 것이 유용합니다. 두 변환이 같은 버전의 SQL Server에서 수행된 경우 형식의 값을 아주 큰 이진 값으로 변환한 다음 다시 이전 형식으로 변환하면 항상 같은 값을 갖게 됩니다. 값의 이진 표현은 SQL Server의 버전을 변경합니다.
int, smallint 및 tinyint를 binary 또는 varbinary로 변환할 수 있지만 binary 값을 다시 정수 값으로 변환하면 잘림이 발생한 경우 이 값은 원래 정수 값과 달라집니다. 예를 들어 다음 SELECT 문은 정수 값 123456이 일반적으로 이진 0x0001e240으로 저장됨을 보여 줍니다.
SELECT CAST( 123456 AS BINARY(4) )
다음 SELECT 문에서 binary 대상이 전체 값을 보유하기에 너무 작으면 동일한 숫자가 0xe240으로 저장되도록 선행 숫자가 자동으로 잘리는 것을 볼 수 있습니다.
SELECT CAST( 123456 AS BINARY(2) )
다음 일괄 처리는 자동 잘림이 오류를 일으키지 않고 산술 연산에 영향을 줄 수 있음을 보여 줍니다.
DECLARE @BinaryVariable2 BINARY(2)
SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1
SELECT CAST( @BinaryVariable2 AS INT)
GO
최종 결과는 123457이 아니라 57921입니다.
[!참고]
모든 데이터 형식과 binary 데이터 형식 간의 변환은 SQL Server 버전 사이에서 같다고 보장할 수 없습니다.
bit 데이터로 변환
bit로 변환하면 0이 아닌 값은 1로 수준이 올라갑니다.
문자 데이터 변환
문자 식이 다른 크기의 문자 데이터 형식으로 변환되면 새 데이터 형식에 대해 너무 긴 값은 잘립니다.
char(5)에서 varchar(5)로 또는 char(20)에서 char(15)로의 변환처럼 문자 식이 데이터 형식이나 크기가 다른 문자 식으로 변환되면 입력 값의 데이터 정렬은 변환된 값에 할당됩니다. 문자 이외의 식을 문자 데이터 형식으로 변환하면 현재 데이터베이스의 기본 데이터 정렬이 변환된 값에 할당됩니다. 두 경우 모두 COLLATE 절을 사용하여 특정 데이터 정렬을 할당할 수 있습니다.
[!참고]
char 및 varchar 데이터 형식에 대해서는 코드 페이지 변환이 지원되지만 text 데이터 형식에 대해서는 지원되지 않습니다. 이전 버전의 SQL Server와 마찬가지로 코드 페이지 변환 중 데이터 손실은 보고되지 않습니다.
근사 numeric 데이터 형식으로 변환되는 문자 식에는 선택적 지수 표기(소문자 e 또는 대문자 E 다음에 옵션인 더하기(+) 또는 빼기(-) 기호가 온 다음 숫자가 옴)가 포함될 수 있습니다.
정확한 numeric 데이터 형식으로 변환되는 문자 식은 숫자, 소수점 및 옵션인 더하기(+) 또는 빼기(-) 기호로 구성되어야 합니다. 선행 공백은 무시됩니다. 123,456.00에서 천 단위 구분 기호와 같은 쉼표 구분 기호는 문자열에서 사용할 수 없습니다.
money 또는 smallmoney 데이터 형식으로 변환되는 문자 식에는 선택적 소수점 및 달러 기호($)가 포함될 수도 있습니다. $123,456.00에서처럼 쉼표 구분자를 사용할 수 있습니다.
다음 예는 데이터를 표시할 수 있도록 변환하는 방법을 보여 줍니다. 다음 예는 문자열 비교를 수행하기 전에 판매 데이터를 문자 데이터로 변환하고 현재 날짜를 스타일 3인 dd/mm/yy로 변환합니다.
USE AdventureWorks;
GO
SELECT SalesPersonID,
CAST(SalesYTD AS varchar(12)),
CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%'
GO
다음 예는 uniqueidentifier 값을 char 데이터 형식으로 변환합니다.
DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char'
GO
다음 예는 현재 날짜를 스타일 3인 dd/mm/yy로 변환합니다.
SELECT CONVERT(char(12), GETDATE(), 3)
GO
Date 및 Time 데이터 변환
date 및 time 데이터 형식으로 변환하면 SQL Server는 날짜 또는 시간으로 인식할 수 없는 모든 값을 거부합니다. 모든 Transact-SQL 날짜/시간 데이터 형식 및 함수에 대한 개요는 날짜 및 시간 함수(보고서 작성기 1.0)를 참조하십시오.
다음 예에서는 date 및 datetime2 값을 varchar 및 binary 데이터 형식으로 각각 변환합니다.
DECLARE @mydate date
SET @mydate = '4/05/98'
SELECT CAST(@mydate AS varchar) AS DATE_VARCHAR
GO
DECLARE @mydate datetime2
SET @mydate = '4/05/98'
SELECT CAST(@mydate AS binary) AS DATE_BINARY
GO
결과 집합은 다음과 같습니다.
(1 row(s) affected)
DATE_VARCHAR
------------------------------
Apr 5 1998
(1 row(s) affected)
DATE_BINARY
--------------------------------------------------------------
0x0700000000008B210B
(1 row(s) affected)
float 및 real 데이터 변환
float의 값은 정수 형식으로 변환될 때 잘립니다.
float 또는 real에서 문자 데이터로 변환할 때 STR 문자열 함수를 사용하는 것이 CAST( )를 사용하는 것보다 유용합니다. 이는 STR을 사용하면 서식을 더 많이 제어할 수 있기 때문입니다. 자세한 내용은 STR(Transact-SQL) 및 함수(Transact-SQL)를 참조하십시오.
money 데이터 변환
정수 데이터 형식에서 money로 변환할 때 단위는 통화 단위로 간주됩니다. 예를 들어 정수 값 4는 4 통화 단위와 동등한 money로 변환됩니다.
다음 예에서는 smallmoney 및 money 값을 varchar 및 decimal 데이터 형식으로 각각 변환합니다.
USE AdventureWorks;
GO
DECLARE @mymoney_sm smallmoney;
SET @mymoney_sm = 3148.29;
SELECT CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney money;
SET @mymoney = 3148.29;
SELECT CAST(@mymoney AS decimal) AS 'MONEY DECIMAL';
GO
결과 집합은 다음과 같습니다.
SM_MONEY VARCHAR
------------------------------
3148.29
(1 row(s) affected)
MONEY DECIMAL
----------------------
3148
(1 row(s) affected)
decimal 및 numeric 데이터
decimal 및 numeric 데이터 형식의 경우 SQL Server는 전체 자릿수와 소수 자릿수의 각 특정 조합을 다른 데이터 형식으로 간주합니다. 예를 들면 decimal(5,5) 및 decimal(5,0)은 다른 데이터 형식으로 간주됩니다.
Transact-SQL 문에서 소수점이 있는 상수는 필요한 최소 전체 자릿수 및 소수 자릿수를 사용하여 numeric 데이터 값으로 자동 변환됩니다. 예를 들어 상수 12.345는 전체 자릿수가 5이고 소수 자릿수가 3인 numeric 값으로 변환됩니다.
decimal 또는 numeric에서 float 또는 real로 변환하면 전체 자릿수가 손실될 수 있습니다. int, smallint, tinyint, float, real, money 또는 smallmoney에서 decimal 또는 numeric으로 변환하면 오버플로가 발생할 수 있습니다.
기본적으로 SQL Server는 숫자를 전체 자릿수 및 소수 자릿수가 낮은 decimal 또는 numeric 값으로 변환할 때 반올림을 사용합니다. 그러나 SET ARITHABORT 옵션이 ON이면 SQL Server는 오버플로가 발생할 때 오류를 일으킵니다. 전체 자릿수 및 소수 자릿수의 손실만으로는 오류가 발생하지 않습니다.
integer 데이터 변환
정수가 암시적으로 문자 데이터 형식으로 변환될 경우 정수가 너무 커서 문자 필드에 맞지 않으면 SQL Server는 ASCII 문자 42인 별표(*)를 입력합니다.
2,147,483,647보다 큰 정수 상수는 bigint 데이터 형식이 아닌 decimal 데이터 형식으로 변환됩니다. 다음 예에서는 임계값을 초과할 때 데이터 형식이 int에서 decimal로 변경됨을 보여 줍니다.
SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;
결과 집합은 다음과 같습니다.
Result1 Result2
1073741823 1073741824.500000
OLE 자동화 저장 프로시저를 사용하여 데이터 형식 변환
SQL Server는 Transact-SQL 데이터 형식을 사용하고 OLE 자동화는 Visual Basic 데이터 형식을 사용하므로 OLE 자동화 저장 프로시저는 이들 간에 전달되는 데이터를 변환해야 합니다.
다음 표에서는 SQL Server에서 Visual Basic 데이터 형식으로 변환하는 방법을 설명합니다.
SQL Server 데이터 형식 |
Visual Basic 데이터 형식 |
---|---|
char, varchar, text, nvarchar, ntext |
String |
decimal, numeric |
String |
bit |
Boolean |
binary, varbinary, image |
1차원 Byte() 배열 |
int |
Long |
smallint |
Integer |
tinyint |
Byte |
float |
Double |
real |
Single |
money, smallmoney |
Currency |
datetime, smalldatetime |
Date |
NULL로 설정된 모든 것 |
Null로 설정된 Variant |
단일 SQL Server 값은 binary, varbinary 및 image 값을 제외하고 모두 단일 Visual Basic 값으로 변환됩니다. 이러한 값은 Visual Basic의 1차원 Byte() 배열로 변환됩니다. 이 배열 범위는 Byte(0에서 length1)입니다. 여기서 length는 SQL Serverbinary, varbinary 또는 image 값의 바이트 수입니다.
이들은 Visual Basic 데이터 형식에서 SQL Server 데이터 형식으로 변환한 것입니다.
Visual Basic 데이터 형식 |
SQL Server 데이터 형식 |
---|---|
Long, Integer, Byte, Boolean, Object |
int |
Double, Single |
float |
Currency |
money |
Date |
datetime |
4000자 이하의 String |
varchar/nvarchar |
4000자를 초과하는 String |
text/ntext |
8000바이트 이하의 1차원 Byte() 배열 |
varbinary |
8000바이트를 초과하는 1차원 Byte() 배열 |
image |