小弟写了个带数据库的图书馆系统,但是在书籍查询这个模块上出现了点问题,代码如下:package library;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;public class BookQuery extends JFrame implements ActionListener {
private JFrame frame;
private JTextField jtfd1;
private JRadioButton rbt1, rbt2;
private JTable tb;
private Object[][] row = new Object[20][6];
private String[] columns = {"书名","ISBN号","作者",
"出版社","在架情况","书架号"};
private JButton bt1;
private Connection conn;
private Statement stmt;

public BookQuery() {
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame("书籍查询");
// frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
JPanel
jp1 = new JPanel(),
jp2 = new JPanel();

jtfd1 = new JTextField("请输入查询内容");
rbt1 = new JRadioButton("书名");
rbt1.setSelected(true);
rbt2 = new JRadioButton("ISBN号");
ButtonGroup bg = new ButtonGroup();
bg.add(rbt1);
bg.add(rbt2);
// String[] searchKind = {"书名","ISBN号"};
// cmbx = new JComboBox(searchKind);
bt1 = new JButton("搜索");
bt1.addActionListener(this);
jp1.setLayout(new GridLayout());
jp1.add(rbt1);
jp1.add(rbt2);
jp1.add(jtfd1);
jp1.add(bt1);

tb = new JTable(row, columns);
tb.setRowHeight(25);
JScrollPane sp = new JScrollPane(tb); content.add(jp1, BorderLayout.NORTH);
content.add(sp, BorderLayout.CENTER);

frame.pack();
frame.setLocationRelativeTo(null);
frame.setSize(600, 200);
frame.setVisible(true);

try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/library","jmwu","12345");
stmt = conn.createStatement();
// System.out.println("s");
}catch(ClassNotFoundException e) { }catch(SQLException e) { }
}

public void actionPerformed(ActionEvent e) {
String str = jtfd1.getText().trim();
String sqlStr;
ResultSet rs;
int i = 0;
Object obj = e.getSource();

if(rbt1.isSelected()) {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where name ="+"'"+str+"'";    //问题所在
}
else {
sqlStr = "select name,ISBN,author,press,ava,loc from book " +
"where ISBN ="+"'"+str+"'";    //问题所在
}
try {
if(obj == bt1) {
if(str.equals("") ||str.equals("请输入查询内容")) {
JOptionPane.showMessageDialog(frame, "请输入查询内容");
return;
}
rs = stmt.executeQuery(sqlStr);
for(int j = 0; j < row.length; j++) {
for(int k = 0; k < 6; k++) {
row[j][k] = null;
}
tb.repaint();
if(rs.next()) {
if(i < row.length) {
row[i][0] = rs.getString("name");
row[i][1] = rs.getString("ISBN");
row[i][2] = rs.getString("author");
row[i][3] = rs.getString("press");
row[i][4] = rs.getString("ava");
row[i][5] = rs.getString("loc");
i++;
}
}
jtfd1.setText("");
}
}
}catch(SQLException se) {

}
}
public static void main(String[] args) {
new BookQuery();
}
}问题是,在执行数据查询时,如果选择 查询“ISBN” table中就能显示查询结果,而如果选择“书名”,无查询结果,确定数据库建表正确,输入正确,我很疑惑,望赐教另:我用的是eclipse 在eclipse中输入的汉字,在数据库中显示是乱码,同样在数据库中插入汉字,用eclipse查询出来也是乱码,求解决办法 谢谢大家!

解决方案 »

  1.   

    mysql> SHOW VARIABLES LIKE 'character%';
    +--------------------------+----------------------------+
    | 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       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    这样的 具体我不会看
      

  2.   

    选ISBN有结果,而选书名没有查出结果,你可以打印出执行的sql语句看一下。乱码问题:
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/library","jmwu","12345");
    连接字符串中指定一下编码,要与数据库中的编码一至。
    例如jdbc:mysql://localhost:3306/mlm?useUnicode=true&characterEncoding=UTF-8
      

  3.   

    为了防止乱码,应该将所有编码方案全部设置成UTF-8
      

  4.   

    多谢指教,我已经试验过了,确实是eclipse和mysql编码不一致,eclipse默认utf8,mysql默认latin1
    但是我用的系统是ubuntu10.04,无法用网上的方法在mysql的my.cnf中修改,因为my.cnf只有root用户才能修改,而我试过了网上的很多方法,都不行,比较棘手,弄了一晚上了 ,打算明天再试。:)
      

  5.   

    多谢指教,但现在的问题是没办法编辑my.cnf  这是只读文件,我用的ubuntu 10.04,不能修改,不能移动,本来想复制到外面,修改好在覆盖回来,也不行,用root用户登录到现在还没研究出来,网上多数方法都试了..但好像系统版本不同的缘故,都不行,郁闷啊
      

  6.   

    ubuntu开启root是sudo passwd root然后给它密码就可以使用了。而且使用sudo一样可以具有相应的权限修改文件。还有一点,linux下mysql默认应该是utf8,不应该是latin,估计是你安装配置是修改了。
      

  7.   

    多谢指教,我明天再试试,我的mysql安装好以后没有配置过字符集,应该就是默认的,可能版本不一样也有关系说不定。
      

  8.   

    mysql的目录下面有一个my.ini文件,将这个文件打开之后会有两处charset=latin1(忘了是不是charset了,不过后面肯定是latin1,只有两处),这个就是数据库的编码方式,将这个改成和你程序一样的编码方式就可以了。
      

  9.   

    mysql> show variables like 'character_set_%'
        -> ;
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    我在my.cnf中改完以后是这样的,然后eclipse的默认编码也是utf8,但是现在的情况是我在终端中向表中插入中文也显示乱码了,而且从程序代码向表插入数据也是乱码  
      

  10.   

    问题已经解决。
    原因在于:mysql默认字符集是latin,而eclipse默认是utf8,字符集不一致造成两边输入输出乱码;
    在my.cnf修改mysql默认字符集为utf8后,乱码仍旧存在,于是将Mysql中原先存在的旧database删除,新建一个,使用新建的database以后就不再有乱码问题了,希望大家能引以为鉴,从我的错误中吸取教训