MySQL - chiều dài () so với char_length ()


215

Sự khác biệt chính giữa length()và là char_length()gì?

Tôi tin rằng nó có một cái gì đó để làm với các chuỗi nhị phân và không nhị phân. Có bất kỳ lý do thực tế để lưu trữ chuỗi dưới dạng nhị phân?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
Có, có những lý do thực tế để lưu trữ chuỗi nhị phân khi chúng thực sự là chuỗi nhị phân, ví dụ như được nén.
sanmai

Câu trả lời:


351

LENGTH()trả về độ dài của chuỗi được đo bằng byte .
CHAR_LENGTH()trả về độ dài của chuỗi được đo bằng ký tự .

Điều này đặc biệt phù hợp với Unicode, trong đó hầu hết các ký tự được mã hóa thành hai byte. Hoặc UTF-8, trong đó số lượng byte khác nhau. Ví dụ:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Như bạn có thể thấy ký hiệu Euro chiếm 3 byte (được mã hóa như 0xE282ACtrong UTF-8) mặc dù đó chỉ là một ký tự.


6
Chỉ UCS-2 được mã hóa thành hai byte cho mỗi ký tự. Mã hóa này (hay chính xác hơn là UTF-16LE) là thứ mà Windows gọi nhầm là Unicode Unicode. MySQL không hỗ trợ UTF-16; thay vào đó, cách tiếp cận thông thường để đưa các chuỗi Unicode vào đó là sử dụng UTF-8.
bobince

2
Ví dụ: chọn độ dài ('日本語'), char_length ('日本語');
sanmai

@bobince: Chẳng hạn, ngay cả UCS-2 cũng mã hóa một số ký tự trong hơn 2 byte 0313 combining comma above. Vì a = 61, 0x00610313 hiển thị dưới dạng a̓ và phải mất 4 byte.
Andomar

2
Trên thực tế theo thuật ngữ Unicode vẫn có 2 ký tự, mặc dù giống như tất cả các dấu kết hợp có thể - nếu có sẵn một phông chữ phù hợp - được hiển thị dưới dạng một glyph. UTF-16LE vẫn có thể có ký tự 4 byte mặc dù nhờ các chất thay thế.
bobince

6
Vậy tôi nên sử dụng chức năng nào trong số những chức năng này khi tìm cách thay đổi kích thước các cột VARCHAR của mình? Khi tạo bảng, giả sử một cột là VARCHAR (10). Điều đó sẽ cho phép tối đa 10 ký tự hay tối đa 10 byte?
still_dreaming_1 17/12/14

19

varchar (10) sẽ lưu trữ 10 ký tự, có thể nhiều hơn 10 byte. Trong các chỉ mục, nó sẽ phân bổ độ dài tối đa của trường - vì vậy nếu bạn đang sử dụng UTF8-mb4, nó sẽ phân bổ 40 byte cho trường 10 ký tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.