首先是我的mysql编码已经修改:
mysql> show Variables like "%set%";
+--------------------------+-------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------------+
| auto_increment_offset | 1 |
| character_set_client | gb2312 |
| character_set_connection | gb2312 |
| character_set_database | gb2312 |
| character_set_filesystem | binary |
| character_set_results | gb2312 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/ |
接着是我的action:
请大家帮我看看,好像是使用PreparedStatement生成insert语句时就产生了乱码:
public class registerAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionErrors errors = new ActionErrors();
boolean useridvalid = true;
useridvalid = useridcheck(request,(registerActionForm)form);
//用户ID未被占用
if(useridvalid){
boolean registered = false;
registered = doRegister(request,(registerActionForm)form);
if(registered){
form.reset(mapping, request);
return mapping.findForward("success");
}
else{
return mapping.findForward("error");
}
}
else{
errors.add("UserIDIsOccupied", new ActionMessage("UserIDIsOccupied"));
form.reset(mapping, request);
return mapping.findForward("error");
}
}
private boolean doRegister(HttpServletRequest request, registerActionForm registerForm) {
boolean b = false;
try {
Context ctx=new InitialContext();
Connection conn=null;
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
conn=ds.getConnection();
String userid = registerForm.getUserid();
String username = registerForm.getUsername();
String password = registerForm.getPassword();
String email = registerForm.getEmail();
String telephone = registerForm.getTelephone();
String userrole = registerForm.getUserrole();
if("1".equals(userrole)){
userrole = "管理员";
}else if("2".equals(userrole)){
userrole = "专业用户";
}
String insSql = new String("insert into UserInfo(userid,username,password," +
"email,telephone,userrole) values(?,?,?,?,?,?)");
PreparedStatement preSQL = conn.prepareStatement(insSql);
userid = new String(userid.getBytes("GB2312"));
preSQL.setString(1,userid);
username = new String(username.getBytes("GB2312"));
System.out.println("#####"+username);
preSQL.setString(2,username);
password = new String(password.getBytes("GB2312"));
preSQL.setString(3,password);
email = new String(email.getBytes("GB2312"));
preSQL.setString(4,email);
telephone = new String(telephone.getBytes("GB2312"));
preSQL.setString(5,telephone);
userrole = new String(userrole.getBytes("GB2312"));
System.out.println("#####"+userrole);
preSQL.setString(6,userrole);
System.out.println("#####"+preSQL);
preSQL.executeUpdate();
preSQL.close();
conn.close();
b = true;
} catch (SQLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return b;
}
private boolean useridcheck(HttpServletRequest request, registerActionForm registerForm) {
boolean checkpass = true;
try {
Context ctx=new InitialContext();
Connection conn=null;
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
conn=ds.getConnection();
String userid = registerForm.getUserid();
String sqlStr = new String("select * from UserInfo where userid=?");
PreparedStatement preSQLSelect = conn.prepareStatement(sqlStr,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
userid = new String(userid.getBytes("GB2312"));
preSQLSelect.setString(1,userid);
ResultSet rs = preSQLSelect.executeQuery();
if(rs.next()){
checkpass = false;
}
rs.close();
preSQLSelect.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return checkpass;
}
}
经过调试,每执行到用黑体字标注的那一段时,打出来的信息都是乱码:
#####com.mysql.jdbc.PreparedStatement@f41393: insert into UserInfo(userid,username,password,email,telephone?userrole) values('bird','bird','123','bird@163.com','01082316463','????')
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?userrole) values('bird','bird','123','bird@163.com','01082316463','????')' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1604)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1519)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1504)
at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
at action.registerAction.doRegister(registerAction.java:104)
at action.registerAction.execute(registerAction.java:40)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
at java.lang.Thread.run(Unknown Source)
求助!!!
--转自