Ceci est connu sous le nom de Mojibake . Ce n'est pas un problème d'encodage DB, mais un problème d'encodage HTTP. Définir l'encodage des caractères de la requête POST comme vous l'avez fait est en effet la bonne solution.
Les points d'interrogation apparaissent lorsque les deux les côtés de la connexion sont conscients de leur propre encodage. Les caractères envoyés/récupérés qui ne sont pas couverts par l'encodage d'un côté seront remplacés par des points d'interrogation. Les caractères arabes n'apparaissent pas dans ISO-8859-1 et sont donc remplacés par des points d'interrogation. C'est la différence avec Mojibake où les caractères sont envoyés sans vérifier si l'encodage utilisé par l'autre côté prend vraiment en charge le caractère. Vous finirez par des caractères mal codés qui se présentent comme une séquence de caractères inintelligibles.
Dans ce cas particulier, le pilote JDBC est lui-même conscient qu'il utilise ISO-8859-1 par défaut pour transmettre les caractères à la BD, alors que les caractères récupérés sont en UTF-8 (le pilote MySQL JDBC ne regarde pas la BD encodage de table, même s'il a été correctement défini sur UTF-8 dans votre cas). Vous devez indiquer explicitement au pilote JDBC d'utiliser UTF-8 pour décoder les caractères avant de transmettre les données à DB. Cela doit être fait en tant que propriétés de connexion JDBC qui sont définies en tant que paramètres de chaîne de requête dans l'URL JDBC comme suit :
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Si vous utilisez une source de données gérée par conteneur, spécifiez simplement ces propriétés séparément de la même manière que vous l'avez fait pour le nom d'utilisateur et le mot de passe
useUnicode=yes
characterEncoding=UTF-8