Java PreparedStatement使用两个单引号作为空字符串参数

And*_*rew 7 java sql escaping prepared-statement

我使用的是如下PreparedStatement的sql:

String sql = "insert into foo (a,b,c) values (?,?,?)";
 ps = conn.prepareStatement(sql);

  ps.setString(psIndex++, a);
  ps.setString(psIndex++, b);
  ps.setString(psIndex++, c);
Run Code Online (Sandbox Code Playgroud)

但是,如果任何变量是空字符串,则结果语句将获得两个单引号.如在:VALUES ('foo','','') 然后我得到一个例外,因为两个单引号是转义序列.

我不敢相信我通过搜索找不到任何东西,但我不能.这里发生了什么?

pea*_*kit -2

编辑:正如其他人指出的那样,您不应该做任何特殊的事情来将空字符串传递给参数化查询。

但是,以防万一您碰巧在查询中使用动态 SQL,例如:

Declare sqlText VARCHAR(MAX)
set sqlText = 'SELECT ....'
EXEC(sqlText)
Run Code Online (Sandbox Code Playgroud)

那么您需要转义每个单引号以''''获得与空字符串等效的值。所以,总共有 4 条报价。前 2 个单引号相当于在运行时获取单引号。另外 2 个单引号将在运行时获得收盘价。

  • 这不是安德鲁要问的。他正在使用准备好的语句,但 JDBC 驱动程序似乎发出了错误的 SQL。 (6认同)