关系数据库——mysql数据类型大总结
整數(shù)類型:
實(shí)數(shù)類型:
定點(diǎn)數(shù):DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值。
DECIMAL(M,D),其中M表示十進(jìn)制數(shù)字總的個(gè)數(shù),D表示小數(shù)點(diǎn)后面數(shù)字的位數(shù)。
M的默認(rèn)取值為10,D默認(rèn)取值為0。如果創(chuàng)建表時(shí),某字段定義為decimal類型不帶任何參數(shù),等同于decimal(10,0)。帶一個(gè)參數(shù)時(shí),D取默認(rèn)值。
M的取值范圍為1~65,取0時(shí)會(huì)被設(shè)為默認(rèn)值,超出范圍會(huì)報(bào)錯(cuò)。
D的取值范圍為0~30,而且必須<=M,超出范圍會(huì)報(bào)錯(cuò)。
所以,很顯然,當(dāng)M=65,D=0時(shí),可以取得最大和最小值。
?
浮點(diǎn)數(shù)類型
:float,double和real。他們定義方式為:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。? “(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點(diǎn)后面
FLOAT和DOUBLE中的M和D的取值默認(rèn)都為0,即除了最大最小值,不限制位數(shù)。
M取值范圍為0~255。FLOAT只保證6位有效數(shù)字的準(zhǔn)確性,所以FLOAT(M,D)中,M<=6時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
D取值范圍為0~30,同時(shí)必須<=M。double只保證16位有效數(shù)字的準(zhǔn)確性,所以DOUBLE(M,D)中,M<=16時(shí),數(shù)字通常是準(zhǔn)確的。如果M和D都有明確定義,其超出范圍后的處理同decimal。
內(nèi)存中,FLOAT占4-byte(1位符號(hào)位 8位表示指數(shù) 23位表示尾數(shù)),DOUBLE占8-byte(1位符號(hào)位 11位表示指數(shù) 52位表示尾數(shù))。
?
浮點(diǎn)數(shù)比定點(diǎn)數(shù)類型存儲(chǔ)空間少,計(jì)算速度快,但是不夠精確。
?
因?yàn)樾枰?jì)算額外的空間和計(jì)算開銷,所以應(yīng)該盡量只在對(duì)小數(shù)進(jìn)行精確計(jì)算時(shí) 才使用DECIMAL。但在數(shù)據(jù)量比較大的情況下,可以考慮使用BIGINT代替DECIMAL,將需要存儲(chǔ)的貨幣單位根據(jù)小數(shù)的位數(shù)乘以相應(yīng)的倍數(shù)即可。
?
BIT數(shù)據(jù)類型
可用來(lái)保存位字段值。BIT(M)類型允許存儲(chǔ)M位值。M范圍為1~64,默認(rèn)為1。
BIT其實(shí)就是存入二進(jìn)制的值,類似010110。
如果存入一個(gè)BIT類型的值,位數(shù)少于M值,則左補(bǔ)0.
如果存入一個(gè)BIT類型的值,位數(shù)多于M值,MySQL的操作取決于此時(shí)有效的SQL模式:
如果模式未設(shè)置,MySQL將值裁剪到范圍的相應(yīng)端點(diǎn),并保存裁減好的值。
如果模式設(shè)置為traditional(“嚴(yán)格模式”),超出范圍的值將被拒絕并提示錯(cuò)誤,并且根據(jù)SQL標(biāo)準(zhǔn)插入會(huì)失敗。
MySQL把BIT當(dāng)做字符串類型,而非數(shù)字類型。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
字符串類型
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
?
CHAR & VARCHAR
?
CHAR和VARCHAR類型聲明的長(zhǎng)度表示你想要保存的最大字符數(shù)。例如,CHAR(30)可以占用30個(gè)字符。默認(rèn)長(zhǎng)度都為255。
CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0到255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉,所以,我們?cè)诖鎯?chǔ)時(shí)字符串右邊不能有空格,即使有,查詢出來(lái)后也會(huì)被刪除。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
所以當(dāng)char類型的字段為唯一值時(shí),添加的值是否已經(jīng)存在以不包含末尾空格(可能有多個(gè)空格)的值確定,比較時(shí)會(huì)在末尾補(bǔ)滿空格后與現(xiàn)已存在的值比較。
VARCHAR列中的值為可變長(zhǎng)字符串。長(zhǎng)度可以指定為0到65,535之間的值(實(shí)際可指定的最大長(zhǎng)度與編碼和其他字段有關(guān),比如,MySql使用utf-8編碼格式,大小為標(biāo)準(zhǔn)格式大小的2倍,僅有一個(gè)varchar字段時(shí)實(shí)測(cè)最大值僅21844,如果添加一個(gè)char(3),則最大取值減少3。整體最大長(zhǎng)度是65,532字節(jié))。
?
同CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。
?
VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。
?
如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符不是空格,則會(huì)產(chǎn)生一條警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。
?
BINARY & VARBINARY
?
BINARY和VARBINARY類型類似于CHAR和VARCHAR類型,但是不同的是,它們存儲(chǔ)的不是字符串,而是二進(jìn)制串。所以它們沒有編碼格式,并且排序和比較基于列值字節(jié)的數(shù)值值。
當(dāng)保存BINARY值時(shí),在它們右邊填充0x00(零字節(jié))值以達(dá)到指定長(zhǎng)度。取值時(shí)不刪除尾部的字節(jié)。比較時(shí)所有字節(jié)很重要(因?yàn)榭崭窈?x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '會(huì)變成'a \0'。
對(duì)于VARBINARY,插入時(shí)不填充字符,選擇時(shí)不裁剪字節(jié)。比較時(shí)所有字節(jié)很重要。
?
BLOB & TEXT
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長(zhǎng)度不同。
有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)4種BLOB類型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。
BLOB列被視為二進(jìn)制字符串。TEXT列被視為字符字符串,類似BINARY和CHAR。
在TEXT或BLOB列的存儲(chǔ)或檢索過(guò)程中,不存在大小寫轉(zhuǎn)換。
未運(yùn)行在嚴(yán)格模式時(shí),如果你為BLOB或TEXT列分配一個(gè)超過(guò)該列類型的最大長(zhǎng)度的值,值被截取以保證適合。如果截掉的字符不是空格,將會(huì)產(chǎn)生一條警告。使用嚴(yán)格SQL模式,會(huì)產(chǎn)生錯(cuò)誤,并且值將被拒絕而不是截取并給出警告。
?
在大多數(shù)方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。
?
BLOB和TEXT在以下幾個(gè)方面不同于VARBINARY和VARCHAR:
當(dāng)保存或檢索BLOB和TEXT列的值時(shí)不刪除尾部空格。(這與VARBINARY和VARCHAR列相同)。
比較時(shí)將用空格對(duì)TEXT進(jìn)行擴(kuò)充以適合比較的對(duì)象,正如CHAR和VARCHAR。
對(duì)于BLOB和TEXT列的索引,必須指定索引前綴的長(zhǎng)度。對(duì)于CHAR和VARCHAR,前綴長(zhǎng)度是可選的。
BLOB和TEXT列不能有默認(rèn)值。
BLOB或TEXT對(duì)象的最大大小由其類型確定,但在客戶端和服務(wù)器之間實(shí)際可以傳遞的最大值由可用內(nèi)存數(shù)量和通信緩存區(qū)大小確定。你可以通過(guò)更改max_allowed_packet變量的值更改消息緩存區(qū)的大小,但必須同時(shí)修改服務(wù)器和客戶端程序。
?
每個(gè)BLOB或TEXT值分別由內(nèi)部分配的對(duì)象表示。
它們(TEXT和BLOB同)的長(zhǎng)度:
Tiny:最大長(zhǎng)度255個(gè)字符(2^8-1)
BLOB或TEXT:最大長(zhǎng)度65535個(gè)字符(2^16-1)
Medium:最大長(zhǎng)度16777215個(gè)字符(2^24-1)
LongText 最大長(zhǎng)度4294967295個(gè)字符(2^32-1)
實(shí)際長(zhǎng)度與編碼有關(guān),比如utf-8的會(huì)減半。
?
當(dāng)BLOB和TEXT值太大時(shí),InnoDB會(huì)使用專門的外部存儲(chǔ)區(qū)域來(lái)進(jìn)行存儲(chǔ),此時(shí)單個(gè)值在行內(nèi)需要1~4個(gè)字節(jié)存儲(chǔ)一個(gè)指針,然后在外部存儲(chǔ)區(qū)域存儲(chǔ)實(shí)際的值。
MySQL會(huì)BLOB和TEXT進(jìn)行排序與其他類型是不同的:它只對(duì)每個(gè)類的最前max_sort_length字節(jié)而不是整個(gè)字符串進(jìn)行排序。
MySQL不能將BLOB和TEXT列全部長(zhǎng)度的字符串進(jìn)行索引,也不能使用這些索引消除排序。
?
ENUM 使用枚舉代替字符串類型
MySQL在存儲(chǔ)枚舉時(shí)非常緊湊,會(huì)根據(jù)列表值的數(shù)量壓縮到一個(gè)或兩個(gè)字節(jié)中。MySQL在內(nèi)部將每個(gè)值在列表中的位置保存為整數(shù),并且在表的.frm文件中保存“數(shù)組——字符串”映射關(guān)系的查找表。
枚舉字段是按照內(nèi)部存儲(chǔ)的整數(shù)而不是定義的字符串進(jìn)行排序的;
由于MySQL把每個(gè)枚舉值都保存為整數(shù),并且必須通過(guò)查找才能轉(zhuǎn)換為字符串,所以枚舉列有一定開銷。在特定情況下,把CHAR/VARCHAR列與枚舉列進(jìn)行JOIN可能會(huì)比直接關(guān)聯(lián)CHAR/VARCHAR更慢。
時(shí)間和日期類型
DATE, DATETIME, 和TIMESTAMP類型 這三者其實(shí)是關(guān)聯(lián)的,都用來(lái)表示日期或時(shí)間。
當(dāng)你需要同時(shí)包含日期和時(shí)間信息的值時(shí)則使用DATETIME類型。MySQL以'YYYY-MM-DD HH:MM:SS'格式檢索和顯示DATETIME值。支持的范圍為'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
當(dāng)你只需要日期值而不需要時(shí)間部分時(shí)應(yīng)使用DATE類型。MySQL用'YYYY-MM-DD'格式檢索和顯示DATE值。支持的范圍是'1000-01-01'到 '9999-12-31'。
?
TIMESTAMP類型同樣包含日期和時(shí)間,范圍從'1970-01-01 00:00:01' UTC 到'2038-01-19 03:14:07' UTC。
TIME值的范圍可以從'-838:59:59'到'838:59:59'。小時(shí)部分會(huì)因此大的原因是TIME類型不僅可以用于表示一天的時(shí)間(必須小于24小時(shí)),還可能為某個(gè)事件過(guò)去的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可以大于24小時(shí),或者甚至為負(fù))
?
兩者的存儲(chǔ)方式不一樣
對(duì)于TIMESTAMP,它把客戶端插入的時(shí)間從當(dāng)前時(shí)區(qū)轉(zhuǎn)化為UTC(世界標(biāo)準(zhǔn)時(shí)間)進(jìn)行存儲(chǔ)。查詢時(shí),將其又轉(zhuǎn)化為客戶端當(dāng)前時(shí)區(qū)進(jìn)行返回。
而對(duì)于DATETIME,不做任何改變,基本上是原樣輸入和輸出。
?
YEAR類型是一個(gè)單字節(jié)類型用于表示年。
MySQL以YYYY格式檢索和顯示YEAR值。范圍是1901到2155。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的关系数据库——mysql数据类型大总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。