Toto je známé jako Mojibake . Toto není problém s kódováním DB, ale problém s kódováním HTTP. Nastavení kódování znaků požadavku POST tak, jak jste to udělali, je skutečně správným řešením.
Otazníky se objeví, když obě strany připojení jsou vědomé jejich vlastního kódování. Odeslané/načtené znaky, které nejsou pokryty kódováním jedné strany, budou nahrazeny otazníky. Arabské znaky se v ISO-8859-1 nevyskytují, a proto jsou nahrazeny otazníky. To je rozdíl oproti Mojibake, kde jsou znaky odesílány bez kontroly, zda kódování používané druhou stranou skutečně znak podporuje. Skončíte s nesprávně zakódovanými znaky, které se prezentují jako nesrozumitelná sekvence znaků.
V tomto konkrétním případě si ovladač JDBC sám uvědomuje, že k přenosu znaků do DB standardně používá ISO-8859-1, zatímco načtené znaky jsou v UTF-8 (ovladač MySQL JDBC se na DB nedívá kódování tabulky, i když je ve vašem případě správně nastaveno na UTF-8). Musíte explicitně říci ovladači JDBC, aby používal UTF-8 k dekódování znaků před přenosem dat do DB. To se má provést jako vlastnosti připojení JDBC, které jsou definovány jako parametry řetězce dotazu v adrese URL JDBC takto:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
Pokud používáte zdroj dat spravovaný kontejnerem, stačí tyto vlastnosti zadat samostatně stejným způsobem, jako jste to udělali pro uživatelské jméno a heslo
useUnicode=yes
characterEncoding=UTF-8