国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
MySql數(shù)據(jù)庫(kù)的列類型(字段類型_就這樣每一天~尋找刺激 -
MySql數(shù)據(jù)庫(kù)的列類型(字段類型
2007年04月02日 星期一 上午 01:17
MySQL數(shù)據(jù)庫(kù)的表是一個(gè)二維表,由一個(gè)或多個(gè)數(shù)據(jù)列構(gòu)成。
每個(gè)數(shù)據(jù)列都有它的特定類型,該類型決定了MySQL如何看待該列數(shù)據(jù),我們可以把整型數(shù)值存放到字符類型的列中,MySQL則會(huì)把它看成
字符串來(lái)處理。
MySQL中的列類型有三種:數(shù)值類、字符串類和日期/時(shí)間類。
從大類來(lái)看列類型和數(shù)值類型一樣,都是只有三種。但每種列類型都還可細(xì)分。
下面對(duì)各種列類型進(jìn)行詳細(xì)介紹。

數(shù)值類的數(shù)據(jù)列類型
數(shù)值型的列類型包括整型和浮點(diǎn)型兩大類。

TINYINT:1字節(jié) 非常小的正整數(shù),帶符號(hào):-128~127,不帶符號(hào):0~255
SMALLINT:2字節(jié) 小整數(shù),帶符號(hào):-32768~32767,不帶符號(hào):0~65535
MEDIUMINT:3字節(jié) 中等大小的整數(shù),帶符號(hào):-8388608~8388607,不帶符號(hào):0~16777215
INT:4字節(jié) 標(biāo)準(zhǔn)整數(shù),帶符號(hào):-2147483648~2147483647,不帶符號(hào):0~4294967295
BIGINT:8字節(jié) 大整數(shù),帶符號(hào):-9223372036854775808~9233372036854775807,不帶符號(hào):0~18446744073709551615
FLOAT:4字節(jié) 單精度浮點(diǎn)數(shù),最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38
DOUBLE:8字節(jié) 雙精度浮點(diǎn)數(shù),最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308
DECIMAL:M+2字節(jié) 以字符串形式表示的浮點(diǎn)數(shù),它的取值范圍可變,由M和D的值決定。

整型數(shù)據(jù)列類型

MySQL有五種整型數(shù)據(jù)列類型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它們之間的區(qū)別是取值范圍不同,存儲(chǔ)空間也各不相同。
在整型數(shù)據(jù)列后加上UNSIGNED屬性可以禁止負(fù)數(shù),取值從0開始。

聲明整型數(shù)據(jù)列時(shí),我們可以為它指定個(gè)顯示寬度M(1~255),如INT(5),指定顯示寬度為5個(gè)字符,如果沒有給它指定顯示寬度,MySQL會(huì)為它指定一個(gè)默認(rèn)值。顯示寬度只用于顯示,并不能限制取值范圍和占用空間,如:INT(3)會(huì)占用4個(gè)字節(jié)的存儲(chǔ)空間,并且允許的最大值也不會(huì)是999,而是INT整型所允許的最大值。

浮點(diǎn)型數(shù)據(jù)列類型

MySQL有三種浮點(diǎn)型數(shù)據(jù)列類型,分別是:FLOAT,DOUBLE和DECIMAL。
浮點(diǎn)類數(shù)據(jù)類型有一個(gè)最大可表示值和一個(gè)最小非零可表示值,最小非零可表示值決定了該類型的精確度。

MySQL 4.0.2版之后,F(xiàn)LOAT和DOUBLE都可以指定UNSIGNED屬性。當(dāng)指定該屬性時(shí),取值范圍不平移到正數(shù)區(qū)間,而只是簡(jiǎn)單地把浮點(diǎn)類型的負(fù)數(shù)部份去掉。

浮點(diǎn)類型也有M(1~255)和D(1~30,且不能大于M-2)。分別表示顯示寬度和小數(shù)位數(shù)。M和D在FLOAT和DOUBLE中是可選的,默認(rèn),當(dāng)MySQL版本大于3.23.6時(shí),F(xiàn)LOAT和DOUBLE類型將被保存為硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后可選,默認(rèn)D值為0,M值為10。

如何選擇數(shù)值類數(shù)據(jù)列類型?

為了節(jié)省存儲(chǔ)空間和提高數(shù)據(jù)庫(kù)處理效率,我們應(yīng)根據(jù)應(yīng)用數(shù)據(jù)的取值范圍來(lái)選擇一個(gè)最適合的數(shù)據(jù)列類型。如果把一個(gè)超出數(shù)據(jù)列取值范圍的數(shù)存入該列,則MySQL就會(huì)截短該值,如:我們把99999存入SMALLINT(3)數(shù)據(jù)列里,因?yàn)镾MALLINT(3)的取值范圍是-32768~32767,所以就會(huì)被截短成32767存儲(chǔ)。顯示寬度3不會(huì)影響數(shù)值的存儲(chǔ)。只影響顯示。

對(duì)于浮點(diǎn)數(shù)據(jù)列,存入的數(shù)值會(huì)被該列定義的小數(shù)位進(jìn)行四舍五入。如把一個(gè)1.234存入FLOAT(6.1)數(shù)據(jù)列中,結(jié)果是1.2。

DECIMAL與FLOAT和DOUBLE的區(qū)別是:DECIMAL類型的值是以字符串的形式被儲(chǔ)存起來(lái)的,它的小數(shù)位數(shù)是固定的。它的優(yōu)點(diǎn)是,不會(huì)象FLOAT和DOUBLE類型數(shù)據(jù)列那樣進(jìn)行四舍五入而產(chǎn)生誤差,所以很適合用于財(cái)務(wù)計(jì)算;而它的缺點(diǎn)是:由于它的存儲(chǔ)格式不同,CPU不能對(duì)它進(jìn)行直接運(yùn)算,從而影響運(yùn)算效率。DECIMAL(M,D)總共要占用M+2個(gè)字節(jié)。

數(shù)值類數(shù)據(jù)列的屬性

ZEROFILL屬性適用于所有數(shù)值類數(shù)據(jù)列類型,作用是,如果數(shù)值的寬度小于定義的顯示寬度,則在數(shù)值前填充0。
UNSIGNED屬性不允許數(shù)據(jù)列出現(xiàn)負(fù)數(shù)。
AUTO_INCREMENT屬性可生成獨(dú)一無(wú)二的數(shù)字序列。只對(duì)整數(shù)類的數(shù)據(jù)列有效。
NULLNOT NULL屬性設(shè)置數(shù)據(jù)列是否可為空。
DEFAULT屬性可為數(shù)據(jù)列指定默認(rèn)值。

//////////////////////////////////////////////////////

字符串類數(shù)據(jù)列類型

字符串可以用來(lái)表示任何一種值,所以它是最基本的類型之一。
我們可以用字符串類型來(lái)存儲(chǔ)圖象或聲音之類的二進(jìn)制數(shù)據(jù),也可存儲(chǔ)用gzip壓縮的數(shù)據(jù)。
下表介紹了各種字符串類型:

CHAR[(M)] M字節(jié) M字節(jié)
VARCHAR[(M)] M字節(jié) L+1字節(jié)
TINYBLOD,TINYTEXT 2^8-1字節(jié) L+1字節(jié)
BLOB,TEXT 2^16-1字節(jié) L+2
MEDIUMBLOB,MEDIUMTEXT 2^24-1字節(jié) L+3
LONGBLOB,LONGTEXT 2^32-1字節(jié) L+4
ENUM('value1','value2',...) 65535個(gè)成員 1或2字節(jié)
SET('value1','value2',...) 64個(gè)成員 1,2,3,4或8字節(jié)

L+1、L+2是表示數(shù)據(jù)列是可變長(zhǎng)度的,它占用的空間會(huì)根據(jù)數(shù)據(jù)行的增減面則改變。數(shù)據(jù)行的總長(zhǎng)度取決于存放在這些數(shù)據(jù)列里的數(shù)據(jù)值的長(zhǎng)度。L+1或L+2里多出來(lái)的字節(jié)是用來(lái)保存數(shù)據(jù)值的長(zhǎng)度的。在對(duì)長(zhǎng)度可變的數(shù)據(jù)進(jìn)行處理時(shí),MySQL要把數(shù)據(jù)內(nèi)容和數(shù)據(jù)長(zhǎng)度都保存起來(lái)。

如果把超出字符串最大長(zhǎng)度的數(shù)據(jù)放到字符類數(shù)據(jù)列中,MySQL會(huì)自動(dòng)進(jìn)行截短處理。

ENUM和SET類型的數(shù)據(jù)列定義里有一個(gè)列表,列表里的元素就是該數(shù)據(jù)列的合法取值。如果試圖把一個(gè)沒有在列表里的值放到數(shù)據(jù)列里,它會(huì)被轉(zhuǎn)換為空字符串(“”)。

字符串類型的值被保存為一組連續(xù)的字節(jié)序列,并會(huì)根據(jù)它們?nèi)菁{的是二進(jìn)制字符串還是非二進(jìn)制字符而被區(qū)別對(duì)待為字節(jié)或者字符:

二進(jìn)制字符串被視為一個(gè)連續(xù)的字節(jié)序列,與字符集無(wú)關(guān)。MySQL把BLOB數(shù)據(jù)列和帶BINARY屬性的CHAR和VARCHAR數(shù)據(jù)列里的數(shù)據(jù)當(dāng)作二進(jìn)制值。

非二進(jìn)制字符串被視為一個(gè)連續(xù)排列的字符序列。與字符集有關(guān)。MySQL把TEXT列與不帶BINARY屬性的CHAR和VARCHAR數(shù)據(jù)列里的數(shù)據(jù)當(dāng)作二進(jìn)制值對(duì)待。

在MySQL4.1以后的版本中,不同的數(shù)據(jù)列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服務(wù)器的字符集作為默認(rèn)字符集。

非二進(jìn)制字符串,即我們通常所說的字符串,是按字符在字符集中先后次序進(jìn)行比較和排序的。而二進(jìn)制字符串因?yàn)榕c字符集無(wú)關(guān),所以不以字符順序排序,而是以字節(jié)的二進(jìn)制值作為比較和排序的依據(jù)。下面介紹兩種字符串的比較方式:

