1

假设我有一个查询,例如SELECT * FROM my_table where name = 'Debbie O'Brian'. 您可能知道在 SQL Server 中,我们只需要添加另一个'以使其忽略单引号。这是我喜欢自动执行的操作。

简而言之,我需要'''两个封闭的'. 这是我到目前为止所拥有的:

String text = "SELECT * FROM my_table where name = 'Debbie O'Brian'";
String[] splitArray = text.split(" '");
for (int i = 0; i < splitArray.length; i++) {
    String str = splitArray[i];
    if (str.endsWith("'"))
        str = str + " ";

    // replace all single quotes
    str = str.replace("'", "''");

    // revert last replacement
    str = str.replace("'' ", "' ");

    splitArray[i] = str;
}

StringBuilder builder = new StringBuilder();
for (int i = 0; i < splitArray.length; i++) {
    builder.append(splitArray[i]).append(" '");
}
System.out.println(builder.substring(0, builder.length() - 2).toString());

问题是我在开始之前依赖于空白的存在'。我的问题是,如果没有这个预先假设,我怎么能做到这一点?非常感谢任何帮助(甚至是算法的建议)。请提及查询中可能有多个单引号字符串。

编辑:我正在使用 Hibernate 执行本机 SQL 并将整个 SQL 查询作为输入。

4

4 回答 4

4

在 SQL 查询中处理单引号和其他特殊字符的最佳方法是使用参数化查询。它也更安全。我建议对“SQL 注入”进行搜索。这将教您如何防止和处理查询中的单引号。

于 2013-08-30T03:27:58.953 回答
4

如果您使用 JDBC 使用

PreparedStatement ps = conn.prepareStatement("SELECT * FROM my_table where name = ?")
ps.setString(1, name);
于 2013-08-30T03:28:02.130 回答
1

当您使用 Hibernate 时,类似于@BOB 所说的使用参数化查询:

    String queryString = "SELECT * FROM my_table where name = :name";
    Query query = getSession().createSQLQuery(queryString);
    query.setString("name", name);       
于 2013-08-30T04:15:25.167 回答
0

好的,正如我上面提到的,我的问题不是 SQL 注入。我所追求的,在这一点上似乎是不可能的,除非我实现一个显然无法满足要求的 SQL 解析器。因此,我将坚持我的预先假设,并放弃尝试修复评论中提到的两个人的错误输入。

谢谢大家的回答。

于 2013-09-01T23:58:08.217 回答