【问题标题】:Java + Mysql UTF8 ProblemJava + Mysql UTF8 问题
【发布时间】:2011-03-17 13:46:20
【问题描述】:

正如标题所说,我在java和mysql之间有问题

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 插入查询... 那么

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!

有什么建议吗?

谢谢

【问题讨论】:

  • 您如何阅读源 XML?它是来自文件还是来自 Web 服务的字符串或其他什么?可能是您对 xml 的原始阅读导致了问题。
  • 这是一个来自网络服务的字符串,我使用 db.parse("http://......") 来获取 xml 内容...

标签: java mysql xml utf-8 insert


【解决方案1】:

已解决, 初始化Connection的时候忘记加编码了:

以前是:

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

现在(工作):

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

【讨论】:

【解决方案2】:

啊!

好的,所以,这不是直接您要求的,而是:

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

触发我所有的内部“不要这样做”警报。

您对传入的文本有绝对和完全的控制权吗?你确定有人在传入的文本中不会有撇号,即使是偶然的?

请重构您的代码,而不是创建 SQL 文本,以便最终调用:

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 转义文本。拜托,除非有一天你想要像this one 这样的对话。作为一个有利的副作用,这种方法可以解决您的问题,假设当您从 XML 中读取字符串值时它们仍然是正确的。 (正如其他人提到的,当您从 XML 中读取时,事情很可能会变得一团糟)

【讨论】:

  • 哈哈。我可以理解一个侧面评论,但整个答案都在挑那个可怜的家伙? -1
  • @DanielMartin +1,有没有办法在设置所有值后从pstmt 获取最终查询字符串,我需要知道这一点,以便我可以记录正在执行的查询。跨度>
  • @Watt 迟到总比不到好:pstmt.toString() 会成功的
猜你喜欢
  • 2014-12-17
  • 2010-09-25
  • 2011-07-12
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2012-12-13
  • 2012-02-21
  • 2011-08-27
相关资源
最近更新 更多