Android SQLite數據庫—數據類型

本章節講述Android Sqlite數據庫數據類型知識


   一、SQLite 數據類型是一個用來指定任何對象的數據類型的屬性。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');



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< 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 表



17.查詢本週所有記錄(weekday) -6天的第一個星期一 到 周天 0點

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


 十二、SQLite最大的特點在於其數據類型爲無數據類型(typelessness)。這意味着可以保存任何類型的數據到所想要保存的任何表的任何列中,無論這列聲明的數據類型是什麼。雖然在生成表結構的時候,要聲明每個域的數據類型,但SQLite並不做任何檢查。開發人員要靠自己的程序來控制輸入與讀出數據的類型。這裏有一個例外,就是當主鍵爲整型值時,如果要插入一個非整型值時會產生異常。雖然,SQLite允許忽略數據類型,但是,仍然建議在Create Table語句中指定數據類型,因爲數據類型有利於增強程序的可讀性。另外,雖然在插入或讀出數據的時候是不區分類型的,但在比較的時候,不同數據類型是有區別的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章