XML 데이터의 serialization 정의

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

XML 데이터 형식을 명시적으로 또는 암시적으로 SQL 문자열 또는 이진 형식으로 캐스팅하는 경우 이 문서에 설명된 규칙에 따라 xml 데이터 형식의 내용이 serialize됩니다.

Serialization 인코딩

SQL 대상 유형이 VARBINARY인 경우 결과는 UTF-16 바이트 순서 표시가 앞에 표시되어 있지만 XML 선언이 없는 UTF-16으로 직렬화됩니다. 대상 형식이 너무 작으면 오류가 발생합니다.

예시:

select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))

결과는 다음과 같습니다.

0xFFFE3C0094032F003E00

SQL 대상 형식이 NVARCHAR 또는 NCHAR인 경우 결과는 앞에 바이트 순서 표시 없이 XML 선언 없이 UTF-16으로 직렬화됩니다. 대상 형식이 너무 작으면 오류가 발생합니다.

예시:

select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))

결과는 다음과 같습니다.

<Δ/>

SQL 대상 형식이 VARCHAR 또는 CHAR인 경우 결과는 바이트 순서 표시 또는 XML 선언 없이 데이터베이스의 데이터 정렬 코드 페이지에 해당하는 인코딩에서 직렬화됩니다. 대상 형식이 너무 작거나 값을 대상 데이터 정렬 코드 페이지에 매핑할 수 없는 경우 오류가 발생합니다.

예시:

select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))

이로 인해 현재 데이터 정렬의 코드 페이지가 유니코드 문자 5를 나타낼 수 없거나 특정 인코딩에 표시될 경우 오류가 발생할 수 있습니다.

XML 결과를 클라이언트 쪽으로 반환하면 데이터가 UTF-16 인코딩으로 전송됩니다. 그런 다음 클라이언트 쪽 공급자는 해당 API 규칙에 따라 이 데이터를 제공합니다.

XML 구조의 serialization

xml 데이터 형식의 콘텐츠는 일반적인 방식으로 직렬화됩니다. 특히 요소 노드는 요소 태그에 매핑되고 텍스트 노드는 텍스트 콘텐츠에 매핑됩니다. 그러나 문자가 엔터티화되는 상황과 형식화된 원자성 값이 serialize되는 방법은 다음 섹션에서 설명합니다.

serialization 중에 XML 문자의 엔터티화

직렬화된 모든 XML 구조체는 재분석할 수 있어야 합니다. 따라서 일부 문자는 XML 파서의 정규화 단계를 통해 문자의 왕복 기능을 보존할 수 있도록 엔터티화된 방식으로 직렬화되어야 합니다. 그러나 문서가 올바른 형식이므로 구문 분석할 수 있도록 일부 문자를 엔터티화해야 합니다. 다음은 serialization 중에 적용되는 엔터티화 규칙입니다.

  • 특성 값 또는 요소 콘텐츠 내에서 발생하는 경우 문자는 항상 <> 로 엔터티화되며&gt;, 각각에 대해 엔터티화&amp;&lt;됩니다.

  • SQL Server는 특성 값을 묶을 때 따옴표(U+0022)를 사용하기 때문에 특성 값에 있는 따옴표는 &quot;로 엔터티화됩니다.

  • 서로게이트 쌍은 서버에서만 캐스팅할 때 단일 숫자 문자 참조로 엔터티화됩니다. 예를 들어 서로게이트 쌍 U+D800 U+DF00은 숫자 문자 참조 &#x00010300;로 엔터티화됩니다.

  • TAB(U+0009) 및 줄 바꿈(LF, U+000A)이 구문 분석 중에 정규화되지 않도록 보호하려면 해당 숫자 문자 참조 &#x9;&#xA; 특성 값 내에서 각각 엔터티화됩니다.

  • 캐리지 리턴(CR, U+000D)이 구문 분석 중에 정규화되지 않도록 하려면 특성 값과 요소 콘텐츠 모두에서 숫자 문자 참조 &#xD; 로 엔터티화됩니다.

  • 공백만 포함된 텍스트 노드를 보호하기 위해 공백 문자 중 하나(일반적으로 마지막 공백 문자)는 해당 숫자 문자 참조로 엔터티화됩니다. 이러한 방식으로 재분석은 구문 분석 중 공백 처리 설정에 관계없이 공백 텍스트 노드를 유지합니다.

예시:

DECLARE @u NVARCHAR(50)
set @u = N'<a a="
    '+NCHAR(0xD800)+NCHAR(0xDF00)+N'>">   '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));

결과는 다음과 같습니다.

<a a="
    𐌀>">
</a>

마지막 공백 보호 규칙을 적용하지 않으려면 xml에서 문자열 또는 이진 형식으로 캐스팅할 때 명시적 CONVERT 옵션 1을 사용할 수 있습니다. 예를 들어 엔터티화를 방지하려면 다음을 수행할 수 있습니다.

SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a>   </a>', 1), 1);

query() 메서드(xml 데이터 형식)는 xml 데이터 형식 인스턴스를 생성합니다. 따라서 문자열 또는 이진 형식으로 캐스팅되는 메서드의 query() 결과는 앞에서 설명한 규칙에 따라 엔터티화됩니다. 엔터티화되지 않은 문자열 값을 가져오려면 value() 메서드(xml 데이터 형식)를 대신 사용해야 합니다. 다음은 메서드를 사용하는 예제입니다.query()

DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');

결과는 다음과 같습니다.

This example contains an entitized char: .

다음은 메서드를 사용하는 예제입니다.value()

SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');

결과는 다음과 같습니다.

This example contains an entitized char: .

형식화된 xml 데이터 형식 직렬화

형식화된 xml 데이터 형식 항목에는 해당 XML 스키마 유형에 따라 형식화된 값이 포함됩니다. 이러한 값은 xs:string으로 캐스팅된 XQuery와 동일한 형식의 XML 스키마 형식에 따라 직렬화됩니다. 자세한 내용은 XQuery의 형식 캐스팅 규칙을 참조 하세요.

예를 들어 xs:double 값 1.34e1은 다음 예제와 같이 13.4로 직렬화됩니다.

declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));

그러면 문자열 값 13.4가 반환됩니다.

참고 항목