sql >> Database >  >> RDS >> Mysql

Kan geen niet-latijnse symbolen invoegen in MySQL

In UTF-8, Упячка moet eigenlijk worden weergegeven als \x423\x43F\x44F\x447\x43A\x430 . De \xD0\xA3\xD0\xBF\xD1\x8F... houdt in dat ze onjuist zijn gecodeerd met ISO-8859-1.

Hier is een testfragment dat dit bewijst:

String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
    System.out.printf("\\x%X", (int) c);
}

Welke afdrukken

\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0

Uw probleem moet dus een stap eerder worden opgelost. Aangezien je het hebt over een Java-webapplicatie en deze string waarschijnlijk het resultaat is van gebruikersinvoer, weet je zeker dat je hebt gezorgd voor de HTTP-verzoek- en responscoderingen? Ten eerste moet u in JSP het volgende bovenaan de JSP toevoegen:

<%@ page pageEncoding="UTF-8" %>

Hierdoor wordt de pagina niet alleen in UTF-8 weergegeven, maar wordt ook impliciet een HTTP Content-Type responsheader die de client instrueert dat de pagina wordt weergegeven met UTF-8, zodat de client weet dat hij alle inhoud moet weergeven en alle formulieren moet verwerken met dezelfde codering.

Nu, het HTTP-verzoekgedeelte, voor GET-verzoeken moet u de betreffende servletcontainer configureren. In Tomcat is dit bijvoorbeeld een kwestie van het instellen van de URIEncoding attribuut van de HTTP-connector in /conf/server.xml overeenkomstig. Voor POST-verzoeken moet dit al worden geregeld door de client (webbrowser) die slim genoeg is om de responscodering te gebruiken zoals gespecificeerd in de JSP. Als dit niet het geval is, moet u een Filter . toevoegen die controleert en sets de aanvraagcodering.

Voor meer achtergrondinformatie kun je dit artikel vinden nuttig.

Afgezien van dit alles heeft MySQL nog een probleem met Unicode-tekens. Het ondersteunt alleen UTF-8-tekens tot 3 bytes , niet 4 bytes. Met andere woorden, alleen het BMP-bereik van 65535 tekens wordt ondersteund, daarbuiten niet. PostgreSQL ondersteunt het bijvoorbeeld volledig. Dit kan uw webapplicatie niet schaden, maar dit is zeker iets om in gedachten te houden.



  1. PostgreSQL en vergrendeling

  2. MySQL Rijniveauvergrendelingen

  3. PHP MYSQL SET geeft fout in while-lus

  4. MySQL-fout lege string gegeven als argument voor ! karakter