MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則
數(shù)據(jù)類型
日常開(kāi)發(fā)中,最常使用到的 MySQL 中常用的數(shù)據(jù)類型有 : 整型, 浮點(diǎn)型, 定點(diǎn)數(shù), 字符型, 時(shí)間日期類型. 下面對(duì)其分別進(jìn)行總結(jié)。
整型

格式為 : INT[(M)] [UNSIGNED] [ZEROFILL]
- 取值范圍:如果是
unsigned無(wú)符號(hào)位 , 則最大值翻倍, 如 tinyint unsigned 的取值范圍為 (0~256). - 注意:INT(1) 和 INT(10) 沒(méi)有區(qū)別, 占用的內(nèi)存都一樣, 并不是代表其最大位數(shù),只是加上 (M) 值后, 在 CMD 中顯示的結(jié)果的寬度不同而已. 只有在加上 zerofill 零填充后 M 才表現(xiàn)出有點(diǎn)點(diǎn)效果, 比如 int(3) zerofill, 插入到數(shù)據(jù)庫(kù)里的是 10, 則實(shí)際插入為 010, 也就是在前面補(bǔ)充加了一個(gè)0.
- Java 中的
Long類型, 和 MySQL 中的bigint相對(duì)應(yīng). - Java 中的
Integer類型, 和 MySQL 中的int相對(duì)應(yīng). - Java 中的
Boolean類型, 和 MySQL 中的tinyint相對(duì)應(yīng).false 代表 0, true 代表 1.
浮點(diǎn)型

