MySQL數據類型選擇mysql
更小的一般更好:通常狀況下選擇能夠正確存儲數據的最小數據類型。越小的數據類型一般更快,佔用磁盤,內存和CPU緩存更小。git
簡單就好:簡單的數據類型的操做一般須要更少的CPU週期。例如:整型比字符操做代價要小得多,由於字符集和校對規則(排序規則)使字符比整型比較更加複雜。github
儘可能避免NULL:儘可能制定列爲NOT NULL,除非真的須要NULL類型的值。由於可能爲NULL列使得索引,索引統計和值比較都更復雜。可爲NULL的列會使用更多的存儲空間,在MySQL裏也須要特殊處理。sql
在選擇列的數據類型時須要先選定合適的大類型,如:數字,字符串,時間等。緩存
整數類型服務器
有兩種類型的數字:整數和實數。若是須要存儲整數,能夠選擇一下集中數據類型:cookie
數據類型 | 長度/字節 | 範圍 | 說明 |
---|---|---|---|
TINYINT | 1 | -2^7—2^7-1 | 整數類型可選UNSIGND屬性 |
SMALLINT | 2 | -2^15—2^15-1 | 表示不容許爲負值 |
MEDIUMINT | 3 | -2^23—2^23-1 | 這大體可使整數上限提升一倍 |
INT | 4 | -2^31—2^31-1 | 例如UNSIGNED可使TINYINT |
BIGINT | 8 | -2^63—2^63-1 | 存儲的範圍是0—255 |
*實數類型函數
實數是帶有小數部分的數字。然而它們不僅是存儲小數部分;也能夠是DECIMAL存儲比BIGINT還大的整數。MYSQL即支持精確類型,也支持非精確存儲。FLOAT和DOUBLE類型支持使用標準的浮點運算進行近似計算。具體計算規則取決於所使用平臺的實現。性能
數據類型 | 長度 | 範圍 | 說明 |
---|---|---|---|
FLOATR | 4字節 | — | 浮點數 |
DOUBLE | 8字節 | — | 浮點數 |
DECIMAL | 最多65數字(5.0以上版本) | — | 定點數 |
MySQL使用DOUBLE做爲內部浮點計算的類型。注意,DECIMAL須要額外的空間和計算開銷,因此只要要求儘可能對小數進行精確時才使用DECIMAL,例如在存儲財務數據時,能夠用BIGINT來替代它來實現,只須要將數據乘以相應的倍數便可。學習
*字符串類型
MySQL支持多種字符串類型。從4.1版本開始,每一個字符串列能夠定義本身的字符集和校對規則(排序規則),這些東西會在很大程度上影響性能。
VARCHAR和CHAR類型
VARCHAR和CHAR時最主要的兩種字符串類型。
VARCHAR:適用於存儲變長的字符串,是最多見的字符串數據類型。它比定常更加節省空間,由於它僅須要使用必要的額外空間(若是MySQL表使用ROW_FORMAT=FIXED建立的話,會使用定長)。
適合使用該類型的狀況:字符串列的最大長度比平均長度大不少;列的更新不多,因此碎片不是問題;使用了UTF-8這樣複雜的字符集,每一個字符的使用不一樣字節數進行存儲。
注:5.0以上版本會保留末尾空格,更早的版本會刪除末尾空格。InnoDB存儲引擎會把過長的VARCHAR轉換爲BLOB類型。
CHAR:CHAR是定長字符串類型,MySQL老是根據定義的類型進行分配足夠的空間。當存儲CHAR時MySQL會默認刪除行尾空格。由於CHAR值一般須要用空格進行填充以方便比較。
CHAR適合存儲很短的字符串,或者全部長度都接近一個長度。
對於常常變動的數據CHAR比較VARCHAR要好,由於定長的CHAR類型不容易產生碎片。
對於更短的列CHAR比VARCHAR要更加節省空間,由於VARCHAR老是須要一個額外的字節來存儲長度。
BLOB和TEXT類型
BLOB和TEXT是用來存儲很大的數據來設計的字符串數據類型,分別採用二進制和字符方式進行存儲。
實際上他們時屬於兩種不一樣數據類型家族:字符類型的時TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT;對應的二進制類型是TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB。BLOB是SMALLBLOGB的同義詞,TEXT是SMALLTEXT的同義詞。
與其餘數據類型不一樣,它們被看成單獨的對象進行處理。當BLOB和TEXT值太大時InnoDB會使用專門的外部區域來進行存儲,此時每一個值只須要1—4個字節在行內存儲一個指針便可,而後在外部存儲區域存儲實際的值。
BLOB和TEXT的僅有的區別在於BLOB類型存儲的時二進制數據,沒有排序規則或字符集,而TEXT類型有字符集和排序規則。
MySQL對BLOB和TEXT列進行排序時與其餘類型時不一樣的,它只對每一個列的最前max_sort_length字節而不是整個字符串作排序。
MySQL不能將BLOB和TEXT列所有長度進行字符串進行索引,也不能使用這些索引消除排序。
日期和時間類型
MySQL可使用不少類型來保存日期和時間值,例如YEAR和DATE.MySQL能存儲最小粒度爲秒。可是可使用微秒級的力度進行運算。
MySQL提供了兩種類似的數據類型:
DATETIME和TIMESTAMP
DATETIME
能保存1001到9999年,精度爲秒。格式爲YYYY-MM-DD HH:MM:SS與時區無關,使用八個字節的存儲空間。
TIMESTAMP
時間戳,正如名字同樣。它能保存從1970年1月1號午夜(格林尼治標準時間)。它只使用四個字節的存儲空間只能表示1970到2038年。
TIMESTAMP顯示的值依賴於時區。MYSQL服務器,操做系統,以及客戶端鏈接都有時區設置。所以存儲值爲0時在不一樣的時區顯示值會有差異。
注:一般狀況下應儘可能使用TIMESTAMP,由於它比DATETIME效率更高。若是須要存儲更小粒度的時間,能夠用BIGINGT或者轉換成DOUBLE類型來進行存儲。
ENUM數據類型
枚舉數據類型在內存中很是緊湊,會根據列表值的數量壓縮到一個或兩個字節。MySQL自身會維護一個查找表。例如:
CREATE TABLE enum_test(
gender ENUM("男","女","其餘") NOT NULL
);
INSERT INTO enum_test values("男","女","其餘");
在數字上下文環境檢索時能夠看到
SELECT gender FROM enum_test;
gender+0 |
---|
1 |
2 |
3 |
注意:枚舉時按照內部的數字而不是定義的字符串進行排序的。
mysql> SELECT gender FROM enum_test ORDER BY gender;
gender |
---|
男 |
女 |
其餘 |
在不少狀況下咱們可使用ENUM類型來替代字符串類型。可是若是不宜使用數字類型做爲枚舉常量,這種雙重性容易致使混亂。枚舉最很差的地方就是,字符串列表是固定的,添加或刪除字符串必須使用ALTER TABLE。
特殊數據類型
某些類型的數據不直接與內置類型一直。如用BIGINT和DOUBLE來存儲低於秒級精度的時間戳。還有就是用一個32位無符號整數存儲IP地址。MySQL提供了INET_ATON()和INET_NTOA函數進行兩種表示方式之間轉換。
INET_ATON(3232235521) ——> 192.168.0.1
INET_NTOA(192.168.0.1)——>3232235521
以上只是常見的數據類型,其餘類型就不一一贅述。本人我的博客站點:www.mycookies.cn(適合初級JAVA學習者學), 歡迎你們來指點指點哦。源碼地址:https://github.com/liqianggh/blog