日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

SQLite3中的数据类型

發(fā)布時(shí)間:2024/7/23 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLite3中的数据类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、概述 大多數(shù)的數(shù)據(jù)庫(kù)引擎(到現(xiàn)在據(jù)我們所知的除了sqlite的每個(gè)sql數(shù)據(jù)庫(kù)引擎)都使用靜態(tài)的、剛性的類(lèi)型,使用靜態(tài)類(lèi)型,數(shù)據(jù)的類(lèi)型就由它的容器決定,這個(gè)容器是這個(gè)指被存放的特定列。

Sqlite使用一個(gè)更一般的動(dòng)態(tài)類(lèi)型系統(tǒng),sqlite中,值的數(shù)據(jù)類(lèi)型跟值本身相關(guān),而不是與它的容器相關(guān)Sqlite的動(dòng)態(tài)類(lèi)型系統(tǒng)和其他數(shù)據(jù)庫(kù)的更為一般的靜態(tài)類(lèi)型系統(tǒng)相兼容,但同時(shí),sqlite中的動(dòng)態(tài)類(lèi)型允許它能做到一些傳統(tǒng)剛性類(lèi)型數(shù)據(jù)庫(kù)所不可能做到的事。


二、?存儲(chǔ)類(lèi)和數(shù)據(jù)類(lèi)型

每個(gè)存放在sqlite數(shù)據(jù)庫(kù)中(或者由這個(gè)數(shù)據(jù)庫(kù)引擎操作)的值都有下面中的一個(gè)存儲(chǔ)類(lèi)

l??NULL,值是NULL

l??INTEGER,值是有符號(hào)整形,根據(jù)值的大小以1,2,3,4,68字節(jié)存放

l??REAL,值是浮點(diǎn)型值,以8字節(jié)IEEE浮點(diǎn)數(shù)存放

l??TEXT,值是文本字符串,使用數(shù)據(jù)庫(kù)編碼(UTF-8UTF-16BE或者UTF-16LE)存放

l??BLOB,只是一個(gè)數(shù)據(jù)塊,完全按照輸入存放(即沒(méi)有準(zhǔn)換)

從上可以看出存儲(chǔ)類(lèi)比數(shù)據(jù)類(lèi)型更一般化。比如INTEGER存儲(chǔ)類(lèi),包括6中不同長(zhǎng)度的不同整形數(shù)據(jù)類(lèi)型,這在磁盤(pán)上造成了差異。但是只要INTEGER值被從磁盤(pán)讀出進(jìn)入到內(nèi)存進(jìn)行處理,它們被轉(zhuǎn)換成最一般的數(shù)據(jù)類(lèi)型(8-字節(jié)有符號(hào)整形)。

Sqlite v3數(shù)據(jù)庫(kù)中的任何列,除了整形主鍵列,可以用于存儲(chǔ)任何一個(gè)存儲(chǔ)列的值。sql語(yǔ)句中的中所有值,不管它們是嵌入在sql文本中或者是作為參數(shù)綁定到一個(gè)預(yù)編譯的sql語(yǔ)句,它們的存儲(chǔ)類(lèi)型都是未定的。在下面描述的情況中,數(shù)據(jù)庫(kù)引擎會(huì)在查詢執(zhí)行過(guò)程中在數(shù)值(numeric)存儲(chǔ)類(lèi)型(INTEGERREAL)和TEXT之間轉(zhuǎn)換值。

1.布爾類(lèi)型

Sqlite沒(méi)有單獨(dú)的布爾存儲(chǔ)類(lèi)型,它使用INTEGER作為存儲(chǔ)類(lèi)型,0false1true

2. DateTime Datatype

Sqlite沒(méi)有另外為存儲(chǔ)日期和時(shí)間設(shè)定一個(gè)存儲(chǔ)類(lèi)集,內(nèi)置的sqlite日期和時(shí)間函數(shù)能夠?qū)⑷掌诤蜁r(shí)間以TEXTREALINTEGER形式存放

l??TEXT?作為IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS"

l??REAL?從格林威治時(shí)間1124日,4174 B.C中午以來(lái)的天數(shù)

l??INTEGER??1970-01-01 00:00:00 UTC以來(lái)的秒數(shù)

程序可以任意選擇這幾個(gè)存儲(chǔ)類(lèi)型去存儲(chǔ)日期和時(shí)間,并且能夠使用內(nèi)置的日期和時(shí)間函數(shù)在這些格式間自由轉(zhuǎn)換

?

三、類(lèi)型近似

為了使sqlite和其他數(shù)據(jù)庫(kù)間的兼容性最大化,sqlite支 持列上“類(lèi)型近似”的觀點(diǎn),列的類(lèi)型近似指的是存儲(chǔ)在列上數(shù)據(jù)的推薦類(lèi)型。這里必須記住一點(diǎn),這個(gè)類(lèi)型是被推薦,而不是必須的。任何列仍然能存儲(chǔ)任意類(lèi)型 的數(shù)據(jù)。只是一些列,給予選擇的話,將會(huì)相比于其他的一些類(lèi)型優(yōu)選選擇一些存儲(chǔ)類(lèi)型,這個(gè)列優(yōu)先選擇的存儲(chǔ)類(lèi)型被稱為它的“近似”。

每個(gè)sqlite3數(shù)據(jù)庫(kù)中的列都被賦予下面類(lèi)型近似中的一種:

l??TEXT

l??NUMERIC

l??INTEGER

l??REAL

l??NONE

