Dit staat bekend als Mojibake . Dit is geen DB-coderingsprobleem, maar een HTTP-coderingsprobleem. De tekencodering van het POST-verzoek instellen zoals u deed, is inderdaad de juiste oplossing.
Vraagtekens treden op wanneer de beide kanten van de verbinding zijn op de hoogte van hun eigen codering. Verzonden/opgehaalde tekens die niet worden gedekt door de codering van één zijde, worden vervangen door vraagtekens. Arabische karakters komen niet voor in ISO-8859-1 en daarom zijn ze vervangen door vraagtekens. Dat is het verschil met Mojibake waarbij karakters worden verzonden zonder te controleren of de door de andere partij gebruikte codering het karakter echt ondersteunt. Je krijgt uiteindelijk verkeerd gecodeerde tekens die zich voordoen als een onverstaanbare reeks tekens.
In dit specifieke geval weet het JDBC-stuurprogramma zelf dat het standaard ISO-8859-1 gebruikt om de tekens naar DB te verzenden, terwijl de opgehaalde tekens zich in UTF-8 bevinden (het MySQL JDBC-stuurprogramma kijkt niet naar de DB tabelcodering, ook al is deze in uw geval correct ingesteld op UTF-8). U moet het JDBC-stuurprogramma expliciet vertellen om UTF-8 te gebruiken om tekens te decoderen voordat gegevens naar DB worden verzonden. Dit moet worden gedaan als JDBC-verbindingseigenschappen die als queryreeksparameters in de JDBC-URL als volgt worden gedefinieerd:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Als u een door een container beheerde gegevensbron gebruikt, geeft u die eigenschappen gewoon afzonderlijk op op dezelfde manier als voor de gebruikersnaam en het wachtwoord
useUnicode=yes
characterEncoding=UTF-8