nvarchar (max) vs NText


183

SQL Server에서 nvarchar(max)vs. NText데이터 형식 을 사용할 때의 장단점은 무엇입니까 ? 이전 버전과의 호환성이 필요하지 않으므로 nvarchar(max)이전 SQL Server 릴리스에서 지원되지 않는 것이 좋습니다.

편집 : 분명히 문제도 적용 TEXT하고 IMAGEvarchar(max)하고 varbinary(max)나중에 그 데이터 유형에 대한 그 검색을 위해.

답변:


197

장점은 같은 기능을 사용할 수 있습니다 LENLEFTnvarchar(max)당신이 그 상대로 할 수 없습니다 ntexttext. 사용했던 곳 nvarchar(max)보다 작업하기가 더 쉽습니다.textWRITETEXTUPDATETEXT.

또한 text, ntext등이 중단되고 ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016은 분명히 여전히 지원할 것입니다.
합류

1
@Confluence 역사적으로, text 및 nText가 SQL Server에 존재하는 한 varchar 및 nvarchar보다 오래된 데이터 형식입니까?
RBT

WRITETEXT 및 UPDATETEXT를 사용하지 않아도됩니다. 아마 2010 년에 당신은 해냈습니다! 추가 정보가 필요합니다.
Simon_Weaver

38

VARCHAR(MAX)TEXT필드 를 수용하기에 충분히 큽니다 . TEXT, NTEXTIMAGESQL 서버 2000의 데이터 형식은 SQL Server의 향후 버전에서 SQL Server 2005의 데이터 유형에 대한 이전 버전과의 호환성을 제공을 더 이상 사용되지 않습니다 있지만있는 새로운 데이터 유형을 사용하는 것이 좋습니다 VARCHAR(MAX), NVARCHAR(MAX)그리고 VARBINARY(MAX).


32

ntext데이터는 항상 별도의 데이터베이스 페이지 nvarchar(max)에 저장되는 반면 데이터베이스 레코드 자체 내에 데이터를 저장하려고합니다.

그래서 nvarchar(max) 약간 더 빠릅니다 (텍스트가 8kB보다 작은 경우). 또한 데이터베이스 크기가 약간 느리게 증가한다는 것을 알았습니다.

간다 nvarchar(max).


13

nvarchar(max)당신이 사용하고 싶은 것입니다. 가장 큰 장점은이 데이터 유형에서 모든 T-SQL 문자열 함수를 사용할 수 있다는 것입니다. 에서는 사용할 수 없습니다 ntext. 나는 실제 단점을 알지 못한다.


내가 이해하지 못하는 것은 그들이 함께 가겠다 고 말하지만 nvarchar(max)4000 자로 제한한다는 것입니다. 필드가 그 이상을 유지하려면 어떻게해야합니까?
VoidKing

2
nvarchar (max)는 4000 자로 제한되지 않습니다. 글자 수는 무제한입니다. 또한 SQL Server에서는 text 및 ntext를 더 이상 사용하지 않습니다. 이는 향후 버전에서 더 이상 지원되지 않을 것임을 의미합니다.
랜디 마인더

OIC, SQL Server CE를 사용하고 있는데 nvarchar(max)4000자를 제한 합니다. 따라서 SQL Server Compact의 ntext경우 어떤 경우에는 사용할 수밖에 없습니다 . 그들이 중단하면 일부 사이트를 업그레이드하지 않아도됩니다.
VoidKing

1
@RandyMinder nvarchar (max)는 무제한 저장 공간이 아닙니다. SQL Server 문서에 따르면 "max는 최대 저장소 크기가 2 ^ 31-1 바이트 (2GB)임을 나타냅니다. 저장소 크기 (바이트)는 입력 한 데이터의 실제 길이 + 2 바이트의 두 배입니다."
Shiv


4

의 가장 큰 단점 Text(함께 NText하고 Image)이하는 것과 같이 SQL Server의 이후 버전에서 제거 될 것입니다 문서 . 그러면 해당 버전의 SQL Server가 릴리스 될 때 스키마를 효과적으로 업그레이드하기가 더 어려워집니다.


3

전환에 대한 경험을 추가하고 싶었습니다. text고대 Linq2SQL 코드 에는 많은 필드 가있었습니다 . 이것은 text인덱스에있는 열을 온라인 으로 재 구축 할 수 있도록 하기위한 것 입니다.

먼저 몇 년 동안의 이점에 대해 알고 있었지만 항상 변환은 SQL Server가 테이블을 다시 작성하고 모든 것을 복사하여 웹 사이트를 중단시키고 내 심박수를 올리는 무서운 긴 쿼리를 의미한다고 가정했습니다.

Linq2SQL이 열 유형에 대해 일종의 확인을 수행하는 경우 오류가 발생할 수 있다고 우려했습니다.

그러나 ALTER 명령이 즉시 반환되었으므로 테이블 메타 데이터 만 변경하고 있다는 사실 만보고하면 좋을 것입니다. <8000 자 데이터를 다시 테이블로 가져 오는 오프라인 작업이있을 수 있지만 ALTER 명령은 즉시 수행되었습니다.

변환이 필요한 모든 열을 찾으려면 다음을 실행했습니다.

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

이것은 나에게 좋은 쿼리 목록을 주며 방금 선택하여 새 창에 복사했습니다. 내가 말했듯이-이것은 즉시 실행되었습니다.

여기에 이미지 설명을 입력하십시오

Linq2SQL은 매우 고대입니다. 테이블을 끌어 오는 디자이너를 사용합니다. EF 코드의 경우 상황이 더 복잡 할 수 있지만 아직 다루지 않았습니다.


1

데이터 유형 에 부분 또는 전체 업데이트 및 고성능 추가에 .WRITE 절을 사용할 수 있다고 덧붙이고 싶습니다 varchar(max)/nvarchar(max).

여기 에서 using .WRITE절의 전체 예를 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.