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? .