SQLite入门之数据类型
2019獨角獸企業重金招聘Python工程師標準>>>
?
SQLite入門之數據類型
?
2011-05-23 16:47:47? 來源:SeaYee
最近在開發一個可以記錄日志的程序,要求效率高,需要能做簡單的查詢和統計。經過同事介紹,看上了SQLite。首先了解一下SQLite存儲的數據類型,至于SQLite的發展和工作原理,可以查看SQLite的官方網站(www.sqlite.org),網上的相關文章都挺多挺詳細的。
一、SQLite簡介
SQLite,是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows、Linux、Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如
Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比他們都快。
二、SQLite數據類型
SQLite除了在字段類型為“Integer Primary
Key”時是限制數據類型外,其它情況下SQLite是Typelessness(無類型)的。這意味著你可以保存任何類型的數據到你所想要保存的任何表的任何列中,無論這列聲明的數據類型是什么。
一般數據采用的固定的靜態數據類型,而SQLite采用的是動態數據類型,會根據存入值自動判斷。SQLite具有以下五種數據類型:
| NULL | 空值。 |
| INTEGER | 帶符號的整型,具體取決有存入數字的范圍大小。 |
| REAL | 浮點數字,存儲為8-byte IEEE浮點數。 |
| TEXT | 字符串文本。 |
| BLOB | 二進制對象。 |
但實際上,SQLite 3也接受如下的數據類型:
| 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 | 包含了:年、月、日、時、分、秒、千分之一秒。 |
| datetime | 包含日期時間格式,必須寫成“2011-05-23”不能寫為“2011-5-23”,否則在讀取時會產生錯誤! |
對于SQLite來說對字段不指定類型是完全有效的,如:
?
| 1 | CreateTableex3(a, b, c); |
即使SQLite允許忽略數據類型,但是仍然建議在你的Create
Table語句中指定數據類型。因為數據類型對于你和其他的程序員交流,或者你準備換掉你的數據庫引擎是非常有用的。SQLite支持常見的數據類型,如:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATETABLEex2( aVARCHAR(10), bNVARCHAR(15), cTEXT, dINTEGER, eFLOAT, fBOOLEAN, gCLOB, hBLOB, iTIMESTAMP, jNUMERIC(10,5), kVARYINGCHARACTER(24), lNATIONALVARYINGCHARACTER(16) ); |
三、SQLite的類型親和性分析
(以下引用“上善若水”的分析,僅供學習參考。網址:http://www.cnblogs.com/hustssrs/archive/2009/03/03/1402214.html。)
SQLite不強制數據類型約束。任何數據都可以插入任何列。你可以向一個整型列中插入任意長度的字符串,向布爾型列中插入浮點數,或者向字符型列中插入日期型值。在Create
TABLE中所指定的數據類型不會限制在該列中插入任何數據。任何列均可接受任意長度的字符串(只有一種情況除外:標志為INTEGER PRIMARY
KEY的列只能存儲64位整數,當向這種列中插數據除整數以外的數據時,將會產生錯誤。)但SQLite確實使用聲明的列類型來指示你所期望的格式。所以,例如你向一個整型列中插入字符串時,SQLite會試圖將該字符串轉換成一個整數。如果可以轉換,它將插入該整數;否則,將插入字符串。這是一個特性,而不是一個Bug。這種特性被稱為類型或列親和性(Type
or Column Affinity)。
1、類型親和性優點:
??? 1)、提高和其它DBMS的兼容性,讓用戶就像是在用一般的DBMS一樣而使用它,提高了容錯能力。
??
2)、SQLite支持的數據類型只有五種,而其它的大型DBMS支持的數據類型有幾十種,那么如果要將其它的數據轉換成SQLite下的數據就根本不能實現,所以就將它的數據類型設計為親和性的,數據類型種類少了系統實現會簡單很多,整個系統也就不會太龐大,因為如果有太多的數據類型限制的話,本身系統在實現方面也會困難些。然而,雖然它支持的類型雖然只有五種,可是實際上任何類型都支持了,這就是SQLite數據類型親和性的巧妙之處。由此我個人認為這也就是將數據類型設計成為親和性的初衷。
??? 3)、在插入數據的時候只要做一些檢查和轉換即可,實現容易。
2、類型親和性缺點:
??
1)、在對表中數據進行統計方面如果有不一致的數據存在則運算比較混亂,其實也就是放寬政策為的是讓更多人去維護。不過它自己是有處理方法的,如果在運算時出現不同類型的數據時就忽略不計等。
??? 2)、還有在數據比較方面也存在同樣的問題,不過也有相應的補救措施,規定了比較準則:
??????
a)、
一個具有空存儲類型的值被認為小于任何值(包括另外一個具有空存儲類型的值)。
??????
b)、一個整數值或實數值小于任何文本值和BLOB值。當一個整數或實數和另一個整數或實數相比較的時候,則按照實際數值來比較。
??????
c)、一個文本值小于BLOB值。當兩個文本值相比較的時候,則用C語言類庫中的memcmp()函數來比較。然而,有時候也不是這樣的,比如在下面所描述的“用戶定義的整理順序”情況下。
??????
d)、當兩個BLOB文本被比較的時候,結果決定于memcmp()函數。
轉載于:https://my.oschina.net/u/246578/blog/136552
總結
以上是生活随笔為你收集整理的SQLite入门之数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【电路补习笔记】1、电阻的参数与选型
- 下一篇: (个人简历一)用纯html写个人简历