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. django-rest-framework 使用例子

    Start Your API 创建项目 startproject rest_api 创建APP startapp task 配置 rest_api/settings.py INSTALLED_APPS ...

  2. RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对

    需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...

  3. 【VS开发】WaitForSingleObject 和 WaitForMultipleObjects函数 (让线程挂起等待事件)

    WaitForSingleObject 和 WaitForMultipleObjects:1.WaitForSingleObject  等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通 ...

  4. linux 保留yum安装后的rpm包

    在linux上,使用yum安装,默认安装完成之后会删除下载的rpm包:想要yum安装软件后,还保留安装包,那么需要修改/etc/yum.conf配置文件中的keepcache参数. [root@bog ...

  5. Nginx是什么及作用?代理和反向代理解析

    一:介绍 nginx是一个高性能的HTTP和反向代理服务器,其特点是占用内存少,并发能力强. 二:名词介绍 代理服务器: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络 ...

  6. 【mysql】开启远程连接

    设置root用户可以远程连接 use mysql; update user set host = '%' where user = 'root'; FLUSH PRIVILEGES;

  7. 六、spring之通过FactoryBean为ioc容器中添加组件

    前面我们已经介绍了几种为容器中添加组件的方法,今天一起学习通过FactoryBean添加组件的方法. 首先我们准备一个类,也就是我们需要注册进spring的ioc容器中的类 类Color: // 不必 ...

  8. 客户端请求服务器端通信, Web 编程发展基础|乐字节

    乐字节的小伙伴们,好久不见,甚是想念啊! 前面我发布的文章算是把Java初级基础阶段讲完了,接下来小乐将会给大家接着讲Java中级阶段——Javaweb. 首先,我们要看看Javaweb阶段主要重点掌 ...

  9. Apache Kafka教程

    1.卡夫卡教程 今天,我们正在使用Apache Kafka Tutorial开始我们的新旅程.在这个Kafka教程中,我们将看到什么是Kafka,Apache Kafka历史以及Kafka的原因.此外 ...

  10. Crazy Binary String(前缀和)(2019牛客暑期多校训练营(第三场))

    示例: 输入: 801001001 输出:4 6 题意:一段长度为n且只有 ‘0’ 和 ‘1’ 的字符串,求子串中 ‘0’ 和 ‘1’ 数目相等和子序列中 ‘0’ 和 ‘1’ 数目相等的最大长度. 思 ...