sqlite3_column

2023-11-04

      此文档的原文地址为为:https://www.sqlite.org/c3ref/column_blob.html。 

      通常,我们都会判断sqlite3_step(pStmt)的返回值是否等于SQLITE_ROW来判断是否继续执行sqlite3_step(pStmt)。在这个过程中,每执行完一次sqlite3_step()之后,会得到Table当前行的值,这时就可以被多次调用去查询这个行的各列的值。sqlite提供多个函数来实现此过程,但均以sqlite3_column为前缀,各函数如下

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

      其中,各函数的第一个参数为从sqlite3_prepare()返回来的prepared statement对象的指针(pStmt),第二参数为指定这一行中的想要被查询的列的索引号,在返回行中各列的索引号从左至右依次排列,最左边的的一列索引号为0,行的列数可以使用sqlite3_colum_count()来获得。

       如果当前SQL语句没有指向一个有效的行,或者超出了当前行列的索引值,函数返回未定义的结果。同时,这些函数只有当最后一次调用的sqlite3_step()返回了Table的当前行时才能被调用,并且sqlite3_reset()与sqlite3_finalize()函数没有被调用过,如果出现此类情况,那么函数也将返回未定义的结果。

      函数sqlite3_column_bytes()返回结果列初始数据的数据类型码,数据类型码分为SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_BLOB, SQLITE_NULL, SQLITE_TEXT。sqlite3_column_bytes()返回值只有在调用过程中没有发生数据类型转换时才有意义,如果在调用过程中发生数据类型转换,那么sqlite3_column_bytes()返回值为未定义。

      如果sqlite3_step()的返回结果类型为BLOB或者为UTF-8字符串(即所查询的当前column的数据类型),那么sqlite3_column_bytes() 将返回该BLOB或者字符串的字节数(注意:一般UTF-8编码汉字占3个字节)。果返回结果类型为UTF-16字符串,那么sqlite3_column_bytes()会先将UTF-16字符串先转换为UTF-8,之后再返回字符串的字节数。如果返回结果类型为一个数字值,那么sqlite3_column_bytes()使用sqlite3_snprintf将该值转换为UTF-8,之后再返回字符串的字节数。如果返回结果为NULL,sqlite3_column_bytes() 返回0。

      如果sqlite3_step()的返回结果类型为BLOB或者为UTF-16字符串(即所查询的当前column的数据类型),那么sqlite3_column_bytes16() 将返回该BLOB或者字符串的字节数(注意:一般UTF-16编码汉字占4个字节)。果返回结果类型为UTF-8字符串,那么sqlite3_column_bytes16()会先将UTF-8字符串先转换为UTF-16,之后再返回字符串的字节数。如果返回结果类型为一个数字值,那么sqlite3_column_bytes16()使用sqlite3_snprintf将该值转换为UTF-16,之后再返回字符串的字节数。如果返回结果为NULL,sqlite3_column_bytes16() 返回0。

       sqlite3_column_bytes8()与sqlite3_column_bytes16()返回的字节数不包括字符串结尾包含的'\0'终止符。函数sqlite3_column_text()与sqlite3_column_text16()返回当前column内的字符串,即使是一个空字符串。

       函数sqlite3_column_blob()对于一个长度0的BLOB将返回一个空指针。

       //(如果当前行所要查询的column内数据类型为int,那么使用函数sqlite3_column_int()与sqlite3_column_int64()来查询该int值。如果当前行所要查询的column内数据类型为double,那么使用函数sqlite3_column_double(sqlite3_stmt*, int iCol)来查询该double值。

        警告:sqlite3_column_value返回的对象是一个unprotected sqlite3_value对象。在多线程的编译环境中,unprotected sqlite3_value 对象只有被sqlite3_bind_value与sqlite3_result_value使用才是安全的。如果被像sqlite3_value_int, sqlite3_value_text, sqlite3_value_byte等调用,这是不安全的线程行为。

       函数会在适当的时候自动进行格式转换,具体的转换规则如下:

Internal
Type
Requested
Type
Conversion

