Trong MySQL, có nhiều lần length()
và hàm char_length()
chức năng sẽ cung cấp các kết quả chính xác như nhau. Tuy nhiên, cũng có những lúc kết quả sẽ hoàn toàn khác. Đây là lý do tại sao.
Đầu tiên, đây là định nghĩa cho từng chức năng sau:
-
char_length()
- Trả về độ dài của một chuỗi, được tính bằng ký tự.
-
length()
- Trả về độ dài của một chuỗi, được tính bằng byte.
Lưu ý “ký tự” so với “byte” - một ký tự được đo bằng ký tự , cái còn lại được đo bằng byte .
Trong nhiều trường hợp, số byte sẽ giống với số ký tự trong chuỗi, nhưng điều này không phải lúc nào cũng đúng. Số byte được sử dụng trên mỗi ký tự phụ thuộc vào cách dữ liệu được lưu trữ. Ví dụ:nếu chuỗi được lưu trữ dưới dạng dữ liệu Unicode, sẽ có 2 byte cho mỗi ký tự.
Dưới đây là một ví dụ cơ bản sử dụng văn bản ASCII (trong đó cả hai hàm đều trả về cùng một kết quả):
SELECT CHAR_LENGTH('Lit'), LENGTH('Lit');
Kết quả:
+--------------------+---------------+ | CHAR_LENGTH('Lit') | LENGTH('Lit') | +--------------------+---------------+ | 3 | 3 | +--------------------+---------------+
Và thường thì chúng ta sẽ nhận được kết quả tương tự nếu chuỗi được lưu trữ trong cơ sở dữ liệu:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Kết quả:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 3 | +-------------------------+--------------------+
Tuy nhiên, nếu chúng ta thay đổi cột cơ sở dữ liệu để lưu trữ dữ liệu dưới dạng unicode:
ALTER TABLE Artists MODIFY COLUMN ArtistName VARCHAR(255) unicode;
Và sau đó chạy lại cùng một truy vấn:
SELECT CHAR_LENGTH(ArtistName), LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Chúng tôi nhận được một kết quả khác:
+-------------------------+--------------------+ | CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) | +-------------------------+--------------------+ | 3 | 6 | +-------------------------+--------------------+
Điều này là do unicode lưu trữ mỗi ký tự dưới dạng 2 byte.
Điều này tương tự như sự khác biệt giữa datalength()
và len()
trong T-SQL.
MySQL cũng có octet_length()
hàm, là từ đồng nghĩa với length()
.