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(n)nvarchar(n) 정의와 비슷합니다.

싱글바이트 인코딩을 사용하는 경우 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입니다. CASTCONVERT 함수를 사용할 경우 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) 를 사용합니다.

CREATE TABLE 또는 ALTER TABLE 실행 시 SET ANSI_PADDINGOFF이면 NULL로 정의된 char 열이 varchar로 처리됩니다.

경고

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 절을 사용하여 특정 데이터 정렬을 할당할 수 있습니다.

참고

charvarchar 데이터 형식에 대해서는 코드 페이지 변환이 지원되지만 text 데이터 형식에 대해서는 지원되지 않습니다. 이전 버전의 SQL Server와 마찬가지로 코드 페이지 변환 중 데이터 손실은 보고되지 않습니다.

근사 numeric 데이터 형식으로 변환되는 문자 식에는 선택적 지수 표기법이 포함될 수 있습니다. 이 표기법은 소문자 e 또는 대문자 E 다음에 선택적 더하기(+) 또는 빼기(-) 기호가 온 다음 숫자가 옵니다.

정확한 numeric 데이터 형식으로 변환되는 문자 식은 숫자, 소수점 및 옵션인 더하기(+) 또는 빼기(-) 기호로 구성되어야 합니다. 선행 공백은 무시됩니다. 123,456.00에서 천 단위 구분 기호와 같은 쉼표 구분 기호는 문자열에서 사용할 수 없습니다.

money 또는 smallmoney 데이터 형식으로 변환되는 문자 식에는 선택적 소수점 및 달러 기호($)가 포함될 수도 있습니다. $123,456.00에서처럼 쉼표 구분자를 사용할 수 있습니다.

빈 문자열이 int로 변환되면 해당 값은 0이 됩니다. 빈 문자열이 날짜로 변환되면 해당 값은 날짜의 기본값1900-01-01이 됩니다.

A. 변수 선언에 사용될 때 n의 기본값 표시

다음 예에서는 charvarchar 데이터 형식이 변수 선언에 사용될 때 n의 기본값이 1임을 보여 줍니다.

DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following 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

(1 row(s) affected)

추가 정보