SQL 研究 相似的數(shù)據(jù)類(lèi)型
最常用的數(shù)值類(lèi)型是int,但是它未必是最佳選擇。bigint,smallint,tinyint可以應(yīng)用在特殊場(chǎng)合。他們的特性如下表所示:
Data type | Range | Storage |
---|---|---|
bigint |
-2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807) |
8 Bytes |
int |
-2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647) |
4 Bytes |
smallint |
-2^15 (-32,768) to 2^15-1 (32,767) |
2 Bytes |
tinyint |
0 to 255 |
1 Byte |
可見(jiàn)如果某一列的值只有10來(lái)個(gè)值,而你卻用了int,那么沒(méi)行數(shù)據(jù)多占用了3個(gè)字節(jié)。如果有1G的行數(shù),那么你多用了3G的空間。如果它還在index中,ok,它又占用了不必要的3G。
與此類(lèi)似的是Float和Real,他們的格式如下:
Data type | Range | Storage |
---|---|---|
float |
- 1.79E+308 to -2.23E-308, 0 and 2.23E-308 to 1.79E+308 |
Depends on the value of n 1,24=4 bytes 25,53=8bytes |
real |
- 3.40E + 38 to -1.18E - 38, 0 and 1.18E - 38 to 3.40E + 38 |
4 Bytes |
需要說(shuō)明的是,float的長(zhǎng)度取決于一個(gè)參數(shù),雖然我們通常聲明的時(shí)候并不指定float的長(zhǎng)度,實(shí)際上是存在這樣的選項(xiàng)的。這個(gè)長(zhǎng)度默認(rèn)是53,數(shù)值范圍如上表所示。
顯然如果你要表示的數(shù)字不會(huì)超過(guò)10的38次方的話,你應(yīng)該用real,他可以為你節(jié)省4個(gè)字節(jié)。
另一個(gè)相關(guān)的例子是decimal和numerical,他們是另一組精確表示數(shù)值的類(lèi)型。float和real是不精確的,所以不能做相等的比較。
decimal和float在功能是等價(jià)的,為什么要分成兩個(gè)名字,我也不清楚。
decimal的聲明如下:decimal(p,s),p表示總共多少位,包括小數(shù)點(diǎn)前后的數(shù)字,s表示小數(shù)點(diǎn)后多少位,p不能超過(guò)38,當(dāng)然s不能超過(guò)p,缺省是0。
decimal的范圍是正負(fù)10的p-s次方的結(jié)果 減去10的-s次方。比如decimal(2,1)的范圍是正負(fù)9.9。
decimal的長(zhǎng)度和p的大小相關(guān),如下表所示:
Precision | Storage bytes |
---|---|
1 - 9 |
5 |
10-19 |
9 |
20-28 |
13 |
29-38 |
17 |
可使用變長(zhǎng)字節(jié)來(lái)存放decimal。此時(shí)數(shù)據(jù)庫(kù)根據(jù)實(shí)際數(shù)值的大小來(lái)存放decimal,而不是根據(jù)聲明來(lái)判斷。如果表中沒(méi)有var length的列,那么需要額外的兩個(gè)字節(jié),否則不會(huì)有額外的需要。
可以通過(guò)如下的命令啟動(dòng)一個(gè)數(shù)據(jù)庫(kù)上的變長(zhǎng)decimal存儲(chǔ):
EXEC sp_db_vardecimal_storage_format 'AdventureWorks', 'ON' ;
通過(guò)EXEC sp_db_vardecimal_storage_format ;查看所有啟動(dòng)了這一功能的數(shù)據(jù)庫(kù)。
通過(guò)EXEC sp_tableoption 'Sales.SalesOrderDetail', 'vardecimal storage format', 1 ;
啟動(dòng)對(duì)某個(gè)表的變長(zhǎng)decimal存儲(chǔ)。
最后再看看datetime和smalldatetime,兩者都表示時(shí)間,區(qū)別如下:
datetime表達(dá)的時(shí)間更久,1753到9999,精度更高,300分之一秒,占用8個(gè)字節(jié);
smalldatetime表達(dá)的時(shí)間較短,1900到2079,精確到分,4個(gè)字節(jié)。
通常情況下,smalldatetime是夠用的。
相關(guān)文章
通過(guò)T-SQL語(yǔ)句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密功能
這篇文章介紹了通過(guò)T-SQL語(yǔ)句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密功能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03SQL Server 2005 數(shù)據(jù)庫(kù)轉(zhuǎn) SQL Server 2000的方法小結(jié)
這篇文章主要介紹了SQL Server 2005 數(shù)據(jù)庫(kù)轉(zhuǎn) SQL Server 2000的方法,需要的朋友可以參考下2014-04-04sqlserver中查找所有包含了某個(gè)文本的存儲(chǔ)過(guò)程
我想查找所有使用了sp_a 的存儲(chǔ)過(guò)程。右擊sp_a->view dependencies-> 選擇 view objects that depend on [sp_a] 你會(huì)發(fā)現(xiàn),有時(shí)候結(jié)果不能夠全部列出來(lái),不能夠找到所有使用了sp_a的其他存儲(chǔ)過(guò)程。2010-05-05SQL Server代理服務(wù)無(wú)法啟動(dòng)怎么辦
SQL Server代理服務(wù)無(wú)法啟動(dòng)怎么辦?這篇文章主要介紹了SQL Server代理服務(wù)無(wú)法啟動(dòng)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03必須會(huì)的SQL語(yǔ)句(二) 創(chuàng)建表、修改表結(jié)構(gòu)、刪除表
這篇文章主要介紹了sqlserver中創(chuàng)建表、修改表結(jié)構(gòu)、刪除表的sql語(yǔ)句,需要的朋友可以參考下2015-01-01Sql server 2012 中文企業(yè)版安裝圖文教程(附下載鏈接)
這篇文章主要介紹了Sql server 2012 中文企業(yè)版安裝圖文教程(附下載鏈接),需要的朋友可以參考下2020-04-04MySQL 數(shù)據(jù)庫(kù) source 命令詳解及實(shí)例
這篇文章主要介紹了MySQL 數(shù)據(jù)庫(kù) source 命令詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06