2017-02-21 5 views
1

So habe ich Hibernate mit Wildfly und MySql eingerichtet.Java EE, Ruhezustand, MySql UTF-8 Abfrage funktioniert nicht

Abfrage funktioniert, aber Problem UTF-8-Charakternamen abzufragen.

Auf MySql:

SELECT * FROM users WHERE firstname = "ნიკა"; 

Hat in leere Menge nicht zur Folge haben.

Während in Java:

Session session = HibernateUtils.getSession(); 

String name = request.getParameter("name"); 

CriteriaBuilder builder = session.getCriteriaBuilder(); 

CriteriaQuery<UsersEntity> query = builder.createQuery(UsersEntity.class); 
Root<UsersEntity> usersRoot = query.from(UsersEntity.class); 
query.select(usersRoot) 
     .where(builder.equal(usersRoot.get("firstname"), name)); 

List<UsersEntity> list = session.createQuery(query).list(); 

session.close(); 

writeUsers(list, response.getWriter()); 

Ergebnisse in einer leeren Menge, wenn localhost:8080/main?name=ნიკა

Abfrage Wie kann ich dieses Problem beheben?

UPDATE:

ich auch Problem haben, dass, wenn alle Daten abfragt und sie nicht Englisch Anzeigen von Zeichen mit Fragezeichen ersetzt werden.

UPDATE 2:

Dieser Code ergibt Fragezeichen auf Browser zeigt nach oben:

response.getWriter().write("ნიკა ჩხარტიშვილი"); 

Während dies ein richtig funktioniert:

response.setCharacterEncoding("UTF-8"); 
response.getWriter().write("ნიკა ჩხარტიშვილი"); 

Wenn mit dieser Abfrage Abfrage-Datenbank SELECT * FROM users WHERE username='ნიკა' Datenbank erhält Fragezeichen statt ნიკა (Das ist was sh eilt in wireshark).

Ich denke, es ist Wildfly Problem, weil es UTF-8 korrekt empfangen, aber Fragezeichen sendet, es sei denn, es ist angegeben, UTF-8 zu senden.

+0

und wenn für den Test Sie den Namen im Code fest codieren könnten, funktioniert es auch. Wenn es so funktioniert, ist es die Übersetzung, die vom Browser ausgeführt wird. – davejal

+0

@davejal Hardcoding funktioniert nicht so gut. – nikartix

+0

Ihr SQL-Beispiel verwendet 'firstname =" ნიკა "'. In Ihrem URL-Beispiel wird "localhost: 8080/main? Name = ნიკა" verwendet. Was passiert, wenn Sie die Sitzung nach dem Aufruf von "writeUsers" schließen? Was macht der Aufruf 'writeUsers'? –

Antwort

0

ich es fest.

Erste Verbindung zum Client war nicht UTF-8. es mit Fixed:

response.setCharacterEncoding("UTF-8"); 

Dies obwohl für ein Servlet funktioniert. Wildfly standalone.xml Konfigurationsdatei

<servlet-container name="default" default-encoding="UTF-8"> 
    <jsp-config/> 
    <websockets/> 
</servlet-container> 

Added default-encoding Eigenschaft servlet-container aktualisiert, jetzt wird jede Antwort Standard UTF-8 Codierung haben.

JDBC-Kommunikation war nicht UTF-8.

Geregelt mit connection.url Aktualisieren beigefügten

?useUnicode=yes&amp;characterEncoding=UTF-8 am Ende.

<property name="connection.url">jdbc:mysql://localhost:3306/cnick?useUnicode=yes&amp;characterEncoding=UTF-8</property> 

Als ich das letzte Mal tat dies dachte ich, es hat nicht funktioniert, weil, was ich war, die Abfrage nicht in der Datenbank. Jetzt geht es.

0

Dies liegt daran, dass URLs nur über das Internet mit dem ASCII-Zeichensatz gesendet werden können.

Wenn Ihr Anruf auf dem Server aus ist Javascript Sie Ihren Namen Wert mit encodeURIComponent kodieren sollte („ნიკა“), sollte Ihr Aufruf wie folgt aussehen:

localhost:8080/main?name=%E1%83%9C%E1%83%98%E1%83%99%E1%83%90 

Wenn Sie nur die URL der Einfügen werden brownser tun Sie es einfach wie gewohnt

localhost:8080/main?name=ნიკა 

und dann in Ihrem Server, nachdem Sie den Namen Wert aus der Anfrage erhalten Sie es erneut als UTF-8 wie folgt kodieren:

//String name = request.getParameter("name"); 
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); 
0

Wenn Sie Fragezeichen bekommen, wenn sie von einer MySQL-Datenbank zu lesen, siehe here

  • Das Bytes gespeichert werden, werden nicht als UTF-8/utf8mb4 codiert. Repariere das. Die Spalte in der Datenbank ist CHARACTER SET utf8 (oder utf8mb4). Repariere das.
  • Überprüfen Sie auch, dass die Verbindung während des Lesens UTF-8 ist.

Die Fragezeichen wurden erzeugt, wenn in die Datenbank einfügen, so dass der ursprüngliche Text nicht wiederhergestellt werden können.

Ich bin mir ziemlich sicher, dass jede Erwähnung von "ISO-8859-1" wird falsch sein. %E1%83%9C ist die Urlencodierung von . Das Holen der namesollte das für Sie rückgängig machen, ohne irgendeine Handlung Ihrerseits. Daher fragt getBytes("ISO-8859-1")ნიკა in dieser Codierung zur Verfügung gestellt werden. Aber diese Kodierung deckt nur Westeuropa ab. Ich schlage vor,

new String(request.getParameter("name").getBytes("UTF-8")); 

versucht (Ist das Java? Oder was?)

+0

Wenn ich von der Befehlszeile auswählen, sind keine Fragezeichen vorhanden. Und wählen Sie mit Where-Klausel funktioniert ordnungsgemäß. Ich denke, es muss Verbindungsproblem sein. – nikartix

+0

Ich habe gerade eine andere Sache überprüft. Ich loggte Namen auf dem Server und sie sind korrekt codiert, aber beim Senden an den Browser sind sie Fragezeichen. – nikartix

+0

Es gibt keine _direct_ Verbindung von MySQL zum Browser. Es muss durch eine App gehen, und diese App muss repariert werden. –