Khi sử dụng T-SQL trong SQL Server (hoặc Azure), LEN()
và DATALENGTH()
các hàm thường sẽ trả về cùng một kết quả, nhưng không phải lúc nào cũng vậy. Có một số trường hợp các hàm này sẽ trả về các kết quả hoàn toàn khác nhau cho những gì có vẻ là cùng một dữ liệu. Điều này là do có sự khác biệt quan trọng giữa cách LEN()
và DATALENGTH()
các chức năng hoạt động, như chúng ta sẽ thấy ở đây.
Đầu tiên, đây là định nghĩa nhanh về từng loại:
-
LEN()
- Trả về số ký tự của biểu thức chuỗi đã chỉ định, không bao gồm khoảng trống ở cuối.
-
DATALENGTH()
- Trả về số byte được sử dụng để biểu diễn bất kỳ biểu thức nào.
Lưu ý "ký tự" so với "byte". Cũng lưu ý rằng "loại trừ khoảng trống ở cuối" chỉ áp dụng cho một.
Dưới đây là một số ví dụ để chứng minh sự khác biệt giữa LEN()
và DATALENGTH()
.
Khoảng trống sau
Một điểm khác biệt giữa LEN()
và DATALENGTH()
là LEN()
chức năng loại trừ khoảng trống ở cuối (dấu cách ở cuối, tab, v.v.) trong khi DATALENGTH()
bao gồm khoảng trống theo sau. Lưu ý, chúng ta chỉ nói về các khoảng trống ở cuối cuối của chuỗi - không phải ở đầu hoặc ở giữa.
Đây là một ví dụ không có khoảng trống ở cuối:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Kết quả:
Len DataLength --- ---------- 3 3
Và đây là một ví dụ với khoảng trống ở cuối:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Kết quả:
Len DataLength --- ---------- 3 4
Tuy nhiên, các khoảng trắng ở đầu được tính bằng cả hai hàm:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Kết quả:
Len DataLength --- ---------- 4 4
Byte so với ký tự
Một điểm khác biệt chính giữa LEN()
và DATALENGTH()
đó có phải là LEN()
không hàm trả về số lượng ký tự trong một chuỗi. Mặt khác, DATALENGTH()
trả về số lượng byte trong một biểu thức.
Đây là một điểm khác biệt quan trọng vì số byte trong một biểu thức không nhất thiết phải khớp với số ký tự trong chuỗi. Khi xử lý một chuỗi unicode, DATALENGTH()
sẽ trả về gấp đôi số ký tự. Điều này là do một chuỗi unicode lưu trữ 2 byte cho mỗi ký tự.
Trong ví dụ trên, chúng ta thấy rằng cả LEN()
và DATALENGTH()
trả về cùng một kết quả cho từ Lit
(
3
). Tuy nhiên, khi chúng ta bắt đầu truy vấn cơ sở dữ liệu, kết quả sẽ phụ thuộc vào cách dữ liệu được lưu trữ. Ví dụ:nếu nó được lưu trữ dưới dạng varchar , kết quả sẽ giống nhau. Nếu nó được lưu trữ dưới dạng nvarchar DATALENGTH()
hàm sẽ trả về gấp đôi số ký tự. Và nếu nó được lưu trữ như nói, char (25) , DATALENGTH()
sẽ trả về chính xác 25 ký tự.
Ví dụ
Hãy chạy truy vấn sau:
SELECT ArtistName, LEN(ArtistName) AS Len, DATALENGTH(ArtistName) AS DataLength FROM Artists WHERE ArtistName = 'Lit';
Kết quả của truy vấn này sẽ phụ thuộc vào cách dữ liệu được lưu trữ.
nvarchar (255)
Nếu ArtistName
cột lưu trữ dữ liệu dưới dạng nvarchar (255) :
ArtistName Len DataLength ---------- --- ---------- Lit 3 6
varchar (255)
Nếu chúng tôi thay đổi cột đó thành varchar (255) , chúng tôi nhận được kết quả sau:
ArtistName Len DataLength ---------- --- ---------- Lit 3 3
char (25)
Nếu chúng tôi thay đổi cột đó thành char (25) , chúng tôi nhận được kết quả sau:
ArtistName Len DataLength ------------------------- --- ---------- Lit 3 25
Vì vậy, có lẽ đạo lý đối với tất cả điều này là, nếu bạn nhận thấy mình nhận được kết quả kỳ lạ khi cố gắng truy xuất độ dài chuỗi, v.v., hãy kiểm tra xem bạn có đang sử dụng đúng hàm không.