Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

LEN () so với DATALENGTH () trong SQL Server

Khi sử dụng T-SQL trong SQL Server (hoặc Azure), LEN()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()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()DATALENGTH() .

Khoảng trống sau

Một điểm khác biệt giữa LEN()DATALENGTH()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()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()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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATALENGTH () trong SQL Server là gì?

  2. Truy vấn SQL Server Xml với nhiều không gian tên

  3. Làm thế nào để lưu trữ cấu trúc thư mục / phân cấp / cây trong cơ sở dữ liệu?

  4. Làm cách nào để loại trừ Ngày cuối tuần trong truy vấn SQL Server?

  5. Làm cách nào để mô phỏng UNPIVOT trong Access?