【问题标题】:How to escape special characters like ' in sqlite in android如何在android的sqlite中转义像'这样的特殊字符
【发布时间】:2012-09-18 20:51:24
【问题描述】:

我有一个函数正在对 SQLite 数据库中的表执行查询。我声明一个常量:public static final String CANADA_HISTORY = "Canada's History";。这存储在String 变量中,比如说difficulty

我有一个问题:

Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = '"+difficulty+"'" , null);

它在撇号附近抛出异常。

Logcat 输出:

I/Database( 1170): sqlite returned: error code = 1, msg = near "s": syntax error
D/AndroidRuntime( 1170): Shutting down VM
W/dalvikvm( 1170): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 1170): FATAL EXCEPTION: main
E/AndroidRuntime( 1170): android.database.sqlite.SQLiteException: near "s": syntax error: , while compiling: select * from Questions_answers where CHAPTERS  = 'Canada's History'

我也试过了:

1.  difficulty=difficulty.replaceAll("'","''");
2.  difficulty=difficulty.replaceAll("'","\'");
3.  difficulty = DatabaseUtils.sqlEscapeString(difficulty);

除此之外,它对像 Canada History 这样的单个词很有效,我的意思是没有特殊字符词。

请给我解决问题的建议谢谢。

【问题讨论】:

  • 尝试使用selectionArgs,例如:rawQuery("select * from table where chapters = ?", new String[] { difficulty } );

标签: android sqlite special-characters


【解决方案1】:

先用这个替换char

difficulty=difficulty.replaceAll("'","\\'");

然后在您的查询中传递它

"select * from Questions_answers where CHAPTERS='"+difficulty+"'";

编辑:

 q = "select * from Questions_answers where CHAPTERS = ?";
    database.rawQuery(q, new String[] { difficulty});

【讨论】:

  • 破折号、连字符“-”字符呢?
  • 编辑看起来不错,但答案的第一部分显然是错误的。 "'""\'" 是相同的字符串(后者只是相同字符序列的替代表示法),因此replace() 语句实际上是一个标识函数。有趣的是,这是公认的答案。
  • Franz 是对的,这行不通,对我没用。
【解决方案2】:

DatabaseUtils.sqlEscapeString(s) 本质上的作用是将所有单引号 (') 替换为两个单引号 (''),并在字符串的开头添加一个单引号,在字符串的末尾添加一个单引号。
所以如果你只是想转义字符串,这个函数应该可以工作:

private static String escape(String s) {
    return s != null ? s.replaceAll("\'", "\'\'") : null;
}

【讨论】:

    【解决方案3】:

    这也是一样的:

    if (columnValue.contains("'")) 
        columnValue = columnValue.replaceAll("'", "[']");
    

    if (columnValue.contains("'")) 
        columnValue = columnValue.replaceAll("'", "\\\'");
    

    但实际上我们使用下一个符号 % 和 _

    【讨论】:

      【解决方案4】:

      据我了解,有两种方法,

      String test="Android 版本" test= test.replace("'","''");

      这种情况绝对没问题,但我绝对建议使用以下方法。

      String test="Android 版本" test= test.replaceAll("'","\'");

      当我们尝试使用 '.

      【讨论】:

        【解决方案5】:

        最好的方法是使用专门为此目的设计的原生 Android 方法:

        DatabaseUtils.sqlEscapeString(String)
        

        这是它的在线文档:

        在我看来,使用这种方法的主要优点是由于方法名称清晰,所以可以自行编写文档。

        【讨论】:

        • 我在使用这个函数后遇到了查询问题,因为它肯定会用单引号包围你的字符串,然后单引号是你字符串的一部分,你必须相应地调整你的查询或使用另一种方法来转义字符串。更多详情stackoverflow.com/questions/31334723/…
        • @Carsten 这个问题与原始查询字符串的使用有关。出于显而易见的原因,您不会将它与其他辅助方法一起使用,它们已经在内部执行此操作。因此,您和其他发帖人遇到了问题。
        • 该 utils 方法的源代码表明它只转义 ' 字符并用两个引号括住输入字符串 '
        【解决方案6】:

        对我有用的是

        if (columnvalue.contains("'")) {
            columnvalue = columnvalue.replaceAll("'", "''");
        }
        

        【讨论】:

        • 这对我也有用。为了安全起见,我还在它之前添加了一个空检查。我不敢相信 GOOG 自己的 DatabaseUtils.sqlEscapeString() 方法是这样的垃圾。
        • String.replaceAll 创建一个模式。我不确定仅替换 ' 是否非常理想
        【解决方案7】:

        你可以试试Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = \""+difficulty+"\"" , null);

        【讨论】:

        • 这是为我工作。谢谢贾里张。解决这个特殊字符问题很容易。
        【解决方案8】:

        SQL 标准指定字符串中的单引号通过将两个单引号放在一行中进行转义。在这方面,SQL 的工作方式类似于 Pascal 编程语言。 SQLite 遵循这个标准。示例:

        INSERT INTO xyz VALUES('5 O''clock');
        

        参考:SQLite FAQ

        【讨论】:

        • 这太可怕了。使用 selectionArgs。不要尝试自己清理 sql 输入。
        • @njzk2 嘿,感谢您的指点。但是,如果您添加有关“为什么可怕?”的详细信息会更好。这将有助于其他用户:)。顺便说一句,我在这里没有得到你的观点,因为这个答案是为了转义特殊字符。
        • 本题针对Android中的SQLite。 OP 询问如何在查询中输入字符,例如'。正确的答案是使用selectArgs,它将转义/清理/...工作留给 SQLite 模块本身,它做得很好,而且很全面。您的建议仅适用于'
        • 这种评论是愚蠢的。绝对没有理由有人不能成功实施自己的字符串清理程序。这是构建您自己的动态构建查询方法的最简单方法之一,这对于参数处理器来说并不是最简单的事情。
        • 我需要将组合表格的结果导出到一个文本文件中,我可以将其包含在 SQlite 浏览器中。我在其中倾倒了几百行,瞧。如果它被我清理了,nog selectionArgs :)
        【解决方案9】:

        您也不需要转义 \ 吗?所以应该是replaceAll("'", "\\'") 还是我错了?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多