为什么要准备stmt.setString(1,“text'xx”);不工作,因为它可能会打乱查询(Java)?
好的,我想在表中插入包含单引号的字符串text'xx为什么要准备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(); 我犯了这个错
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();