代码之家  ›  专栏  ›  技术社区  ›  Marcx

Java+MySQL UTF8问题

  •  33
  • Marcx  · 技术社区  · 14 年前

    正如标题所说,我在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.execyte s.executeUpdate 特殊字符存储为?

    因此特殊字符没有正确存储: מסירות קצרות 存储为 ?????????

    Hi! 存储为 你好!

    有什么建议吗?

    谢谢

    2 回复  |  直到 14 年前
        1
  •  83
  •   Marcx    14 年前

    解决了的, 初始化连接时忘记添加编码:

    以前是:

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

    现在(工作):

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

        2
  •  11
  •   Daniel Martin    14 年前

    噢!

    好吧,这不是 直接地 你要的东西,但是这个:

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

    启动所有内部“不要这样做”警报。

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

    请重构代码,以便最终调用:

    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();
    

    也就是说,让数据库转义文本。求你了,除非有一天你想和我谈话 this one . 作为一个有利的副作用,这种方法 可以 解决您的问题,假设从XML中读取字符串值时字符串值仍然正确。(正如其他人提到的,当您从XML中读取数据时,很有可能事情变得一团糟)