Това е известно като Mojibake . Това не е проблем с DB кодирането, а проблем с HTTP кодирането. Задаването на кодирането на символите на POST заявка, както го направихте, наистина е правилното решение.
Въпросителни знаци се появяват, когато и двете страните на връзката са наясно на собственото им кодиране. Изпратените/извлечените знаци, които не са обхванати от кодирането на едната страна, ще бъдат заменени с въпросителни. Арабските знаци не се срещат в ISO-8859-1 и следователно те са заменени с въпросителни. Това е разликата с Mojibake, при която символите се изпращат, без да се проверява дали кодирането, използвано от другата страна, наистина поддържа знака. В крайна сметка ще получите неправилно кодирани знаци, което се представя като неразбираема последователност от знаци.
В този конкретен случай JDBC драйверът сам по себе си е наясно, че използва ISO-8859-1 по подразбиране за предаване на знаците към DB, докато извлечените знаци са в UTF-8 (драйверът на MySQL JDBC не разглежда DB кодиране на таблица, въпреки че е правилно зададено на UTF-8 във вашия случай). Трябва изрично да кажете на JDBC драйвера да използва UTF-8 за декодиране на знаци, преди да предаде данни към DB. Това трябва да се направи като свойства на JDBC връзка, които са дефинирани като параметри на низ на заявка в URL адреса на JDBC така:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Ако използвате управляван от контейнер източник на данни, просто посочете тези свойства отделно по същия начин, както направихте за потребителското име и паролата
useUnicode=yes
characterEncoding=UTF-8