热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidSQLite数据库—数据类型

本章节讲述AndroidSqlite数据库数据类型知识  一、SQLite数据类型是一个用来指定任何对象的数据类型的属性。SQLite中的每一列,每个变量和表达式都有相关的数据类型

本章节讲述Android Sqlite数据库数据类型知识


   一、SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。
您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。



 二、SQLite 存储类

每个存储在 SQLite 数据库中的值都具有以下存储类之一:

《Android SQLite数据库—数据类型》



 三、SQLite 亲和(Affinity)类型

SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型:

《Android SQLite数据库—数据类型》



四、SQLite 亲和类型(Affinity)及类型名称

下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:

《Android SQLite数据库—数据类型》《Android SQLite数据库—数据类型》



五、Boolean 数据类型

SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。


六、Date 与 Time 数据类型

SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。

《Android SQLite数据库—数据类型》



 七、但实际上,sqlite3也接受如下的数据类型:


 smallint 16 位元的整数。

 interger 32 位元的整数。

 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

 float  32位元的实数。

 double  64位元的实数。

 char(n)  n 长度的字串,n不能超过 254。

 varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。

 graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。

 vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000

 date  包含了 年份、月份、日期。

 time  包含了 小时、分钟、秒。

 timestamp 包含了 年、月、日、时、分、秒、千分之一秒。


八、创建表例子

CREATE TABLE mytable(    
column1 VARCHAR(10),    
column2 NVARCHAR(15),   
column3 TEXT,    
column4 INTEGER,   
column5 FLOAT,   
column6 BOOLEAN,    
column7 CLOB,    
column8 BLOB,    
column9 TIMESTAMP,   
column10 NUMERIC(10,5),    
column11 VARYING CHARACTER (24),    
column12 NATIONAL VARYING CHARACTER(16)   
);


九、char、varchar、text和nchar、nvarchar、ntext的区别

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。  

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。



十、sqlite3支持的函数


1.日期函数

datetime() : 产生日期和时间
date(): 产生日期
time():产生时间
strftime():对以上3个函数产生的日期和时间进行格式化

 用法实例:
1、SELECT date(‘2011-9-9′,’+1 day’,’+1 year’); 结果是 2010-09-10
2、SELECT datetime(‘now’); 当前日期和时间
3、SELECT datetime(‘now’, ‘start of month’); 本月的第一天零点,也可以设置年和日的第一天
4、SELECT datetime(‘now’,’+1 hour’,’-12 minute’); 当前时间加48分钟

strftime()函数可以将YYYY-MM-DD HH:MM:SS格式的日期字符串转换为其它形式的字符串
%d:天数,01-31
%f :小数形式的秒,SS.SSS
%H:小时
%j  :某一天是该年的第几天,001-366
%m:月份,00-12
%M:分钟,00-59
%s:从1970到现在的秒数
%S:秒,00-59
%w:星期,0-6,0是星期天
%W:某天是该年的第几周,01-53
%Y:年,YYYY
%% 百分号

应用举例:
SELECT strftime(‘%Y.%m.%d %H:%M:%S’,’now’,’localtime’);



2、【算术函数】

abs(X):返回绝对值
max(X,Y[,…]):返回最大值
min(X,Y,[,…]):返回最小值
random(*):返回随机数
round(X[,Y]): 四舍五入




3、【字符串处理函数】

length(x) :返回字符串字符个数
lower(x) :大写转小写
upper(x):小写转大写
substr(x,y,Z):截取子串
like(A,B):确定给定的字符串与指定的模式是否匹配




4、【条件判断函数、集合函数、其它函数】

typeof(x):返回数据的类型
last_insert_rowid():返回最后插入的数据的ID


十一、date相关函数

1.对年月进行操作

SELECT DATE(‘2006-10-17′,’+1 day’,’+1 year’);  2007-10-18  



2.获取时分

select time(‘now’,’localtime’)    19:27:45



datetime 
3.直接对时间 2006-10-17 00:20:00 进行计算

SELECT DATETIME (‘2016-10-17 00:20:00′,’+1 hour’,’-12 minute’);


4.获取时间,并转换成本地时区时间

SELECT DATETIME (‘now’,’localtime’);  



5.+8 时区, 中国时区 和 localtime 效果在中国是一致的

SELECT DATETIME (‘now’,’+8 hour’);   


6.取现在时间,时区是本地时区,在此时间基础上 (对时间运算)

SELECT DATETIME (‘now’, ‘localtime’, ‘+2 hour’ , ‘+20 minute’ , ‘-20 second’);  



7.一年开始(start of year)的时间


SELECT DATETIME (‘now’,’localtime’,’start of year’);   



8. 对计算完的时间,得到他那个月的第一天

SELECT DATETIME (‘2016-10-17 00:20:00′,’+1 hour’,’-12 minute’,’start of month’);  



9. 现在时间当天开始时间


SELECT DATETIME (‘now’,’localtime’,’start of day’);  



10. 计算机当前月份的最后一天

SELECT date(‘now’,’start of month’,’+1 month’,’-1 day’) 



11. 时间戳 1480593328(单位:秒) 表示的日期和时间

