1.數值類型 html
MYSQL支持全部標準SQL,這其中包括: mysql
- 精確數值數據類型:INTERGER/INT,SMALLINT,DECIMAL/DEC,NUMERIC
- 近似數值數據類型:FLOAT,REAL,DOCULE PRECISION
- BIT數據類型
做爲對標準SQL的擴展,MySQL還支持TINYINT,MEDIUMINT及BIGINT,以下圖: sql
Type |
Bytes |
Minimum Value |
Maximum Value |
|
|
(Signed/Unsigned) |
(Signed/Unsigned) |
TINYINT |
1 |
-128 |
127 |
|
|
0 |
255 |
SMALLINT |
2 |
-32768 |
32767 |
|
|
0 |
65535 |
MEDIUMINT |
3 |
-8388608 |
8388607 |
|
|
0 |
16777215 |
INT |
4 |
-2147483648 |
2147483647 |
|
|
0 |
4294967295 |
BIGINT |
8 |
-9223372036854775808 |
9223372036854775807 |
|
|
0 |
18446744073709551615 服務器 |
- 若是ZEROFILL指定給數值列,則MYSQL會自動添加UNSIGNED屬性
- 整數或浮點類型都可指定AUTO_INCREMENT屬性,當被賦值NULL或0時會自動設置成下一個序列值,AUTO_INCREMENT序列從1開始
- MYSQL將DOUBLE與DOUBLE PRECISION等同,將REAL也與DOUBLE PRECISION等同
- DECIMAL與NUMERIC用來存儲精確數值數據,NUMERIC是DECIMAL的一種實現,MYSQL5.5將DECIMAL與NUMERIC存儲爲二進制格式
- BIT數據類型用來存儲比特數值,BIT(M)中M容許從1到64,位數不足時會自動左側補0
- SERIAL 等同於BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
2.日期時間類型
當使用DATE與TIME類型時一般須要注意的事項:
- MYSQL會嘗試從各類格式的輸入中解析日期與時間,但仍是有格式限制的
- 只有兩位數的YEAR,會讓MYSQL感到迷惑,因此MYSQL會嘗試做下面的解析:在70~99之間的年會被解析成:1970~1999,在00~69之間的年會被解析成2000~2069
- MYSQL在解析日期時,日期的輸入順序必須爲:year-month-day,不然沒法正確解析
- 默認狀況下,MYSQL會將超出範圍或不合法的日期與時間,轉換成0,但對於超出範圍的TIME,會將其歸整到一個恰當的時間點上。下面是「0」格式的格式,前提是沒有設置NO_ZERO_DATE,不然會拋出警告: p, li { white-space: pre-wrap; }
Data Type 函數 |
「Zero」 Value 性能 |
DATETIME spa |
'0000-00-00 00:00:00' .net |
DATE htm |
'0000-00-00' 對象 |
TIMESTAMP |
'0000-00-00 00:00:00' |
TIME |
'00:00:00' |
YEAR |
0000 |
- DATEIME,DATE與TIMESTAMP的區別在於所表示的日期時間範圍不一樣:DATETIME是 p, li { white-space: pre-wrap; } :'1000-01-01 00:00:00' to '9999-12-31 23:59:59',DATE是:‘1000-01-01’到‘9999-12-31’,而TIMESTAMP是:‘1970-01-01 00:00:01’UTC到‘2038-01-19 03:14:07’UTC(隨MYSQL的版本不一樣而改變)
- MYSQL識別日期時間時遵循相對「鬆散」的格式,即不關心日期日間之間的分隔符是什麼,有或沒有,只要日期正確,均可以識別,如:‘10-12-04 21:50:59’,‘10.12.04 21+50+59’,‘10/12/04 21*50^59’,‘101204215059’,都是同樣的,均可以被正確識別出來。
- TIMESTAMP 類型會自動初始化及更新. TIMESTAMP默認值爲CURRENT_TIMESTAMP,除非其被指定了其它默認值,參考以下:
自動初始化與更新 |
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
自動初始化 |
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
自動更新 |
ts TIMESTAMP DEFAULT 0 NO UPDATE CURRENT_TIMESTAMP |
無 |
ts TIMESTAMP DEFAULT 0 |
3.字符串類型
字符串類型包括:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM和SET.
3.1 CHAR與 VARCHAR類型
這兩種類型很類似,但它們的存儲與檢索方法不一樣,最大長度也不一樣以及是否保留尾部空格也不一樣.CHAR與VARCHAR中的數字是來代表它們最多能夠存儲的字符數的,如CHAR(90),能存儲90個字符. CHAR的長度是固定的,能夠從0-255,當被存儲時會經過右側補空格的方式來填滿整個長度.當檢索取出時,若是設置了SQL模式爲:PAD_CHAR_TO_FULL_LENGTH,會自動去掉後面的空格.
VARCHAR存儲的是變長字符串,長度範圍在0-65535之間,但其實際的最大值受限於行的最大值(全部列共享65535個字節),與CHAR相反,VARCHAR爲附加1或2個字節的在其數據前面,用以指明實際存儲的字符數,即若是字符串<=255,則附加1字節,不然2個字節.
MYSQL的全部歸類(collations)都是PADSPACE的,因此不管是CHAR仍是VARCHAR在比較時都會自動去除尾部的空格再進行比較.
3.2 BINARY與VARBINAY
它們與CHAR及VARCHAR相似,不一樣之處在於BINARY與VARBINARY使用字節爲存儲單位,而CHAR與VARCHAR使用字符爲存儲單位.BINARY能夠用做CHAR及VARHCAR的一個屬性,但它們的意義確不一樣.CHAR(5) BINARY === CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin(假設默認字符集是latin1),而BINARY(5)就表示存儲5字節的二進制數據,沒有字符集,也沒有歸類.
BINARY存儲以後會用0x00來補全未填充的字節,在選出時,尾部字節也不會被丟棄.全部的字節在比較中都會被用到,其中包括ORDER BY 和 DISTINCT操做,0x00與space(空格)是不一樣的,0x00<space.但若是具備BINARY屬性的列被指定爲索引且惟一值時,那麼自動填加的補充字節就無效了,不然會拋出duplicate-key錯誤.全部在使用BINARY類型時,須要仔細考慮前面提到填充和剔除特性. 若是您但願獲得的值與存儲的值徹底同樣,沒有填充字節的問題,那麼可優先考慮VARBINARY或BLOB類型.
3.3 BLOB與TEXT
BLOB存儲的是二進制這字符串,即字節字符串,沒有字符集,排序和比較都是按字節的數值.TEXT存儲的是非二進制字符串排序與比較依據的是其字符集所對應的歸類(整理).由於BLOB與TEXT的值能夠很是的長,因此在使用時會有一些限制:
- 在排序時,只有max_sort_length個字節被使用,默認值是1024,若是想在不改變此變量的前提下,使更多的字節加入排序,能夠彩用SUBSTRING()方法
- 當查詢結果中包含BLOB或TEXT實例列時,MYSQL是採用在磁盤上建立臨時表的方式處理的,由於MEMORY引擎是不支持這兩種類型的.由於磁盤的使用會致使性能降低,因此除非確實須要,不然在查詢中不要包含TEXT或BLOB列,特別是不要使用如SELECT *,來查詢全部列.
- BLOB與TEXT的最大值決定於它們的類型,可是客戶端與服務器之間的實際可傳輸的最大值卻取決於空閒內存的數量及通訊緩衝區的大小. 咱們可能經過調整max_allowed_packet來增大緩衝,但須要在客戶端與服務器端同時設置
3.4 ENUM類型
ENUM是從一個具備固定值的列表中選取一項做爲值的字符串對象.被枚舉的值必須用引號包圍,不能爲表達式,或者一個變量估值.若是想用數值做爲枚舉值,那也必須得用引號引發. 枚舉的值在如下狀況下能夠爲''或NULL:
- 若是一個無效的值賦予了ENUM對象,那麼一個空字符串會被插入,做爲一個特殊的錯誤值,這個字符串與"正常"的空字符串有差異,其在數值上爲0.
- 若是ENUM列被聲明容許爲NULL,那麼NULL就是一個合法的值,且默認值就是NULL,若是聲明爲NOT NULL,那麼其默認值就是列表中的第一個元素.
- 每一個被枚舉的值都有一個索引,索引從1開始,因此當枚舉值無效時其值會被賦予0,NULL的索引是NULL,(這裏所說的索引,專指相應元素在枚舉列表中所處的位置.
枚舉值排序是按照它們在列表中的索引即位置進行排序的,空字符串會排在全部非空字符串之間,而NULL又會排在空字符串以前.若是但願枚舉值按照字母表來排序的話,須要使用CAST(col as CHAR)或CONCAT(col)來實現.
函數SUM()或AVG()在對枚舉列進行計算時,都使用的是索引值.若是想查詢某一枚舉列的詳細信息,可以使用:
mysql>show columns from table_name like enum_col
3.5 SET類型
SET是一個能夠0或更多值的字符串對象,和ENUM相似,其值一樣來自於一個用逗號分隔的列表,所以SET值成員自己不能包含逗號. 如SET('one','two') not null 的列可能有值爲:'','one','two','one,two'.一個SET能夠最多有64個不一樣成員值.檢索SET值時,會按列定義時的大小寫顯示,而且SET列能夠指定字符集和歸類整理,因此當使用BINARY或區分大小的歸類時,須要特別注意.
MySQL經過數值的方式來存儲SET值,存儲值低序位對應第一組元素.若是在數值上下文中檢索一個SET值,所得到的bits序列值,對了SET成員中可以組成這個序列的成員組合.舉例說明,若有SET('a','b','c','d'),與之相對應的數值表爲:
p, li { white-space: pre-wrap; }
SET Member |
Decimal Value |
Binary Value |
'a' |
1 |
0001 |
'b' |
2 |
0010 |
'c' |
4 |
0100 |
'd' |
8 |
1000 |
若是賦予此列的值爲9,在二進制上爲1001,因此'a'和'd'被選中,即其結果值爲'a,d'.
對於一個包含多個SET元素的值,無論其插入值的順序如何,也不否重複與否,當檢索結果時,每一個元素只會出如今次,且按照被定義的順序.