MySQL數據類型,可以被分為3類:數值類型、日期和時間類型以及字符串(字符)類型
方括號(“[”和“]”)指出可選的類型修飾符的部分
M
指出最大的顯示尺寸。最大的合法的顯示尺寸是 255 。
D
適用於浮點類型並且指出跟隨在十進制小數點后的數碼的數量。最大可能的值是30,但是應該不大於M-2。
UNSIGNED
為“無符號”的意思, 即為非負數。是MYSQL自定義的類型,非標准SQL。unsigned 屬性只針對整型,用途:
1.UNSIGNED 可用來約束數據的范圍,例如有些年齡這種值一般能是負數,那么就可以設置一個 UNSIGNED ,這樣可以不允許負數插入。
2.可以增加數值范圍(相當於把負數那部分加到正數上)。不過少用,不方便移植。
ZEROFILL
填零,即在數字長度不夠的數據前面填充0,以達到設定的長度,MySQL中字段設置為該屬性時,將為該列自動地增加UNSIGNED屬性。
一、數值類型
整型:(1個字節是8位)
在MySQL中創建整型字段INT(或其它像tinyint)時,可以設定該字段的位數。如int(11),int(5),如果不指定位數,INT型默認長度為11。字段插入長度與int設定的M無關,當插入長度大於設定的M時,字段值不會被截斷,還是按照類型的實際精度進行保存。
整型字段有個ZEROFILL屬性,在數字長度不夠的數據前面填充0,以達到設定的長度。M值只當屬性為ZEROFILL時,才有區別效果。
如表結構為id1 int(10) ,id2 int(5),對應數據為 第一行為(1,1),第二行為(1111111,1111111),當id1,id2字段設置為ZEROFILL屬性時,顯示數據為第一行為(0000000001,00001),第二行為(0001111111,1111111),不夠的位數會以0補齊。
數據類型 | 大小 | M (默認值) |
范圍(有符號) | 范圍(無符號) | 用途 |
tinyint [(M)] [UNSIGNED] [ZEROFILL] | 1字節 | 4 | -128~127 (-27~27-1) | 0 ~ 255 (0 ~ 28-1) | 非常小整數值 |
smallint [(M)] [UNSIGNED] [ZEROFILL] | 2字節 | 6 | -32768~32767(-215 ~ 215-1) | 0 ~ 65535 (0 ~ 216-1) | 較小整數 |
mediumint [(M)] [UNSIGNED] [ZEROFILL] | 3字節 | 9 | -8388608 ~ 8388607 (-223 ~ 223-1) | 0 ~ 16777215 (0 ~ 224-1) | 中等大小整數 |
int [(M)] [UNSIGNED] [ZEROFILL] | 4字節 | 11 | -2147483648 ~ 2147483647(-231 ~ 231-1) | 0 ~ 4294967295 (0 ~ 232-1) | 標准整數 |
integer [(M)] [UNSIGNED] [ZEROFILL] | 4字節 | 11 | -2147483648 ~ 2147483647(-231 ~ 231-1) | 0 ~ 4294967295 (0 ~ 232-1) | 和int相同 |
bigint [(M)] [UNSIGNED] [ZEROFILL] | 8字節 | 20 | -9223372036854775808 ~9223372036854775807 (-263 ~ 263-1) |
0 ~ 18446744073709551615 (0 ~ 264-1) |
較大整數 |
浮點型:
(M,D) 表示總共M位,D個小數位,D包含於M中。浮點類型不能是unsigned的。
對每種浮點類型,可指定一個最大的顯示尺寸M和小數位數D。M的值應該取1到255。D的值可為0到30,但是不應大於M-2。M和D對float和double都是可選的,但對於decimal是必須的,在選項M和D時,如果省略了它們,則使用缺省值,如果D被省略,它被設置為0。如果M被省掉,它被設置為10。
數據類型 | 大小 | 用途 |
float [(M,D)] [ZEROFILL] | 4字節 | 單精度浮點型,8位精度;參數m只影響顯示效果,不影響精度,d卻不同,會影響到精度;m是十進制數字的總個數,d是小數點后面的數字個數 |
double[(M,D)] [ZEROFILL] | 8字節 | 雙精度浮點型,16位精度;參數m只影響顯示效果,不影響精度,d卻不同,會影響到精度 |
real[(M,D)] [ZEROFILL] | 8字節 | 同double |
decimal[(M[,D])] [ZEROFILL] | 4字節 | decimal(m,d) 定點類型浮點型在數據庫中存放的是近似值,而定點類型在數據庫中存放的是精確值。參數m是定點類型數字的最大個數(精 度),范圍為0~65,d小數點右側數字的個數,范圍為0~30,但不得超過m。對定點數的計算能精確到65位數字。DECIMAL 數據類型用於精度要求非常高的計算中,這種類型允許指定數值的精度和計數方法作為選擇參數。精度在這里指為這個值保存的有效數字的總個數,而計數方法表示小數點后數字的位數。比如語句 DECIMAL(7,3) 規定了存儲的值不會超過 7 位數字,並且小數點后不超過 3 位 |
numeric[(M,D)] [ZEROFILL] | 4字節 | 同decimal |
DECIMAL 類型不同於FLOAT和DECIMAL,其中DECIMAL 實際是以串存放的。DECIMAL 可能的最大取值范圍與DOUBLE 一樣,但是其有效的取值范圍由M 和D 的值決定。如果改變M 而固定D,則其取值范圍將隨M 的變大而變大。表2 - 7的前三行說明了這一點。如果固定M 而改變D,則其取值范圍將隨D 的變大而變小(但精度增加)。表2 - 7的后三行說明了這一點。
給定的DECIMAL 類型的取值范圍取決於MySQL數據類型的版本。對於MySQL3.23 以前的版本,DECIMAL(M, D) 列的每個值占用M 字節,而符號(如果需要)和小數點包括在M 字節中。因此,類型為DECIMAL(5, 2) 的列,其取值范圍為-9.99 到9 9 . 9 9,因為它們覆蓋了所有可能的5 個字符的值。正如MySQL3.23 一樣,DECIMAL 值是根據ANSI 規范進行處理的, ANSI 規范規定DECIMAL(M, D) 必須能夠表示M 位數字及D 位小數的任何值。
例如, DECIMAL(5, 2) 必須能夠表示從-999.99 到999.99 的所有值。而且必須存儲符號和小數點,因此自MySQL3.23以來DECIMAL 值占M + 2 個字節。對於DECIMAL(5, 2),“最長”的值(- 9 9 9 . 9 9)需要7個字節。在正取值范圍的一端,不需要正號,因此MySQL數據類型利用它擴充了取值范圍,使其超過了ANSI 所規范所要求的取值范圍。如DECIMAL(5, 2) 的最大值為9 9 9 9 . 9 9,因為有7 個字節可用。
簡而言之,在MySQL3.23 及以后的版本中,DECIMAL(M, D) 的取值范圍等於更早版本中的DECIMAL(M + 2, D) 的取值范圍。在MySQL數據類型的所有版本中,如果某個DECIMAL 列的D 為0,則不存儲小數點。這樣做的結果是擴充了列的取值范圍,因為過去用來存儲小數點的字節現在可用來存放其他數字了。
二、字符類型
對於可變長的字符類型,其值所占的存儲量是不同的,這取決於實際存放在列中的值的長度,這個長度用L表示。
數據類型 | 大小(范圍) | 用途 |
char(M)[BINARY] | M個字節,0 <= M <= 255 (L為固定的=255,不夠補空格) |
定長字符串;CHAR 類型可以使用 BINARY 修飾符。當用於比較運算時,這個修飾符使 CHAR 以二進制方式參於運算,而不是以傳統的區分大小寫的方式。CHAR值根據缺省字符集以大小寫不區分的方式排序和比較,除非給出BINARY關鍵詞 |
varchar(M) [BINARY] | L+1個字節,其中L <= M 且0 <= M <= 65535(MySQL5.0之前都是最大255) |
變長字符串;VARCHAR 類型在使用 BINARY 修飾符時與 CHAR 類型完全相同 |
tinyblob,tinytext | L+1個字節,其中L < 28-1 (255) |
tinyblob:不超過 255 個字符的二進制字符串;tinytext:短文本字符串 |
blob,text | L+2個字節,其中L < 216-1 (65535) |
blob:二進制形式的長文本數據,在分類和比較時BLOB 類型區分大小寫;text:長文本數據,在分類和比較時TEXT 不區分大小寫 |
mediumblob,mediumtext | L+3個字節,其中L < 224-1 |
mediumblob:二進制形式的中等長度文本數據;mediumtext :中等長度文本數據, |
longblob,longtext | L+4個字節,其中L < 232-1 |
longblob:二進制形式的極大文本數據 ;longtext :極大文本數據 |
enum('value1','value2',...) | 1或2個字節,取決於枚舉值的個數(最多65,535個值) |
|
set('value1','value2',...) | 1、2、3、4或者8個字節,取決於set成員的數目(最多64個成員) |
三、日期類型
MySQL 帶有 5 個不同的數據類型可供選擇。它們可以被分成簡單的日期、時間類型,和混合日期、時間類型。根據要求的精度,子類型在每個分類型中都可以使用,並且 MySQL 帶有內置功能可以把多樣化的輸入格式變為一個標准格式。
類型 | 大小 | 范圍 | 格式 | 用途 |
YEAR[(2|4)] | 1字節 | 1901/2155 | YYYY | 年份值 |
DATE | 3字節 | '1000-01-01'--'9999-12-31' | YYYY-MM-DD | 日期值 |
TIME | 3字節 | '-838:59:59'到'838:59:59' | HH:MM:SS | 時間值或持續時間 |
DATETIME | 8字節 | '1000-01-01 00:00:00'--'9999-12-31 23:59:59' | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP[(M)] | 8字節 | 1970-01-01 00:00:00/2037 年某時 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
(1)YEAR
給YEAR類型賦值可以有三種方法。
第一種是直接插入4位字符串或者4位數字。
第二種是插入2位字符串,這種情況下如果插入‘00’~‘69’,則相當於插入2000~2069;如果插入‘70’~‘99’,則相當於插入1970~1999。第二種情況下插入的如果是‘0’,則與插入‘00’效果相同,都是表示2000年。
第三種是插入2位數字,它與第二種(插入兩位字符串)不同之處僅在於:如果插入的是一位數字0,則表示的是0000,而不是2000年。所以在給YEAR類型賦值時,一定要分清0和‘0’,雖然兩者相差個引號,但實際效果確實相差了2000年。
(2)DATE
MySQL是以YYYY-MM-DD格式來顯示DATE類型的值,插入數據時,數據可以保持這種格式。另外,MySQL還支持一些不嚴格的語法格式,分隔符“-”可以用“@”、“.”等眾多富豪來替代。在插入數據時,也可以使用“YY-MM-DD”格式,YY轉化成對應的年份的規則與YEAR類型類似。如果我們想插入當前系統的時間,則可以插入CURRENT_DATE或者NOW()。
允許使用字符串或數字把值賦給DATE列。
(3)TIME
TIME類型表示為“時:分:秒”,盡管小時范圍一般是0~23,但是為了表示某些特殊時間間隔,MySQL將TIME的小時范圍擴發了,而且支持負值。對TIME類型賦值,標准格式是"HH:MM:SS",但不一定非要是這種格式。如果插入的是"D HH:MM:SS"格式,則類似插入了"(D*24+HH):MM:SS"。比如插入"2 23:50:50",相當於插入了"71:50:50"。如果插入的是"HH:MM"或"SS"格式,則效果是其他未被表示位的值賦為零值。比如插入"30",相當於插入了"00:00:30";如果插入"11:25",相當於插入了"11:25:00"。
另外也可以插入‘D HH’和‘D HH:MM’,效果按上面的例子可以推理出來了吧。 在MySQl中,對於'HHMMSS'格式,系統能夠自動轉化為標准格式。如果我們想插入當前系統的時間,則可以插入CURRENT_TIME或者NOW()。
TIME類型允許使用字符串或數字把值賦給TIME列,只占3個字節,如果只是存儲時間數據,它最合適了。
需要注意的是,沒有冒號分隔符的 TIME 類型值,將會被 MySQL 理解為持續的時間,而不是時間戳。
(4)DATETIME
通常用於自動存儲包含當前日期和時間的時間戳,並可在需要執行大量數據庫事務和需要建立一個調試和審查用途的審計跟蹤的應用程序中發揮良好作用。
(5)TIMESTAMP
通常用於自動存儲包含當前日期和時間的時間戳,並可在需要執行大量數據庫事務和需要建立一個調試和審查用途的審計跟蹤的應用程序中發揮良好作用。
TIMESTAMP的取值范圍比較小,沒有DATETIME的取值范圍大,因此輸入值時一定要保證在TIMESTAMP的范圍之內。它的插入也與插入其他日期和時間數據類型類似。
那么TIMESTAMP類型如何插入當前時間?第一,可以使用CURRENT_TIMESTAMP;第二,輸入NULL,系統自動輸入當前的TIMESTAMP;第三,無任何輸入,系統自動輸入當前的TIMESTAMP。
另外有很特殊的一點:TIMESTAMP的數值是與時區相關.
MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式來顯示TIMESTAMP值,取決於是否M是14(或省略)、12、8或6,但是允許你使用字符串或數字把值賦給TIMESTAMP列。一個TIMESTAMP列對於記錄一個INSERT或UPDATE操作的日期和時間是有用的,因為如果你不自己給它賦值,它自動地被設置為最近操作的日期和時間。你以可以通過賦給它一個NULL值設置它為當前的日期和時間