Mysql karakterkészlet probléma utf8 és java kliens esetén
Üdv mindenkinek!
Több fórumon való keresés után írom le itt a problémámat, mivel eddig nem találtam rá megoldást és remélem valaki tud majd segíteni.
Röviden a szerkezet:
JSP --> szervlet <-> DAO
HTML <------+
Környezet:
SunOS 5.10
Apache Tomcat/5.5.20
Mysql Server version: 5.0.51
mysql-connector-java-5.1.6
DB:
CREATE DATABASE `liget` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Table:
CREATE TABLE `liget`.`Test` (
`Kulcs` varchar(10) collate utf8_hungarian_ci NOT NULL,
`Szoveg` varchar(1000) collate utf8_hungarian_ci NOT NULL,
PRIMARY KEY (`Kulcs`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;
Tomcat server.xml
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
...
web.xml
...
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>p1.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
Ezt a kódolást állítja be az EncodingFilter.java osztály.
JSP:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml">;
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
...
<form action="/httpPost/PostServlet" method="post">
<table>
<tr>
<td valign="top"><label for="kulcs">Kulcs: </label></td>
<td valign="top"><input id="kulcs" name="kulcs" maxlength="5" type="text" size="5" /> </td>
<td valign="top"><label for="szoveg">Szoveg: </label></td>
<td valign="top"><textarea name="szoveg" rows="20" cols="50"></textarea> <br />
...
HttpPost servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String s1 = request.getParameter("kulcs");
String s2 = request.getParameter("szoveg");
LOG.debug("kulcs = " + s1 + " szoveg = " + s2);
String msg = new String();
Test test = new Test(s1, s2);
try {
TestDAO tDAO = new TestDAO();
if (request.getParameter("mi").equalsIgnoreCase("get")) {
test = tDAO.get(test);
} else {
tDAO.store(test);
}
...
TestDAO.java
...
String stmtGet = new String("SELECT Szoveg FROM Test WHERE Kulcs = ?");
String stmtUpd = new String("UPDATE Test SET Szoveg = ? WHERE Kulcs = ?");
String stmtIns = new String("INSERT INTO Test VALUES(?,?)");
...
String connectionURL =
"jdbc:mysql://pepper.12web.hu:3306/liget?user=*****;password=*****;useUnicode=true;characterEncoding=utf8;characterSetResults=utf8";
...
try {
ps = connection.prepareStatement(stmtGet);
ps.setString(1, kulcs);
rs = ps.executeQuery();
if (rs.next()) {
ps = connection.prepareStatement(stmtUpd);
ps.setString(1, szoveg);
ps.setString(2, kulcs);
ps.executeUpdate();
} else {
ps = connection.prepareStatement(stmtIns);
ps.setString(1, kulcs);
ps.setString(2, szoveg);
ps.executeUpdate();
}
ps = connection.prepareStatement(stmtGet);
ps.setString(1, kulcs);
rs = ps.executeQuery();
rs.next();
test.setSzoveg(rs.getString(1));
...
Tomcat log:
2008-08-11 01:23:20,525 DEBUG p1.EncodingFilter - doFilter: 32 - Encoding: UTF-8
2008-08-11 01:23:20,540 DEBUG p1.PostServlet - doPost: 56 - kulcs = tűző szoveg =
2008-08-11 01:23:20,555 DEBUG p1.TestDAO - <init>: 47 - ConnectionURL: jdbc:mysql://pepper.12web.hu:3306/liget?user=*****;password=*****;useUnicode=true;characterEncoding=utf8;characterSetResults=utf8 driver= MySQL-AB JDBC Driver/mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
2008-08-11 01:23:20,556 DEBUG p1.TestDAO - get: 61 - kulcs = tűző
2008-08-11 01:23:20,558 DEBUG p1.TestDAO - get: 85 - DB Select kulcs = tűző szoveg = *** No row(s) found with the given key ***
PHPAdmin:
query: SELECT * FROM `Test` WHERE `Kulcs` = 'tűző';
returns:
kulcs=tűző
szoveg=árvíztűrő tükörfúrógép
Mit rontottam el?
Segítségeteket előre is köszönöm.
Dániel Mihály
■ Több fórumon való keresés után írom le itt a problémámat, mivel eddig nem találtam rá megoldást és remélem valaki tud majd segíteni.
Röviden a szerkezet:
JSP --> szervlet <-> DAO
HTML <------+
Környezet:
SunOS 5.10
Apache Tomcat/5.5.20
Mysql Server version: 5.0.51
mysql-connector-java-5.1.6
DB:
CREATE DATABASE `liget` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Table:
CREATE TABLE `liget`.`Test` (
`Kulcs` varchar(10) collate utf8_hungarian_ci NOT NULL,
`Szoveg` varchar(1000) collate utf8_hungarian_ci NOT NULL,
PRIMARY KEY (`Kulcs`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;
Tomcat server.xml
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
...
web.xml
...
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>p1.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
Ezt a kódolást állítja be az EncodingFilter.java osztály.
JSP:
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml">;
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
...
<form action="/httpPost/PostServlet" method="post">
<table>
<tr>
<td valign="top"><label for="kulcs">Kulcs: </label></td>
<td valign="top"><input id="kulcs" name="kulcs" maxlength="5" type="text" size="5" /> </td>
<td valign="top"><label for="szoveg">Szoveg: </label></td>
<td valign="top"><textarea name="szoveg" rows="20" cols="50"></textarea> <br />
...
HttpPost servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
String s1 = request.getParameter("kulcs");
String s2 = request.getParameter("szoveg");
LOG.debug("kulcs = " + s1 + " szoveg = " + s2);
String msg = new String();
Test test = new Test(s1, s2);
try {
TestDAO tDAO = new TestDAO();
if (request.getParameter("mi").equalsIgnoreCase("get")) {
test = tDAO.get(test);
} else {
tDAO.store(test);
}
...
TestDAO.java
...
String stmtGet = new String("SELECT Szoveg FROM Test WHERE Kulcs = ?");
String stmtUpd = new String("UPDATE Test SET Szoveg = ? WHERE Kulcs = ?");
String stmtIns = new String("INSERT INTO Test VALUES(?,?)");
...
String connectionURL =
"jdbc:mysql://pepper.12web.hu:3306/liget?user=*****;password=*****;useUnicode=true;characterEncoding=utf8;characterSetResults=utf8";
...
try {
ps = connection.prepareStatement(stmtGet);
ps.setString(1, kulcs);
rs = ps.executeQuery();
if (rs.next()) {
ps = connection.prepareStatement(stmtUpd);
ps.setString(1, szoveg);
ps.setString(2, kulcs);
ps.executeUpdate();
} else {
ps = connection.prepareStatement(stmtIns);
ps.setString(1, kulcs);
ps.setString(2, szoveg);
ps.executeUpdate();
}
ps = connection.prepareStatement(stmtGet);
ps.setString(1, kulcs);
rs = ps.executeQuery();
rs.next();
test.setSzoveg(rs.getString(1));
...
Tomcat log:
2008-08-11 01:23:20,525 DEBUG p1.EncodingFilter - doFilter: 32 - Encoding: UTF-8
2008-08-11 01:23:20,540 DEBUG p1.PostServlet - doPost: 56 - kulcs = tűző szoveg =
2008-08-11 01:23:20,555 DEBUG p1.TestDAO - <init>: 47 - ConnectionURL: jdbc:mysql://pepper.12web.hu:3306/liget?user=*****;password=*****;useUnicode=true;characterEncoding=utf8;characterSetResults=utf8 driver= MySQL-AB JDBC Driver/mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
2008-08-11 01:23:20,556 DEBUG p1.TestDAO - get: 61 - kulcs = tűző
2008-08-11 01:23:20,558 DEBUG p1.TestDAO - get: 85 - DB Select kulcs = tűző szoveg = *** No row(s) found with the given key ***
PHPAdmin:
query: SELECT * FROM `Test` WHERE `Kulcs` = 'tűző';
returns:
kulcs=tűző
szoveg=árvíztűrő tükörfúrógép
Mit rontottam el?
Segítségeteket előre is köszönöm.
Dániel Mihály
Az őŐ és űŰ karakterek elvesznek.