JDBC读取数据库中文表名乱码

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class XmlNameWriter {
/**

* 利用dom4j生成XML

*

* @author Daniel Cheng

*/
static Logger logger=Logger.getLogger(XmlNameWriter.class.getClass());

public void createXML() {

    PropertyConfigurator.configure ( "D:\\workspace\\testlog4j.properties" ) ;
    String driver="com.mysql.jdbc.Driver";
    String url="jdbc:mysql://localhost:3306/zczh?characterEncoding=gbk";
    String username="root";
    String password="233111";
    Connection conn=null;

    Document doc = DocumentHelper.createDocument();
    Element rootEle = doc.addElement("tables");   

    try{
        Class.forName(driver);
        conn=DriverManager.getConnection(url, username, password);
        ResultSet rs=null;
        DatabaseMetaData dbmd=conn.getMetaData();
        rs=dbmd.getTables(null, null, null, null);
        while(rs.next()){
            [b]Element nameEle = rootEle .addElement("table");
                                String tablename=rs.getString(3);
            nameEle.setText(tablename);
                                logger.debug(tablename+"表名已读取到");[/b]//此处获取的中文表名乱码,我在论坛里找了几个设置字符集的方法,试了之后依然乱码。怎样解决?
        }
        if(rs!=null){
            rs.close();
        }


    }catch(SQLException e){
        logger.error(e.getMessage());
    }catch(ClassNotFoundException e){
        logger.error("error:"+e.getMessage());
    }finally{
        if(conn!=null){
            try{
                conn.close();
            }catch(SQLException e){
                logger.error("error:"+e.getMessage());
            }
        }
    }
    try {
        Writer out = new FileWriter("tables.xml");
        //格式化输出,类型IE浏览一样   
        OutputFormat format = OutputFormat.createPrettyPrint();
        //OutputFormat format = OutputFormat.createCompactFormat();   
        format.setEncoding("gbk");
        //创建写出对象   
        XMLWriter writer = new XMLWriter(out, format);
        writer.write(doc);
        writer.close();
        System.out.println("生成tables.xml成功。");
    } catch (IOException e) {
        // TODO Auto-generated catch block   
        e.printStackTrace();
        System.out.println("失败了。");
    }
}

public static void main(String[] args) {
    new XmlNameWriter().createXML();
}

}

4个回答

你先确定你数据库中存着的,是不是就是乱码的?
mysql数据库如果要存中文,在创建数据库和打开数据库的时候是需要加参数的
类似:
mysql -u root --default-character-set=utf8

[code="java"]
String tablename= new String(rs.getString(3).getBytes("ISO-8859-1"))
[/code]

试试这个看行不行?

如果你用的是mySQL,我接下来的回答对你应该很有帮助
首先,你在命令行看看你的字符集设置,命令
show variables like'%char%';
你会看到你的字符集设置
character_set_client // 客户端,即你的命令行窗口的字符集设置

character_set_connection //程序连接数据库的字符集设置,这个可以在建立Connection的url处设置,例如:url=jdbc:mysql://localhost:3306/"表空间名"?useUnicode=true&characterEncoding=GB2312

character_set_database //表空间的字符集设置

character_set_filesystem //不用管

character_set_results //查询结果字符集设置(我是这么理解的)

character_set_server //服务器,即你安装的数据库服务器的字符集设置

character_set_system //不用管
你能看到以上7项,
character_set_filesystem //binary
character_set_system //utf8
这两项你可以不用管。
其他5项,应该设置成你想要的字符集
假如你用gb2312,那这5项的值都应该是gb2312,当然客户端也不是很必要,你如果不用客命令行来插入或者查询你就可以不用管客户端的字符设置。

以下将说明而具体怎么设置字符集
1.修改数据库安装文件。
修改my.ini文件,这个文件在数据库安装根目录下,
修改default-character-set=GB2312;改成gb2312,这个有两项,一项是Client section,即客户端设置,一项是Server section,即数据库服务器设置
2.Connection url的设置,这个在前文已经写出具体格式
3.然后就是你程序的字符设置。你的项目编码也应该是gb2312或者gbk(扩展了gb2312,所以也支持gb2312),其次你页面传递过来的数据也应该以gb2312或者gbk来编码,所以也要设置页面的编码格式。如果是jsp或者html应该设置content:content="text/html; charset=gb2312"

如果以上3条都设置好了。。应该能解决乱码了

你再用命令行执行show variables like'%char%';
看到的结果,其中那5项的编码应该都是gb2312

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问