1. Pendahuluan
MySQL menambahkan pengkodean utf8mb4 ini setelah 5.5.3, yang berarti sebagian besar byte 4, dan secara khusus digunakan untuk kompatibel dengan unicode empat byte. Untungnya, utf8mb4 adalah superset dari utf8, dan tidak ada konversi lain yang diperlukan kecuali mengubah pengkodean menjadi utf8mb4. Tentu saja, untuk menghemat ruang, umumnya cukup menggunakan utf8.
2. Deskripsi konten
Seperti disebutkan di atas, karena utf8 dapat menyimpan sebagian besar karakter Cina, mengapa menggunakan utf8mb4? Panjang karakter maksimum pengkodean UTF8 yang didukung oleh MySQL adalah 3 byte, dan jika Anda menemukan karakter lebar 4 byte, Anda akan menyisipkan pengecualian. Karakter Unicode maksimum yang dikodekan oleh UTF-8 dari tiga byte adalah 0xffff, yang merupakan bidang multibahasa dasar (BMP) di Unicode. Artinya, karakter Unicode apa pun yang tidak ada dalam bidang multiteks dasar tidak dapat disimpan menggunakan set karakter utf8 Mysql. Ini termasuk emoji (Emoji adalah pengkodean Unicode khusus yang biasa ditemukan di ponsel iOS dan Android), dan banyak karakter Cina yang tidak biasa digunakan, serta karakter Unicode baru, dan banyak lagi.
3. Akar penyebab masalah
Format UTF-8 asli menggunakan satu hingga enam byte dan dapat mengkodekan hingga 31 karakter. Spesifikasi UTF-8 terbaru hanya menggunakan satu hingga empat byte dan dapat mengkodekan hingga 21 bit, yang persis seperti yang mewakili semua 17 bidang Unicode. utf8 adalah set karakter di Mysql yang hanya mendukung karakter UTF-8 hingga tiga byte, yang merupakan bidang multi-teks dasar di Unicode.
Mengapa UTF8 di Mysql hanya mendukung karakter UTF-8 dengan maksimal tiga byte? Saya memikirkannya, mungkin karena ketika Mysql pertama kali dikembangkan, Unicode tidak memiliki pesawat tambahan. Saat itu, Komite Unicode masih memimpikan "65.535 karakter sudah cukup untuk seluruh dunia". Panjang string di Mysql menghitung karakter daripada byte, dan untuk tipe data CHAR, string harus cukup panjang. Saat menggunakan set karakter utf8, panjang yang perlu dipertahankan adalah panjang karakter terpanjang utf8 dikalikan dengan panjang string, sehingga wajar untuk membatasi panjang utf8 maksimum menjadi 3, misalnya, CHAR(100) Mysql akan mempertahankan 300 byte. Adapun mengapa versi berikutnya tidak mendukung karakter UTF-8 4 byte, saya pikir satu karena alasan kompatibilitas mundur, dan yang lainnya adalah bahwa karakter di luar bidang multibahasa dasar jarang digunakan.
Untuk menyimpan karakter UTF-8 4 byte di Mysql, set karakter utf8mb4 diperlukan, tetapi hanya didukung setelah versi 5.5.3 (lihat versi: pilih version(); )。 Saya pikir untuk kompatibilitas yang lebih baik, Anda harus selalu menggunakan utf8mb4 alih-alih utf8. Untuk data tipe CHAR, utf8mb4 menghabiskan lebih banyak ruang, dan menurut rekomendasi resmi Mysql, gunakan VARCHAR alih-alih CHAR.
|