SQLite针对特殊字符进行转义操作

Android SQLite在使用一些特殊字符时,会报android.database.sqlite.SQLiteException异常,如下几种情况:
String name1 = "account's888"; 
String sql1 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account[s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account]s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account%s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account$s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account(s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "account)s888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

String name2 = "_accounts888"; 
String sql2 = "select * from user where loginname like '%" + name +"'%";

执行以上语句将会发生异常,导致应用崩溃。sqlite不支持特殊字符,对于特殊字符都需要进行转义操作。需要进行转义的原因是,类似%、_、[、]、(、)、”、’、””、” 等特殊字符都会在特定情况阻断SQL语句,导致无法正常执行。

like谓词查询中,会使用到两个通配符:“%”“_”、,其中“%”表示零个或任意多个字符,“_”表示任意一个字符,但如果查询的条件表达式中出现了“%”“_”,就需要对其进行转义。除此之外,特殊字符“‘”,若出现在查询表达式中,也需要进行转义,其转义方式和以上两个字符的转义方式有些差别。下面以示例简单说明:

1、对”%”的转义

select * from student where description like ‘%!%%’ escape ‘!’

本sql解释为取出表student中所有字段description中含有”%”的记录。

2、对”_”的转义

select * from students where description like ‘%!_%’ escape ‘!’

本sql解释为取出表student中所有字段description中含有”_”的记录。

3、对”‘”的转义

select * from students where description like ‘%”%”

本sql解释为取出表student中所有字段description中含有”‘”的记录。

比较以上3sql,不难看出,对于“%”“_”需要指定一个转义字符,用关键字escape说明。例子中使用了‘!’,但你可以使用其它字符,比如字母a-z(大小写任意),或者数字0-9和其它字符等。

发表回复

后才能评论