char 및 varchar(Transact-SQL)
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 Warehouse
고정 크기(char) 또는 가변 크기(varchar)인 문자 데이터 형식입니다. SQL Server 2019(15.x)부터 UTF-8 사용 데이터 정렬을 사용하는 경우 이러한 데이터 형식은 유니코드 문자 데이터의 전체 범위를 저장하고 UTF-8 문자 인코딩을 사용합니다. UTF-8이 아닌 데이터 정렬이 지정된 경우 이러한 데이터 형식은 해당 데이터 정렬의 코드 페이지에서 지원하는 문자의 하위 집합만 저장합니다.
인수
char [ ( n ) ]
고정 크기 문자열 데이터입니다. n은 바이트로 문자열 크기를 정의하며 1에서 8,000 사이의 값이어야 합니다. Latin
처럼 싱글바이트 인코딩 문자 집합의 경우 스토리지 크기는 n바이트이고 저장할 수 있는 문자 수도 n입니다. 멀티바이트 인코딩 문자 집합의 경우 스토리지 크기는 여전히 n바이트이지만 저장할 수 있는 문자 수는 n보다 작을 수 있습니다. ISO에서 정의한 char의 동의어는 character입니다. 문자 집합에 대한 자세한 내용은 싱글바이트 및 멀티바이트 문자 집합을 참조하세요.
varchar [ ( n | max ) ]
가변 크기 문자열 데이터입니다. n을 사용하여 문자열 크기(바이트)를 정의할 수 있으며 1~8,000 사이의 값이거나 최대를 사용하여 2^31-1바이트(2GB)의 최대 스토리지 크기로 열 제약 조건을 나타낼 수 있습니다. Latin
처럼 싱글바이트 인코딩 문자 집합의 경우 스토리지 크기는 n바이트 +2바이트이고 저장할 수 있는 문자 수도 n입니다. 멀티바이트 인코딩 문자 집합의 경우 스토리지 크기는 여전히 n바이트 + 2바이트이지만 저장할 수 있는 문자 수는 n보다 작을 수 있습니다. varchar의 ISO 동의어는 문자가 다르거나 문자가 다릅니다. 문자 집합에 대한 자세한 내용은 싱글바이트 및 멀티바이트 문자 집합을 참조하세요.
설명
char(n) 및 varchar(n)에서 n이 문자 수를 정의한다고 잘못 생각하는 경우가 많습니다. 그러나 char(n) 및 varchar(n)에서 n은 바이트의 문자열 길이(0~8,000)를 정의합니다. n은 저장할 수 있는 문자 수를 정의하지 않습니다. 이 개념은 nchar 및 nvarchar의 정의와 유사합니다.
싱글바이트 인코딩을 사용하는 경우 char 및 varchar의 스토리지 크기는 n바이트이고 문자 수도 n자이기 때문에 오해가 발생합니다. 그러나 UTF-8과 같은 멀티바이트 인코딩의 경우 상위 유니코드 범위(128~1,114,111)에서는 한 문자가 2바이트 이상을 사용합니다. 예를 들어 char(10)로 정의된 열에서 데이터베이스 엔진은 싱글바이트 인코딩을 사용하는 문자(유니코드 범위 0~127) 10자를 저장할 수 있지만, 멀티바이트 인코딩을 사용하는 경우(유니코드 범위 128~1,114,111) 10자 미만을 저장할 수 있습니다. 유니코드 스토리지 및 문자 범위에 대한 자세한 내용은 UTF-8과 UTF-16 간의 스토리지 차이점을 참조하세요.
데이터 정의나 변수 선언문에서 n을 지정하지 않으면 기본 길이는 1입니다. CAST
및 CONVERT
함수를 사용할 경우 n을 지정하지 않으면 기본 길이는 30입니다.
char 또는 varchar를 사용하는 개체에는 COLLATE
절을 사용하여 특정 데이터 정렬을 할당하지 않는 한 데이터베이스의 기본 데이터 정렬이 할당됩니다. 데이터 정렬은 문자 데이터를 저장하는 데 사용되는 코드 페이지를 제어합니다.
SQL Server의 멀티바이트 인코딩에는 다음이 포함됩니다.
코드 페이지 936 및 950(중국어), 932(일본어) 또는 949(한국어)를 사용하는 일부 동아시아 언어의 경우 DBCS(더블바이트 문자 집합)입니다.
코드 페이지가 65001인 UTF-8입니다.
적용 대상: SQL Server 2019(15.x) 이상 버전
여러 언어를 지원하는 사이트가 있는 경우:
- SQL Server 2019(15.x)부터 UTF-8 사용 데이터 정렬을 사용하여 유니코드를 지원하고 문자 변환 문제를 최소화하세요.
- 이전 버전의 SQL Server 데이터베이스 엔진을 사용하는 경우 유니코드 nchar 또는 nvarchar 데이터 형식을 사용하여 문자 변환 문제를 최소화하세요.
char 또는 varchar를 사용하는 경우에는 다음과 같이 하는 것이 좋습니다.
- 열 데이터 항목의 크기가 일관된 경우 char를 사용합니다.
- 열 데이터 항목의 크기가 비교적 큰 차이를 보일 경우 varchar를 사용합니다.
- 열 데이터 항목들의 크기가 비교적 큰 차이를 보이고 문자열 길이가 8,000바이트를 초과할 수 있는 경우 varchar(max) 를 사용합니다.
OFF
둘 중 하나 CREATE TABLE
또는 ALTER TABLE
실행될 때인 경우 SET ANSI_PADDING
varchar로 처리되는 것으로 NULL
정의된 char 열입니다.
경고
Null이 아닌 각 varchar(max) 또는 nvarchar(max) 열은 24바이트의 추가 고정 할당이 필요하며 정렬 작업 시 여기에 8,060바이트의 행 제한이 적용됩니다. 이로 인해 null이 아닌 varchar(max)의 수 또는 테이블에서 생성할 수 있는 nvarchar(max) 열의 수에 암묵적인 제한이 생깁니다.
테이블 생성 시 또는 데이터 삽입 시점에 특별한 오류(최대 행의 크기가 최대로 허용된 8,060바이트를 초과한다는 일반적인 경고 외의 메시지)가 표시되지 않습니다. 이렇게 크기가 큰 행은 클러스터형 인덱스 키 업데이트 같은 일부 정상 작업이나 전체 열 집합 정렬에서 오류(오류 512 등)를 발생시킬 수 있으며, 이 오류는 작업을 수행하는 동안에만 발생합니다.
문자 데이터 변환
문자 식이 다른 크기의 문자 데이터 형식으로 변환되면 새 데이터 형식에 대해 너무 긴 값은 잘립니다. uniqueidentifier 형식은 문자 식에서 변환하기 위한 문자 형식으로 간주되므로, 문자 형식으로 변환하기 위한 잘림 규칙이 있습니다. 예 섹션을 참조하세요.
문자 식이 다른 데이터 형식 또는 크기의 문자 식으로 변환되는 경우(예: 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
에서처럼 쉼표 구분자를 사용할 수 있습니다.
빈 문자열이 int로 변환되면 해당 값은 0
이 됩니다. 빈 문자열이 날짜로 변환되면 해당 값은 날짜(즉1900-01-01
,)가 됩니다.
예제
A. 변수 선언에 사용될 때 n의 기본값 표시
다음 예제에서는 변수 선언에 사용되는 경우 char 및 varchar 데이터 형식에 대해 n의 기본값이 1임을 보여 있습니다.
DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO
B. CAST 및 CONVERT에 varchar가 사용될 때 n의 기본값 표시
다음 예에서는 char 또는 varchar 데이터 형식이 CAST
또는 CONVERT
함수에 사용될 때 n의 기본값이 30임을 보여 줍니다.
DECLARE @myVariable AS VARCHAR(40);
SET @myVariable = 'This string is longer than thirty characters';
SELECT CAST(@myVariable AS VARCHAR);
SELECT DATALENGTH(CAST(@myVariable AS VARCHAR)) AS 'VarcharDefaultLength';
SELECT CONVERT(CHAR, @myVariable);
SELECT DATALENGTH(CONVERT(CHAR, @myVariable)) AS 'VarcharDefaultLength';
C. 표시를 위해 데이터 변환
다음 예에서는 두 개의 열을 문자 형식으로 변환한 후 해당 형식에 적용되는 스타일을 표시된 데이터에 적용합니다. money 형식이 문자 데이터로 변환되고 1
스타일이 적용됩니다. 이 스타일은 소수점 앞 세 자리마다 쉼표를 사용하고 소수점 뒤 두 자리까지 값을 표시합니다. datetime 형식이 문자 데이터로 변환되고 스타일 3
이 적용됩니다. 이 스타일은 데이터를 dd/mm/yy
형식으로 표시합니다. WHERE
절에서 money 형식은 문자열 비교 연산을 수행하기 위해 문자 형식으로 캐스팅됩니다.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
SalesYTD,
CONVERT(VARCHAR(12), SalesYTD, 1) AS MoneyDisplayStyle1,
GETDATE() AS CurrentDate,
CONVERT(VARCHAR(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS VARCHAR(20)) LIKE '1%';
결과 집합은 다음과 같습니다.
BusinessEntityID SalesYTD DisplayFormat CurrentDate DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278 1453719.4653 1,453,719.47 2011-05-07 14:29:01.193 07/05/11
280 1352577.1325 1,352,577.13 2011-05-07 14:29:01.193 07/05/11
283 1573012.9383 1,573,012.94 2011-05-07 14:29:01.193 07/05/11
284 1576562.1966 1,576,562.20 2011-05-07 14:29:01.193 07/05/11
285 172524.4512 172,524.45 2011-05-07 14:29:01.193 07/05/11
286 1421810.9242 1,421,810.92 2011-05-07 14:29:01.193 07/05/11
288 1827066.7118 1,827,066.71 2011-05-07 14:29:01.193 07/05/11
D. uniqueidentifier 데이터 변환
다음 예제에서는 uniqueidentifier 값을 char 데이터 형식으로 변환합니다.
DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';
다음 예는 변환될 데이터 형식에서 해당 값이 너무 길면 데이터가 잘림을 보여 줍니다. uniqueidentifier 형식은 36자로 제한되므로 길이가 초과된 글자는 잘립니다.
DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;
결과 집합은 다음과 같습니다.
String TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기