서로 다른 데이터 정렬 간의 데이터 복사
Microsoft SQL Server의 유니코드 열 사이에서는 데이터를 변환하지 않고 원활하게 이동할 수 있습니다. 하지만 유니코드가 아닌 문자 데이터를 포함하는 열 간에 데이터를 이동하려면 원본 코드 페이지에서 대상 코드 페이지로 변환해야 합니다. 코드 페이지는 지정한 스크립트의 각 문자와 연결된 숫자 인덱스 또는 코드 포인트 값을 정렬한 문자 집합입니다. 코드 페이지는 서로 다른 Microsoft Windows 로캘에서 사용하는 문자 집합 및 키보드 레이아웃을 지원합니다. 지원되는 코드 페이지 목록은 코드 페이지 아키텍처를 참조하십시오.
기본적으로 문자 데이터는 다음 방식으로 변환됩니다.
연산 |
다음으로 문자 데이터 변환 |
---|---|
내보내기 |
OEM 코드 페이지 문자 |
가져오기 |
ANSI/Microsoft Windows 코드 페이지 문자 |
OEM과 ANSI 코드 페이지 간 변환 시 확장 또는 DBCS(더블바이트 문자 집합) 문자는 손실됩니다. SQL Server에서 이런 변환을 방지하려면 코드 페이지를 지정하거나 데이터 정렬을 지정합니다.
[!참고]
데이터베이스를 특정 데이터 정렬에서 다른 데이터 정렬로 전송하는 방법은 Microsoft 웹 사이트를 참조하십시오.
SQL Server 7.0 이후 버전에서는 문자열의 물리적 저장소를 컬렉션으로 제어합니다. 데이터 정렬 설정은 서버 인스턴스, 데이터베이스, 테이블 열 및 식 등 4가지 수준의 데이터 정렬 설정을 지원합니다. 데이터 정렬은 다음 3가지 속성을 지정합니다.
비유니코드 문자 데이터를 저장하는 데 사용하는 코드 페이지
유니코드 데이터 형식(nchar, nvarchar, 및 ntext)에 사용할 정렬 순서. 정렬 순서는 문자를 정렬하는 순서와 비교 연산 시 문자를 평가하는 방법을 지정합니다.
비유니코드 문자 데이터 형식(char, varchar, 및 text)에 사용할 정렬 순서
[!참고]
서식 파일의 각 열에 대해 데이터 정렬 이름을 지정하는 것이 좋습니다.
코드 페이지 및 데이터 정렬에 대한 소개는 데이터 정렬 및 유니코드 지원을 참조하십시오. 자세한 내용은 데이터 정렬 작업을 참조하십시오.
열 수준 데이터 정렬 사용
SQL Server 7.0 이상 버전에서 대량 내보내기를 수행할 때는 데이터를 저장할 대상 데이터 파일 필드의 데이터 정렬을, 대량 가져오기를 수행할 때는 데이터를 저장할 대상 테이블 열의 데이터 정렬을 지정하여 데이터 변환을 제어할 수 있습니다. 데이터 파일의 데이터 정렬과 데이터베이스 내 테이블 열의 데이터 정렬 간에 필요한 모든 변환은 가져오기 또는 내보내기 작업에 의해 내부적으로 수행됩니다.
[!참고]
SQL Server 7.0 이상에서는 코드 페이지 지정이 지원되지만 서식 파일에 데이터 정렬을 지정하는 것이 더 좋습니다.
대량 가져오기 및 대량 내보내기 작업 시 데이터 정렬은 항상 SQLCHAR 열에 적용됩니다. SQLCHAR 또는 SQLNCHAR가 호스트 데이터 형식으로 지정되지 않은 열에 대해서는 열 데이터 정렬 지정이 항상 무시됩니다. 데이터 정렬은 대량 가져오기 작업 시 ORDER 힌트에서 참조되는 SQLCHAR 및 SQLNCHAR 열의 정렬 순서를 결정하는 데 사용됩니다.
데이터 정렬을 지정하려면 서식 파일을 사용해야 합니다. 두 서식 파일 형식 모두 열 수준의 데이터 정렬 지정을 지원합니다. 비 XML 서식 파일에서 데이터 정렬을 사용하는 방법은 다음 섹션 "비 XML 서식 파일에서 열 수준 데이터 정렬 지정"을 참조하십시오. XML 서식 파일에서 데이터 정렬을 사용하는 방법은 XML 서식 파일 이해를 참조하십시오.
비 XML 서식 파일에서 열 수준 데이터 정렬 지정
비 XML 서식 파일의 마지막 열(서수 위치 8인 열)에는 해당 열의 데이터가 데이터 파일에 저장되는 방식을 정의하는 데이터 정렬 지정이 있습니다. 데이터 정렬 열 옵션은 다음과 같습니다.
옵션 |
설명 |
---|---|
name |
데이터 파일에 데이터를 저장하는 데 사용하는 데이터 정렬의 이름을 지정합니다. SQL 데이터 정렬 이름 목록은 SQL Server 데이터 정렬 이름(Transact-SQL)을 참조하십시오. |
RAW |
명령의 코드 페이지 옵션 또는 bcp_control BCPFILECP 힌트에서 지정한 코드 페이지에 데이터가 저장됨을 지정합니다. 아무것도 지정하지 않으면 클라이언트 컴퓨터의 OEM 코드 페이지의 데이터 정렬이 데이터 파일의 데이터 정렬로 사용됩니다.
참고
코드 페이지 옵션에 대한 자세한 내용은 이 항목 뒷부분의 "코드 페이지 사용"을 참조하십시오. BCPFILECP 힌트에 대한 자세한 내용은 bcp_control을 참조하십시오.
|
"" |
RAW와 같은 의미입니다. |
예
다음 예에서는 필드 2와 3에 열 데이터 정렬이 지정된 비 XML 서식 파일을 보여 줍니다. 데이터 정렬 정보는 굵게 표시되어 있습니다.
9.0
4
1 SQLCHAR 0 7 "\t" 1 DepartmentID ""
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "\t" 3 GroupName SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 24 "\r\n" 4 ModifiedDate ""
[!참고]
이 서식 파일은 AdventureWorks2008R2 예제 데이터베이스의 HumanResources.Department 테이블을 위한 것으로, 이 테이블에는 DepartmentID, Name, GroupName 및 ModifiedDate의 4개 열이 있습니다.
비 XML 형식 파일에 대한 자세한 내용은 비 XML 서식 파일 이해를 참조하십시오.
코드 페이지 사용
[!참고]
데이터 변환을 제어하려면 대량 내보내기 또는 대량 가져오기 작업의 열 수준 데이터 정렬 지정에 서식 파일을 사용하는 것이 좋습니다. 자세한 내용은 을 참조하십시오. 이전 섹션 "열 수준 데이터 정렬 사용"을 참조하십시오.
코드 페이지 지정 구문은 다음과 같습니다.
bcp 명령에 코드 페이지를 지정하려면 -C 스위치를 사용합니다.
-C { ACP | OEM | RAW | code_page }
BULK INSERT 또는 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문에 코드 페이지를 지정하려면 CODEPAGE 옵션을 사용합니다.
CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }
-C 스위치와 CODEPAGE 옵션은 모두 다음 코드 페이지 값을 사용합니다.
코드 페이지 값 |
설명 |
---|---|
ACP |
가져오기 작업 중 char, varchar 또는 text 데이터 형식의 데이터 필드를 ANSI/Windows 코드 페이지(ISO 1252)에서 SQL Server 코드 페이지로 변환하도록 지정합니다. 내보내기 작업 중 bcp가 이러한 열을 SQL Server 코드 페이지에서 ANSI/Windows 코드 페이지로 변환하도록 지정합니다. |
OEM(기본값) |
가져오기 작업 중 char, varchar 또는 text 데이터 형식의 데이터 필드를 시스템 OEM 코드 페이지에서 SQL Server 코드 페이지로 변환하도록 지정합니다. 내보내기 작업 중 bcp가 이러한 열을 SQL Server 코드 페이지에서 시스템 OEM 코드 페이지로 변환하도록 지정합니다. |
RAW |
코드 페이지 간 변환이 일어나지 않습니다. 가장 빠른 옵션입니다. |
code_page |
특정 코드 페이지 번호(예: 850)입니다. 지원되는 코드 페이지 목록은 코드 페이지 아키텍처를 참조하십시오. |
예
다음 예에서는 AdventureWorks2008R2 데이터베이스의 HumanResources.myTeam 테이블을 사용합니다. 예를 실행하려면 이 테이블을 만들어야 합니다. 테이블에 대한 내용과 테이블을 만드는 방법은 HumanResources.myTeam 테이블 만들기를 참조하십시오.
[!참고]
기본 키 충돌을 방지하려면 다음 예를 실행하기 전에 myTeam 테이블에서 기존 행을 삭제해야 합니다.
1. bcp에서 코드 페이지 사용
이 예에서는 bcp에서 코드 페이지 850을 사용하여 AdventureWorks2008R2 데이터베이스의 HumanResources.myTeam 테이블 데이터를 myTeam850.txt 데이터 파일로 대량으로 내보냅니다. Windows 명령 프롬프트에서 다음을 입력합니다.
bcp AdventureWorks2008R2.HumanResources.myTeam out myTeam850.txt -c -C850 -T
2. BULK INSERT에서 코드 페이지 사용
이 예에서는 BULK INSERT를 사용하여 이전 bcp 예에서 만든 myTeam850.txt를 대량 가져오기를 수행하여 AdventureWorks2008R2HumanResources.myTeam 테이블로 가져옵니다.
SQL Server Management Studio 쿼리 편집기 같은 쿼리 도구에서 다음을 실행합니다.
USE AdventureWorks2008R2;
GO
DELETE HumanResources.myTeam;
GO
BULK INSERT HumanResources.myTeam
FROM 'C:\myTeam850.txt'
WITH (CODEPAGE = 850);
GO
서로 다른 데이터 정렬 간 데이터 대량 내보내기
대량 내보내기 작업에서 데이터 정렬 지정은 문자 데이터를 데이터 파일에 저장하는 데 사용되는 코드 페이지를 제어합니다. 다음은 적용되는 대상입니다.
문자 형식 데이터 파일의 모든 열
SQLCHAR가 호스트 파일 데이터 형식으로 지정된 기본 모드 파일의 모든 열
값이 127보다 크거나 32보다 작은 SQLCHAR 문자
32부터 127까지의 값을 가진 문자에 데이터 정렬이 적용되지만 모든 코드 페이지가 32부터 127까지의 값에 같은 문자를 매핑하므로 다른 데이터 정렬을 적용해도 효과가 없습니다.
대량 내보내기 작업에 어떤 데이터 정렬 또는 코드 페이지가 사용되었는지 확인하는 규칙은 다음과 같습니다.
서식 파일이나 ODBC bcp_setcolfmt 함수(bcp_setcolfmt)를 사용하여 열 데이터 정렬을 지정한 경우 데이터 정렬과 연관된 ANSI 코드 페이지를 사용하여 문자 데이터를 저장합니다.
열 데이터 정렬을 지정하지 않았으나 명령의 code-page 옵션 또는 bcp_control BCPFILECP 힌트로 코드 페이지를 지정한 경우 이 코드 페이지를 사용하여 열 데이터 정렬이 지정되지 않은 모든 열의 SQLCHAR 데이터를 저장합니다.
[!참고]
코드 페이지 옵션에 대한 자세한 내용은 이 항목 앞부분의 "코드 페이지 사용"을 참조하십시오. BCPFILECP 힌트에 대한 자세한 내용은 bcp_control을 참조하십시오.
데이터 정렬과 코드 페이지를 모두 지정하지 않으면 SQLCHAR 데이터는 클라이언트 컴퓨터의 OEM 코드 페이지를 사용하여 저장됩니다.
[!참고]
데이터 정렬/코드 페이지에 대한 정보는 데이터 파일에 저장되지 않습니다.
서로 다른 데이터 정렬 간 데이터 대량 가져오기
대량 가져오기 작업에서 코드 페이지 해석은 데이터 파일에 문자 형식 SQLCHAR 데이터로 저장된 열에만 적용됩니다. 문자 형식 데이터 파일에서 모든 열은 SQLCHAR로 저장됩니다. 데이터 정렬/코드 페이지에 대한 정보는 데이터 파일에 저장되지 않으므로 대량 가져오기 작업 시 데이터 필드의 데이터 정렬/코드 페이지에 대한 정보를 제공해야 합니다.
대량 가져오기 작업에 어떤 데이터 정렬 또는 코드 페이지가 사용되었는지 확인하는 규칙은 다음과 같습니다.
서식 파일이나 ODBC bcp_setcolfmt 함수(bcp_setcolfmt)를 사용하여 열 데이터 정렬을 지정한 경우 지정된 열 데이터 정렬과 연관된 ANSI 코드 페이지를 사용하여 데이터 파일의 SQLCHAR 데이터를 해석합니다. 지정한 데이터 정렬이 데이터 파일의 데이터 정렬과 일치하는지 확인하십시오.
열 정렬을 지정하지 않았으나 명령의 code-page 옵션 또는 bcp_control BCPFILECP 힌트로 코드 페이지를 지정한 경우 이 코드 페이지를 사용하여 SQLCHAR 데이터를 해석합니다.
[!참고]
코드 페이지 옵션에 대한 자세한 내용은 이 항목 앞부분의 "코드 페이지 사용"을 참조하십시오. BCPFILECP 힌트에 대한 자세한 내용은 bcp_control을 참조하십시오.
데이터 정렬과 코드 페이지를 모두 지정하지 않으면 클라이언트 컴퓨터의 OEM 코드 페이지를 사용하여 SQLCHAR 열의 데이터를 해석합니다.
대량 가져오기 작업의 데이터 정렬 지정은 다음 사항에 영향을 줍니다.
작업이 데이터 파일에 있는 SQLCHAR 열의 코드 페이지를 해석하는 방법
bcp 또는 BULK INSERT에서 ORDER 힌트를 적용하는 방법(지정된 경우)
ORDER 힌트를 사용할 경우 대량 가져오기 작업은 ORDER 힌트의 올바른 해석을 위해 데이터 정렬을 사용합니다. 이 힌트는 SQLCHAR 및 SQLNCHAR 열에 적용됩니다. ORDER 힌트가 참조한 열의 데이터는 이러한 열에 매핑된 데이터 정렬에 의해 정의된 순서와 같아야 합니다. 자세한 내용은 데이터 대량 가져오기 중 정렬 순서 제어를 참조하십시오.