Đầ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 Máy chủ SQL 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.
Source: http://139.180.218.5
Category: Thuật ngữ đời thường