NULL INTEGER Result is 0
NULL FLOAT Result is 0.0
NULL TEXT Result is a NULL pointer
NULL BLOB Result is a NULL pointer
INTEGER FLOAT Convert from integer to float
INTEGER TEXT ASCII rendering of the integer
INTEGER BLOB Same as INTEGER->TEXT
FLOAT INTEGER CAST to INTEGER
FLOAT TEXT ASCII rendering of the float
FLOAT BLOB CAST to BLOB
TEXT INTEGER CAST to INTEGER
TEXT FLOAT CAST to REAL
TEXT BLOB No change
BLOB INTEGER CAST to INTEGER
BLOB FLOAT CAST to REAL
BLOB TEXT Add a zero terminator if needed

      特别指出:发生类型转换时,可能导致上一级调用返回的指针,如sqlite3_column_blob(), sqlite3_column_text(), sqlite3_column_text16() 为无效。这种情况可能发生在下面几个case中:

  •    content类型为BLOB,调用sqlite3_column_text() orsqlite3_column_text16(),------可能会在字符串结尾加上‘\0’终止符。
  •    content类型为UTF-8 text,调用sqlite3_column_bytes16() orsqlite3_column_text16()。------将content转换为UTF-16。
  •    content类型为UTF-16 text,调用sqlite3_column_bytes8() orsqlite3_column_text8()。------将content转换为UTF-8。

UTF-16到UTF-16le之间的转换时安全的。
      几个安全的使用策略:

  • 先sqlite3_column_text() ,之后 sqlite3_column_bytes()
  • 先sqlite3_column_blob() ,之后 sqlite3_column_bytes()
  • 先sqlite3_column_text16() ,之后sqlite3_column_bytes16()

      换句话说,可以先调用sqlite3_column_text() ,sqlite3_column_blob() ,sqlite3_column_text16() ,得到你想要的格式的结果,之后调用sqlite3_column_bytes(),sqlite3_column_bytes(),sqlite3_column_bytes16() 来得到该结果的大小。

      


 附录:英文字母和汉字在不同的编码集中所占的字节数对比


                 汉字    英文字母       编码
字节数 :      2          1              GB2312

字节数 :      2          1                GBK

字节数 :      2          1             GB18030

字节数 :      1          1            ISO-8859-1

字节数 :      3          1               UTF-8

字节数 :      4          4              UTF-16

字节数 :      2          2             UTF-16BE
  
