MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則
數(shù)據(jù)類型
日常開發(fā)中,最常使用到的 MySQL 中常用的數(shù)據(jù)類型有 : 整型, 浮點(diǎn)型, 定點(diǎn)數(shù), 字符型, 時(shí)間日期類型. 下面對(duì)其分別進(jìn)行總結(jié)。
整型
格式為 : INT[(M)] [UNSIGNED] [ZEROFILL]
- 取值范圍:如果是
unsigned
無符號(hào)位 , 則最大值翻倍, 如 tinyint unsigned 的取值范圍為 (0~256). - 注意:INT(1) 和 INT(10) 沒有區(qū)別, 占用的內(nèi)存都一樣, 并不是代表其最大位數(shù),只是加上 (M) 值后, 在 CMD 中顯示的結(jié)果的寬度不同而已. 只有在加上 zerofill 零填充后 M 才表現(xiàn)出有點(diǎn)點(diǎn)效果, 比如 int(3) zerofill, 插入到數(shù)據(jù)庫里的是 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ù)位超過指定長(zhǎng)度, 對(duì)后面的數(shù)字按照四舍五入截取. 所以如果插入一個(gè)數(shù) 123.45678, 實(shí)際數(shù)據(jù)庫里存的是123.457, 進(jìn)行了四舍五入截取.
- 小數(shù)位如果都是0, 則不保存小數(shù)位, 直接保存整數(shù).
定點(diǎn)數(shù)
浮點(diǎn)型在數(shù)據(jù)庫中存放的是近似值, 而定點(diǎn)類型在數(shù)據(jù)庫中存放的是精確值. 所以對(duì)于金額等精度要求高的數(shù)據(jù), 使用定點(diǎn)數(shù) decimal 來保存.
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)先選擇
占空間小
的類型.
原因 : 小空間的類型占用的磁盤, 內(nèi)存, CPU 緩存, CPU 處理時(shí)間都更少.
對(duì)于字符型和數(shù)字型, 優(yōu)先選擇數(shù)字型
.
比如 : 應(yīng)該使用整型來存儲(chǔ) IP 地址, 而不是字符型. 應(yīng)該使用日期時(shí)間類型來存儲(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, 并寫好注釋.
不要濫用 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ù)的偏移量. 不過定長(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è)基本語法可以看出,最簡(jiǎn)單的SELECT語句是SELECT select_list,實(shí)際上利用這個(gè)最簡(jiǎn)單的SELECT語句,你也可以完成許多你期待的功能,首先你能利用它進(jìn)行MySQL所支持的任何運(yùn)算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運(yùn)用SELECT語句的這種功能,你就可以自由地運(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ù)庫圖解
這篇文章主要介紹了linux系統(tǒng)下安裝配置解壓版的MySQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2017-12-12MySQL使用show?effective?grants查看權(quán)限官方解讀
這篇文章主要為大家介紹了MySQL使用show?effective?grants查看權(quán)限,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07MHA實(shí)現(xiàn)mysql主從數(shù)據(jù)庫手動(dòng)切換的方法
這篇文章主要介紹了MHA實(shí)現(xiàn)mysql主從數(shù)據(jù)庫手動(dòng)切換的方法,詳細(xì)的講述了主從數(shù)據(jù)庫切換的步驟與方法,非常實(shí)用,需要的朋友可以參考下2014-10-10MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了MySQL Workbench導(dǎo)入excel數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01