2010-07-18 121 views
31

正如標題所說,我有Java和MySQL的的Java + MySQL的UTF8問題

MySQL數據庫,表和列是utf8_unicode_ci之間的問題。 我有把從XML輸入的一些應用程序,然後撰寫查詢...

public String [] saveField(String xmltag, String lang){  
    NodeList nodo = this.doc.getElementsByTagName(xmltag); 
    String [] pos = new String[nodo.getLength()];  
    for (int i = 0 ; i < nodo.getLength() ; i++) { 
    Node child = nodo.item(i); 
    pos[i] = "INSERT INTO table (id, lang, value) VALUES (" + 
     child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " + 
     lang + " , " + 
     "'" + child.getFirstChild().getTextContent() + "'" + 
     ");";  
    } 
    return pos; 
} 

這個方法返回一個包含一個或多個SQL INSERT查詢字符串數組... 然後

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql:///dbname", "user", "pass"); 
..... 
Statement s; s = 
this.con.createStatement(); 
s.execute(query); 

都與s.execytes.executeUpdate特殊字符存儲爲?

如此特殊字符無法正確保存: מסירות קצרות存儲爲?????????

Hi!存儲爲Hi!

有什麼建議?

感謝

+1

你如何閱讀源XML?它來自文件還是來自Web服務的字符串或其他?有可能你原來的xml讀取導致了這個問題。 – 2010-07-18 12:58:38

+0

這是一個來自web服務的字符串,我使用db.parse(「http:// ......」)來獲取xml內容... – Marcx 2010-07-18 13:14:20

回答

72

解決, 我忘了補充編碼初始化連接時:

是以前:

con = DriverManager.getConnection("jdbc:mysql:///dbname", "user", "pass");

現在

(工作):

con = DriverManager.getConnection("jdbc:mysql:///dbname?useUnicode=true&characterEncoding=utf-8", "user", "pass");

+0

不應該是utf8嗎? https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-charsets。html – tObi 2018-02-19 20:11:55

11

AUGH!

好,那麼,這是不是直接你要的東西,但這:

pos[i] = "INSERT INTO table (id, lang, value) VALUES (" + 
    child.getAttributes().getNamedItem("id").getNodeValue().toString() + " , " + 
    lang + " , " + 
    "'" + child.getFirstChild().getTextContent() + "'" + 
    ");";  

掀起了我所有的內部 「DO NOT DO THIS」 報警。

您是否對傳入文本有絕對完整的控制權?你確定有人不會在即將發生的文字中出現撇號嗎?

PreparedStatement pstmt = 
    con.prepareStatement("INSERT INTO table (id, lang, value) VALUES (?,?,?)"); 
// then, in a loop: 
pstmt.setString(0, child.getAttributes().getNamedItem("id").getNodeValue().toString()); 
pstmt.setString(1, lang); 
pstmt.setString(2, child.getFirstChild().getTextContent()); 
pstmt.execute(); 

也就是說,讓DB逃脫文字:

而不是創建SQL文本,請讓你最終調用重構你的代碼。請,除非有一天你想有一個像this one這樣的對話。作爲一個有利的副作用,這種方法可能會解決您的問題,假設從XML讀取它們時字符串值仍然正確。 (正如其他人所提到的,當你從XML中讀取數據時,事情很可能會變得混亂)

+0

是的我知道,我寫這種方式給你一個更輕的代碼;) – Marcx 2010-07-18 13:38:00

+0

大聲笑。我可以理解一個方面的評論,但對這個可憐的傢伙採取全面的回答? -1 – kellogs 2013-08-01 10:14:39

+0

@DanielMartin +1,有沒有辦法從'pstmt'獲得最終查詢字符串,然後再設置它的所有值,我需要知道這一點,以便我可以記錄正在執行的查詢。 – Watt 2014-01-13 21:03:42