MySQL - length () vs char_length ()

215

Apa perbedaan utama antara length()dan char_length()?

Saya percaya ini ada hubungannya dengan string biner dan non-biner. Apakah ada alasan praktis untuk menyimpan string sebagai biner?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Yada
sumber
2
Ya, ada alasan praktis untuk menyimpan string biner ketika mereka sebenarnya adalah string biner, misalnya dikompresi.
sanmai

Jawaban:

351

LENGTH()mengembalikan panjang string yang diukur dalam byte .
CHAR_LENGTH()mengembalikan panjang string yang diukur dalam karakter .

Ini sangat relevan untuk Unicode, di mana sebagian besar karakter dikodekan dalam dua byte. Atau UTF-8, di mana jumlah byte bervariasi. Sebagai contoh:

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

Seperti yang Anda lihat tanda Euro menempati 3 byte (itu dikodekan seperti 0xE282ACpada UTF-8) meskipun itu hanya satu karakter.

Andomar
sumber
6
Hanya UCS-2 yang dikodekan dalam dua byte per karakter. Pengkodean ini (atau lebih tepatnya UTF-16LE) adalah apa yang oleh Windows disebut "Unicode". MySQL tidak mendukung UTF-16; sebaliknya pendekatan yang biasa untuk menempatkan string Unicode di dalamnya adalah dengan menggunakan UTF-8.
bobince
2
Misalnya: pilih panjang ('日本語'), char_length ('日本語');
sanmai
@obobince: Bahkan UCS-2 mengkodekan beberapa karakter dalam lebih dari 2 byte, misalnya 0313 combining comma above. Karena a = 61, 0x00610313 ditampilkan sebagai a̓, dan ini membutuhkan 4 byte.
Andomar
2
Sebenarnya dengan terminologi Unicode yang masih 2 karakter, meskipun seperti semua tanda menggabungkannya bisa - jika font yang sesuai tersedia - dapat diterjemahkan sebagai mesin terbang tunggal. UTF-16LE masih dapat memiliki karakter 4-byte meskipun berkat para pengganti.
bobince
6
Jadi yang mana dari fungsi-fungsi ini yang harus saya gunakan ketika mencari tahu cara mengubah ukuran kolom VARCHAR saya? Saat membuat tabel katakanlah satu kolom adalah VARCHAR (10). Apakah itu memungkinkan maksimum 10 karakter, atau maksimum 10 byte?
still_dreaming_1
19

varchar (10) akan menyimpan 10 karakter, yang mungkin lebih dari 10 byte. Dalam indeks, itu akan mengalokasikan panjang maksimal bidang - jadi jika Anda menggunakan UTF8-mb4, itu akan mengalokasikan 40 byte untuk bidang 10 karakter.

Brent
sumber