Có nghĩa là nvarchar
gì?
Sự khác nhau giữa là gì char
, nchar
, varchar
, và nvarchar
trong SQL Server?
Có nghĩa là nvarchar
gì?
Sự khác nhau giữa là gì char
, nchar
, varchar
, và nvarchar
trong SQL Server?
Câu trả lời:
Chỉ cần dọn dẹp ... hoặc tổng hợp ...
nchar
và nvarchar
có thể lưu trữ các ký tự Unicode .char
và không thể lưu trữ các ký tự Unicode .varchar
char
và nchar
có độ dài cố định sẽ dành không gian lưu trữ cho số lượng ký tự bạn chỉ định ngay cả khi bạn không sử dụng hết dung lượng đó.varchar
và nvarchar
có độ dài thay đổi sẽ chỉ sử dụng hết khoảng trắng cho các ký tự bạn lưu trữ. Nó sẽ không dự trữ lưu trữ như char
hoặcnchar
.nchar
và nvarchar
sẽ chiếm gấp đôi dung lượng lưu trữ, vì vậy có thể là khôn ngoan khi chỉ sử dụng chúng nếu bạn cần hỗ trợ Unicode .
n...
phiên bản có chiếm gấp đôi dung lượng lưu trữ như câu trả lời của tôi hay không
Tất cả các câu trả lời cho đến nay varchar
là byte đơn, nvarchar
là byte kép. Phần đầu tiên của điều này thực sự phụ thuộc vào đối chiếu như minh họa dưới đây.
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
Trả về
Lưu ý rằng các ký tự 华
và 国
ký tự vẫn không được thể hiện trong VARCHAR
phiên bản và được âm thầm thay thế bằng ?
.
Thực tế vẫn không có ký tự tiếng Hoa nào có thể được lặp lại bởi một byte trong đối chiếu đó. Các ký tự byte đơn duy nhất là tập ASCII phương tây điển hình.
Do đó, việc chèn từ nvarchar(X)
cột này sang varchar(X)
cột khác có thể bị lỗi cắt ngắn (trong đó X biểu thị một số giống nhau trong cả hai trường hợp).
SQL Server 2012 bổ sung các đối chiếu SC (Ký tự bổ sung) hỗ trợ UTF-16
. Trong các đối chiếu này, một nvarchar
ký tự đơn có thể mất 2 hoặc 4 byte.
nchar và char hoạt động khá giống nhau theo cách tương tự như nhau, cũng như nvarchar và varchar. Sự khác biệt duy nhất giữa chúng là nchar / nvarchar lưu trữ các ký tự Unicode (cần thiết nếu bạn yêu cầu sử dụng các bộ ký tự mở rộng) trong khi varchar thì không.
Vì các ký tự Unicode yêu cầu lưu trữ nhiều hơn, các trường nchar / nvarchar chiếm không gian gấp đôi (ví dụ: trong các phiên bản trước của SQL Server, kích thước tối đa của trường nvarchar là 4000).
Câu hỏi này là một bản sao của câu hỏi này .
Chỉ cần thêm một cái gì đó nữa: nchar - thêm dấu cách vào dữ liệu. nvarchar - không thêm dấu cách vào dữ liệu.
Vì vậy, nếu bạn định lọc tập dữ liệu của mình theo trường 'nchar', bạn có thể muốn sử dụng RTRIM để xóa khoảng trắng. Ví dụ: trường nchar (10) được gọi là THƯƠNG HIỆU lưu trữ từ NIKE. Nó thêm 6 khoảng trắng ở bên phải của từ. Vì vậy, khi lọc, biểu thức nên đọc: RTRIM (Trường! BRAND.Value) = "NIKE"
Hy vọng điều này sẽ giúp được ai đó ngoài kia vì tôi đã phải vật lộn với nó một chút!
Cố gắng của tôi để tóm tắt và sửa các câu trả lời hiện có:
Đầu tiên, char
và nchar
sẽ luôn sử dụng một lượng không gian lưu trữ cố định, ngay cả khi chuỗi được lưu trữ nhỏ hơn không gian có sẵn, trong khi đó varchar
và nvarchar
sẽ chỉ sử dụng nhiều dung lượng lưu trữ cần thiết để lưu trữ chuỗi đó (cộng với hai byte trên không, có lẽ để lưu trữ độ dài chuỗi). Vì vậy, hãy nhớ, "var" có nghĩa là "biến", như trong không gian biến.
Điểm chính thứ hai cần hiểu là, nchar
và nvarchar
lưu trữ các chuỗi sử dụng chính xác hai byte cho mỗi ký tự, trong khi đó char
và varchar
sử dụng mã hóa được xác định bởi trang mã đối chiếu, thường sẽ chính xác một byte cho mỗi ký tự (mặc dù có trường hợp ngoại lệ, xem bên dưới). Bằng cách sử dụng hai byte cho mỗi ký tự, có thể lưu trữ rất nhiều ký tự, vì vậy điều cơ bản cần nhớ ở đây là nchar
và nvarchar
có xu hướng là lựa chọn tốt hơn nhiều khi bạn muốn hỗ trợ quốc tế hóa, điều mà bạn có thể làm.
Bây giờ cho một số điểm tốt hơn.
Đầu tiên nchar
và nvarchar
các cột luôn lưu trữ dữ liệu bằng UCS-2. Điều này có nghĩa là chính xác hai byte cho mỗi ký tự sẽ được sử dụng và bất kỳ ký tự Unicode nào trong Mặt phẳng đa ngôn ngữ cơ bản (BMP) có thể được lưu trữ bởi một nchar
hoặc nvarchar
trường. Tuy nhiên, không phải trường hợp nào cũng có thể lưu trữ bất kỳ ký tự Unicode nào . Ví dụ, theo Wikipedia, các điểm mã cho chữ tượng hình Ai Cập nằm ngoài BMP. Do đó, có các chuỗi Unicode có thể được biểu thị bằng UTF-8 và các bảng mã Unicode thực sự khác không thể được lưu trữ trong SQL Server nchar
hoặc nvarchar
trường và các chuỗi được viết bằng chữ tượng hình Ai Cập sẽ nằm trong số đó. May mắn là người dùng của bạn có thể không viết theo kịch bản đó, nhưng đó là điều cần lưu ý!
Một điểm khó hiểu nhưng thú vị khác mà các áp phích khác đã nhấn mạnh là char
và varchar
các trường có thể sử dụng hai byte cho mỗi ký tự cho một số ký tự nhất định nếu trang mã đối chiếu yêu cầu nó. (Martin Smith đưa ra một ví dụ tuyệt vời, trong đó anh ấy cho thấy cách Trung Quốc_Traditable_Stroke_Order_100_CS_AS_KS_WS thể hiện hành vi này. Hãy xem thử.)
CẬP NHẬT: Kể từ SQL Server 2012, cuối cùng cũng có các trang mã cho UTF-16 , ví dụ Latin1_General_100_CI_AS_SC, có thể thực sự bao trùm toàn bộ phạm vi Unicode.
char
: dữ liệu ký tự có độ dài cố định với độ dài tối đa 8000 ký tự.nchar
: dữ liệu unicode có độ dài cố định với độ dài tối đa 4000 ký tự.Char
= Độ dài 8 bitNChar
= Độ dài 16 bitchar
không thể có độ dài 8 bit. Nó không phải lưu trữ độ dài và độ dài cố định có thể lên tới 8000 ký tự.
nchar[(n)]
(nhân vật quốc gia)
n
xác định độ dài chuỗi và phải là giá trị từ 1 đến 4.000.n
byte.nvarchar [(n | max)]
(tính cách dân tộc khác nhau.)
n
xác định độ dài chuỗi và có thể là giá trị từ 1 đến 4.000.max
chỉ ra rằng kích thước lưu trữ tối đa là 2 ^ 31-1 byte (2 GB).char [(n)]
(tính cách)
non-Unicode
dữ liệu chuỗi.n
xác định độ dài chuỗi và phải là giá trị từ 1 đến 8.000.n
byte.varchar [(n | max)]
(nhân vật khác nhau)
n
xác định độ dài chuỗi và có thể là giá trị từ 1 đến 8.000.max
chỉ ra rằng kích thước lưu trữ tối đa là 2 ^ 31-1 byte (2 GB).Sự khác biệt là:
Một sự khác biệt khác là chiều dài. Cả nchar và nvarchar có thể dài tới 4.000 ký tự. Và char và varchar có thể dài tới 8000 ký tự. Nhưng đối với SQL Server, bạn cũng có thể sử dụng [n] varchar (max) có thể xử lý tối đa 2.147.483.648 ký tự. (Hai gigabyte, số nguyên 4 byte đã ký.)
nchar đòi hỏi nhiều không gian hơn nvarchar.
ví dụ,
Một nchar (100) sẽ luôn lưu trữ 100 ký tự ngay cả khi bạn chỉ nhập 5, 95 ký tự còn lại sẽ được đệm bằng khoảng trắng. Lưu trữ 5 ký tự trong một nvarchar (100) sẽ lưu 5 ký tự.
nchar (10) là một chuỗi Unicode có độ dài cố định có độ dài 10. nvarchar (10) là một chuỗi Unicode có độ dài thay đổi với độ dài tối đa là 10. Thông thường, bạn sẽ sử dụng chuỗi trước nếu tất cả các giá trị dữ liệu là 10 ký tự và sau nếu độ dài khác nhau.
nchar có độ dài cố định và có thể chứa các ký tự unicode. nó sử dụng hai byte lưu trữ cho mỗi ký tự.
varchar có độ dài thay đổi và không thể giữ các ký tự unicode. nó sử dụng lưu trữ một byte cho mỗi ký tự.
UCS-2
(mà tình cờ là mã hóa được sử dụng bởi SQL Server) lưu trữ mọi ký tự trong chính xác hai byte, xem msdn.microsoft.com/en-us/l Library / bb330962% 28v = sql.90% 29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 có thể sử dụng nén SCSU, nhưng vẫn nén các chuỗi Unicode được mã hóa UCS-2: msdn.microsoft.com/en-us/l Library / ee240835.aspx
NVARCHAR có thể lưu trữ các ký tự Unicode và mất 2 byte cho mỗi ký tự.
nvarchar
luôn mất 2 byte cho mỗi ký tự.