Sự khác nhau giữa CHAR và VARCHAR, NCHAR và NVARCHAR là gì?
Đây là điểm khác biệt cơ bản giữa CHAR vs VARCHAR và NCHAR vs NVARCHAR trong SQL Server:
1. CHAR vs VARCHAR#
| Tiêu chí | CHAR | VARCHAR |
|---|---|---|
| Kiểu dữ liệu | Chuỗi ký tự có độ dài cố định | Chuỗi ký tự có độ dài biến đổi |
| Dung lượng lưu trữ | Luôn chiếm đúng số ký tự đã khai báo (đệm thêm khoảng trống nếu chưa đủ) | Chỉ chiếm số ký tự thực tế + 2 byte để lưu độ dài |
| Sử dụng | Thích hợp với dữ liệu có độ dài cố định, ví dụ mã vùng, mã nhân viên có độ dài cố định | Thích hợp dữ liệu có độ dài thay đổi, ví dụ tên, mô tả |
| Hiệu suất | Tốt hơn khi độ dài cố định | Tiết kiệm dung lượng khi độ dài thay đổi |
2. NCHAR vs NVARCHAR#
| Tiêu chí | NCHAR | NVARCHAR |
|---|---|---|
| Kiểu dữ liệu | Chuỗi ký tự Unicode có độ dài cố định | Chuỗi ký tự Unicode có độ dài biến đổi |
| Dung lượng lưu trữ | Luôn chiếm 2 byte x số ký tự (cố định, đệm khoảng trống nếu thiếu) | 2 byte x số ký tự thực tế + 2 byte lưu độ dài |
| Hỗ trợ ngôn ngữ | Hỗ trợ đa ngôn ngữ, ký tự Unicode (hỗ trợ tốt tiếng Việt, tiếng Trung, tiếng Ả Rập...) | Tương tự NCHAR, nhưng linh hoạt hơn về độ dài |
| Sử dụng | Dữ liệu Unicode có độ dài cố định | Dữ liệu Unicode có độ dài thay đổi |
| Hiệu suất | Tốt cho dữ liệu cố định | Tiết kiệm bộ nhớ hơn khi độ dài thay đổi |
3. Tóm tắt và lưu ý#
CHAR và VARCHAR: chỉ lưu ký tự ASCII (hoặc 1 byte một ký tự) → phù hợp tiếng Anh.
NCHAR và NVARCHAR: lưu ký tự Unicode (2 byte mỗi ký tự) → hỗ trợ đa ngôn ngữ, bao gồm cả tiếng Việt.
Khi bạn cần lưu chuỗi tiếng Việt hoặc đa ngôn ngữ, nên dùng NCHAR hoặc NVARCHAR.
Khi độ dài chuỗi thay đổi, ưu tiên dùng VARCHAR hoặc NVARCHAR để tiết kiệm bộ nhớ.
Ví dụ:#
` -- CHAR(10): nếu nhập 'ABC' sẽ lưu 7 ký tự khoảng trắng đệm thêm DECLARE @c CHAR(10) = 'ABC'; -- VARCHAR(10): nếu nhập 'ABC' chỉ lưu đúng 3 ký tự DECLARE @v VARCHAR(10) = 'ABC';
-- NCHAR(10): lưu chuỗi Unicode cố định 10 ký tự DECLARE @nc NCHAR(10) = N'Xin chào';
-- NVARCHAR(10): lưu chuỗi Unicode biến đổi tối đa 10 ký tự DECLARE @nv NVARCHAR(10) = N'Xin chào'; `