왜 Microsoft SQL Server에서 문자열 앞에 N을 넣어야합니까?


34

T-SQL을 배우고 있습니다. 내가 본 예제에서 varchar()셀에 텍스트를 삽입하기 위해 삽입 할 문자열 만 쓸 수 있지만 nvarchar()셀의 경우 모든 예제에는 문자열 앞에 문자 N이 붙습니다.

nvarchar()행 이있는 테이블에서 다음 쿼리를 시도했지만 제대로 작동하므로 접두사 N이 필요하지 않습니다.

insert into [TableName] values ('Hello', 'World')

내가 본 모든 예제에서 문자열 앞에 N이 붙는 이유는 무엇입니까?

이 접두사를 사용하는 장단점은 무엇입니까?


N은 리터럴 문자열에만 필요하지 않습니까?
웨인 인 야크

폴란드어는 비 라틴어 기반 언어입니다 ????
Heckflosse_230

2
N"National Varying Character"에서와 같이 National을 의미하며 동등한 ANSI SQL 데이터 형식을 참조하십시오 .
ErikE

나는이 질문에 동의하고 지금까지 아무도 대답하지 않았다, AFAICT. " 문자열 리터럴이 ASCII 일 때 SQL이 암시 적으로 my VARCHAR를 변환하게하는 것이 왜 나쁜가 NVARCHAR?"
binki

이 질문은 이미 여기에서 묻고 대답했습니다 : varchar와 nvarchar의 차이점은 무엇입니까?

답변:


27

NVarchar는 유니 코드에 사용됩니다. 데이터베이스가 다국어 데이터를 저장하지 않으면 Varchar를 계속 사용할 수 있습니다. 예를 들어 : N'abc'단순히 문자열을 유니 코드로 변환합니다.


2
그렇다면 N 대신 U를 접두사로 사용하지 않아도되는 이유는 무엇입니까?
Attila Kun

U는 추측으로 서명에 대한 혼동 될 수
JB 왕

U&'abc'유니 코드 문자열을 지정하는 올바른 방법입니다. 참고 항목 SQL 2003 BNF를
ceving

2
N은 실제로 "국가 언어 문자"세트를 나타냅니다.
Mike Bovenlander

23

기본적으로 SQL Server는 varchar에 Windows-1252 문자 코드를 사용합니다 . 라틴어 기반 언어 (영어, 독일어, 프랑스어 등)의 대부분의 문자를 포함하지만 비 라틴어 기반 언어 (폴란드어, 러시아어 등)의 문자는 포함하지 않습니다. @Pieter B에서 언급했듯이 nvarchar는 누락 된 문자가 포함 된 유니 코드 에 대한 것이므로이 문제를 해결하는 데 사용됩니다 . 이것은 비용이 들며, varchar보다 nvarchar를 저장하는 데 두 배의 공간이 필요합니다.

문자열 앞에 N을 넣으면 문자가 nvarchar 열에 배치되기 전에 유니 코드로 변환됩니다. 대부분의 경우 N을 꺼두는 것이 좋지만 권장하지는 않습니다. 미안보다 안전하는 것이 훨씬 낫습니다.


3
간단히 설명하면 : "기본적으로"SQL Server는 Varchar 필드의 데이터 정렬에 해당하는 인코딩을 사용합니다.이 필드는 일반적으로 인스턴스의 기본 데이터 정렬을 기반으로 필드를 만들 때 재정의 할 수 있습니다. 인스턴스의 기본 데이터 정렬은 설치시 설정할 수 있지만 일반적으로 시스템 기본 로캘의 CP_ACP에 해당합니다. 그것은 미국 영어 머신에서는 Windows 1252이지만 일본어 시스템 로케일이있는 머신에서는 932, 러시아 머신에서는 1251입니다. 이야기의 도덕은? NVarchar 사용 :)
JasonTrue

1
지금까지는 "SQL이 암시 적으로 트랜스 코딩하기 때문에 리터럴 문자열에 N 접두사를 사용하는 이유는 무엇입니까?"라는 질문에 대한 유일한 답변입니다. 다른 답변은 "nvarchar와 varchar의 차이점은 무엇입니까?"라는 다른 질문에 대한 것입니다.
Timbo

18

MS SQL Server는 다른 RDBMS에 비해 UTF-8을 제대로 지원하지 않기 때문입니다.

MS SQL Server는 Windows 자체에서 사용되는 "좁은"문자열 ( charC ++ CHAR또는 VARCHARSQL)이 레거시 "코드 페이지" 로 인코딩 되는 규칙을 따릅니다 . 코드 페이지의 문제점은 문자 수가 제한되어 있으며 (대부분은 1 바이트 인코딩으로 보고서를 256 자로 제한 함) 단일 언어 (또는 비슷한 알파벳을 가진 언어 그룹)를 중심으로 설계되었다는 것입니다. 이로 인해 다국어 데이터를 저장하기가 어렵습니다. 예를 들어 러시아어는 코드 페이지 1251 을 사용하고 히브리어는 코드 페이지 1255를 사용 하므로 러시아어 및 히브리어 데이터를 모두 저장할 수 없습니다 .

유니 코드 는 세계의 모든 언어를 표현할 수있을만큼 백만 개 이상의 문자를 수용 할 수있는 공간이있는 하나의 거대한 코드화 된 문자 세트를 사용하여이 문제를 해결합니다. 몇 가지 유니 코드 인코딩 체계가 있습니다. 마이크로 소프트는 사용하는 것을 선호 UTF-16 에 대한 역사적인 이유 . UTF-16은 기존의 8 비트 대신 16 비트 코드 단위 시퀀스로 문자열을 나타내므로 별도의 문자 유형이 필요합니다. MSVC ++에서 이것은입니다 wchar_t. 그리고 MS SQL에서는 NCHAR또는 NVARCHAR입니다. 은 N"국가"의 약자 유니 코드에 대해 때문에 나에게 뒤로 보이는, -nationalization하지만은 ISO 용어입니다.

다른 SQL 구현에서는 UTF-8 텍스트를 VARCHAR열에 저장할 수 있습니다 . UTF-8은 가변 길이 (문자 당 1-4 바이트) 인코딩으로 데이터가 대부분 기본 라틴 범위 (ASCII와 문자 당 1 바이트로 표시됨) 인 경우에 최적화되어 있지만 모든 유니 코드 문자 따라서 bwalk2895에서 언급 한 "두 배의 공간"문제를 피할 수 있습니다.

불행히도 MS SQL Server 는 UTF-8을 지원하지 않으므로VARCHAR 대신 UTF-16을 사용하고 (ASCII 텍스트를위한 공간을 낭비) 유니 코드가 아닌 코드 페이지를 사용하고 외래 문자를 표현할 수있는 능력을 상실해야합니다. 또는 UTF-8을 BINARY열에 저장하십시오 (SQL 문자열 함수가 제대로 작동하지 않거나 GUI DB 관리자에서 데이터를 16 진 덤프로보아야하는 것과 같은 불편을 처리 함 ).


1
SQL Server 2012 이전 버전에서는 UCS-2 인코딩 (2 바이트)을 사용합니다. 최신 버전에서는 문자 당 4 바이트 (UTF-8과 유사하지만 2 바이트에서 시작)에 가변 길이 맵핑되는 UTF-16을 사용하고 있습니다.
j123b567
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.