Questo è noto come Mojibake . Questo non è un problema di codifica DB, ma un problema di codifica HTTP. L'impostazione della codifica dei caratteri della richiesta POST come hai fatto è davvero la soluzione corretta.
I punti interrogativi si verificano quando entrambi i lati della connessione sono consapevoli della propria codifica. I caratteri inviati/recuperati che non sono coperti dalla codifica di un lato saranno sostituiti da punti interrogativi. I caratteri arabi non sono presenti in ISO-8859-1 e quindi sono sostituiti da punti interrogativi. Questa è la differenza con Mojibake in cui i caratteri vengono inviati senza verificare se la codifica utilizzata dall'altra parte supporta davvero il carattere. Finirai con caratteri codificati in modo errato che si presenta come una sequenza di caratteri incomprensibile.
In questo caso particolare, il driver JDBC è di per sé consapevole che sta usando ISO-8859-1 per impostazione predefinita per trasmettere i caratteri al DB, mentre i caratteri recuperati sono in UTF-8 (il driver MySQL JDBC non guarda il DB codifica della tabella, anche se nel tuo caso è stata impostata correttamente su UTF-8). È necessario dire esplicitamente al driver JDBC di utilizzare UTF-8 per decodificare i caratteri prima di trasmettere i dati al DB. Questo deve essere fatto come proprietà di connessione JDBC che sono definite come parametri della stringa di query nell'URL JDBC in questo modo:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Se stai utilizzando un'origine dati gestita dal contenitore, specifica queste proprietà separatamente come hai fatto per il nome utente e la password
useUnicode=yes
characterEncoding=UTF-8