二進(jìn)制字符串的比較方式是一個(gè)字節(jié)一個(gè)字節(jié)進(jìn)行的,比較的依據(jù)是兩個(gè)字節(jié)的二進(jìn)制值。也就是說它是區(qū)分大小寫的,因?yàn)橥粋€(gè)字母的大小寫的數(shù)值編碼是不一樣的。

非二進(jìn)制字符串的比較方式是一個(gè)字符一個(gè)字符進(jìn)行的,比較的依據(jù)是兩個(gè)字符在字符集中的先后順序。在大多數(shù)字符集中,同一個(gè)字母的大小寫往往有著相同的先后順序,所以它不區(qū)分大小寫。

二進(jìn)制字符串與字符集無(wú)關(guān),所以無(wú)論按字符計(jì)算還是按字節(jié)計(jì)算,二進(jìn)制字符串的長(zhǎng)度都是一樣的。所以VARCHAR(20)并不表示它最多能容納20個(gè)字符,而是表示它最多只能容納可以用20個(gè)字節(jié)表示出來(lái)的字符。對(duì)于單字節(jié)字符集,每個(gè)字符只占用一個(gè)字節(jié),所以這兩者的長(zhǎng)度是一樣的,但對(duì)于多字節(jié)字符集,它能容納的字符個(gè)數(shù)肯定少于20個(gè)。

