Site icon Nhạc lý căn bản – nhacly.com

Sự khác biệt giữa char, nchar, varchar và nvarchar trong SQL Server là gì?

Cố gắng của tôi để tóm tắt và sửa những câu vấn đáp hiện có :

Đầu tiên, charncharsẽ 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 đó varcharnvarcharsẽ 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à, ncharnvarcharlưu trữ các chuỗi sử dụng chính xác hai byte cho mỗi ký tự, trong khi đó charvarcharsử 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à ncharnvarcharcó 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 ncharnvarcharcá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 ncharhoặc nvarchartrườ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 ncharhoặc nvarchartrườ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à charvarcharcá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.

Exit mobile version