Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要准备stmt.setString(1,“text'xx”);不工作,因为它可能会打乱查询(Java)?_Java_Mysql_Sql - Fatal编程技术网

为什么要准备stmt.setString(1,“text'xx”);不工作,因为它可能会打乱查询(Java)?

为什么要准备stmt.setString(1,“text'xx”);不工作,因为它可能会打乱查询(Java)?,java,mysql,sql,Java,Mysql,Sql,好的,我想在表中插入包含单引号的字符串text'xx String sql="INSERT INTO table (text, id) values (?,?)"; preparedStmt=myCon.prepareStatement(sql); preparedStmt.setString(1, "text'xx"); preparedStmt.setInt(2,1); int affectedRows = preparedStmt.executeUpdate(); 我犯了这个错

好的,我想在表中插入包含单引号的字符串text'xx

String sql="INSERT INTO table (text, id) values (?,?)";
  preparedStmt=myCon.prepareStatement(sql);
 preparedStmt.setString(1, "text'xx");
 preparedStmt.setInt(2,1);
 int affectedRows = preparedStmt.executeUpdate();
我犯了这个错误:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'text' at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2868)...
因此,我调试了以下sql语句(&F):

insert into table (text,id) values ('text'xx',1);
即strage cos preparedStmt.setString1,text'xx;这应该是一个非常强大的方法&它应该把所有东西都去掉,对吗

还是我误解了什么

如何修复它?

更新

将表名更改为另一个非默认名称。我的例子中的表2 确保您的文本字段是UTF-8 您的IDE在eclipse运行时应该是UTF-8 配置->通用->编码->UTF-8 在mysql连接中指定UTF-8 jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-八,

确保您的代码是UTF-8Eclipse,右键单击.java ->属性->utf-8 这对我有用

public static void main(String[] args) throws Exception {
    Connection myCon = null;
    try {
        String userName = "myuser", password = "mypass";// change accordingly
        String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";// change accordingly
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        myCon = DriverManager.getConnection(url, userName, password);
        PreparedStatement preparedStmt;
        try {
            String sql = "INSERT INTO table2 (text, id) values (?,?)";
            preparedStmt = myCon.prepareStatement(sql);
            preparedStmt.setString(1, "/ˈaɪfoʊn/ eye-fohn)");
            preparedStmt.setInt(2, 1);
            preparedStmt.executeUpdate();   
            preparedStmt = myCon.prepareStatement("SELECT id, text as text from table2 ");
            ResultSet rs = preparedStmt.executeQuery();
            while (rs.next()) {
                System.out.println("-->" +rs.getString("text") + "<--");
            }           
            preparedStmt.close();               
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        System.err.println(e.getMessage());
    } finally {
        if (myCon != null) {
            try {
                myCon.close();
            } catch (Exception e) { }
        }
    }
}

您可以尝试以下代码:-

String sql="INSERT INTO table_name (text, id) values (?,?)";
preparedStmt=myCon.prepareStatement(sql);
preparedStmt.setString(1, "text''xx");
preparedStmt.setInt(2,1);
int affectedRows = preparedStmt.executeUpdate();

在这里,我将您的表名更改为表名,并在文本'xx中加上一个引号。这会将您的值转换为文本'xx,不会出现错误。希望这对您有所帮助。

检查“”在字符串中的作用。你到底想让它做什么?您可能需要一个转义字符来防止出现问题。@Stultuske:不应该有任何转义的必要。真的吗??我以为prepareStmt会为我转义?@Tum:它应该为您转义,或者在协议中作为单独的参数值传递。你给我的密码看起来很好。当你说你发现sql是这样的。。。这可能仅仅是一个诊断表示,它没有真正显示发送到数据库的内容吗?您正在使用哪个JDBC驱动程序?文本字段的大小是多少?我不确定它应该是什么,但是如果DB认为它是第二个值,这可能会引起麻烦。我想TUM刚刚找到了一个司机BuGi应该和他使用同一个驱动程序。你是否尝试访问En.WikiTo.Org/Wiki/iPhone;复制前3个单词,如iPhone/aɪfoʊn/eye fohn,并将它们插入DB。你能插入它吗?你试过访问en.wikipedia.org/wiki/Iphone;&复制前3个单词,如iPhone/aɪfoʊn/eye fohn,并将它们插入DB。你能插入它吗?
String sql="INSERT INTO table_name (text, id) values (?,?)";
preparedStmt=myCon.prepareStatement(sql);
preparedStmt.setString(1, "text''xx");
preparedStmt.setInt(2,1);
int affectedRows = preparedStmt.executeUpdate();