Permasalahan UTF-8 dan MySQL/MariaDb

in so you know

Sebenarnya permasalahan ini sudah lama sekali, dan pernah aku bahas di blogku yang sebelumnya. Tapi sekadar pengingat saja, siapa tahu ada yang mengalami dan bingung.

Incorrect string value: ‘\xF0\x9F\x8E\xB6\xF0\x9F…’

Pernahkah kalian menemui permasalahan seperti itu? Yak, betul, setelah dunia memasuki era revolusi emoji *halah*, permasalahan penyimpanan text ke database jadi lebih riwil. Tuntutan agar database mensupport utf-8 menjadi keharusan. Lantas bagaimana ketika terlanjur punya database yang belum support dan melahirkan error di atas?

Mudah saja sebenarnya, gunakan character set utf8mb4 dan collate utf8mb4_unicode_ci. Caranya? Jalankan perintah ini di mysql/mariadb console:

ALTER DATABASE    
     database_name    
     CHARACTER SET = utf8mb4    
     COLLATE = utf8mb4_unicode_ci;

Table juga harus diset supaya menggunakan format ini, jadi lakukan langkah ini:

ALTER TABLE    
     table_name    
     CONVERT TO CHARACTER SET utf8mb4    
     COLLATE utf8mb4_unicode_ci;

Untuk memastikan bahwa perubahan yang kamu lakukan sudah benar, jalankan perintah ini:

SHOW VARIABLES 
     WHERE Variable_name 
     LIKE 'character\_set\_%' 
     OR Variable_name LIKE 'collation%';

Maka, kalian akan mendapatkan hasil kurang lebih begini:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_0900_ai_ci |
| collation_database       | utf8mb4_0900_ai_ci |
| collation_server         | utf8mb4_0900_ai_ci |
+--------------------------+--------------------+

Jangan lupakan my.ini atau my.cnf

Setelah melakukan perubahan di atas, atau sebelum juga boleh, pastikan juga bahwa default character set di client maupun mysql:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

Kenapa? Karena kegagalan menulis ke database itu kesalahannya di mysql workbench, bukan di mysqlnya. Untuk membuktikan itu, kalian bisa langsung saja mempaste emoji di mysql console, tentu tidak akan muncul masalah. Kalau masalah juga, berarti memang databasenya kelamaan nggak disentuh 😀

Demikian sedikit dan sependek yang saya tahu soal utf-8, semoga dengan begini tidak ada lagi masalah penyimpanan emoji, aksara jawa, aksara arab, dan lain-lain.

Salam!