CHAR和VARCHAR

CHAR和VARCHAR是最常用的兩種字符串類型,它們之間的區(qū)別是:

CHAR是固定長(zhǎng)度的,每個(gè)值占用相同的字節(jié),不夠的位數(shù)MySQL會(huì)在它的右邊用空格字符補(bǔ)足。

VARCHAR是一種可變長(zhǎng)度的類型,每個(gè)值占用其剛好的字節(jié)數(shù)再加上一個(gè)用來(lái)記錄其長(zhǎng)度的字節(jié)即L+1字節(jié)。

CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是從MySQL4.0.2版開始的。它們的作用是作為占位符或用來(lái)表示各種on/off開關(guān)值。

如何選擇CHAR和VARCHAR,這里給出兩個(gè)原則:

如果數(shù)據(jù)都有相同的長(zhǎng)度,選用VARCHAR會(huì)多占用空間,因?yàn)橛幸晃挥脕?lái)存儲(chǔ)其長(zhǎng)度。如果數(shù)據(jù)長(zhǎng)短不一,選用VARCHAR能節(jié)省存儲(chǔ)空間。而CHAR不論字符長(zhǎng)短都需占用相同的空間,即使是空值也不例外。

如果長(zhǎng)度出入不大,而且是使用MyISAM或ISAM類型的表,則用CHAR會(huì)比VARCHAR好,因?yàn)镸yISAM和ISAM類型的表對(duì)處理固定長(zhǎng)度的行的效率高。

  
在一個(gè)數(shù)據(jù)表里,只要有一個(gè)數(shù)據(jù)列的長(zhǎng)度是可變的,則所有數(shù)據(jù)列的長(zhǎng)度將是可變的。MySQL會(huì)進(jìn)行自動(dòng)地轉(zhuǎn)換。一個(gè)例外,CHAR長(zhǎng)度小于4的不會(huì)進(jìn)行自動(dòng)轉(zhuǎn)換,因?yàn)镸ySQL會(huì)認(rèn)為這樣做沒必要,節(jié)省不了多少空間。反而MySQL會(huì)把大量長(zhǎng)度小的VARCHAR轉(zhuǎn)換成CHAR,以減少空間占用量。

