Kiểu dữ liệu NVARCHAR trong SQL Server là gì? Varchar và Nvarchar có gì khác nhau?

Nvarchar trong SQL hay kiểu dữ liệu Nvarchar là một kiểu dữ liệu thường gặp, sử dụng thường xuyên và dùng trong nhiều trường hợp làm việc với cơ sở dữ liệu. Tuy nhiên lại có quá nhiều người nhầm lẫn Nvarchar và varchar về cách dùng, về trường hợp sử dụng. Vậy thì sql server nvarchar là gì? Sự khác nhau giữa varchar và nvarchar như thế nào? Cùng comdy.vn tìm hiểu rõ hơn qua bài viết này nhé.

Kiểu dữ liệu nvarchar là gì? 

Kiểu dữ liệu nvarchar là gì
Nvarchar trong sql là kiểu dữ liệu dạng chuỗi Unicode và có độ rộng biến thiên

What is nvarchar in sql? Nvarchar trong sql là kiểu dữ liệu dạng chuỗi Unicode và có độ rộng biến thiên. Chúng có kích thước tối đa 536.870.912 ký tự.

Kiểu dữ liệu NVARCHAR trong SQL Server được sử dụng để lưu trữ dữ liệu chuỗi Unicode có độ dài thay đổi. Sau đây là cú pháp của NVARCHAR: Nvarchar(n).

Trong cú pháp này, n xác định độ dài chuỗi nằm trong khoảng từ 1 đến 4.000. Nếu bạn không chỉ định độ dài chuỗi, giá trị mặc định của nó là 1.

Một cách khác để khai báo một cột NVARCHAR là sử dụng cú pháp sau: Nvarchar(max).

Trong cú pháp này, max là kích thước lưu trữ tối đa tính bằng byte là 2 ^ 31-1 byte (2 GB). Nói chung, kích thước lưu trữ thực tế tính bằng byte của một giá trị NVARCHAR gấp hai lần số ký tự cộng với 2 byte.

Các ISO synonym của NVARCHARNATIONAL CHAR VARYING hoặc NATIONAL CHARACTER VARYING. Vì vậy bạn có thể sử dụng chúng thay thế cho nhau trong khai báo biến hoặc định nghĩa dữ liệu cột.

NVARCHAR(50) là gì? Nvarchar(50) là kiểu dữ liệu nvarchar xác định độ dài tối đa của chuỗi ký tự có thể được lưu trữ trong cột là 50.

Nvarchar bytes bao nhiêu? 

Nvarchar trong SQL được sử dụng để lưu trữ chuỗi ký tự UNICODE. Vì UNICODE sử dụng mã hóa đa byte, số lượng byte cần thiết để lưu trữ một giá trị NVARCHAR phụ thuộc vào số lượng ký tự và loại ký tự trong chuỗi.

Mỗi ký tự trong UNICODE có thể sử dụng từ 1 đến 4 byte để lưu trữ. Tuy nhiên, trong hầu hết các trường hợp, mỗi ký tự sẽ sử dụng 2 byte (16 bit) để lưu trữ.

Điều này có nghĩa là một giá trị NVARCHAR(n) sẽ sử dụng n*2 byte trong bộ nhớ để lưu trữ. Trong đó với n là số ký tự được cho phép. Vì mỗi ký tự sử dụng 2 byte, n*2 byte sẽ là dung lượng tối đa mà một giá trị NVARCHAR(n) có thể chiếm trong bộ nhớ.

Lưu ý rằng một số ký tự đặc biệt trong UNICODE có thể sử dụng 4 byte để lưu trữ. Do vậy, một giá trị NVARCHAR(n) có thể chiếm nhiều hơn n*2 byte trong trường hợp này.

Ví dụ về kiểu dữ liệu NVARCHAR trong SQL Server

Ví dụ về nvarchar trong SQL Server
Lấy ví dụ về kiểu dữ liệu nvarchar trong sql server

Ví dụ về sql server nvarchar sau đây sẽ giúp bạn có thể hiểu rõ hơn về nvarchar khác gì varchar:

Câu lệnh sau tạo một bảng mới chứa một cột kiểu NVARCHAR:

CREATE TABLE test.sql_server_nvarchar (
    val NVARCHAR NOT NULL
);

Trong ví dụ này, theo mặc định, độ dài chuỗi của cột NVARCHAR là 1.

Để thay đổi độ dài chuỗi của cột val, bạn sử dụng câu lệnh ALTER TABLE ALTER COLUMN:

ALTER TABLE test.sql_server_Nvarchar 
ALTER COLUMN val NVARCHAR (15) NOT NULL;

Câu lệnh sau đây INSERT một chuỗi mới vào cột val của bảng test.sql_server_nvarchar:

INSERT INTO test.sql_server_varchar (val)
VALUES (N'Trung Nguyễn');

Câu lệnh hoạt động như mong đợi vì giá trị chuỗi có độ dài nhỏ hơn độ dài chuỗi được xác định trong định nghĩa cột.