字节数 :      2          2             UTF-16LE


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlite3_column 的相关文章

  • React 使用技巧:useReducer、immer库和 Formik工具库

    1 使用 useReducer hook useReducer 是 useState 的替代品 它可以更好的管理组件的状态 useReudcer 的格式 import useReducer from react let state disp
  • 纯CSS绘制形状(三角形、菱形、球体,长方体等等

    在前段时间看到有的面试题说让说一下梯形 当时自己懵了 所以把各种各样的常见的形状的CSS实现总结一下 基本形状实现之后就可以利用这些基本形状进行组合 就可以实现复杂的形状 1 三角形 triangle width 0 height 0 bo
  • Windows 10创建文件夹目录链接

    问题引出 我们安装软件的时候会发现有些软件虽然设置了安装在非系统盘 但是有些插件文加夹会默认放在系统盘 当我们想把这些文件夹移到别的盘 怎么办呢 毕竟要想开机快 电脑运行更顺畅 还是把系统盘空间留大一点比较好 解决措施 将原来位置下的文件夹
  • 蓝桥杯.Java.进制转换

    在本节内容 我们主要解释三道题 十六进制转八进制 十六进制转十进制和十进制转十六进制 1 十六进制转八进制 问题描述 给定n个十六进制正整数 输出它们对应的八进制数 输入格式 输入的第一行为一个正整数n 1 lt n lt 10 接下来n行
  • pyquery用法详解

    PyQuery库也是一个非常强大又灵活的网页解析库 如果你有前端开发经验的 都应该接触过jQuery 那么PyQuery就是你非常绝佳的选择 PyQuery 是 Python 仿照 jQuery 的严格实现 语法与 jQuery 几乎完全相
  • 华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 先将 0 0 位置的值变为1 第一次同化 第二次同化 大家好 我是哪吒 一 题目描述 存在一个m n的二维数组
  • react-11(样式组件-组件)

    import React Component from react import ReactDOM from react dom client import styled from styled components const root
  • HBase(分布式、面向列、非结构化数据存储,基础框架,设计和操作)总结

    sqoop 总结 1 HBase 介绍 2 面向列数据库 2 1 HBase 与 传统关系数据库的区别 2 2 Hive 和 Hbase区别 2 3 Hbase 和 传统关系型数据库区别 3 Hbase 数据模型 4 HBase 基础架构
  • LeetCode-1324. Print Words Vertically

    Given a string s Return all the words vertically in the same order in which they appear in s Words are returned as a lis
  • 实时数仓建设

    数据智性就显得尤为重要 快速的获取数据反馈能够帮助公司更快的做出决策 更好的进行产品迭代 实时数仓在这一过程中起到了不可替代的作用 一 实时数仓建设的背景 传统意义上的数据仓库主要处理T 1数据 即 今天产生的数据分析结果明天才能看到 随着
  • AD Release 10 PCB 中的常见问题及解决办法

    作为一名新手小白 刚开始进行PCB设计的时候会遇到各种问题 以下是我遇到过的问题及解决办法 希望对大家有用 不正确的地方也请大家多多指正 谢谢 1 silkscreen over component pads 这个报错是说丝印层的文字和焊盘
  • android 移动网络开关打开_手把手教你>> 打开5G开关,畅享极速好网!

    5G小贴士 现在买5G手机的人越来越多 但是你知道吗 5G手机要使用5G网络 必须要打开这个开关 不然就会导致买了5G手机 却用不上5G网络今天小编教你让你的5G手机发挥真正实力 Follow me 各位小伙伴们注意了 想要使用5G网络 必
  • 用 pytorch 进行分类(二分类,多分类)

    import numpy as np import sklearn import torch import torch nn as nn from torch autograd import Variable import torch nn
  • 【Unity】记录一个Findobjectoftype有关的bug

    场景 在写一个多人联机的FPS游戏时 本地启动时 主角是有后坐力的 但是客户端射击没有后坐力 感觉很奇怪 不能房主不开挂其余人全是挂吧 于是打算找一下问题所在 这里计算后坐力的思路是这样的 在鼠标控制的脚本中进行计算后坐力 触发的方法Fir
  • 【HTTP】http重定向301/302/303/307

    一 概述 重定向常常和请求转发放在一起讨论 前者是两次不相关的请求 后者是一次请求服务器端转发 然而本文并不讨论两者的区别 而是HTTP 1 0规范和HTTP 1 1规范中关于重定向的区别 以及实际使用中的情况 重定向实际使用是一个响应码
  • K8S 微服务内存溢出如何排查

    场景 晚上做稳定性压测 早上回来发现内存溢出 2022 06 08 08 29 10 273 ERROR 7 alina utility 2 org apache catalina core StandardServer Error sen
  • mysql中ceil是什么意思_MySQL ceil()函数

    CEIL X CEILING X 该函数返回的最小整数值 但不能小于X 请看下面的例子 mysql gt SELECT CEILING 3 46 CEILING 3 46 4 1 row in set 0 00 sec mysql gt S
  • 【华为OD机试 2023 B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • LeetCode压缩字符串

    给你一个字符数组 chars 请使用下述算法压缩 从一个空字符串 s 开始 对于 chars 中的每组 连续重复字符 如果这一组长度为 1 则将字符追加到 s 中 否则 需要向 s 追加字符 后跟这一组的长度 压缩后得到的字符串 s 不应该
  • 用Python做一个高山滑雪小游戏

    介绍一款好玩的游戏的开发 该游戏名为高山滑雪 改编自 Computer Programming for Kids and other Beginners 的第25章 游戏效果 游戏的基本界面如下 滑雪者由高山上滑下 玩家通过键盘上的左右方向

随机推荐

  • 有序序列判断-c++

    题目描述 输入一个整数序列 判断是否是有序序列 有序 指序列中的整数从小到大排序或者从大到小排序 输入描述 第一行输入一个整数N 3 N 50 第二行输入N个整数 用空格分隔N个整数 输出描述 输出为一行 如果序列有序输出sorted 否则
  • 基于SSL的虚拟专用网络

    基于SSL的虚拟专用网络 基于安全套接层协议 Security Socket Layer SSL 建立远程安全访问通道的虚拟专用网络技术 像简单虚拟专用网络通过安装软件客户端的方式进行安全远程访问服务器虽然与基于硬件形式的相比更便于使用 但
  • Python OpenCV GrabCut进行前景分割和提取

    Python OpenCV GrabCut进行前景分割和提取 1 效果图 1 1 边界框GrabCut效果图 1 2 Mask GrabCut效果图 2 GrabCut原理 2 1 GrabCut是什么及步骤 2 2 grabCut img
  • 信捷服务器Z相信号,信捷plc标记与中断处理小知识

    信捷plc标记与中断处理小知识 有关信捷plc的编程知识 在信捷plc中标记P I用于分支与中断 标记I一般用于中断功能 包括外部中断 定时中断等场合 分支用的标记 P 用于条件跳转或子程序的跳转目标 一 标记P I 标记P I用于分支与中
  • kotlin框架

  • RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available()

    今天在调试yolov7时遇到由题所示报错 Traceback most recent call last File d 1 yolov7 main train py line 609 in
  • linux设备驱动之构造和运行模块

    构造和运行模块 今天开始学习 linux设备驱动程序 第三版这本书 在看到第二章的构造和运行模块的时候 我在linux平台上做了一个小测试 下面就让我说下 在宿主机上安装开发工具和下载linux源码 要求版本号和目标机上的linux内核版本
  • UDP 协议的实现

    pragma pack 1 define ETH ALEN 6 struct ethhdr t unsigned char h dest ETH ALEN destination eth addr unsigned char h sourc
  • C/C++

    课程介绍 参考 麦子学院 嵌入式C语言高级 本套课程的定位 前导课程 掌握简单C语言的基本语法 计算机程序语言的学习思路 基本程序设计思想 语言工具的特性 基本程序设计思想 数据类型 运算符 条件分支 循环设计 面向对象的设计 C语言工具的
  • opkg update 失败:

    记得以前opkg一直是好的 但是今天切到mt7621上面突然发现不能用 一开始提示opkg update的时候 说明网站不对 也就是openwrt的源不对 修改opkg源 位置在板子上 etc opkg distfeeds conf文件里
  • C#四舍五入的方法

    作者 张铭标 撰写时间 2019年 6月16日 在C 中要实现四舍五入的方法主要有三种 一 使用Round 方法进行输出 double Z1 55 686 double z Math Round Z1 2 输出结果为 55 69 decim
  • 左右实时间轴效果demo(整理)

  • 使用gerrit+git,git review dev 代码时出现:ERROR: commit 8673d4b: missing Change-Id in message footer

    在公司使用gerrit git 使用webstorm在commit代码后 git review dev 时出现下面的错误 一般这种错误是在你有代码更改后 没有提交 然后又执行了git pull操作 https www cnblogs com
  • 13.完善统计图形——向统计图形添加表格

    import matplotlib as mpl import matplotlib pyplot as plt import numpy as np mpl rcParams font sans serif FangSong mpl rc
  • Gradle sync failed: Unable to start the daemon process.This problem might be caused by incorrect con

    一 Android studio3 0 1启动的报错问题描述 Gradle sync failed Unable to start the daemon process This problem might be caused by inc
  • 使用信号槽在线程中接收信息并在mainwindow中显示

    今天解决的问题是使用线程调用相机进行操作 将操作中获取的数据进行在mainwindow中显示 困扰我来好几天了 呜呜呜 在学长的帮助下终于实现了 主要方法是利用信号槽实现保存线程中的数据 并显示 记录一下实现过程 其中看了这篇文章之后对这个
  • QT编译出现multiple definition of错误

    起初以为是文件重复包含 调用依赖所致 其实呢是Pro文件中重复添加多次
  • arm-linux笔记3:arm-linux PC文件传输方法总结(4种最常见的方法)

    arm linux笔记3 arm linux PC文件传输方法总结 4种最常见的方法 1使用串口终端传输文件 2使用ftp传输文件 3使用nfs传输文件 4使用u盘拷贝 串口的优点是方法简单 不需要过多的配置 不需要联接网络 但是发送数据的
  • Nginx web应用服务器部署

    前端项目部署通常会选择一些轻量级的Web服务器 如Apache Nginx等 下面以Nginx为例介绍如何部署前端项目 安装Nginx 可以在官网上下载对应版本的Nginx 然后按照官方文档进行安装 配置Nginx Nginx的配置文件在
  • sqlite3_column

    此文档的原文地址为为 https www sqlite org c3ref column blob html 通常 我们都会判断sqlite3 step pStmt 的返回值是否等于SQLITE ROW来判断是否继续执行sqlite3 st