Mysql中的列類型有三大類:數值類、字元類和日期/時間類
數值類分整數型和浮點型兩大類
整數型:
列名取值範圍占用位元組數
TINYINT非常小的正整數,帶符号:-128~127,不帶符号0~255占用1位元組
SMALLINT 小整數,帶符号:-32768~32767不帶符号:0~65535占用2位元組MEDIUMINT中等大小的整數 帶符号:-8388608~8388607,不帶符号:0~16777215占用3位元組
INT标準整數,帶符号:-2147483648~2147483647,不帶符号:0~4294967295占用4位元組
BIGINT大整數,帶符号:-9223372036854775808~9233372036854775807,不帶符号:0~18446744073709551615占用8位元組
浮點型
FLOAT單精度浮點數,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38占用4位元組
DOUBLE雙精度浮點數,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308占用8位元組
DECIMAL(M,D)M+2位元組 以字元串形式表示的浮點數,它的取值範圍可變,由M和D的值決定
注意:
1.如何區分帶符号和不帶符号
Mysql中在定義列類型的時候,在整數型資料列後加上一個關鍵字unsigned是禁止負數,取值從0開始
2.簡單解釋下占用位元組數和取值範圍的關系
使用TINYINT來簡單描述下,因為TINYINT占用一位元組,也就是8位
即:0000 0000~~~ 1111 1111
0~~~ (128+64+32+16+8+4+2+1)=255,2^8 -1
這個是不帶符号的,有unsigned屬性的
什麼是帶符号的,在計算機中,計算機為了表示一個負數,會把最左側的0或1當做符号訓示符,0代表正數,1代表負數
0 000 0000 正數
1 111 1111 負數
負數的值=絕對值位- 128
假設 1 111 1111這個代表的是負數,絕對值是2^7-1絕對值是127,再減去128得-1
1 000 0000 代表的負數,絕對值 是0,減去128,得-128
是以,負數的取值範圍就是 -128 --> 127
也是二進制的補碼計算,利用檢視下二進制補碼的資料進一步學習
更主要的知道tinyint的取值範圍-128~127,0~255占用1位元組就好了,假設說有一個age字段,一般人的年齡在0~120歲,使用tinyint是最恰當的
3.數值類型顯示寬度問題,在聲明數值列類型時,可以顯式的聲明列的顯示寬度,如int(5)指定顯示寬度為5,這個值并不會限定取值範圍和占用的空間,如果沒有指定這個值的話,預設的顯示為10,占用的位元組還是4位元組!如果你指定的int(5)的話,但你的值為2的話,前面是用0來補充,也就是顯示00002,這個值必須要與zerofill結合時候的才能顯示出這樣的效果!
4.浮點類型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示顯示寬度和小數位數。M和D在FLOAT和DOUBLE中是可選的,預設,當MySQL版本大于3.23.6時,FLOAT和DOUBLE類型将被儲存為硬體所支援的最大精度。DECIMAL的M和D值在MySQL3.23.6後可選,預設D值為0,M值為10
5.DECIMAL與FLOAT和DOUBLE的差別是:DECIMAL類型的值是以字元串的形式被儲存起來的,它的小數位數是固定的。它的優點是,不會象FLOAT和DOUBLE類型資料列那樣進行四舍五入而産生誤差,是以很适合用于财務計算;而它的缺點是:由于它的存儲格式不同,CPU不能對它進行直接運算,進而影響運算效率。DECIMAL(M,D)總共要占用M+2個位元組。
簡單描述下數值列類型的屬性:
ZEROFILL屬性适用于所有數值類資料列類型,作用是,如果數值的寬度小于定義的顯示寬度,則在數值前填充0,使用這個屬性就表示你的數值列類型是無符号的,自動添加了unsigned屬性
UNSIGNED屬性不允許資料列出現負數。
AUTO_INCREMENT屬性可生成獨一無二的數字序列。隻對整數類的資料列有效。
NULL和NOT NULL屬性設定資料列是否可為空。
DEFAULT屬性可為資料列指定預設值
二:字元類
CHAR(M) 固定長度,占用M位元組數,M的範圍是0~255
VARCHAR(M) 可變長度,M位元組,L+1位元組,M的範圍是0~65535用一個位元組或兩個位元組長的字首+資料。如果VARCHAR列聲明的長度大于255,長度字首是兩個位元組。
TINYBLOD,TINYTEXT 2^8-1位元組L+1位元組
BLOB,TEXT 2^16-1位元組L+2位元組
MEDIUMBLOB,MEDIUMTEXT 2^24-1位元組L+3
LONGBLOB,LONGTEXT 2^32-1位元組L+4
ENUM('value1','value2',...) 65535個成員1或2位元組
SET('value1','value2',...) 64個成員1,2,3,4或8位元組
注意:
1.L+1、L+2是表示資料列是可變長度的,它占用的空間會根據資料行的增減面則改變。資料行的總長度取決于存放在這些資料列裡的資料值的長度。L+1或L+2裡多出來的位元組是用來儲存資料值的長度的。在對長度可變的資料進行處理時,MySQL要把資料内容和資料長度都儲存起來。
2.ENUM和SET類型的資料列定義裡有一個清單,清單裡的元素就是該資料列的合法取值。如果試圖把一個沒有在清單裡的值放到資料列裡,它會被轉換為空字元串(“”)。
3.在mysql 5.1版本後,varchar(20) 占用20個位元組,是20個字元、20個漢字、20個數字,并不是一位元組等于2字的算法
三:日期/時間類
DATE 1000-01-01~9999-12-31 3位元組(MySQL3.23版以前是4位元組) 0000-00-00
TIME -838:59:59~838:59:59 3位元組00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8位元組0000-00-00 00:00:00
TIMESTAMP 19700101000000~2037年的某個時刻4位元組00000000000000
YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1位元組0000
MySQL總是把日期和日期裡的年份放在最前面,按年月日的順序顯示。
DATE、TIME和DATATIME類型分别存放日期值、時間值、日期和時間值的組合。它們的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。
TIMESTAMP資料列的格式是CCYYMMDDhhmmss,取值範圍從19700101000000開始,即1970年1月1号,最大到2037年。它的特點是能把資料行的建立或修改時間記錄下來,如果說你設計的表中有一個字段是計算登入時間的,可以考慮使用這個日期類型
YEAR
YEAR是一種單位元組的資料列類型,YEAR(4)的取值範圍是1901~2155,YEAR(2)的取值範圍是1970~2069,但隻顯示最後兩位數。MySQL能自動把兩位數字年份轉換成四位數字的年份,如97和14分被轉換成1997和2014。轉換規則是這樣的:
年份值00~69将被轉換成2000~2069;
年份值70~99将被轉換成1970~1999。
00被轉換成0000,而不是2000。因為數值00也就是0,而0值是YEAR的一個合法取值。