任何人都可以告诉如何逃避或替换不支持的字符,如android中的sqlite中的单引号可以任何人举例
由于
答案 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语句,不需要额外的转义。