SELECT datetime(‘1480593328′,’unixepoch’,’localtime’)



12. 两个日期时间之间相差多少秒(julianday)

SELECT julianday(‘now’,’localtime’)*86400 – 
julianday(‘2004-01-01 02:34:56’)*86400



13. 获取当前的时间的毫秒数(strftime ) 结果:1480593328000


SELECT  strftime (‘%s’,’now’) * 1000   

14. 获取当前时间并格式化 结果 2006.10.17 21:41:09

SELECT strftime(‘%Y.%m.%d %H:%M:%S’,’now’,’localtime’);  


15.查询今天内所有的记录(day)


SELECT time>= DATETIME (‘now’,’start of day’,’+0 day’) 
AND time


16.查询昨天所有的记录(+day -day)


SELECT time>= DATETIME (‘now’,’start of day’,’-1 day’) 
AND time from 表



17.查询本周所有记录(weekday) -6天的第一个星期一 到 周天 0点

SELECT time>=DATETIME (‘now’,’start of day’,’-6 day’,’weekday 1′) 
AND timefrom 表  


18.查询本月所有记录(start of month)

SELECT Time>= DATETIME (‘now’,’start of month’,’+0 month’,’-0 day’) 
AND Time  from 表


19.查询上一月所有记录(+ month -month)


SELECT Time>= DATETIME (‘now’,’start of month’,’-1 month’,’-0 day’)
 AND Time  from 表


20.计算今年十月份第一个星期二的日期(month weekday)

SELECT date(‘now’,’start of year’,’+9 months’,’weekday 2′);



====解释,基本知识==========================

(1)时间/日期函数

DATETIME().………………….产生日期和时间

date()………………………产生日期

time()………………………产生时间

julianday(日期时间字符串, 修正符, 修正符, ……) 函数返回一个天数,从格林威治时间公元前4714年11月24号开始算起

strftime() ===============对以上三个函数产生的日期和时间进行格式化

其他四个函数都可以用 strftime() 函数来表示: 
date(…) -> strftime(“%Y-%m-%d”,…)

time(…) -> strftime(“%H:%M:%S”,…)

datetime(…) -> strftime(“%Y-%m-%d %H:%M:%S”,…)

julianday(…) -> strftime(“%J”,…)

(2)DATETIME ()的用法是:DATETIME (日期/时间, 时间时区格式 , 修正符, 修正符…)

(3)date()和time()的语法与DATETIME ()相同

在时间/日期函数里可以使用如下格式的字符串作为参数:

YYYY-MM-DD

YYYY-MM-DD HH:MM

YYYY-MM-DD HH:MM:SS

YYYY-MM-DD HH:MM:SS.SSS

HH:MM 代表2000-01-01日的时间,

HH:MM:SS 代表2000-01-01日的时间,

HH:MM:SS.SSS 代表2000-01-01日的时间,

now 表示产生现在的时间

DDDD.DDDD 使用格林威治时间(UTC); 一个 Julian Day Numbers

(4)修正符,日期和时间可以使用下面的修正符来更改日期或时间: 
NNN days 
NNN hours 
NNN minutes 
NNN.NNNN seconds 
NNN months 
NNN years 
start of month 
start of year 
start of week 
start of day 
weekday N 返回下一个星期是N的日期和时间; 
unixepoch 返回从1970-01-01开始算起的秒数 
localtime 第十三个修正符表示返回本地时间 
utc

(5)strftime() 函数

可以把YYYY-MM-DD HH:MM:SS格式的日期字符串转换成其它形式的字符串。

的语法是strftime(格式, 日期/时间, 修正符, 修正符, …)

它可以用以下的符号对日期和时间进行格式化:

%d 月份, 01-31

%f 小数形式的秒,SS.SSS

%H 小时, 00-23

%j 算出某一天是该年的第几天,001-366

%m 月份,00-12

%M 分钟, 00-59

%s 从1970年1月1日到现在的秒数

%S 秒, 00-59

%w 星期, 0-6 (0是星期天)

%W 算出某一天属于该年的第几周, 01-53

%Y 年, YYYY

%% 百分号

strftime()的用法举例如下:

SELECT strftime(‘%Y.%m.%d %H:%M:%S’,’now’,’localtime’); 
结果:2006.10.17 21:41:09


 十二、SQLite最大的特点在于其数据类型为无数据类型(typelessness)。这意味着可以保存任何类型的数据到所想要保存的任何表的任何列中,无论这列声明的数据类型是什么。虽然在生成表结构的时候,要声明每个域的数据类型,但SQLite并不做任何检查。开发人员要靠自己的程序来控制输入与读出数据的类型。这里有一个例外,就是当主键为整型值时,如果要插入一个非整型值时会产生异常。虽然,SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。另外,虽然在插入或读出数据的时候是不区分类型的,但在比较的时候,不同数据类型是有区别的。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37730482/article/details/72180915


推荐阅读
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了一种使用SQL Server存储过程来实现基于单一条件的高效分页查询的方法。通过示例代码,详细说明了如何构建和执行这种分页查询。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • AI炼金术:KNN分类器的构建与应用
    本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ... [详细]
author-avatar
ql3zqi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有