SQLite3数据类型

news/2025/2/12 18:13:05/

存储类与数据类型

  • NULL
  • INTEGER
    有符号整数类型,存储为0,1,2,3,4,6或8个字节,取决于值的大小。
  • REAL
    浮点类型,存储为8字节的IEEE浮点数。
  • TEXT
    文本类型,将使用数据库指定的编码格式存储(UTF-8,UTF-16BE,UTF-16LE)
  • BLOB
    用于存储数据原始形式

存储类型(storage class)比数据类型(Datatype)更加泛化。比如INTEGER代表7种不同长度的整数类型,在存储时会有一些区别,但是一旦读到内存中时,都会被转换为8字节符号整数。所以大多数情况下这两个概念不好区分,可以相互使用。

Boolean类型

没有单独的boolean类型,可以使用整数类型存0或1代替。3.23.0版本支持关键字TRUE和FALSE,被自动转换为1和0。

日期和时间类型

没有单独的日期/时间类型,可以以使用以下三个类型替代:

  • TEXT
    可存储为ISO8601格式的字符串(“YYYY-MM-DD HH:MM:SS.SSS”)
  • REAL
    可存储为儒略历日数,根据预言的公历,格林威治时间从公元前4714年11月24日中午开始的天数。
  • INTEGER
    可存储为Unix时间,从UTC时间1970-01-01 00:00:00开始的秒数。

亲和类型

为了最大化兼容其它数据库引擎,为一个列增加亲和关系(Affinity)属性,用以表示该列推荐的存储类型。推荐不是强制,仍然可以存储其它类型。在SQLITE3中每一列都会被分配其中一个亲和类型:

  • TEXT
    存储数据时使用NULL,TEXT,BLOB存储类。插入数值类型时会被转换为TEXT类型。

  • NUMERIC
    插入文本时,自动转换为INTEGER或REAL(文本格式符合特定要求时)。如果是INTEGER文本但数值超过8字节有符号整数,则转换为REAL类型(仅文本前15个十进制数字视为有效内容)。无法转换为数值时使用TEXT存储,十六进制格式的整数文本被视为普通文本。如果一个浮点数可无损转换为整数,则会被转换为整数存储。NULL和BLOB不做转换,直接以其类型存储。指数表示形式的浮点数如果能无损转换为整数,则会被转换为整数存储。'3.0e+5’将被转换为300000。

  • INTEGER
    与NUMERIC几乎相同,区别在于转换为NUMERIC时,浮点数将保留小数点后的0。例如插入数据为“4.0”,对于INTEGER亲和类型,CAST(4.0 as INT)得到结果为4,CAST(4.0 as NUMERIC)得到结果为4.0。

  • REAL
    与NUMERIC几乎相同,区别在于INTEGER会被强制转换为浮点类型。内部优化机制会将一个没有小数部分的较小的浮点数转换为整数再进行存储以节省存储空间,重新读取再转换为浮点数。

  • BLOB
    该类型不会发生数据转换。

如何确定列的亲和类型?

未使用STRICT关键字定义表时,列的亲和类型由其定义时指定的类型决定:

  1. 声明类型包含"INT"字符串时,分配INTEGER。
  2. 声明类型包含"CHAR",“CLOB”,"TEXT"时分配TEXT。
  3. 声明类型包含"BLOB"时,分配BLOB。
  4. 声明类型包含"REAL",“FLOA”,"DOUB"时分配REAL。
  5. 其它情况分配NUMERIC。

表达式的亲和类型

  • IN、NOT IN运算符的右操作数据如果是一个列表,则不具有亲和性,但如果是一个SELECT语句,则其亲和性与返回结果集相同。
  • 如果表达式指向一个真实表(非VIEW或子查询)列的引用,则亲和性与列相同。
  • 形如"CAST(expr AS type)"的表达式,亲和性与type相同。
  • COLLATE运算符的亲和性与左操作数据相同。

比较运算符

“=”
“==”
“<”
“<=”
“>”
“>=”
“!=”
“IN”
“NOT IN”
“BETWEEN”
“IS”
“IS NOT”

排序规则

  • NULL类型的值比其它任何类型的值都小,比一个其它NULL类型的值小。
  • INTEGER或REAL类型的值小于TEXT或BLOB类型的值。
  • TEXT类型的值小于BLOB类型的值。
  • BLOB类型的值相互比较时,使用memcmp方法的计算结果。

比较前的类型转换

比较INTEGER、REAL、TEXT存储类型的两个值之前可能会发生类型转换,取决于操作数的亲和关系。
数值类型可以转换为TEXT,TEXT可以在格式正确的情况下转换为数值(不包含十六进制格式)。BLOB只是简单解释为文本字符串并以数据库当前的编码进行文本比较。

  • 如果其一操作数有INTEGER、REAL或NUMERIC亲和类型,而另一操作数有TEXT或BLOB或无亲和类型,则后者应用NUMERIC亲和类型。
  • 如果其一操作数有TEXT亲和类型而另一操作数无亲和类型,则后者应用TEXT亲和类型。
  • 其它情况则按操作数自有类型比较。