Câu lệnh sau cố gắng chèn một dữ liệu chuỗi mới có độ dài lớn hơn độ dài chuỗi của cột val:

INSERT INTO test.sql_server_nvarchar (val)
VALUES (N'Trung Nguyễn - Comdy.vn');

SQL Server đã phát hành lỗi và chấm dứt câu lệnh:

String or binary data would be truncated.
The statement has been terminated.

Để tìm số ký tự và kích thước lưu trữ tính bằng byte của các giá trị được lưu trữ trong cột NVARCHAR, bạn sử dụng hàm LENDATALENGTH như sau:

SELECT
    val,
    LEN(val) len,
    DATALENGTH(val) data_length
FROM
    test.sql_server_nvarchar;

Trong hướng dẫn này, bạn đã học cách sử dụng kiểu dữ liệu NVARCHAR trong SQL Server để lưu trữ dữ liệu Unicode có độ dài thay đổi trong cơ sở dữ liệu.

Kiểu dữ liệu varchar là gì? 

Kiểu dữ liệu varchar là gì
Kiểu dữ liệu varchar trong sql là dữ liệu dạng chuỗi ký tự có độ rộng biến thiên

Varchar(n) trong sql là dữ liệu dạng chuỗi ký tự, có độ rộng biến thiên. Tương tự như char thi varchar có kích thước tối đa là 8.000 ký tự, lưu trữ 2 byte số ký tự.

Ví dụ varchar(255) là gì thi đây là kiểu dữ liệu định nghĩa một cột trong bảng có thể chứa một chuỗi ký tự có độ daif tối đa là 255 ký tự.

So sánh kiểu dữ liệu varchar và nvarchar

Hai kiểu dữ liệu nvarchar và varchar thường bị nhầm lẫn trong quá trình sử dụng. Bảng sau sẽ minh họa sự khác nhau giữa varchar và nvarchar:

VARCHAR IN SQL

NVARCHAR IN SQL 
Kiểu dữ liệu ký tự Các ký tự có độ dài thay đổi, không phải Unicode Độ dài thay đổi, cả ký tự Unicode và không phải Unicode như tiếng Việt.
Chiều dài tối đa Lên đến 8.000 ký tự Lên đến 4.000 ký tự
Kích thước ký tự Sql nvarchar chiếm 1 byte cho mỗi ký tự Chiếm 2 byte cho mỗi ký tự Unicode / Không phải Unicode
Kích thước lưu trữ Độ dài Thực tế (tính bằng byte) 2 lần Độ dài Thực tế (tính bằng byte)
Sử dụng Được sử dụng khi độ dài dữ liệu là cột có độ dài thay đổi hoặc có thể thay đổi và nếu dữ liệu thực tế luôn nhỏ hơn dung lượng. Do chỉ để lưu trữ, chỉ được sử dụng nếu bạn cần hỗ trợ Unicode như các ký tự tiếng Việt.

Làm thế nào để lọc được điều kiện có dấu Tiếng Việt trong sql?

Để insert tiếng việt vào sql server, chúng ta cần insert nvarchar in sql. Tức là: Cho thêm chữ N vào phía trước để bảo cho SQL Server biết lầ ta đang làm việc với chuỗi ký tự dạng sql server unicode. N ở đây là viết tắt cho National language character. Viết N nghĩa là truyền vào giá trị dạng Nvarchar, dạng Nchar, Ntext thay vì là char, varchar, text mặc định của SQL server.

Microsoft giải thích như sau:

Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

Khi nào thì sử dụng nvarchar vs varchar sql server? 

Khi nào sử dụng nvarchar vs varchar sql server
Sử dụng NVARCHAR khi cần lưu trữ dữ liệu chuỗi ký tự có đa ngôn ngữ hoặc dấu diễn, và sử dụng VARCHAR khi không cần hỗ trợ đa ngôn ngữ hoặc dấu diễn

Nvarchar trong sql 

Sử dụng mssql NVARCHAR khi bạn cần lưu trữ dữ liệu chuỗi ký tự có đa ngôn ngữ hoặc dấu diễn. Các trường hợp sử dụng Nvchar bao gồm:

  • Lưu trữ dữ liệu tiếng Việt, tiếng Trung, tiếng Nhật, tiếng Hàn, và các ngôn ngữ khác có các ký tự không nằm trong bảng mã ASCII.
  • Lưu trữ dữ liệu có dấu diễn (ví dụ: â, ê, ô, đ trong tiếng Việt).
  • Hỗ trợ tìm kiếm và sắp xếp dựa trên chuỗi ký tự không phân biệt dấu.

Varchar trong sql 

