2016-12-12 8 views
3

이것은 내 머리를 감싸는 순수한 이론적 인 질문이다.varchar 열에 정렬되지 않은 유니 코드 (UTF-16) 데이터는 어떻게 저장됩니까?

나는 Unicode 사이클론 (1F300) 기호를 가지고 있다고 가정 해 보자.

    : 나는 기본적 Latin1_General_CI_AS 정렬을 사용 varchar 컬럼에 저장하려고하면, 사이클론 기호 내가이 짓을 볼 수 있습니다

    방법을 varchar에 기호에 따라 사용되는 한 바이트 ...에 맞지 않을 수 없습니다

  1. 자바 스크립트는 기본 평면 (BMP)의 기호에서 2 기호 (서로 게이트 쌍)로 저장하는 기호와 같습니다. put them back together ...
  2. 기호를 자르고 첫 번째 바이트를 저장하고 두번째 .... (데이터는 토스트입니다 - 설명서를 읽었어야합니다 ....)
  3. 데이터가 파괴되어 사용법이 저장되지 않습니다. (데이터는 토스트입니다 - 매뉴얼을 읽어야합니다 ....)
  4. 내 정신 능력 밖에있는 다른 옵션 .....

나는 다른 유니 코드 문자

INSERT INTO [Table] (Field1) 
VALUES ('') 

INSERT INTO [Table] (Field1) 
VALUES ('') 

의 몇 가지를 삽입하고 내가 0x3F3F 가지고 두 경우 모두 바이트 SELECT cast (field1 as varbinary(10))로를 읽은 후 몇 가지 조사를 수행했다. ascii에서

enter image description here

3F 정상적인 일을 select *는 그 데이터가 토스트하고도 1 바이트가 저장되어 있지 의미합니까 때 나는 또한 볼 ? (question mark) 예 : 두 개의 물음표 (??)인가?

varchar 열에 정렬이 아닌 유니 코드 데이터가 저장되는 방식은 무엇입니까?

답변

4

데이터는 토스트이며 정확하게 2 x 0x3F 바이트입니다. 이것은 삽입 이전에 유형 변환 중에 발생하며 실질적으로 cast('' as varbinary(2))과 0xF3F3이 동일합니다 (주조 N''과 반대).

유니 코드 데이터를 유니 코드가 아닌 열에 삽입해야하는 경우 열은 WideCharToMultiByte API와 데이터 정렬과 관련된 코드 페이지를 사용하여 유니 코드에서 내부적으로 변환됩니다. 주어진 코드 페이지에서 문자를 나타낼 수 없으면 문자는 물음표 (?) Ref으로 바뀝니다.

+1

안녕하세요, Alex, 답변 해 주셔서 감사합니다. 나는 왜''대신''??''이 부상, 폭력에 대한 모욕처럼 느껴지는지 궁금합니다. –

1

예 데이터가 없어졌습니다.

VarcharNVarchar에 비해 공간이 적습니다. 그러나 이러한 비용 절감에는 비용이 따릅니다. Varchar가 유니 코드 문자를 저장할 공간이 없습니다 (문자 당 1 바이트에서 내부 조회만으로는 충분하지 않습니다). Microsoft's Developer Network에서

:

... 문자 변환 문제를 최소화하기 위해 유니 코드 NCHAR 또는 NVARCHAR 데이터 유형을 사용하는 것이 좋습니다.

지원되는 문자는 물음표로 표시됩니다.

+0

크기가 문제가 아닙니다. 유형의 정의와 동작, 특히 암시 적 변환입니다. nchar은 하나의 UTF-16 코드 단위입니다. 일부 유니 코드 코드 포인트는 하나, 두 개가 필요합니다. 일부 데이터베이스 시스템은 유니 코드로 UTF-8로 저장할 수 있습니다. 코드 포인트에는 1, 2, 3 또는 4 개의 8 비트 코드 단위가 필요합니다. –