nvarchar (tối đa) so với NText


183

Những lợi thế và bất lợi của việc sử dụng các loại dữ liệu nvarchar(max)so với NTextSQL Server là gì? Tôi không cần khả năng tương thích ngược, vì vậy nvarchar(max)sẽ không được hỗ trợ trong các bản phát hành SQL Server cũ hơn.

Chỉnh sửa: Rõ ràng câu hỏi cũng áp dụng cho TEXTIMAGEso với varchar(max)varbinary(max), đối với những người tìm kiếm các loại dữ liệu đó sau này.

Câu trả lời:


197

Ưu điểm là bạn có thể sử dụng các chức năng như LENLEFTbật nvarchar(max)và bạn không thể làm điều đó chống lại ntexttext. Nó cũng dễ làm việc nvarchar(max)hơn so với textnơi bạn phải sử dụng WRITETEXTUPDATETEXT.

Ngoài ra, text, ntext, vv đang được tán thành ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016 rõ ràng vẫn sẽ hỗ trợ họ.
Hợp lưu

1
@Confluence Trong lịch sử, văn bản và nText kiểu dữ liệu cũ hơn varchar và nvarchar có liên quan đến sự tồn tại của chúng trong SQL Server không?
RBT

Bạn KHÔNG phải sử dụng WRITETEXT và UPDATETEXT. Có lẽ trong năm 2010 bạn đã làm! Quan tâm cho bất kỳ thông tin thêm.
Simon_Weaver

38

VARCHAR(MAX)là đủ lớn để chứa TEXTtrường. TEXT, NTEXTIMAGEkiểu dữ liệu của SQL Server 2000 sẽ hết hạn vào phiên bản tương lai của SQL Server, SQL Server 2005 cung cấp khả năng tương thích ngược với các loại dữ liệu nhưng nó được khuyến khích sử dụng các loại dữ liệu mới đó là VARCHAR(MAX), NVARCHAR(MAX)VARBINARY(MAX).


32

ntextsẽ luôn lưu trữ dữ liệu của nó trong một trang cơ sở dữ liệu riêng biệt, trong khi nvarchar(max)sẽ cố gắng lưu trữ dữ liệu trong chính bản ghi cơ sở dữ liệu.

Vì vậy, nvarchar(max)có phần nhanh hơn (nếu bạn có văn bản nhỏ hơn 8 kB). Tôi cũng nhận thấy rằng kích thước cơ sở dữ liệu sẽ tăng chậm hơn một chút, điều này cũng tốt.

Go nvarchar(max).


13

nvarchar(max)là những gì bạn muốn được sử dụng. Ưu điểm lớn nhất là bạn có thể sử dụng tất cả các hàm chuỗi T-SQL trên kiểu dữ liệu này. Điều này là không thể với ntext. Tôi không nhận thức được bất kỳ nhược điểm thực sự.


Điều tôi không hiểu là họ nói đi cùng nvarchar(max)nhưng điều đó giới hạn tôi tới 4000 ký tự. Nếu tôi muốn một lĩnh vực chứa nhiều hơn thế thì sao?
VoidKing

2
nvarchar (tối đa) không giới hạn bạn tới 4000 ký tự. Bạn có một số lượng không giới hạn các ký tự. Ngoài ra, văn bản và ntext đã bị SQL Server phản đối. Điều này có nghĩa là trong phiên bản tương lai, chúng sẽ không còn được hỗ trợ.
Randy Minder 19/12/13

OIC, tôi đang sử dụng SQL Server CE, điều này giới hạn nvarchar(max)tới 4000 ký tự của tôi . Vì vậy, đối với SQL Server Compact, tôi không có lựa chọn nào khác ngoài sử dụng ntexttrong một số trường hợp. Khi họ ngừng sử dụng, tôi cho rằng tôi sẽ không phải nâng cấp một số trang web.
VoidKing

1
@RandyMinder nvarchar (max) không phải là bộ nhớ không giới hạn. Theo tài liệu của SQL Server "max chỉ ra rằng kích thước lưu trữ tối đa là 2 ^ 31-1 byte (2 GB). Kích thước lưu trữ, tính bằng byte, gấp hai lần chiều dài thực tế của dữ liệu được nhập + 2 byte."
Shiv


4

Nhược điểm lớn nhất của Text(cùng với NTextImage) là nó sẽ bị xóa trong phiên bản tương lai của SQL Server, như tài liệu hướng dẫn . Điều đó sẽ làm cho lược đồ của bạn khó nâng cấp hơn khi phiên bản SQL Server đó được phát hành.


3

Muốn thêm kinh nghiệm của tôi với chuyển đổi. Tôi đã có nhiều textlĩnh vực trong mã Linq2Query cổ đại. Điều này là để cho phép textcác cột có trong chỉ mục được xây dựng lại TRỰC TUYẾN .

Trước tiên tôi đã biết về lợi ích trong nhiều năm, nhưng luôn cho rằng việc chuyển đổi có nghĩa là một số truy vấn dài đáng sợ trong đó SQL Server sẽ phải xây dựng lại bảng và sao chép mọi thứ, đưa trang web của tôi xuống và nâng cao tâm trạng của tôi.

Tôi cũng lo ngại rằng Linq2Query có thể gây ra lỗi nếu nó đang thực hiện một số loại xác minh loại cột.

Mặc dù vậy, rất vui khi báo cáo rằng các lệnh ALTER trả về NGAY LẬP TỨC - vì vậy chúng chắc chắn chỉ thay đổi siêu dữ liệu bảng. Có thể có một số công việc ngoại tuyến xảy ra để đưa <8000 dữ liệu ký tự trở lại trong bảng, nhưng lệnh ALTER là ngay lập tức.

Tôi đã chạy như sau để tìm tất cả các cột cần chuyển đổi:

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

Điều này đã cho tôi một danh sách các truy vấn đẹp, mà tôi vừa chọn và sao chép vào một cửa sổ mới. Như tôi đã nói - chạy cái này ngay lập tức.

nhập mô tả hình ảnh ở đây

Linq2Query khá cổ xưa - nó sử dụng một nhà thiết kế mà bạn kéo các bảng lên. Tình hình có thể phức tạp hơn đối với Mã EF trước tiên nhưng tôi vẫn chưa giải quyết được.


1

Tôi muốn thêm rằng bạn có thể sử dụng mệnh đề .WRITE cho các cập nhật một phần hoặc toàn bộ và hiệu suất cao bổ sung cho varchar(max)/nvarchar(max)các loại dữ liệu.

Ở đây bạn có thể tìm thấy ví dụ đầy đủ của việc sử dụng .WRITEmệnh đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.