Apa perbedaan antara rangkaian karakter utf8mb4 dan utf8 di MySQL?

341

Apa perbedaan antara utf8mb4dan utf8rangkaian karakter di MySQL ?

Saya sudah tahu tentang pengkodean ASCII , UTF-8 , UTF-16 dan UTF-32 ; tapi saya penasaran ingin tahu apa perbedaan utf8mb4kelompok pengkodean dengan jenis pengkodean lain yang didefinisikan dalam MySQL Server .

Apakah ada manfaat / usul khusus utf8mb4daripada menggunakan utf8?

Mojtaba Rezaeian
sumber

Jawaban:

392

UTF-8 adalah pengodean panjang variabel. Dalam kasus UTF-8, ini berarti bahwa menyimpan satu titik kode memerlukan satu hingga empat byte. Namun, pengodean MySQL yang disebut "utf8" (alias "utf8mb3") hanya menyimpan maksimum tiga byte per titik kode.

Jadi set karakter "utf8" / "utf8mb3" tidak dapat menyimpan semua poin kode Unicode: itu hanya mendukung rentang 0x000 hingga 0xFFFF, yang disebut " Basic Multilingual Plane ". Lihat juga Perbandingan pengkodean Unicode .

Inilah yang dikatakan (versi sebelumnya dari halaman yang sama) tentang dokumentasi MySQL :

Set karakter bernama utf8 [/ utf8mb3] menggunakan maksimum tiga byte per karakter dan hanya berisi karakter BMP. Pada MySQL 5.5.3, set karakter utf8mb4 menggunakan maksimum empat byte per karakter mendukung karakter tambahan:

  • Untuk karakter BMP, utf8 [/ utf8mb3] dan utf8mb4 memiliki karakteristik penyimpanan yang identik: nilai kode yang sama, pengkodean yang sama, panjang yang sama.

  • Untuk karakter tambahan, utf8 [/ utf8mb3] tidak dapat menyimpan karakter sama sekali , sedangkan utf8mb4 membutuhkan empat byte untuk menyimpannya. Karena utf8 [/ utf8mb3] tidak dapat menyimpan karakter sama sekali, Anda tidak memiliki karakter tambahan di kolom utf8 [/ utf8mb3] dan Anda tidak perlu khawatir tentang mengubah karakter atau kehilangan data saat memutakhirkan data utf8 [/ utf8mb3] dari versi yang lebih lama dari MySQL

Jadi jika Anda ingin kolom Anda mendukung penyimpanan karakter yang berada di luar BMP (dan biasanya Anda mau), seperti emoji , gunakan "utf8mb4". Lihat juga Apa karakter Unicode non-BMP paling umum dalam penggunaan aktual? .

CodeCaster
sumber
10
Satu-satunya kasus yang saya temui (sejauh ini) di mana utf8mb4 'wajib' adalah bahasa Mandarin dan Emoticon. Ada huruf yang tidak jelas yang membutuhkannya.
Rick James
10
Ini juga diperlukan jika Anda menggunakan untuk menyimpan kata sandi dan data terenkripsi di database Anda. Saya menyimpan kata sandi terenkripsi di mysql menggunakan format utf8 normal yang menyebabkan saya banyak masalah dengan beberapa kata sandi secara acak dan sangat sulit untuk di-debug sehingga akhirnya saya mencoba menggunakan encoding base64 dan memperbaiki masalah sementara. Tapi, sekarang saya tahu alasannya.
Mojtaba Rezaeian
38
@idealidea data terenkripsi adalah biner, dan Anda tidak boleh menyimpan data biner dalam kolom varchar. :)
CodeCaster
8
@thomasrutter Cobalah karakter (𡞰) ini untuk disimpan dengan UTF-8. :)
502_Geek
2
@MojtabaRezaeian tergantung pada algoritma kata sandi - bcrypt2 akan menghasilkan ASCII.
Jasen
60

Set utf8mb4karakter berguna karena saat ini kita membutuhkan dukungan untuk menyimpan tidak hanya karakter bahasa tetapi juga simbol, emoji yang baru diperkenalkan, dan sebagainya.

Bacaan yang bagus tentang Cara mendukung Unicode penuh dalam basis data MySQL oleh Mathias Bynens juga dapat menjelaskan hal ini.

Jimmy Kane
sumber
11
MySQL 8.0 sekarang menjadi set karakter utf8mb4 default. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk
47

Diambil dari Manual Referensi MySQL 8.0 :

  • utf8mb4: Pengkodean UTF-8 dari rangkaian karakter Unicode menggunakan satu hingga empat byte per karakter.

  • utf8mb3: Pengkodean UTF-8 dari rangkaian karakter Unicode menggunakan satu hingga tiga byte per karakter.

Di MySQL utf8 saat ini merupakan alias utf8mb3yang sudah usang dan akan dihapus dalam rilis MySQL di masa depan . Pada saat itu utf8 akan menjadi referensi untuk utf8mb4 .

Jadi, terlepas dari alias ini, Anda dapat secara sadar mengatur utf8mb4penyandian.

Untuk melengkapi jawabannya, saya ingin menambahkan komentar @ WilliamEntriken di bawah ini (juga diambil dari manual):

Untuk menghindari ambiguitas tentang makna utf8, pertimbangkan menentukan utf8mb4secara eksplisit untuk referensi set karakter alih-alih utf8.

simhumileco
sumber