BLOB和TEXT

BLOB是二進(jìn)制字符串,TEXT是非二進(jìn)制字符串。兩者都可存放大容量的信息。

有關(guān)BLOB和TEXT索引的建立:

BDB表類型和MySQL3.23.2以上版本的MyISAM表類型允許在BLOB和TEXT數(shù)據(jù)列上建立索引。

ISAM、HEAP和InnoDB表不支持大
對(duì)象列的索引。

使用BLOB和TEXT應(yīng)注意的問題:

由于這兩個(gè)列類型所存儲(chǔ)的數(shù)據(jù)量大,所以刪除和修改操作容易在數(shù)據(jù)表里產(chǎn)生大量的碎片,需定期運(yùn)行OPTIMIZE TABLE以減少碎片和提高性能。

如果使用的值非常巨大,就需對(duì)服務(wù)器進(jìn)行相應(yīng)的優(yōu)化調(diào)整,增加max_allowed_packet參數(shù)的值。對(duì)那些可會(huì)用到變些巨大數(shù)據(jù)的客戶程序,也需加大它們的數(shù)據(jù)包大小。

ENUM和SET

ENUM和SET都是比較特殊的字符串?dāng)?shù)據(jù)列類型,它們的取值范圍是一個(gè)預(yù)先定義好的列表。ENUM或SET數(shù)據(jù)列的取值只能從這個(gè)列表中進(jìn)行選擇。ENUM和SET的主要區(qū)別是:

ENUM只能取單值,它的數(shù)據(jù)列表是一個(gè)枚舉集合。它的合法取值列表最多允許有65535個(gè)成員。例如:ENUM("N","Y")表示,該數(shù)據(jù)列的取值要么是"Y",要么就是"N"。

SET可取多值。它的合法取值列表最多允許有64個(gè)成員。空字符串也是一個(gè)合法的SET值。

ENUM和SET的值是以字符串形式出現(xiàn)的,但在內(nèi)部,MySQL以數(shù)值的形式存儲(chǔ)它們。

ENUM的合法取值列表中的字符串被按聲明定義的順序被編號(hào),從1開始。

SET的編號(hào)不是按順序進(jìn)行編號(hào)的,SET中每一個(gè)合法取值都對(duì)應(yīng)著SET值里的一個(gè)位。第一個(gè)合法取值對(duì)應(yīng)0位,第二個(gè)合法取值對(duì)應(yīng)1位,以此類推,如果數(shù)值形式的SET值等于0,則說明它是一個(gè)空字符串,如果某個(gè)合法的取值出現(xiàn)在SET數(shù)據(jù)列里,與之對(duì)應(yīng)的位就會(huì)被置位;如果某個(gè)合法的取值沒有出現(xiàn)在SET數(shù)據(jù)列里,與之對(duì)應(yīng)的位就會(huì)被清零。正因?yàn)镾ET值與位有這樣的對(duì)應(yīng)關(guān)系,所以SET數(shù)據(jù)列的多個(gè)合法取值才能同時(shí)出現(xiàn)并構(gòu)成SET值。

字符串類型數(shù)據(jù)列的字符集屬性

在MySQL 4.1以前的版本,字符串?dāng)?shù)據(jù)列的字符集由服務(wù)器的字符決定,MySQL 4.1版以后的版本可對(duì)每個(gè)字符串?dāng)?shù)據(jù)列指定不同的字符串。如果按默認(rèn)方式設(shè)置,可按數(shù)據(jù)列、數(shù)據(jù)表、數(shù)據(jù)庫(kù)、服務(wù)器的順序關(guān)聯(lián)字符串的字符集,直到找一個(gè)明確定義的字符集。

/////////////////////////////////////////////////////////

