2012-07-16 22 views
0

我有這樣的代碼,我遇到使用數據庫VARCHAR Java裏面的NetBeans,數據類型用java netbeans的我無法從數據庫讀取

import com.mysql.jdbc.Statement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.util.Scanner; 

public class NewDataBase { 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     try{ 
       Connection con = DriverManager.getConnection("jdbc:mysql://localhost/mydb","root", "password"); 
       Statement stmt = (Statement) con.createStatement(); 
       System.out.println("Enter name"); 
       String name =sc.next(); 
       String SQL = "select * from list where Name ='"+ name + "'"; 
       ResultSet rs = stmt.executeQuery(SQL); 
       System.out.print("Name: " + rs.getNString("Name")); 
       System.out.print("Number: " + rs.getNString("Number")); 
       // while(rs.next()) 
       // { 
       // System.out.print("Name: " + rs.getNString("Name")); 
       // System.out.print("Number: " + rs.getNString("Number")); 

       //} 
     }catch(Exception e){ 
      System.out.print("Error:" + e.getMessage()); 
     } 
    } 
} 

錯誤讀取從MySQL數據庫中的信息的一個問題:能當字段的字符集不是UTF-8時,請不要調用getNString()

+2

您已經開放了SQL注入。爲了避免它,請始終使用['PreparedStatement'](http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)。 – Lion 2012-07-16 18:49:32

+0

http://xkcd.com/327/ – 2012-07-16 22:11:22

回答

1

用途:

Properties props = new Properties(); 
    props.put("user", "root");   
    props.put("password", "password"); 
    props.put("useUnicode", "true"); 
    props.put("useServerPrepStmts", "false"); // use client-side prepared statement 
    props.put("characterEncoding", "UTF-8"); // ensure charset is utf8 here 

    String url = "jdbc:mysql://localhost/mydb"; 
    Connection connection = DriverManager.getConnection(url, props); 

    PreparedStatement ps = 
     connection.prepareStatement("INSERT INTO list (Name, Number) VALUES (?, ?)"); 

    String testNumber = "12345"; 
    String testName = "name1"; 
    pstmt1.setNCharacterStream(1, new StringReader(testName), testName.length()); 
    ps.setNCharacterStream(2, new StringReader(testNumber), testNumber.length()); 
    ps.execute(); 

也不要忘了在

if (rs.next()) { 
    System.out.print("Name: " + rs.getNString("Name")); 
    System.out.print("Number: " + rs.getNString("Number")); 
} 
+0

INSERT INTO list(Name,Number)VALUES(_utf8'aaaaaa',_utf8'222222'); – user1529682 2012-07-16 19:41:45

+0

錯誤:當字段的字符集不是UTF-8 – user1529682 2012-07-16 19:43:06

+0

連接到數據庫時無法調用getNString()成功完成。 更新數據庫通過以下語句成功完成: stmt.executeUpdate(「INSERT INTO list(Name,Number)VALUES(_utf8'AB',_utf8'45')」); 但我的程序裏面的數據庫中的retreive數據不成功 我認爲這是數據庫內部的數據類型,必須使用什麼類型的數據。 感謝您的回覆。 – user1529682 2012-07-16 21:02:54

2

嘗試rs.getString("Name")而不是rs.getNString("Name")

+0

錯誤:結果開始之前se – user1529682 2012-07-16 19:39:19

+0

請添加完整的錯誤堆棧跟蹤和更新的代碼。一半的信息可能沒有幫助。 – kosa 2012-07-16 19:40:27

+0

它對我有用 – humphrey 2014-11-08 20:17:13

0
if (rs.next()) { 
    rs.getString("Name"); 
} 
rs.close(); 
stmt.close(); 
con.close(); 

評論是的,更好的使用PreparedStatement SQL注入和反斜槓,報價和這樣的逃避。

1

我100%肯定這個工作。這是我從Namberi得到的答案。

rs.getString("Name") instead of rs.getNString("Name")