SQLite3中的数据类型
Sqlite使用一個更一般的動態類型系統,sqlite中,值的數據類型跟值本身相關,而不是與它的容器相關。Sqlite的動態類型系統和其他數據庫的更為一般的靜態類型系統相兼容,但同時,sqlite中的動態類型允許它能做到一些傳統剛性類型數據庫所不可能做到的事。
二、?存儲類和數據類型
每個存放在sqlite數據庫中(或者由這個數據庫引擎操作)的值都有下面中的一個存儲類:
l??NULL,值是NULL
l??INTEGER,值是有符號整形,根據值的大小以1,2,3,4,6或8字節存放
l??REAL,值是浮點型值,以8字節IEEE浮點數存放
l??TEXT,值是文本字符串,使用數據庫編碼(UTF-8,UTF-16BE或者UTF-16LE)存放
l??BLOB,只是一個數據塊,完全按照輸入存放(即沒有準換)
從上可以看出存儲類比數據類型更一般化。比如INTEGER存儲類,包括6中不同長度的不同整形數據類型,這在磁盤上造成了差異。但是只要INTEGER值被從磁盤讀出進入到內存進行處理,它們被轉換成最一般的數據類型(8-字節有符號整形)。
Sqlite v3數據庫中的任何列,除了整形主鍵列,可以用于存儲任何一個存儲列的值。sql語句中的中所有值,不管它們是嵌入在sql文本中或者是作為參數綁定到一個預編譯的sql語句,它們的存儲類型都是未定的。在下面描述的情況中,數據庫引擎會在查詢執行過程中在數值(numeric)存儲類型(INTEGER和REAL)和TEXT之間轉換值。
1.布爾類型
Sqlite沒有單獨的布爾存儲類型,它使用INTEGER作為存儲類型,0為false,1為true
2. Date和Time Datatype
Sqlite沒有另外為存儲日期和時間設定一個存儲類集,內置的sqlite日期和時間函數能夠將日期和時間以TEXT,REAL或INTEGER形式存放
l??TEXT?作為IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS")
l??REAL?從格林威治時間11月24日,4174 B.C中午以來的天數
l??INTEGER?從?1970-01-01 00:00:00 UTC以來的秒數
程序可以任意選擇這幾個存儲類型去存儲日期和時間,并且能夠使用內置的日期和時間函數在這些格式間自由轉換
?
三、類型近似
為了使sqlite和其他數據庫間的兼容性最大化,sqlite支 持列上“類型近似”的觀點,列的類型近似指的是存儲在列上數據的推薦類型。這里必須記住一點,這個類型是被推薦,而不是必須的。任何列仍然能存儲任意類型 的數據。只是一些列,給予選擇的話,將會相比于其他的一些類型優選選擇一些存儲類型,這個列優先選擇的存儲類型被稱為它的“近似”。
每個sqlite3數據庫中的列都被賦予下面類型近似中的一種:
l??TEXT
l??NUMERIC
l??INTEGER
l??REAL
l??NONE
具有TEXT近似的列可以用NULL,TEXT或者BLOB類型存儲數據。如果數值數據被插入到具有TEXT近似的列,在被存儲前被轉換為文本形式
一個有NUMERIC近似的列可以使用1中的所有5中存儲類來存儲數據。當文本數據被存放到NUMERIC近似的列中,這個文本的存儲類被轉換到INTEGER或REAL(根據優先級順序),如果這個轉換是無損的話。對于TEXT和REAL存儲類間的轉換,如果數據的前15位的被保留的話sqlite就認為這個轉換是無損的、可反轉的。如果TEXT到INTEGER或REAL的轉換不可避免的會造成損失,那么數據將使用TEXT存儲類存儲。不會企圖去轉換NULL或BLOB值。
一個字符串可能看起來像浮點數據,有小數點或指數符號,但是只要這個數據可以使用整形存放,NUMERIC近似就會將它轉換到整形。比如,字符串?'3.0e+5'存放到一個具有NUMERIC近似的列中,被存為300000,而不是浮點型值300000.0。
具有INTEGER近似的列和具有NUMERIC近似的列表現相同。它們之間的差別僅處于轉換描述上。
具有REAL近似的列和具有NUMERIC近似的列一樣,除了它將整形數據轉換成浮點型形式。
具有NONE近似的列不會優先選擇一個存儲列,也不會強制將數據從一個存儲類轉換到另外一個類。
1.?列近似的決定因素
列的近似由這個列的聲明類型所決定,根據下面的順序的規則:
<1>?如果聲明類型包含”INT”字符串,那么這個列被賦予INTEGER近似
<2>?如果這個列的聲明類型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一個,那么這個列就有了TEXT近似。注意類型VARCHAR包含了”CHAR”字符串,那么也就被賦予了TEXT近似
<3>?如果列的聲明類型中包含了字符串”BLOB”或者沒有為其聲明類型,這個列被賦予NONE近似
<4>?其他的情況,列被賦予NUMERIC近似
上面規則額順序對于決定列的近似很重要。一個列的聲明類型為”CHARINT”的話同時會匹配規則<1>和<2>,但是第一個規則占有優先級所以這個列的近似將是INTEGER。
2.?近似名稱例子
?????????下面這個表顯示了多少來自更傳統的SQL操作的普通數據類型名稱,使用上一節中的5個規則,被轉換到近似類型。這個表只顯示了sqlite能夠接受的數據類名稱的一個子集。注意到跟隨類型名的圓括號內的數值參數(如:”VARCHAR(255)”)被sqlite忽略—sqlite不在字符串、BLOBS或者數值的長度上強加任何長度限制(除了一個全局的SQLITE_MAX_LENGTH限制)。
注意到聲明類型為”FLOATING POINT”將被賦予INTEGER近似,而不是REAL近似,因為在”POINT”中的”INT”。聲明類型為”STRING”的將被賦予NUMERIC,而不是TEXT(因為上述表中定義的類型中不存在STRING這一類型,它被歸于到規則<4>中,屬于其他情況)。
(從上面可以看出,sqlite3只是從聲明類型字符串中去查找它知道的聲明類型,比如”XINT”將被賦予INTEGER近似因為這個字符串里面有”INT”,所以這里并不需要一個單獨的正確的聲明類型,而是只要聲明類型字符串里面包含了sqlite所知道的聲明類型即可)
轉載自:http://supershll.blog.163.com/blog/static/3707043620123153547193/
? ? ?更多內容查看SQLite教程:http://www.runoob.com/sqlite/sqlite-tutorial.html
總結
以上是生活随笔為你收集整理的SQLite3中的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java se 开发web程序_JDiy
- 下一篇: 七、区块链如何运用merkle tree