Computer >> Máy Tính >  >> Lập trình >> MySQL

Sự khác biệt giữa hàm MySQL LENGTH () và CHAR_LENGTH () là gì?

Cả hai hàm đều là hàm chuỗi và trả về số ký tự có trong chuỗi. Nhưng chúng khác nhau ở khái niệm rằng hàm CHAR_LENGTH () đo độ dài chuỗi bằng ‘ký tự’ trong khi hàm LENGTH () đo độ dài chuỗi bằng ‘byte’. Nói cách khác, chúng ta có thể nói rằng hàm CHAR_LENGTH () là an toàn nhiều byte, tức là nó bỏ qua việc các ký tự là byte đơn hay nhiều byte. Ví dụ:nếu một chuỗi chứa bốn ký tự 2 byte thì LENGTH ().

Hàm sẽ trả về 8, trong khi hàm CHAR_LENGTH () sẽ trả về 4. Theo nghĩa này, chúng ta có thể nói rằng CHAR_LENGTH () cho kết quả chính xác hơn hàm LENGTH ().

Sự khác biệt đặc biệt liên quan đến Unicode, trong đó hầu hết các ký tự được mã hóa thành hai byte hoặc liên quan đến UTF-8 khi số lượng byte thay đổi. Nó được minh họa trong ví dụ dưới đây -

Ví dụ

Trong ví dụ dưới đây, trước hết, chuỗi ‘Gaurav’ được chuyển đổi thành ucs2 , đó là Unicode và chứa các ký tự 2 byte, bộ ký tự. Sau đó, chúng ta có thể quan sát thấy sự khác biệt so với tập kết quả, tức là LENGTH () trả về độ dài bằng một số byte và CHAR_LENGTH () trả về độ dài bằng một số ký tự.

mysql> SET @A = CONVERT('Gaurav' USING ucs2);
Query OK, 0 rows affected (0.15 sec)

mysql> Select Char_length(@A), LENGTH(@A);

+-----------------+------------+
| Char_length(@A) | LENGTH(@A) |
+-----------------+------------+
| 6               | 12         |
+-----------------+------------+

1 row in set (0.03 sec)

Và bây giờ, trong ví dụ bên dưới, chúng tôi đang sử dụng một ký tự đặc biệt trong UTF-8 , một số byte khác nhau, bộ ký tự. Sau đó, chúng tôi có thể quan sát sự khác biệt từ tập hợp kết quả.

mysql> SET @B = CONVERT('©' USING utf8);
Query OK, 0 rows affected (0.15 sec)

mysql> Select CHAR_LENGTH(@B);

+-----------------------+
| CHAR_LENGTH(@B)       |
+-----------------------+
| 1                     |
+-----------------------+

1 row in set (0.00 sec)

mysql> Select LENGTH(@B);

+---------------+
| LENGTH(@B)    |
+---------------+
| 2             |
+---------------+

1 row in set (0.00 sec)