sqlite3 的转义

sqlite 关于 string 类型的数据需要转义。

通过查找规则，可以很容易通过switch拼装一个字符串来搞定。大致规则是，单引号和双引号要变成两个，其他特殊字符为前面加上’/’。

C语言实现如下:

char *str_escape(const char *str) {
static char dest[1024];
int i;
int j = 0;
int len = strlen(str);
for (i = 0; i < len; i++) {
switch (str[i]) {
case '\'':
case '\"':
dest[j] = dest[j + 1] = str[i];
j += 2;
break;
case '/':
case '[':
case ']':
case '%':
case '&':
case '_':
case '(':
case ')':
dest[j] = '/';
j++;
default:
dest[j] = str[i];
j++;
}
}
dest[j] = '\0';
return dest;
}

看起来很好很强大。

又手贱 google 了下更多相关信息，发现前面那个函数可以替换为如下:

inline char *str_escape(const char *str) { //
return sqlite3_mprintf("%q", str);
}

没错，人家已经给了系统函数了。

References:

关于sqlite的特殊字符转义

SQLite escape characters?