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