Sử dụng VARCHAR khi bạn chỉ cần lưu trữ dữ liệu chuỗi ký tự trong một bảng mã cụ thể và không cần hỗ trợ đa ngôn ngữ hoặc dấu diễn. Các trường hợp sử dụng VARCHAR bao gồm:

  • Lưu trữ dữ liệu chuỗi ký tự trong các ngôn ngữ sử dụng bảng mã ASCII (ví dụ: tiếng Anh).
  • Không cần hỗ trợ các ký tự đặc biệt hoặc dấu diễn.
  • Không cần tìm kiếm và sắp xếp dựa trên chuỗi ký tự không phân biệt dấu.

Lưu ý rằng kiểu dữ liệu NVARCHAR tiêu tốn nhiều bộ nhớ hơn so với VARCHAR do hỗ trợ Unicode. Vì vậy, nếu ứng dụng của bạn chỉ sử dụng một ngôn ngữ duy nhất và không cần hỗ trợ đa ngôn ngữ hoặc dấu diễn, sử dụng VARCHAR có thể tiết kiệm tài nguyên hệ thống.

Kiểu dữ liệu char và varchar khác nhau như thế nào? 

Char và varchar khác nhau như thế nào
Tìm hiểu về sự khác nhau của kiểu dữ liệu char và varchar trong sql server

Độ dài kiểu dữ liệu 

CHAR có độ dài cố định. Khi bạn khai báo một cột kiểu CHAR(10), ví dụ, cột này luôn có độ dài 10, bất kể dữ liệu thực tế trong cột là gì. Nếu chuỗi ký tự ngắn hơn 10, thì các khoảng trắng sẽ được thêm vào cuối chuỗi để đạt đủ độ dài 10.

VARCHAR có độ dài có thể thay đổi. Khi bạn khai báo một cột kiểu VARCHAR(10), độ dài của cột có thể thay đổi để phù hợp với dữ liệu thực tế. Ví dụ, nếu chuỗi ký tự trong cột chỉ có 5 ký tự, thì cột chỉ sử dụng 5 byte để lưu trữ dữ liệu.

Tiêu thụ bộ nhớ 

CHAR tiêu tốn bộ nhớ cố định, bất kể độ dài thực tế của dữ liệu. Vì vậy, nếu bạn khai báo một cột CHAR(1000) nhưng chỉ lưu trữ chuỗi ký tự có độ dài 10, cột vẫn tiêu tốn bộ nhớ 1000 byte.

VARCHAR tiêu thụ bộ nhớ dựa trên độ dài thực tế của dữ liệu. Vì vậy, nếu bạn khai báo một cột VARCHAR(1000) nhưng chỉ lưu trữ chuỗi ký tự có độ dài 10, cột chỉ tiêu tốn bộ nhớ 10 byte.

Hiệu suất và tốc độ truy vấn

CHAR có thể nhanh hơn trong việc tìm kiếm và truy vấn dữ liệu so với VARCHAR bởi vì độ dài cố định giúp cơ sở dữ liệu quản lý dữ liệu dễ dàng hơn.

VARCHAR có thể tốt hơn trong việc tiết kiệm bộ nhớ và tăng hiệu suất truy vấn khi dữ liệu có độ dài thay đổi.

Cách khai báo biến trong sql như thế nào? 

Cách khai báo biến trong sql như thế nào
Cách khao báo 1 biến trong sql luôn cần có dấu @ ở trước

Để khai báo biến trong sql, bạn sử dụng từ khóa Declare với cú pháp như sau:

DECLARE @var_name data_type;

Trong đó thì @var_name là tên biến, luôn luôn phải bắt đầu bằnng @:

data_type là kiểu dữ liệu biến.

Nếu muốn khai báo nhiều biến cùng một lúc thì thay vì sử dụng nhiều lệnh Declare thì ta sẽ sử dụng dấu phẩy tách ra như sau:

DECLARE @model_year SMALLINT,
        @product_name VARCHAR(MAX);

Truncated là gì? 

Truncated là một thuật ngữ trong lĩnh vực lập trình và quản lý cơ sở dữ liệu, thường được sử dụng để chỉ việc cắt hoặc giới hạn một giá trị dữ liệu để phù hợp với một đối tượng hoặc quy tắc cụ thể.

Khi một giá trị dữ liệu được cắt hoặc giới hạn, thông thường nó xảy ra khi giá trị đó vượt quá độ dài tối đa được cho phép cho một trường hoặc biến. Trong tình huống này, giá trị dữ liệu sẽ bị cắt bớt hoặc bị giới hạn thành một độ dài nhỏ hơn, dẫn đến mất mát thông tin.

Kết lại

Trên đây là toàn bộ chia sẻ của comdy.vn về kiểu dữ liệu nvarchar trong sql. Varchar nvarchar đều là những kiểu dữ liệu quen thuộc, cần sử dụng nhiều trong quá trình học tập, làm việc với cơ sở dữ liệu. Do đó muốn làm tốt thì phải hiểu sâu bản chất của từng kiểu varchar and nvarchar để dùng đúng nhất.

Hi vọng thông tin trong bài viết là bổ ích, ý nghĩa với mọi người. Xin cám ơn!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *