2014-01-10 2 views
0

캐스팅 할 때 하나의 값으로 두 개의 다른 값을 얻고 있습니다. nvarcharbinary으로 설정합니다. SQL Server 2008 R2에서 Varchar를 이진으로 변환 하시겠습니까?

는 값 A12875 위해 나는 내가 select 문을 사용하고 때이 얻을 0x4131323837350000000000000000000000000000

같은 결과를 얻고있다. 같은 문이 저장 프로 시저를 실행하면

나는 차이가 무엇 동일한 쿼리

select cast('A12875' as binary(20)) 

을 사용하고이

0x2000410031003200380000000000000000000000 

같은 결과는 무엇입니까? '

+0

'A12785'은 ** 아닙니다 ** NVARCHAR 리터럴 - N'ABC12785 '가됩니다 .... –

답변

1

차이점은 문자 인코딩입니다. 문자 인코딩은 문자를 바이트로 나타내는 방법입니다.

문자는, 당신은, 자신의 유니 코드 코드 포인트는 UTF-8 (또는 라틴-1 또는 ASCII)를 사용하면 얻을 것이다이 문자열을 인코딩하는 데 사용하는 경우

A code point 41 
1 code point 31 
2 code point 32 
8 code point 38 
7 code point 37 
5 code point 35 

, 필드에 패딩 남아 있습니다 20 바이트 :

41 31 32 38 37 35 00 00 ... 00 

하지만 다른 문자 인코딩이 있습니다. 스토어드 프로 시저를 실행할 때 UTF-16LE을 인코딩으로 선택하고 여하튼 공백 문자가 앞에 오게되는 것처럼 보입니다. UTF-16LE의 코드 점 (41)은 일반적 0041 것이기 때문에

41 00 

로 표현되지만 바이트가 반전된다. 그래서 당신은 기대 :

41 00 31 00 32 00 38 00 37 00 35 00 ... 00 00 

공간 문자는 그래서이 20 00로 표현되는 코드 포인트 20입니다. 왜 그들이 공간을 앞에두고 있는지 모르겠다. 리틀 엔디안의 경우 2000이고 빅 엔디안의 경우 0020과 같이 바이트 순서 표시를 만드는 재미있는 방법 일 수 있습니다.

문자가 바이트로 변환 될 때 문자 인코딩을 사용하는 방법을 보려면 SQL Server 설명서를 참조하십시오. 알다시피, 언제든지 문자를 바이트로 변환하려고하면 인코딩을 지정해야합니다. 어쩌면 디폴트가있을 수 있지만 일반적으로 문자 -> 바이트는 인코딩 없이는 의미가 없습니다. 시나리오에서는 서로 다른 두 환경에서 서로 다른 두 가지 기본값을 사용했습니다.

+0

자세한 예제를 사용하여 설명해 주시겠습니까? – Anjali

+0

SQL_Latin1_General_CP1_CI_AS 이것은 내 데이터베이스 인코딩 – Anjali

+0

단순히 NVARCHAR 대신 VARCHAR를 사용할 수 있습니까? 또는 N 접두사를 질문에 주석으로 제안 된대로 사용하여 진정한 varchar를 가지며 조작 된 리터럴을 거부하거나 다른 시스템에 의존하지 않도록합니다. 당신의 문자열이 단순한 VARCHAR 일 수있는 것처럼 보입니다. 어느 쪽이든. –

관련 문제