Jest to znane jako Mojibake . To nie jest problem z kodowaniem DB, ale problem z kodowaniem HTTP. Ustawienie kodowania znaków żądania POST, tak jak to zrobiłeś, jest rzeczywiście właściwym rozwiązaniem.
Znaki zapytania pojawiają się, gdy oba strony połączenia są świadome własnego kodowania. Wysłane/odzyskane znaki, które nie są objęte kodowaniem z jednej strony, zostaną zastąpione znakami zapytania. Znaki arabskie nie występują w ISO-8859-1 i dlatego są zastępowane znakami zapytania. Na tym polega różnica w przypadku Mojibake, w której znaki są wysyłane bez sprawdzania, czy kodowanie używane przez drugą stronę rzeczywiście obsługuje znak. Otrzymasz niepoprawnie zakodowane znaki, które wyglądają jak niezrozumiała sekwencja znaków.
W tym konkretnym przypadku sterownik JDBC sam zdaje sobie sprawę, że domyślnie używa ISO-8859-1 do przesyłania znaków do bazy danych, podczas gdy pobrane znaki są w UTF-8 (sterownik MySQL JDBC nie patrzy na bazę danych kodowanie tabeli, nawet jeśli w twoim przypadku jest poprawnie ustawione na UTF-8). Musisz wyraźnie powiedzieć sterownikowi JDBC, aby używał UTF-8 do dekodowania znaków przed przesłaniem danych do DB. Należy to zrobić jako właściwości połączenia JDBC, które są zdefiniowane jako parametry ciągu zapytania w adresie URL JDBC w następujący sposób:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Jeśli korzystasz ze źródła danych zarządzanego przez kontener, po prostu określ te właściwości osobno w taki sam sposób, jak w przypadku nazwy użytkownika i hasła
useUnicode=yes
characterEncoding=UTF-8