一路拾遺
          Collect By Finding All The Way ......
          posts - 81,comments - 41,trackbacks - 0

          可參見MySQL 5.1參考手冊 11章 列類型:http://dev.mysql.com/doc/refman/5.1/zh/column-types.html

          MySQL數(shù)據(jù)庫的表是一個二維表,由一個或多個數(shù)據(jù)列構(gòu)成。
          每個數(shù)據(jù)列都有它的特定類型,該類型決定了MySQL如何看待該列數(shù)據(jù),我們可以把整型數(shù)值存放到字符類型的列中,MySQL則會把它看成字符串來處理。
          MySQL中的列類型有三種:數(shù)值類、字符串類和日期/時間類。
          從大類來看列類型和數(shù)值類型一樣,都是只有三種。但每種列類型都還可細分。
          下面對各種列類型進行詳細介紹。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          字符串可以用來表示任何一種值,所以它是最基本的類型之一。
          我們可以用字符串類型來存儲圖象或聲音之類的二進制數(shù)據(jù),也可存儲用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個成員 1或2字節(jié)
          SET('value1','value2',...) 64個成員 1,2,3,4或8字節(jié)

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

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

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

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

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

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

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

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

          二進制字符串的比較方式是一個字節(jié)一個字節(jié)進行的,比較的依據(jù)是兩個字節(jié)的二進制值。也就是說它是區(qū)分大小寫的,因為同一個字母的大小寫的數(shù)值編碼是不一樣的。

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

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

          CHAR和VARCHAR

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

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

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

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

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

          如果數(shù)據(jù)都有相同的長度,選用VARCHAR會多占用空間,因為有一位用來存儲其長度。如果數(shù)據(jù)長短不一,選用VARCHAR能節(jié)省存儲空間。而CHAR不論字符長短都需占用相同的空間,即使是空值也不例外。

          如果長度出入不大,而且是使用MyISAM或ISAM類型的表,則用CHAR會比VARCHAR好,因為MyISAM和ISAM類型的表對處理固定長度的行的效率高。

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

          BLOB和TEXT

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

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

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

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

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

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

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

          ENUM和SET

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

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

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

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

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

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

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

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

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

          日期,時間型數(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年的某個時刻 4字節(jié) 00000000000000
          YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1字節(jié) 0000

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

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

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

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

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

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

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

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

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

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

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

          YEAR

          YEAR是一種單字節(jié)的數(shù)據(jù)列類型,YEAR(4)的取值范圍是1901~2155,YEAR(2)的取值范圍是1970~2069,但只顯示最后兩位數(shù)。MySQL能自動把兩位數(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。因為數(shù)值00也就是0,而0值是YEAR的一個合法取值。 

           

          posted on 2009-07-01 20:11 胖胖泡泡 閱讀(358) 評論(1)  編輯  收藏

          FeedBack:
          # re: 【轉(zhuǎn)載】MySQL中的數(shù)據(jù)類型(列類型)[未登錄]
          2009-07-03 10:51 | meme
          頂學長,電話號碼的數(shù)據(jù)類型如果是整數(shù),11位呢……  回復  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 长顺县| 湖南省| 静海县| 霍林郭勒市| 普格县| 苗栗市| 策勒县| 宝清县| 锡林郭勒盟| 葫芦岛市| 临漳县| 天峨县| 瓮安县| 安徽省| 肃宁县| 赤水市| 泰和县| 科技| 开江县| 富裕县| 永川市| 商南县| 兰溪市| 鄂州市| 南雄市| 吉隆县| 新河县| 通河县| 本溪市| 呼伦贝尔市| 永丰县| 新津县| 清远市| 宁阳县| 三门峡市| 舒兰市| 龙胜| 德阳市| 临海市| 公主岭市| 中西区|