다음을 통해 공유


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

테이블의 특정 열에 대해 다른 데이터 정렬을 지정함으로써 char, varchar, text, nchar, nvarchar, 및 ntext 데이터에 대한 데이터베이스 데이터 정렬을 재정의할 수 있으며, 이를 위해 다음 중 하나를 사용할 수 있습니다.

  • CREATE TABLEALTER TABLE의 COLLATE 절입니다. 다음은 그 예입니다.

    CREATE TABLE dbo.MyTable  
      (PrimaryKey   int PRIMARY KEY,  
       CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  
      );  
    GO  
    ALTER TABLE dbo.MyTable ALTER COLUMN CharCol  
                varchar(10)COLLATE Latin1_General_CI_AS NOT NULL;  
    GO  
    
  • SQL Server Management Studio. 자세한 내용은 데이터 정렬 및 유니코드 지원을 참조하세요.

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

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

  • 계산된 열

  • 인덱스

  • 자동으로 또는 CREATE STATISTICS 문에 의해 생성된 배포 통계

  • CHECK 제약 조건

  • 외래 키 제약 조건

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

데이터 정렬 및 텍스트 열

기본 데이터 정렬의 코드 페이지와 다른 데이터 정렬을 가진 열에 값을 text 삽입하거나 업데이트할 수 있습니다. 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  
       );  
    

또한 참조하십시오

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