sqlite3_mprintf

  • sqlite3_mprintf()函数原型:
  • char *sqlite3_mprintf(const char*,...);
  • sqlite3_mprintf()的作用是将结果写入到sqlite3_malloc()获取的内存中,例程返回的字符串应该使用sqlite3_free()进行释放,如果无法申请到足够的内存,则会返回NULL指针;
  • 它同c库函数 sprintf()类似,实现一些额外的格式化。对所有常用的printf()格式化选项都适用。另外还有非常用选项:%q, %Q, %z;
  • %q选项的作用类似于%s,它会替换了参数列表中以空字符结尾的字符串%q,同时他会将单引号字符转义,有助于防止SQL注入攻击;
  • 示例:
  • char * zText =“这是快乐的一天!”;
    char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES('%q')”,zText);
    sqlite3_exec(db,zSQL,,,);
    sqlite3_free(ZSQL)
  • 因为使用了%q格式字符串,所以zText中的'\''字符被转义,生成的SQL如下所示:
  • INSERT INTO table1 VALUES('这是快乐的一天!')
  • 作为一般规则,在将文本插入字符串文字时,应始终使用%q而不是%s。
  • %Q选项的作用类似于%q,除了它还在整个字符串的外部添加单引号。此外,如果参数列表中的参数是NULL指针,则%Q替换文本“NULL”(不带单引号);
  • char * zSQL = sqlite3_mprintf(“INSERT INTO table VALUES(%Q)”,zText);
    sqlite3_exec(db,zSQL,,,);
    sqlite3_free(ZSQL);
  • 即使zText变量是NULL指针,上面的代码也会在zSQL变量中呈现正确的SQL语句。
  • “%z”格式化选项的作用类似于“%s”,但添加了在读取字符串并将其复制到结果中之后,在输入字符串上调用sqlite3_free()。

从程序看 %s, %q, %Q之间的区别

  • char *str_he = "合";
    char *str_fen = "分"; //初始化表
    for(rc = ; rc < ; rc++) {
    sql = sqlite3_mprintf("INSERT INTO RELAY VALUES ('%d', '%s','%s', '2019-7-12');", rc, str_he, str_fen);
    sqlite3_exec(db, sql, , , &zErrMsg);
    } rc = sqlite3_get_table(db, "SELECT * FROM RELAY", &dbresult, &nRow, &nColum, &zErrMsg);
    if(rc == SQLITE_OK) {
    index = nColum;
    for(i = ; i < nRow; i++) {
    for(j = ; j < nColum; j++) {
    printf("%d--%s : %s\n", i, dbresult[j], dbresult[index++]);
    // ++index;
    }
    printf("----------------------------------------------\n");
    }
    }
  • 输出结果:
  • --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    。。。。。
  • 将 %s 改为 %q ,输出结果:
  • --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    。。。。。。
  • 将 %s 改为 %Q,输出结果:
  • --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : 合
    --W_STATUS : 分
    --TIME : --
    ----------------------------------------------
    。。。。。。
  • 从上面的结果来看,当插入的字符串不为空指针时,三者之间并没有多大差别。
  • 将字符串设置为NULL
  • char *str_he = NULL;
    char *str_fen = NULL;
  • %s 输出结果
  • --ID :
    --C_STATUS :
    --W_STATUS :
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS :
    --W_STATUS :
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS :
    --W_STATUS :
    --TIME : --
    ----------------------------------------------
    。。。。。。
  • %q 输出结果
  • --ID :
    --C_STATUS : (NULL)
    --W_STATUS : (NULL)
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : (NULL)
    --W_STATUS : (NULL)
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : (NULL)
    --W_STATUS : (NULL)
    --TIME : --
    ----------------------------------------------
    。。。。。。
  • %Q输出结果
  • --ID :
    --C_STATUS : (null)
    --W_STATUS : (null)
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : (null)
    --W_STATUS : (null)
    --TIME : --
    ----------------------------------------------
    --ID :
    --C_STATUS : (null)
    --W_STATUS : (null)
    --TIME : --
    ----------------------------------------------
    。。。。。。
  • 当需要插入的字符为NULL时,%s 并没有将NULL插入到表中,但是%q, %Q能够将NULL插入到表中,只是大小写不一样;

sqlite3入门之sqlite3_mprintf的更多相关文章

  1. python sqlite3 入门 (视频讲座)

    python sqlite3 入门 (视频讲座) an SQLite mini-series! - Simple Databases with Python 播放列表: YouTube https:/ ...

  2. Sqlite3入门简记

    一,安装Sqlite3 1.入门时看http://www.runoob.com/sqlite/sqlite-intro.html,说的简单,但是适合入门 2.在终端输入sqlite3,没有返回信息,表 ...

  3. sqlite3入门之sqlite3_get_table,sqlite3_free_table

    sqlite3_get_table sqlite3_get_table函数原型: int sqlite3_get_table( sqlite3 *db, /* An open database */ ...

  4. sqlite3 入门

    SQLite3 C语言API入门下载SQLite3 我们下载sqlite源码包,只需要其中的sqlite3.c.sqlite.h即可.最简单的一个创建表操作#include <stdio.h&g ...

  5. sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close

    sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...

  6. sqlite3使用入门

    sqlite的安装 1. 首先是下载sqlite,可以该页面下载:http://www.sqlite.org/download.html 当前的最新版本为:sqlite-shell-win32-x86 ...

  7. SQLite3简单入门及C++ API

    转载请注明出处:http://www.cnblogs.com/StartoverX/p/4660487.html 项目用到SQLite3,简单记录一下. MySQL不同,SQLite3的数据库基于文件 ...

  8. Django入门实践(3)

    Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子是创建一个简单应用wiki ...

  9. 使用数据库sqlite3 C语言实现登陆注册的功能

    //此代码为注册功能 void create_regtable() { int rc; //rc为返回值,判断函数是否执行成功 rc=0函数执行成功,rc !=0函数执行失败 sqlite3 *db; ...

随机推荐

  1. Pytest单元测试框架-测试用例运行规则

    1.Pytest测试用例运行规则 在pytest单元测试框架下面执行用例,需要满足以下几个特点: 1. 文件名以test_*.py开头或者*_test.py 2. 测试类.测试函数以test开头 3. ...

  2. html中使用mathjax数学公式

    测试用例: test.html: <!DOCTYPE html> <html> <head> <link rel="stylesheet" ...

  3. 【神经网络与深度学习】【计算机视觉】Faster R-CNN

    Faster R-CNN Fast-RCNN基本实现端对端(除了proposal阶段外),下一步自然就是要把proposal阶段也用CNN实现(放到GPU上).这就出现了Faster-RCNN,一个完 ...

  4. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  5. spring中最重要的一些Aware接口

    附上关于这节的spring官方文档: ApplicationContextAware and BeanNameAware aware接口在spring中无处不在,它是用来感知spring的ioc co ...

  6. 【转】Spring中@Async

    Spring中@Async 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实, ...

  7. 『Go基础』第8节 格式化输出

    输出就是将数据信息打印到电脑屏幕上. 本节我们就来学习一下Go语言中的三种输出方式: Print().Println().Printf(). 1.Print() Print()主要的一个特点就是打印数 ...

  8. 【LEETCODE】40、1051. Height Checker

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  9. [LOJ2290] [THUWC2017] 随机二分图

    题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...

  10. Atcoder Grand Contest 036 D - Negative Cycle

    Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...