本章節講述Android Sqlite數據庫數據類型知識
您可以在創建表的同時使用這些數據類型。SQLite 使用一個更普遍的動態類型系統。在 SQLite 中,值的數據類型與值本身是相關的,而不是與它的容器相關。
二、SQLite 存儲類
每個存儲在 SQLite 數據庫中的值都具有以下存儲類之一:
三、SQLite 親和(Affinity)類型
SQLite支持列的親和類型概念。任何列仍然可以存儲任何類型的數據,當數據插入時,該字段的數據將會優先採用親緣類型作爲該值的存儲方式。SQLite目前的版本支持以下五種親緣類型:
四、SQLite 親和類型(Affinity)及類型名稱
下表列出了當創建 SQLite3 表時可使用的各種數據類型名稱,同時也顯示了相應的親和類型:
五、Boolean 數據類型
SQLite 沒有單獨的 Boolean 存儲類。相反,布爾值被存儲爲整數 0(false)和 1(true)。
六、Date 與 Time 數據類型
SQLite 沒有一個單獨的用於存儲日期和/或時間的存儲類,但 SQLite 能夠把日期和時間存儲爲 TEXT、REAL 或 INTEGER 值。
七、但實際上,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');
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:453.直接對時間 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');SELECT DATETIME ('now','localtime','start of year');
8. 對計算完的時間,得到他那個月的第一天
SELECT DATETIME ('2016-10-17 00:20:00','+1 hour','-12 minute','start of month');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')SELECT julianday('now','localtime')*86400 -
julianday('2004-01-01 02:34:56')*86400
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< DATETIME ('now','start of day','+1 day') from 表
16.查詢昨天所有的記錄(+day -day)
SELECT time>= DATETIME ('now','start of day','-1 day')
AND time< DATETIME ('now','start of day','+0 day')
from 表
SELECT time>=DATETIME ('now','start of day','-6 day','weekday 1')
AND time<DATETIME ('now','start of day','+1 day','weekday 1')
from 表
18.查詢本月所有記錄(start of month)
SELECT Time>= DATETIME ('now','start of month','+0 month','-0 day')AND Time < datetime('now','start of month','+1 month','0 day')
from 表
19.查詢上一月所有記錄(+ month -month)
SELECT Time>= DATETIME ('now','start of month','-1 month','-0 day')
AND Time < DATETIME ('now','start of month','+0 month','-1 day')
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