使用mysql5.1,安装时使用默认的字符Latin1,由于这个数据库是公用的,所以配置不能改变
mysql> show variables like 'cha%';
+--------------------------+----------------------------------------------------
+
| Variable_name            | Value
|
+--------------------------+----------------------------------------------------
+
| character_set_client     | latin1
|
| character_set_connection | latin1
|
| character_set_database   | latin1
|
| character_set_filesystem | binary
|
| character_set_results    | latin1
|
| character_set_server     | latin1
|
| character_set_system     | utf8
|
| character_sets_dir       | C:\MySQL\MySQL Server 5.1\share\charsets\
+--------------------------+----------------------------------------------------
+
8 rows in set (0.00 sec)在test用户下创建games表,表的编码是采用默认的编码,现在使用JSP将汉字写入表中,发现汉字为???,由于Tomcat也是公用的,不能修改Tomcat的配置文件,JSP编码为UTF-8,代码如下:
<%@ page language="java" contentType="text/html;charset=UTF-8"%> 
<%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%>
<%
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password="123456";
String str1="东方不败";
String sql="insert into games(gamekey,title,content) values('A','"+str1+"','这是一个很好的电影')";
System.out.println(sql);
Statement stmt;
try{
Class.forName(driver);
}
catch(Exception e){
System.out.println("无法加载驱动程序"+driver);
}
try{
Connection con=DriverManager.getConnection(url,user,password);
System.out.println("数据库连接成功");
stmt=con.createStatement();
stmt.execute(sql);
}
catch(Exception e){
e.printStackTrace();
}
%>尝试使用new String(str1.getBytes("ISO-8859-1"),"UTF-8")和new String(str1.getBytes("UTF-8"),"ISO-8859-1")来转换,结果表中还是乱码,这个问题研究了很久,还是找不到解决办法,有什么好的解决办法吗?谢谢!

解决方案 »

  1.   

    从数据库读数据出来转码的基本步骤:
    在JSP文件的开始处一般有这两行:
    <%@ page contentType="text/html; charset=gb2312" language="java" errorPage="" %>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />(这个在<head></head>标签里)tomcat缺省的编码方式为iso-8859-1,读取汉字后可进行转换:
    new String(str.getBytes("ISO-8859-1"),"GBK");
      

  2.   

    以前使用 默认的字符的mysql 开发,虽然在mysql客户端显示为乱码,但用java读出来是好的。所以我觉得和mysql没关系。同意1楼的意见,因为tomcat的默认编码是iso-8859-1,所以可以用new String(str.getBytes("ISO-8859-1"),"GBK")或new String(str.getBytes("ISO-8859-1"),"GB2312")试试
      

  3.   

    在select之前,先执行set names utf8
      

  4.   

    我也遇到了同样的问题。
    我把数据库的编码成和JSP,通讯编码统一使用的GBK,然后直接用MYSQL客户端写入中文。
    结果,我的JSP可以正常读取MYSQL里面的中文。
    说明我的页面出现在写入数据库的时候,编码出现问题。
    当希望通过编码过滤器过滤的时候,写入数据库的时候还是出现乱码。new String(str.getBytes("ISO-8859-1"),"GBK");
    将在DAO层将add()函数下的ps.setString(1, category.getName()) ;
    改成ps.setString(1, new String(category.getName().getBytes("ISO-8859-1"),"GBK")); 
    可,还是出现乱码。。
      

  5.   

    重新安装一次MYSQL就解决问题了。。
      

  6.   

    my.ini
    文件里面将编码改成gbk
      

  7.   

    你的意思是服务器一定要用latin1(也就是ISO-8859-1)。那你只能降低对页面的要求,只能在页面中使用GB系列编码。用UTF是不行的,因为UTF会用低位编码,会和latin1编码冲突,引起编码转换丢失问题。除此以外,你其他的理解都是对的。
      

  8.   

    以下为综合网上的乱码问题,自己总结的一些方法。可以试一试,看有没有可以帮助你的。
    MySQL插入中文乱码:
    1.在配置文件中,如   c:\winnt\my.ini   中的   [mysqld]   里添加一行:     
      default-character-set=utf8    
    2.连接字符串里,的编码。
    strURL = "jdbc:mysql://localhost:3306/hikdb?useUnicode=true&amp;characterEncoding=utf-8";
    3.数据库表编码,例如:
    CREATE TABLE  `hikdb`.`tb_user` (
      `nLsh` int(10) unsigned NOT NULL auto_increment,
      `UserName` varchar(64)  NOT NULL,
      PRIMARY KEY  (`nLsh`)
    ) ENGINE = innodb DEFAULT CHARACTER SET utf8;