算术运算符

+, -, *, /,%,<<,>>,&,|

两边运算符被解释为数值。STRING或BLOB自动转换为REAL或INTEGER。
STRING或BLOB描述一个实数时(有小数点或指数),或其描述的整数超过8字节有符号整数时,将被转换为REAL,否则转换为INTEGER。
部分运算符要求操作数是整数,则REAL类型通过CAST to INTEGER转换为整数。
NULL类型参与运算的结果仍是NULL,操作数无法转换为数值类型且不是NULL时,转换为0或0.0。 除以0返回一个NULL类型。

排序,分组,SELECT组合查询

查询结果通过ORDER BY排序时,最先出现的时NULL类型,然后时INTEGER和REAL类型,接着是TEXT类型,最后是BLOB类型。

group by子句用于分组的值如果存储类型不同则会放到不同的组。例外情况是对于INTEGER或REAL存储类型,只要数值相同即在同一组。

UNION、INTERSECT和EXCEPT组合的SELECT查询会在值比较时隐式转换类型,并且不会应用亲和类型。

排序序列

比较两个字符串时使用排序序列或排序方法进行比较。

  • BINARY
    使用memcmp进行比较
  • NOCASE
    使用strnicmp进行比较,不会进行完整的UTF大小写转换,即仅有26个ASCII字母被转换为小写进行比较。
  • RTRIM
    与BINARY相似,只是将字符串末尾的空格去掉再比较。
开发者可以通过sqlite3_create_collation()注册自己的排序函数。

指定排序函数

每个表的每一列都有一个关联的排序函数,默认为BINARY。在定义列时通过COLLATE子句可以指定其它排序函数。
以下规则用于确定对于二进制比较运算符 (=, <, >, <=, >=, !=, IS, and IS NOT)使用哪一个排序函数:

  1. 任何一个操作数有通过COLLATE显式分配的排序函数时,直接使用,优先于左操作数的排序函数。
  2. 如果有一个操作数是列,则列的排序函数优先于左操作数的排序函数。
  3. 其它情况使用BINARY。

原文链接:https://www.sqlite.org/datatype3.html


http://www.ppmy.cn/news/1140081.html

相关文章

【Overload游戏引擎分析】编辑器对象鼠标拾取原理

Overload的场景视图区有拾取鼠标功能&#xff0c;单击拾取物体后会显示在Inspector面板中。本文来分析鼠标拾取这个功能背后的原理。 一、OpenGL的FrameBuffer 实现鼠标拾取常用的方式有两种&#xff1a;渲染id到纹理、光线投射求交。Overload使用的是渲染id到纹理&#xff0c…

成功解决@Async注解不生效的问题,异步任务处理问题

首先&#xff0c;有这样一个异步监听方法 然后配置好了异步线程池 package com.fdw.study.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conf…

数百个下载能够传播 Rootkit 的恶意 NPM 软件包

供应链安全公司 ReversingLabs 警告称&#xff0c;最近观察到的一次恶意活动依靠拼写错误来诱骗用户下载恶意 NPM 软件包&#xff0c;该软件包会通过 rootkit 感染他们的系统。 该恶意软件包名为“node-hide-console-windows”&#xff0c;旨在模仿 NPM 存储库上合法的“node-…

网络代理技术:保障隐私与增强安全

在当今高度互联的数字世界中&#xff0c;网络代理技术正逐渐崭露头角&#xff0c;为用户提供了保护隐私和增强网络安全的有力工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫开发中的应用&#xff0c;助您更好地理解和利用这些技术。 1. Socks5代理&#xff…

Python-Scrapy框架(框架学习)

一、概述 Scrapy是一个用于爬取网站数据的Python框架&#xff0c;可以用来抓取web站点并从页面中提取结构化的数据。 基本组件&#xff1a; 引擎(Engine)&#xff1a;负责控制整个爬虫的流程&#xff0c;包括调度请求、处理请求和响应等。 调度器(Scheduler)&#xff1a;负责…

Google Cloud dataflow streaming job简介

简单介绍 首先 gcp 的dataflow 是1个ETL 组件, 它是基于Apache beam的 Apache beam 是1个较新的开源ETL 框架。 对于我们常用的ETL tool Spring batch 有下面的区别 spring batch 更偏向batch &#xff08;后台处理&#xff09;的ETL&#xff0c; 而apache beam 同时支持bat…

docker compose 管理应用服务的常用命令

一 、docker compose 是什么 Docker Compose是一个用来管理多个关联容器的工具&#xff0c;可以根据配置文件自动构建、管理、编排一组容器。 Docker Compose语境下的“服务”是指一组容器共同构成的一个应用服务后端。 Docker Compose语境下的“项目”是由一个或多个应用服务…

vue3 keepalive跳转页面保存页面状态

描述 实现页面 A-> B &#xff0c; B->A&#xff08;A保存之前页面状态&#xff0c;不刷新页面&#xff09; // router/index.tsimport { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router createRouter({h…