열 데이터 정렬 설정 또는 변경

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

테이블의 특정 열에 다른 데이터 정렬을 지정하고 다음 중 하나를 사용하여 char, varchar, text, nchar, nvarchar, ntext 데이터의 데이터베이스 데이터 정렬을 재정의할 수 있습니다.

  • 아래 예제와 같이 CREATE TABLEALTER TABLE의 COLLATE 절입니다.

    • 현재 위치 변환. 아래 정의된 기존 테이블 중 하나를 고려합니다.

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      
      -- VARCHAR column is encoded the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      

      UTF-8을 사용하도록 열을 현재 위치로 변환하려면 필요한 데이터 형식과 UTF-8 사용 데이터 정렬을 설정하는 ALTER COLUMN 문을 실행합니다.

      ALTER TABLE dbo.MyTable 
      ALTER COLUMN CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8
      

      이 방법은 구현하기는 쉽지만, 차단 작업의 가능성이 있어 대규모 테이블 및 사용 중인 애플리케이션의 문제로 이어질 수 있습니다.

    • 복사 및 교체. 아래 정의된 기존 테이블 중 하나를 고려합니다.

      -- NVARCHAR column is encoded in UTF-16 because a supplementary character enabled collation is used
      CREATE TABLE dbo.MyTable (CharCol NVARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC);
      GO
      
      -- VARCHAR column is encoded using the Latin code page and therefore is not Unicode capable
      CREATE TABLE dbo.MyTable (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI);
      GO
      

      UTF-8을 사용하도록 열을 변환하려면 대상 열이 이미 필요한 데이터 형식이고 UTF-8이 설정된 데이터 정렬인 새 테이블에 데이터를 복사한 다음 이전 테이블을 대체합니다.

      CREATE TABLE dbo.MyTableNew (CharCol VARCHAR(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8);
      GO
      INSERT INTO dbo.MyTableNew 
      SELECT * FROM dbo.MyTable;
      GO
      DROP TABLE dbo.MyTable;
      GO
      EXEC sp_rename 'dbo.MyTableNew', 'dbo.MyTable';
      GO
      

      이 메서드는 현재 위치 변환보다 훨씬 빠르지만 많은 종속성(FK, PK, 트리거, DF)을 사용하여 복잡한 스키마를 처리하고 테이블의 꼬리를 동기화(데이터베이스가 사용 중인 경우)하려면 더 많은 계획이 필요합니다.

    자세한 내용은 데이터 정렬 및 유니코드 지원을 참조하십시오.

  • SQL Server Management Studio. 자세한 내용은 열 수정(데이터베이스 엔진)을 참조하세요.

  • SMO(SQL Server Management Objects)에서 Column.Collation 속성을 사용합니다.

현재 다음 중 하나에서 참조하는 열의 데이터 정렬은 변경할 수 없습니다.

  • 계산 열
  • 인덱스
  • 자동으로 또는 CREATE STATISTICS 문에 의해 생성된 배포 통계
  • CHECK 제약 조건
  • 외래 키 제약 조건

tempdb로 작업하는 경우 COLLATE 절에 임시 테이블의 열이 연결 시 tempdb의 데이터 정렬 대신 현재 사용자 데이터베이스의 기본 데이터 정렬을 사용하도록 지정하는 database_default 옵션을 포함할 수 있습니다.

데이터 정렬 및 텍스트 열

데이터 정렬이 데이터베이스의 기본 데이터 정렬 코드 페이지와 다른 텍스트 열에 값을 삽입하거나 업데이트할 수 있습니다. SQL Server는 값을 열의 데이터 정렬로 암시적으로 변환합니다.

데이터 정렬 및 tempdb

tempdb 데이터베이스는 SQL Server가 시작될 때마다 빌드되며 모델 데이터베이스와 기본 데이터 정렬이 동일합니다. 이는 일반적으로 인스턴스의 기본 데이터 정렬과 동일합니다. 사용자 데이터베이스를 만들고 model과 다른 기본 데이터 정렬을 지정하면 사용자 데이터베이스는 tempdb와 다른 기본 데이터 정렬을 사용합니다. 모든 임시 저장 프로시저 또는 임시 테이블이 만들어지고 tempdb에 저장됩니다. 즉, 임시 테이블의 모든 암시적 열과 임시 저장 프로시저의 모든 강제 변환 가능한 기본 상수, 변수 및 매개 변수에는 영구 테이블 및 저장 프로시저에서 만든 비교 가능한 개체와는 다른 데이터 정렬이 있습니다.

이로 인해 사용자 정의 데이터베이스와 시스템 데이터베이스 개체 간의 데이터 정렬이 일치하지 않는 문제가 발생할 수 있습니다. 예를 들어 SQL Server 인스턴스는 Latin1_General_CS_AS 데이터 정렬을 사용하고 다음 문을 실행합니다.

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;  
USE TestDB;  
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  

이 시스템에서 tempdb 데이터베이스는 코드 페이지 1252와 함께 Latin1_General_CS_AS 데이터 정렬을 사용하고 TestDBTestPermTab.Col1은 코드 페이지 1257과 함께 Estonian_CS_AS 데이터 정렬을 사용합니다. 예시:

USE TestDB;  
GO  
-- Create a temporary table with the same column declarations  
-- as TestPermTab  
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar );  
INSERT INTO #TestTempTab  
         SELECT * FROM TestPermTab;  
GO  

이전 예제에서 tempdb 데이터베이스는 Latin1_General_CS_AS 데이터 정렬을 사용하고 TestDBTestTab.Col1Estonian_CS_AS 데이터 정렬을 사용합니다. 예시:

SELECT * FROM TestPermTab AS a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1;  

tempdb 는 기본 서버 데이터 정렬을 사용하고 TestPermTab.Col1 은 다른 데이터 정렬을 사용하므로 SQL Server는 "같음 작업에서 'Latin1_General_CI_AS_KS_WS'과(와) 'Estonian_CS_AS' 간의 데이터 정렬 충돌을 해결할 수 없습니다"라는 오류를 반환합니다.

오류 방지를 위해 다음 대안 중 하나를 사용할 수 있습니다.

  • 임시 테이블 열에서 tempdb가 아닌 사용자 데이터베이스의 기본 데이터 정렬을 사용하도록 지정합니다. 이렇게 하면 임시 테이블이 시스템에 필요한 경우 여러 데이터베이스에서 비슷한 형식의 테이블로 작업할 수 있습니다.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE database_default  
       );  
    
  • #TestTempTab 열에 올바른 데이터 정렬을 지정합니다.

    CREATE TABLE #TestTempTab  
       (PrimaryKey int PRIMARY KEY,  
        Col1 nchar COLLATE Estonian_CS_AS  
       );  
    

참고 항목

서버 데이터 정렬 설정 또는 변경
데이터베이스 데이터 정렬 설정 또는 변경
데이터 정렬 및 유니코드 지원