具有TEXT近似的列可以用NULLTEXT或者BLOB類(lèi)型存儲(chǔ)數(shù)據(jù)。如果數(shù)值數(shù)據(jù)被插入到具有TEXT近似的列,在被存儲(chǔ)前被轉(zhuǎn)換為文本形式

一個(gè)有NUMERIC近似的列可以使用1中的所有5中存儲(chǔ)類(lèi)來(lái)存儲(chǔ)數(shù)據(jù)。當(dāng)文本數(shù)據(jù)被存放到NUMERIC近似的列中,這個(gè)文本的存儲(chǔ)類(lèi)被轉(zhuǎn)換到INTEGERREAL(根據(jù)優(yōu)先級(jí)順序),如果這個(gè)轉(zhuǎn)換是無(wú)損的話。對(duì)于TEXTREAL存儲(chǔ)類(lèi)間的轉(zhuǎn)換,如果數(shù)據(jù)的前15位的被保留的話sqlite就認(rèn)為這個(gè)轉(zhuǎn)換是無(wú)損的、可反轉(zhuǎn)的。如果TEXTINTEGERREAL的轉(zhuǎn)換不可避免的會(huì)造成損失,那么數(shù)據(jù)將使用TEXT存儲(chǔ)類(lèi)存儲(chǔ)。不會(huì)企圖去轉(zhuǎn)換NULLBLOB值。

一個(gè)字符串可能看起來(lái)像浮點(diǎn)數(shù)據(jù),有小數(shù)點(diǎn)或指數(shù)符號(hào),但是只要這個(gè)數(shù)據(jù)可以使用整形存放,NUMERIC近似就會(huì)將它轉(zhuǎn)換到整形。比如,字符串?'3.0e+5'存放到一個(gè)具有NUMERIC近似的列中,被存為300000,而不是浮點(diǎn)型值300000.0

具有INTEGER近似的列和具有NUMERIC近似的列表現(xiàn)相同。它們之間的差別僅處于轉(zhuǎn)換描述上。

具有REAL近似的列和具有NUMERIC近似的列一樣,除了它將整形數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)型形式

具有NONE近似的列不會(huì)優(yōu)先選擇一個(gè)存儲(chǔ)列,也不會(huì)強(qiáng)制將數(shù)據(jù)從一個(gè)存儲(chǔ)類(lèi)轉(zhuǎn)換到另外一個(gè)類(lèi)。

1.?列近似的決定因素

列的近似由這個(gè)列的聲明類(lèi)型所決定,根據(jù)下面的順序的規(guī)則:

<1>?如果聲明類(lèi)型包含”INT”字符串,那么這個(gè)列被賦予INTEGER近似

<2>?如果這個(gè)列的聲明類(lèi)型包含”CHAR””CLOB”,或者”TEXT”中的任意一個(gè),那么這個(gè)列就有了TEXT近似。注意類(lèi)型VARCHAR包含了”CHAR”字符串,那么也就被賦予了TEXT近似

<3>?如果列的聲明類(lèi)型中包含了字符串”BLOB”或者沒(méi)有為其聲明類(lèi)型,這個(gè)列被賦予NONE近似

<4>?其他的情況,列被賦予NUMERIC近似

上面規(guī)則額順序?qū)τ跊Q定列的近似很重要。一個(gè)列的聲明類(lèi)型為”CHARINT”的話同時(shí)會(huì)匹配規(guī)則<1><2>,但是第一個(gè)規(guī)則占有優(yōu)先級(jí)所以這個(gè)列的近似將是INTEGER

2.?近似名稱例子

?????????下面這個(gè)表顯示了多少來(lái)自更傳統(tǒng)的SQL操作的普通數(shù)據(jù)類(lèi)型名稱,使用上一節(jié)中的5個(gè)規(guī)則,被轉(zhuǎn)換到近似類(lèi)型。這個(gè)表只顯示了sqlite能夠接受的數(shù)據(jù)類(lèi)名稱的一個(gè)子集。注意到跟隨類(lèi)型名的圓括號(hào)內(nèi)的數(shù)值參數(shù)(如:”VARCHAR(255)”)被sqlite忽略—sqlite不在字符串、BLOBS或者數(shù)值的長(zhǎng)度上強(qiáng)加任何長(zhǎng)度限制(除了一個(gè)全局的SQLITE_MAX_LENGTH限制)。

注意到聲明類(lèi)型為”FLOATING POINT”將被賦予INTEGER近似,而不是REAL近似,因?yàn)樵?/span>”P(pán)OINT”中的”INT”。聲明類(lèi)型為”STRING”的將被賦予NUMERIC,而不是TEXT(因?yàn)樯鲜霰碇卸x的類(lèi)型中不存在STRING這一類(lèi)型,它被歸于到規(guī)則<4>中,屬于其他情況)

(從上面可以看出,sqlite3只是從聲明類(lèi)型字符串中去查找它知道的聲明類(lèi)型,比如”XINT”將被賦予INTEGER近似因?yàn)檫@個(gè)字符串里面有”INT”,所以這里并不需要一個(gè)單獨(dú)的正確的聲明類(lèi)型,而是只要聲明類(lèi)型字符串里面包含了sqlite所知道的聲明類(lèi)型即可)


轉(zhuǎn)載自:http://supershll.blog.163.com/blog/static/3707043620123153547193/

? ? ?更多內(nèi)容查看SQLite教程:http://www.runoob.com/sqlite/sqlite-tutorial.html

總結(jié)

以上是生活随笔為你收集整理的SQLite3中的数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。