日期,時(shí)間型數(shù)據(jù)列類型

DATE 1000-01-01~9999-12-31 3字節(jié)(MySQL3.23版以前是4字節(jié) ) 0000-00-00
TIME -838:59:59~838:59:59 3字節(jié) 00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8字節(jié) 0000-00-00 00:00:00
TIMESTAMP 19700101000000~2037年的某個(gè)時(shí)刻 4字節(jié) 00000000000000
YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1字節(jié) 0000

MySQL總是把日期和日期里的年份放在最前面,按年月日的順序顯示。

DATE、TIME、DATATIME數(shù)據(jù)列類型

DATE、TIME和DATATIME類型分別存放日期值、時(shí)間值、日期和時(shí)間值的組合。它們的格式分別是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。

DATATIME里的時(shí)間值和TIME值是有區(qū)別的,DATATIME里的時(shí)間值代表的是幾點(diǎn)幾分,TIME值代表的是所花費(fèi)的時(shí)間。當(dāng)向TIME數(shù)據(jù)列插值時(shí),需用時(shí)間的完整寫法,如12分30秒要寫成“00:12:30”。

TIMESTAMP數(shù)據(jù)列類型

TIMESTAMP數(shù)據(jù)列的格式是CCYYMMDDhhmmss,取值范圍從19700101000000開始,即1970年1月1號(hào),最大到2037年。它的特點(diǎn)是能把數(shù)據(jù)行的創(chuàng)建或修改時(shí)間記錄下來(lái):

如果把一個(gè)NULL值插入TIMESTAMP列,這個(gè)數(shù)據(jù)列就將自動(dòng)取值為當(dāng)前的日期和時(shí)間。

在創(chuàng)建和修改數(shù)據(jù)行時(shí),如果沒有明確對(duì)TIMESTAMP數(shù)據(jù)列進(jìn)行賦值,則它就會(huì)自動(dòng)取值為當(dāng)前的日期和時(shí)間。如果行中有多個(gè)TIMESTAMP列,只有第一個(gè)會(huì)自動(dòng)取值。

如果對(duì)TIMESTAMP設(shè)置一個(gè)確定的日期和時(shí)間值,則會(huì)使TIMESTAMP的自動(dòng)取值功能失效。

TIMESTAMP默認(rèn)的列寬是14,可指定列寬,以改變顯示效果。但不論你指定的列寬如何,MySQL都是以4字節(jié)來(lái)存儲(chǔ)TIMESTAMP值,也總是以14位精度來(lái)計(jì)算。

如果需要把創(chuàng)建時(shí)間和最近一次修改時(shí)間同時(shí)記錄下來(lái),可以用兩個(gè)時(shí)間戳來(lái)記錄,一個(gè)記錄創(chuàng)建時(shí)間,一個(gè)記錄修改時(shí)間。不過需記住兩件事,一是要把記錄修改時(shí)間的TIMESTAMP數(shù)據(jù)列放在最前面,這樣才會(huì)自動(dòng)取值;二是創(chuàng)建一條新記錄時(shí),要用now()函數(shù)來(lái)初始化創(chuàng)建時(shí)間TIMESTAMP數(shù)據(jù)列,這樣,該TIMESTAMP數(shù)據(jù)列就不會(huì)再變化。

YEAR

YEAR是一種單字節(jié)的數(shù)據(jù)列類型,YEAR(4)的取值范圍是1901~2155,YEAR(2)的取值范圍是1970~2069,但只顯示最后兩位數(shù)。MySQL能自動(dòng)把兩位數(shù)字年份轉(zhuǎn)換成四位數(shù)字的年份,如97和14分被轉(zhuǎn)換成1997和2014。轉(zhuǎn)換規(guī)則是這樣的:

年份值00~69將被轉(zhuǎn)換成2000~2069;

年份值70~99將被轉(zhuǎn)換成1970~1999。

00被轉(zhuǎn)換成0000,而不是2000。因?yàn)閿?shù)值00也就是0,而0值是YEAR的一個(gè)合法取值。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MySQL 數(shù)據(jù)類型 | 菜鳥教程
MySQL 數(shù)據(jù)類型
mysql數(shù)據(jù)類型
ORACLE基本數(shù)據(jù)類型總結(jié)
SQL2000的數(shù)據(jù)類型
MySQL數(shù)據(jù)庫(kù)實(shí)操教程(04)——數(shù)據(jù)類型詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服