Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
Java '的转义字符@';——JDBC?_Java_Mysql_Sql_Jdbc - Fatal编程技术网

Java '的转义字符@';——JDBC?

Java '的转义字符@';——JDBC?,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我正在批量插入MySQL表: insert into table1 (field1, field2) values("aa@gmail.com", "f2 value"), ("cc@gmail.com", "another f2 here"); 值字符串中的字符“@”出现错误: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用第1行“插入买家(字段1,

我正在批量插入MySQL表:

insert into table1 (field1, field2) values("aa@gmail.com", "f2 value"), ("cc@gmail.com", "another f2 here");
值字符串中的字符“@”出现错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用第1行“插入买家(字段1,字段2)值('aa@')的正确语法 位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:423) 位于com.mysql.jdbc.Util.HandleneInstance(Util.java:425) 位于com.mysql.jdbc.Util.getInstance(Util.java:408) 位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) 在com.mysql.jdbc.MysqlIO.checkErrorPacket上(MysqlIO.java:3970) 在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)上 位于com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524) 位于com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677) 位于com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549) 位于com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) 位于com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) 位于com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) 位于com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098) 在com.mysql.jdbc.PreparedStatement.executeUpdate上(PreparedStatement.java:1994)

我怎样才能避开这个问题——JDBC是否有某种逃逸特征来解决这个问题

注意:我知道JDBC批处理执行。我正在寻找上述问题的解决方案-如果有的话:

pStat.addBatch();
pStat.executeBatch();
蒂亚


进一步注意:上述插入查询直接在MySQL上运行良好,中间没有JDBC。另外注意:当JDBC本身使用
pStat.getString(“aa@gmail.com")因此,批处理执行是一种解决方案。

尝试使用PreparedStatement。它自动解析特殊字符,避免sql注入

String queryStr = "insert into table1 (field1, field2) values(?, ?);"
try {
    PreparedStatement preparedStatement = conn.prepareStatement(queryStr);
    preparedStatement.setString(1, "aa@gmail.com");
    preparedStatement.setString(2, "f2 value");
    preparedStatement.executeUpdate();
} catch (SQLException e) {
    // Error
} finally {
    if (preparedStatement != null) {
        preparedStatement.close();
    }
    if (conn != null) {
        conn.close();
    }
}

更多示例:

尝试使用PreparedStatement。它自动解析特殊字符并避免sql注入

String queryStr = "insert into table1 (field1, field2) values(?, ?);"
try {
    PreparedStatement preparedStatement = conn.prepareStatement(queryStr);
    preparedStatement.setString(1, "aa@gmail.com");
    preparedStatement.setString(2, "f2 value");
    preparedStatement.executeUpdate();
} catch (SQLException e) {
    // Error
} finally {
    if (preparedStatement != null) {
        preparedStatement.close();
    }
    if (conn != null) {
        conn.close();
    }
}
更多示例:

使用单引号:

insert into table1 (field1, field2) 
  values('aa@gmail.com', 'f2 value'), ('cc@gmail.com', 'another f2 here');
使用单引号:

insert into table1 (field1, field2) 
  values('aa@gmail.com', 'f2 value'), ('cc@gmail.com', 'another f2 here');

我不认为错误消息表明“@”at符号字符有问题

MySQL语法错误“right syntax to use near”通常指向遇到问题的第一个令牌。在这种情况下,MySQL似乎反对
INSERT

…在“
附近插入买家(字段1,字段2)值('aa@
”位于第1行

我怀疑SQL文本中有
insert
之前的内容,MySQL看到了多个语句。这只是猜测,我们没有看到实际的代码


我建议在执行或准备SQL文本之前显示它的实际内容。

我不认为错误消息表明“@”at符号字符有问题

MySQL语法错误“right syntax to use near”通常指向遇到问题的第一个令牌。在这种情况下,MySQL似乎反对
INSERT

…在“
附近插入买家(字段1,字段2)值('aa@
”位于第1行

我怀疑SQL文本中有
insert
之前的内容,MySQL看到了多个语句。这只是猜测,我们没有看到实际的代码


我建议在执行或准备SQL文本之前显示其实际内容。

从Java运行时,对特殊字符使用UTF-8代码。
@
的UTF-8代码是
\u0040

insert into table1 (field1, field2) values("aa\u0040gmail.com", "f2 value"), ("cc\u0040gmail.com", "another f2 here");

从Java运行时,对特殊字符使用UTF-8代码。
@
的UTF-8代码是
\u0040

insert into table1 (field1, field2) values("aa\u0040gmail.com", "f2 value"), ("cc\u0040gmail.com", "another f2 here");

正在一次执行由
分隔的两个查询。 一切都解决了。
@
没有问题


感谢您富有洞察力的评论和回答。

正在一次完成两个由
分隔的查询。 一切都解决了。
@
没有问题


感谢您富有洞察力的评论和回答。

插入本身有错误吗?您尝试过括号吗?@DanielMarcus请参阅“进一步说明”。thx的评论。感谢@xavierz使其成为jdbc问题而不是sql问题使用单引号而不是双引号是否有帮助:
values('aa@gmail.com“,”f2值“)
,…?@MarkusPscheidt没有-相同的错误。插入本身有错误吗?您尝试过括号吗?@DanielMarcus请参阅“进一步说明”。thx的评论。感谢@xavierz使其成为jdbc问题而不是sql问题使用单引号而不是双引号是否有帮助:
值('aa@gmail.com“,”f2值“)
,…?@MarkusPscheidt没有-同样的错误。那么为什么它在SQL剪贴簿上运行良好。我正在将查询打印到控制台-复制/粘贴到剪贴簿以运行。此外--行并没有在“@”处结束。@xavierz:我无法解释您正在观察的行为;我也不可能复制该行为。我的建议是您在JDBC和“@”字符方面乱吼错误树。使用不包含“@”字符的field1值测试应该相当简单。@xavierz:我怀疑查询中有多个SQL语句。如果SQL文本是
插入到sometable(…)值(…),(…);insert into BUILTERS…
MySQL将在第二次insert时标记错误,因为这是第二条语句。不允许在查询中运行多条SQL语句。(同样,我只是猜测,因为