Dieser Artikel ist die Fortsetzung meines ersten Beitrags UTF-8 in Java Webapplikationen.
Alles bisher veröffentlichten Artikel zur Zeichensatzproblematik finden sich hier: http://www.buildblog.de/tag/zeichensatz/
Um nochmal kurz zusammen zu fassen. Zur ordnungsgemäßen verwendung von UTF-8 im Zusammenhang mit JSP´s und Servlets sind folgende Schritte erforderlich:
Die ersten fünf Punkte haben wir bereits im ersten Teil abgehakt. Daher sind sie durchgestrichen. Widmen wir uns also der Datenbank.
6. MySql Verbindungen auf UTF-8 umstellen
Hier gibt es zwei Ansatzpunkte, was daran lieg, dass es auch zwei verschiedene Wege gibt innerhalb eines Servlet-Containers wie Tomcat eine Verbindung aufzubauen.
I. Der manuelle Verbindungaufbau
Überlicherweise sieht ein Verbindungsaufbau von Java zu MySql so aus:
Connection conn = DriverManager.getConnection(“jdbc:mysql://host/database”,”username”,”pw”);
Falls in der MySql-Konfiguration schon UTF-8 als Standardzeichensatz eingestellt wurde, sind auch keine weiteren Schritte erforderlich. Falls nicht muss der Connection-String ergänzt werden, so dass er wie folgt aussieht:
Connection conn = DriverManager.getConnection(“jdbc:mysql://host/database?useUnicode=true&characterEncoding=UTF-8“,”username”,”pw”);
Dies ist wie gesagt nur sinnvoll, wenn man, aus welchen Gründen auch immer, die Datenbank nicht auf UTF-8 umstellen kann oder will. Wie man das macht habe ich bereits an anderer Stelle beschrieben.
II. Der Verbindungsaufbau über den ConnectionPool
Der Verbindungaufbau über den Connection Pool hat dann wie folgt auszusehen (die hervorgehobenen Teile sind die UTF-8 Ergänzungen.
<Resource driverClassName=”com.mysql.jdbc.Driver” maxActive=”50″ maxIdle=”30″ maxWait=”10000″ name=”jdbc/dbWebapp” username=”user” password=”password” type=”javax.sql.DataSource” url=”jdbc:mysql://host:3306/database?autoReconnect=true” characterEncoding=”utf8″ useUnicode=”true” >
</Resource>
7. Die Konfiguration des MySql-Servers ändern
Dieser Schritt ist nicht zwigend erforderlich, wenn man sich an die oben genannten Regeln hält. Ich rate trotzdem dazu, denn wenn wir den MySql-Server nicht umstellen haben wir eine potentielle Fehlerquelle mehr. Zudem führt der Umstand mit sehr hoher wahrscheinlichkeit dazu, dass wir irgendwann bei der Anlage einer Tabelle irgendwo vergessen dein Zeichensatz einzugeben und dann wiederum Salat in der Datenbank haben. Also: bitte die Zeichensatzkonfiguration des MySql-Servers wie im Minitutorial erklärt ändern.
8. Die Zeichensatzkodierung bestehender Tabellen ändern
Hier bekommen wir ein neues Problem, denn die Umstellung kann mit Zeichensalat enden, wenn man einen Fehler macht. Also vorher unbedingt die Datenbank sichern.
Der Befehl zur Umstellung des Zeichensatzes einer Spalte lautet:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Dieses Statement hat allerdings möglicherweise einen unerwünschten Nebeneffekt. Dieser zeigt sich darin, dass MySql hierbei automatisch den Datentyp der Spalte ändert um zu erreichen, dass im neuen Zeichensatz ebenso viele Zeichen in die Spalte passen wie vorher.
Für eine latin1 TEXT Spalte benötigt jedes Zeichen einen Platz von einem Byte, so dass diese bis zu 65.535 Zeichen speichern kann. Wird die Spalte jetzt in das UTF-8 Format konvertiert benötigt jedes Zeichen bis zu 3 Bytes, also 3 × 65.535 = 196.605 Bytes. Da diese Datenmenge im TEXT Datentypen nicht ausreichend Platz findet konvertiert MySql die Spalte in den Datentyp MEDIUM-TEXT, welcher der kleinste Datentyp ist, der eine Menge von 196.605 Bytes beherbergen könnte.
Ebenso wird mit dem VARCHAR-Datentyp verfahren. Dies kann natürlich auswirkungen auf die verwendeten Indizes haben, welche dann möglicherweise angepasst werden müssen.
Diese Methode funktioniert übrigens nicht, wenn man eine Spalte hat in der als Zeichensatz latin-1 eingestellt war, aber trotzdem UTF-8 Zeichen gespeichert wurden. Dann ist wie folgt zu verfahren:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
Zum Schluss sollte in jedem Fall noch der Standard-Zeichensatz der Tabelle geändert werden (nur für den Fall, dass wir irgendwann noch Felder ergänzen wollen und bei unserem Statement die Angabe des Zeichensatzes vergessen):
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
9. Stored Procedures & Functions
Stored-Procedures und Stored-Functions haben häufig Rückgabewerte der Form:
RETURNS TEXT CHARACTER SET utf8;
Der Fett markierte Teil, ist sofern noch nicht in der deklaration der entsprechenden Methode vorhanden, zu ergänzen.
Das Gleiche gilt für Variablendeklarationen:
DECLARE path VARCHAR(255) CHARACTER SET utf8;
http://stackoverflow.com/questions/138948/how-to-get-utf-8-working-in-java-webapps
10. Den Zeichensatz von Java beim Starten von Tomcat festlegen
Hierzu benötigen wir das Startscript von Tomcat. Das ist unter Windows die catalina.bat und unter Linux die catalina.sh. Jeweils zu finden unter %Tomcat_Home%/bin
Beim Aufruf von java … innerhalb dieses Scripts muss noch der Startparameter
-Dfile.encoding=utf-8
ergänzt werden.
Sind alle Schritte ordnungsgemäß umgesetzt sollte es keine Probleme mehr mit der Kodierung geben.
Gut und wo ist die versprochene JavaScript Variante um Parameter der GET-Methode zu kodieren?
Trotzdem Danke für die Mühe.
[...] Weiterlesen… Tags: Java, UTF-8, Webapplikationen, Zeichensatz [...]