*Markus: (MYSQL) UTF8-, bzw Umlaut-Problem

Beitrag lesen

Hallo,

eigentlich wollte ich herausfinden, wie ich dem Tomcat beibringen kann, UTF-8 zu verwenden. URIEncoding="UTF-8" in der server.xml scheint nicht zu helfen (funktioniert angeblich nur bei GET). In den JSPs hilft folgende Zeile:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>

ebenfalls nicht.
Beim Herumspielen kam ich aber plötzlich auf etwas ganz anderes, noch viel schlimmeres drauf. Offensichtlich scheinen Umlaute am Schluss einer Eingabe in einem HTML-Input-Feld, die über ein Servlet in eienr MySQL-Db landet den Tomcat völlig aus dem Tritt zu bringen. Ein "ÄÖÜ" löst folgende Exception aus:

  
ava.sql.SQLException: Incorrect string value: '\xC2\x84\xC3\x83\xC2\x96...' for column 't_beschreibung' at row 1

Der Code sieht so aus:

Servlet.....

  
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   ThemenGebietDao dao = new ThemenGebietDaoImpl();  
  
   if (request.getParameter("themaanlegen") != null)   {  
    String thema = request.getParameter("themengebiet");  
    if (thema != null && !thema.trim().equals(""))   {  
    ThemenGebietBo bo = new ThemenGebietBo();  
    bo.setBeschreibung(thema);  
    dao.setNewThemengebiet(bo);  
    request.getRequestDispatcher("themengebiet_erfolgreich.html").forward(request, response);  
    }  
    else  {  
    request.getRequestDispatcher("themengebiet_fehler.html").forward(request, response);  
    }  
   }

Gespeichert wird der Wert folgendermaßen:

  
 @Override  
 public void setNewThemengebiet(ThemenGebietBo themenGebiet) {  
        Connection con = ConnectionFactory.getConnection();  
        if (con != null)   {  
         String conString = "INSERT INTO Themengebiet SET t_beschreibung = ?";  
         try {  
    PreparedStatement pst = con.prepareStatement(conString);  
    pst.setString(1, themenGebiet.getBeschreibung());  
             pst.execute();  
  
   } catch (SQLException e) {  
    e.printStackTrace();  
   }  
   finally  {  
    try { con.close(); }  
    catch (SQLException e) { e.printStackTrace(); }  
   }  
        }  
 }  

Will ich einen String, der "fünf" heißt speichern, funktioniert es, d.h. es steht richtig in der MySQL-DB als "fünf".
Angezeigt wird es aber trotzdem falsch. Die Kodierung im Browser UTF-8, MySQL ist standardmäßig auf utf8. Scheint wohl ein Tomcat-Problem zu sein.
Jedenfalls ist es mir ein größeres Anliegen, das Problem mit der Tomcat-Exception zu beheben. Will ich ÄÖÜ abspeichern, bekomme ich folgendes als StackTrace:

  
java.sql.SQLException: Incorrect string value: '\xC2\x84\xC3\x83\xC2\x96...' for column 't_beschreibung' at row 1  
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)  
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)  
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)  
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)  
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)  
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)  
 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)  
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)  
 at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995)  
 at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169)  
 at dao.ThemenGebietDaoImpl.setNewThemengebiet(ThemenGebietDaoImpl.java:44)  
 at servlets.ThemenServlet.doPost(ThemenServlet.java:50)  
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)  
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)  
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)  
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)  
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)  
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)  
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)  
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)  
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)  
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)  
 at java.lang.Thread.run(Thread.java:619)  

Kann sich das jemand erklären?

Markus

--