Viết sự khác biệt giữa varchar và nvarchar


59

Hiện tại trong cơ sở dữ liệu SQL Server 2012 của chúng tôi, chúng tôi đang sử dụng varcharvà chúng tôi muốn thay đổi điều đó nvarchar. Tôi đã tạo một kịch bản để làm điều đó.

Câu hỏi của tôi là có sự khác biệt nào trong cách SQL Server ghi vào varcharcột so với nvarcharcột không? Chúng tôi có một số thủ tục phụ trợ mà tôi quan tâm.

Chỉnh sửa:
Không chắc chắn nếu điều này có ích, nhưng các cột không có chỉ mục, f / k hoặc các ràng buộc đối với chúng.


Câu trả lời:


46

Bạn cần chắc chắn rằng bạn có tiền tố chuỗi ký tự Unicode với tiền tố N. Ví dụ: những thứ này sẽ hoạt động khác nhau nếu kiểu dữ liệu cơ bản là NVARCHAR:

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

Các kết quả:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

Đối với những người trên thiết bị di động hoặc trình duyệt decrepit hiển thị các ký tự hộp thay vì các ký tự Unicode thực tế, đây là giao diện:

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


37

Mối quan tâm lớn nhất là nvarcharsử dụng 2 byte cho mỗi ký tự, trong khi varcharsử dụng 1. Do đó, nvarchar(4000)sử dụng cùng một dung lượng lưu trữ như varchar(8000)*.

Ngoài tất cả dữ liệu nhân vật của bạn cần gấp đôi dung lượng lưu trữ, điều này cũng có nghĩa là:

  • Bạn có thể phải sử dụng nvarcharcác cột ngắn hơn để giữ các hàng trong giới hạn hàng 8060 byte / giới hạn cột ký tự 8000 byte.
  • Nếu bạn đang sử dụng nvarchar(max)các cột, chúng sẽ bị đẩy ra khỏi hàng sớm hơn varchar(max).
  • Bạn có thể phải sử dụng nvarcharcác cột ngắn hơn để nằm trong giới hạn khóa chỉ mục 900 byte (Tôi không biết tại sao bạn muốn sử dụng khóa chỉ mục lớn như vậy, nhưng bạn không bao giờ biết).

Ngoài ra, làm việc với nvarcharkhông có nhiều khác biệt, giả sử phần mềm máy khách của bạn được xây dựng để xử lý Unicode. SQL Server sẽ chuyển đổi một cách trong suốt varcharsang một nvarchar, vì vậy bạn không cần phải có tiền tố N cho các chuỗi ký tự trừ khi bạn đang sử dụng các ký tự 2 byte (tức là Unicode) theo nghĩa đen. Hãy lưu ý rằng việc đúc nvarcharđể varbinarymang lại kết quả khác so với thực hiện tương tự varchar. Điểm quan trọng là bạn sẽ không phải thay đổi ngay lập tức mọi nghĩa đen thành một chữ nvarchar để giữ cho ứng dụng hoạt động, giúp dễ dàng xử lý.

* Nếu bạn sử dụng nén dữ liệu (nén hàng nhẹ là đủ, Phiên bản doanh nghiệp được yêu cầu trước SQL Server 2016 SP1 ), bạn thường sẽ tìm ncharnvarcharkhông tốn nhiều dung lượng hơn charvarchardo nén Unicode (sử dụng thuật toán SCSU) .


17

Hãy suy nghĩ sau đây là những khác biệt chính:

  1. Nvarchar lưu trữ dữ liệu UNICODE. Nếu bạn có yêu cầu lưu trữ dữ liệu UNICODE hoặc đa ngôn ngữ, nvarchar là lựa chọn. Varchar lưu trữ dữ liệu ASCII và nên là loại dữ liệu bạn chọn để sử dụng bình thường.
  2. Về việc sử dụng bộ nhớ, nvarchar sử dụng 2 byte cho mỗi ký tự, trong khi varchar sử dụng 1.
  3. THAM GIA một VARCHAR để NVARCHAR có một hiệu suất đáng kể.
  4. Có thể cần một tiền tố N khi chèn dữ liệu: INSERT dbo.t (c) CHỌN N'ʤ ʥ ';
  5. Một số chuyên gia khuyến nghị nvarchar luôn vì: vì tất cả các hệ điều hành và nền tảng phát triển hiện đại đều sử dụng Unicode bên trong, sử dụng nvarchar thay vì varchar, sẽ tránh mã hóa chuyển đổi mỗi khi bạn đọc hoặc ghi vào cơ sở dữ liệu

0

nvarchar được yêu cầu cho Sao chép hợp nhất RDP từ DB di động sang SQL Server 2005. Ngoài ra, LTrim (), RTrim () & Trim () đã được sử dụng rất nhiều bc nvarchar không tự động cắt () khỏi khoảng trống từ mục nhập dữ liệu, trong khi Varchar đã làm .

Tôi không biết điều đó có thay đổi trong những năm gần đây hay không, nhưng nvarchar hiện là tiêu chuẩn được sử dụng cho thông tin đăng nhập Trang web thành viên đơn giản .NET trên VS Pro 2017 được sử dụng trong cơ sở dữ liệu được tạo.


-3

Nếu bạn sử dụng NVarchar trên Varchar và bạn không có yêu cầu hỗ trợ MULTI-LINQUAL, bạn tăng dung lượng lưu trữ cho DB, Sao lưu (cục bộ và ngoại vi). Cơ sở dữ liệu hiện đại nên hỗ trợ cả và bất kỳ lần truy cập Chuyển đổi nào cũng cần được xem xét trong thiết kế.

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.