- 設(shè)一個(gè)字段定義為 float(5,3), 5 表示在 CMD 中顯示的總位數(shù)是 5 位, 3 表示小數(shù)位是 3 位.
- 小數(shù)位超過(guò)指定長(zhǎng)度, 對(duì)后面的數(shù)字按照四舍五入截取. 所以如果插入一個(gè)數(shù) 123.45678, 實(shí)際數(shù)據(jù)庫(kù)里存的是123.457, 進(jìn)行了四舍五入截取.
- 小數(shù)位如果都是0, 則不保存小數(shù)位, 直接保存整數(shù).
定點(diǎn)數(shù)
浮點(diǎn)型在數(shù)據(jù)庫(kù)中存放的是近似值, 而定點(diǎn)類型在數(shù)據(jù)庫(kù)中存放的是精確值. 所以對(duì)于金額等精度要求高的數(shù)據(jù), 使用定點(diǎn)數(shù) decimal 來(lái)保存.
decimal(m,d) 參數(shù) m 是總個(gè)數(shù), d 是小數(shù)位. ( m<65, d<30, d<m )
字符型
| 字符型 | 含義 | 占用字節(jié)數(shù) |
|---|---|---|
| char(n) | 固定長(zhǎng)度, 最多 255 個(gè)字符 | 4 byte |
| varchar(n) | 可變長(zhǎng)度, 最多 65535 個(gè)字符 | 實(shí)際存入字節(jié)數(shù)+1 |
char 類型的字符串檢索速度要比 varchar 類型的快. 所以能 char 的優(yōu)先 選擇 char.- char(n) 若存入字符數(shù)小于 n, 則以空格補(bǔ)于其后, 查詢之時(shí)再將空格去掉. 所以
char 類型存儲(chǔ)的字符串末尾不能有空格, varchar 不限于此. - char(n) 固定長(zhǎng)度, char(4) 不管是存入幾個(gè)字符, 都將占用 4 個(gè)字節(jié). varchar 可變長(zhǎng)度, 是存入的實(shí)際字符數(shù)+1個(gè)字節(jié)(n<=255)或 2 個(gè)字節(jié)(n>255), 所以 varchar(4), 存入3 個(gè)字符將占用 4 個(gè)字節(jié).
- varchar(10) 的 10 代表了申請(qǐng)的空間長(zhǎng)度, 即
存儲(chǔ)的數(shù)據(jù)的最大長(zhǎng)度, 而 int(10) 的 10 只是代表了展示的長(zhǎng)度.
日期時(shí)間型
| 日期時(shí)間類型 | 占用空間(字節(jié)數(shù)) | 日期格式 |
|---|---|---|
| DATETIME | 8 byte | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 4 byte | YYYY-MM-DD HH:MM:SS |
| DATE | 4 byte | YYYY-MM-DD |
| TIME | 3 byte | HH:MM:SS |
| YEAR | 1 byte | YYYY |
- 根據(jù)實(shí)際需要選擇能夠滿足的最小存儲(chǔ)的類型即可. 比如 :
DATE 用于表示 年月日, 生日字段使用 DATE 類型即可. 這樣不但能節(jié)省內(nèi)存, 還能提高表的操作效率. - 如果要記錄年月日時(shí)分秒, 而且記錄的年代比較久遠(yuǎn), 最好使用 DATETIME. 因?yàn)?nbsp;
TIMESTAMP 可以表示的年代范圍比 DATETIME 少的多. - 如果記錄的日期需要用到時(shí)區(qū), 需要選擇 TIMESTAMP.
- 一個(gè)表中至多
只能有一個(gè)字段設(shè)置 CURRENT_TIMESTAMP. 并且 CURRENT_TIMESTAMP 只適合 TIMESTAMP 類型的字段.
CREATE TABLE USER( ... create_time timestamp NULL default CURRENT_TIMESTAMP, -- 默認(rèn)為當(dāng)前時(shí)間 ... )
字段類型的選取原則
- 字段類型優(yōu)先級(jí) :
整型 > date,time > char,varchar > blob
原因:整型運(yùn)算快, 且節(jié)省空間. char, varchar 要考慮字符集的轉(zhuǎn)換與排序時(shí)的校對(duì)集, 所以速度慢.
- 優(yōu)先選擇
占空間小的類型.
原因 : 小空間的類型占用的磁盤(pán), 內(nèi)存, CPU 緩存, CPU 處理時(shí)間都更少.
對(duì)于字符型和數(shù)字型, 優(yōu)先選擇數(shù)字型.
比如 : 應(yīng)該使用整型來(lái)存儲(chǔ) IP 地址, 而不是字符型. 應(yīng)該使用日期時(shí)間類型來(lái)存儲(chǔ)日期時(shí)間, 而不是字符型.
- 對(duì)于 char 和 varchar
如果列中的數(shù)據(jù)長(zhǎng)度差不多一致, 比如 : 身份證號(hào), 學(xué)號(hào)等, 則應(yīng)該考慮使用 char 類型.
對(duì)于那些長(zhǎng)度未知的字符串, 使用 varchar.
如果列中的最大數(shù)據(jù)長(zhǎng)度小于 50 Byte (15個(gè)字符左右), 則一般考慮使用 char.
- 對(duì)于 decimal 和 float:
精確數(shù)據(jù)只能使用 decimal 類型.
非精確數(shù)據(jù)優(yōu)先使用 float 類型, ( float 比 decimal 的存儲(chǔ)空間小 )
- 對(duì)于那些可能值很有限的列,
使用 tinyint 代替 varchar / int
比如記錄移動(dòng)設(shè)備平臺(tái), 只有兩個(gè)值:android, ios, 那么就可以使用 0 表示 android, 1 表示 ios, 并寫(xiě)好注釋.
不要濫用 bigint, 比如文章表的主鍵 id 字段, 用 int 就行了, 21 億篇文章的上限足夠使用了.
以上原則主要是從以下角度考慮 :
- 查詢速度:
定長(zhǎng)數(shù)據(jù)比變長(zhǎng)數(shù)據(jù)查詢快, 因?yàn)槎ㄩL(zhǎng)數(shù)據(jù)與數(shù)據(jù)之間的偏移是固定的, 很容易計(jì)算下一個(gè)數(shù)據(jù)的偏移.
而變長(zhǎng)數(shù)據(jù)則還需要多一步去查詢下一個(gè)數(shù)據(jù)的偏移量. 不過(guò)定長(zhǎng)數(shù)據(jù)可能會(huì)浪費(fèi)更多的存儲(chǔ)空間.
- 排序速度:在對(duì)數(shù)據(jù)進(jìn)行
比較 ( 查詢條件, JOIN 條件以及排序 ) 操作時(shí),同樣的數(shù)據(jù), 數(shù)字的處理比字符串快.
字符串的比較與當(dāng)前的排序規(guī)則有關(guān), 它需要去查詢當(dāng)前排序規(guī)則的字典順序, 而數(shù)字不需要.
到此這篇關(guān)于MySQL 數(shù)據(jù)類型及最優(yōu)選取規(guī)則的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從這個(gè)基本語(yǔ)法可以看出,最簡(jiǎn)單的SELECT語(yǔ)句是SELECT select_list,實(shí)際上利用這個(gè)最簡(jiǎn)單的SELECT語(yǔ)句,你也可以完成許多你期待的功能,首先你能利用它進(jìn)行MySQL所支持的任何運(yùn)算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運(yùn)用SELECT語(yǔ)句的這種功能,你就可以自由地運(yùn)用MySQL的函數(shù)為PHP程序進(jìn)行各種運(yùn)算,并賦值給變量。在很多的時(shí)候,你會(huì)發(fā)現(xiàn)MySQL擁有許多比PHP更為功能強(qiáng)大的函數(shù)。2008-04-04
linux系統(tǒng)下安裝配置解壓版的MySQL數(shù)據(jù)庫(kù)圖解
這篇文章主要介紹了linux系統(tǒng)下安裝配置解壓版的MySQL數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2017-12-12
MySQL使用show?effective?grants查看權(quán)限官方解讀
這篇文章主要為大家介紹了MySQL使用show?effective?grants查看權(quán)限,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
MHA實(shí)現(xiàn)mysql主從數(shù)據(jù)庫(kù)手動(dòng)切換的方法
這篇文章主要介紹了MHA實(shí)現(xiàn)mysql主從數(shù)據(jù)庫(kù)手動(dòng)切換的方法,詳細(xì)的講述了主從數(shù)據(jù)庫(kù)切換的步驟與方法,非常實(shí)用,需要的朋友可以參考下2014-10-10
MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

