Ini dikenal sebagai Mojibake . Ini bukan masalah penyandian DB, tetapi masalah penyandian HTTP. Menyetel pengkodean karakter permintaan POST seperti yang Anda lakukan memang merupakan solusi yang tepat.
Tanda tanya muncul ketika keduanya sisi koneksi sadar pengkodean mereka sendiri. Karakter terkirim/diambil yang tidak tercakup oleh pengkodean satu sisi akan diganti dengan tanda tanya. Karakter Arab tidak muncul di ISO-8859-1 dan karenanya diganti dengan tanda tanya. Itulah bedanya dengan Mojibake dimana karakter dikirim tanpa memeriksa apakah pengkodean yang digunakan oleh pihak lain benar-benar mendukung karakter tersebut. Anda akan mendapatkan karakter yang salah dikodekan yang menampilkan dirinya sebagai urutan karakter yang tidak dapat dipahami.
Dalam kasus khusus ini, driver JDBC dengan sendirinya menyadari bahwa ia menggunakan ISO-8859-1 secara default untuk mengirimkan karakter ke DB, sedangkan karakter yang diambil berada di UTF-8 (driver MySQL JDBC tidak melihat DB pengkodean tabel, meskipun sudah disetel dengan benar ke UTF-8 dalam kasus Anda). Anda perlu memberi tahu driver JDBC secara eksplisit untuk menggunakan UTF-8 untuk memecahkan kode karakter sebelum mengirimkan data ke DB. Ini harus dilakukan sebagai properti koneksi JDBC yang didefinisikan sebagai parameter string kueri di URL JDBC seperti:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Jika Anda menggunakan sumber data yang dikelola penampung, cukup tentukan properti tersebut secara terpisah dengan cara yang sama seperti yang Anda lakukan untuk nama pengguna dan sandi
useUnicode=yes
characterEncoding=UTF-8