如何在Android上的SQLite中转义不受支持的字符?

时间:2011-03-25 11:55:00

标签: android sqlite

任何人都可以告诉如何逃避或替换不支持的字符,如android中的sqlite中的单引号可以任何人举例

由于

3 个答案:

答案 0 :(得分:41)

您可以使用commons-lang实用程序,也可以使用regexp来处理它。

如果你正在构建动态SQL,我建议尝试使用一个准备好的语句,这样就不需要转义单引号。

仅使用使用字符串连接构建的动态SQL:

String value = "one's self";
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...

将其更改为

String value = "one's self";
value= DatabaseUtils.sqlEscapeString(value);
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...

理想情况下,使用准备好的声明

String value = "one's self";
StringBuilder query= StringBuilder();
query.append("insert into tname(foo) values (?)");
SQLiteStatement stmt= db.compileStatement(query.toString());
stmt.bindString(1, value);
long rowId= stmt.executeInsert();
// do logic check for > -1 on success

这样您就不会遇到“SQL注入攻击”。

有关详细信息,请参阅http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html

修改 我做了一些挖掘,你可以使用DatabaseUtils.sqlEscapeString(String)来转义字符串的内容,这样它对于没有准备的完整SQL语句是有效的。

答案 1 :(得分:0)

这些不是用简单的吗?所以,你的单引号就是\'。

答案 2 :(得分:0)

实际上,最简单的方法是用双引号('')替换单引号(')。您的查询将变为:

insert into tname(foo) values ('one''s self');

解释:SQLite主张使用单引号(')而不是双引号(“)作为字符串分隔符,声称这是SQL标准所要求的(我无法确认) SQLite也不同于我所知道的所有其他SQL数据库,因为它再次使用''而不是'来声明SQL标准。(同样,我无法确认这个声明)。

就个人而言,我倾向于不同意这种说法,因为我所知道的每个其他SQL数据库都使用C语言来转义字符,反斜杠。即使它是在ISO的SQL标准中使用'',我认为最好修改该标准以使用C方式,因为在实践中,它已经是标准了。

请注意:

insert into tname(foo) values ('ones "self"');

是该逻辑的有效sql语句,不需要额外的转义。