处理字符串中的撇号

时间:2013-08-30 03:23:18

标签: java string

假设我有一个查询,例如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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

如果您使用JDBC

PreparedStatement ps = conn.prepareStatement("SELECT * FROM my_table where name = ?")
ps.setString(1, name);

答案 2 :(得分:1)

当你使用Hibernate时,类似于@ B.O.B所说的使用参数化查询:

    String queryString = "SELECT * FROM my_table where name = :name";
    Query query = getSession().createSQLQuery(queryString);
    query.setString("name", name);       

答案 3 :(得分:0)

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

感谢大家的回答。