mysql字段長(zhǎng)度設(shè)計(jì)
mysql字段長(zhǎng)度設(shè)計(jì)
整數(shù)型
- 1、整數(shù)型的數(shù)值類型已經(jīng)限制了取值范圍,有符號(hào)整型和無符號(hào)整型都有,而M值并不代表可以存儲(chǔ)的數(shù)值字符長(zhǎng)度,它代表的是數(shù)據(jù)在顯示時(shí)顯示的最小長(zhǎng)度;
- 2、當(dāng)存儲(chǔ)的字符長(zhǎng)度超過M值時(shí),沒有任何的影響,只要不超過數(shù)值類型限制的范圍;
- 3、當(dāng)存儲(chǔ)的字符長(zhǎng)度小于M值時(shí),只有在設(shè)置了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。
舉例子,如果你設(shè)置int(11),那么有個(gè)字段值是123,那么這個(gè)值在顯示寬度上是3位,而設(shè)計(jì)的是顯示的是11位,所以這時(shí)候,你如果在字段設(shè)計(jì)的時(shí)候,選擇zerofill就可以發(fā)現(xiàn),123變成了00000000123,也就是剩下的8位用0補(bǔ)足了。
所以我們?cè)谠O(shè)計(jì)mysql數(shù)據(jù)庫(kù)時(shí),建表時(shí),mysql會(huì)自動(dòng)分配長(zhǎng)度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
所以,就用這些默認(rèn)的顯示長(zhǎng)度就可以了。不用再去自己填長(zhǎng)度,比如搞個(gè)int(10)、tinyint(1)之類的,基本沒用。而且導(dǎo)致表的字段類型多樣化。

字符串型(CHAR(M)、VARCHAR(M))
CHAR(M)定義的列的長(zhǎng)度為固定的,M取值可以為0~255之間,當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉。在存儲(chǔ)或檢索過程中不進(jìn)行大小寫轉(zhuǎn)換。CHAR存儲(chǔ)定長(zhǎng)數(shù)據(jù)很方便,CHAR字段上的索引效率級(jí)高,比如定義char(10),那么不論你存儲(chǔ)的數(shù)據(jù)是否達(dá)到了10個(gè)字節(jié),都要占去10個(gè)字節(jié)的空間,不足的自動(dòng)用空格填充。
VARCHAR(M)定義的列的長(zhǎng)度為可變長(zhǎng)字符串,M取值可以為0~65535之間,(VARCHAR的最大有效長(zhǎng)度由最大行大小和使用的字符集確定。整體最大長(zhǎng)度是65,532字節(jié))。VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過255,則使用兩個(gè)字節(jié))。VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。varchar存儲(chǔ)變長(zhǎng)數(shù)據(jù),但存儲(chǔ)效率沒有CHAR高。如果一個(gè)字段可能的值是不固定長(zhǎng)度的,我們只知道它不可能超過10個(gè)字符,把它定義為 VARCHAR(10)是最合算的。
CHAR和VARCHAR最大的不同就是一個(gè)是固定長(zhǎng)度,一個(gè)是可變長(zhǎng)度。
總結(jié)一下,從空間上考慮,用varchar合適;從效率上考慮,用char合適,關(guān)鍵是根據(jù)實(shí)際情況找到權(quán)衡點(diǎn),所有當(dāng)需要大量查詢需求的時(shí)候,用char。當(dāng)對(duì)于保存數(shù)據(jù)量過大的需求時(shí),為了節(jié)省儲(chǔ)存空間用varchar。
TEXT
最大長(zhǎng)度為65,535(2的16次方–1)字符的TEXT列。
Text主要是用來存放非二進(jìn)制的文本,如論壇帖子,題目,或者百度知道的問題和回答之類。TEXT列不能有默認(rèn)值,存儲(chǔ)或檢索過程中,不存在大小寫轉(zhuǎn)換,后面如果指定長(zhǎng)度,不會(huì)報(bào)錯(cuò)誤,但是這個(gè)長(zhǎng)度是不起作用的,意思就是你插入數(shù)據(jù)的時(shí)候,超過你指定的長(zhǎng)度還是可以正常插入。其實(shí)可以總結(jié)為用來儲(chǔ)存大批量的文本信息的時(shí)候,使用TEXT。
總結(jié)
1,長(zhǎng)度的區(qū)別,char范圍是0~255,varchar最長(zhǎng)是64k,如果遇到了大文本,考慮使用text,最大能到4G。
2,效率來說基本是char>varchar>text。
3,char和varchar可以有默認(rèn)值,text不能指定默認(rèn)值。

時(shí)間型
DATETIME類型用在你需要同時(shí)包含日期和時(shí)間信息的值時(shí)。MySQL檢索并且以'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值,支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
DATE類型用在你僅需要日期值時(shí),沒有時(shí)間部分。MySQL檢索并且以'YYYY-MM-DD'格式顯示DATE值,支持的范圍是'1000-01-01'到'9999-12-31'。
TIMESTAMP列類型提供一種類型,你可以使用它自動(dòng)地用當(dāng)前的日期和時(shí)間標(biāo)記INSERT或UPDATE的操作。
TIME數(shù)據(jù)類型表示一天中的時(shí)間。MySQL檢索并且以"HH:MM:SS"格式顯示TIME值。支持的范圍是'00:00:00'到'23:59:59'。
datetime和timestamp的區(qū)別:
1.datetime 的日期范圍比較大;如果有1970年以前的數(shù)據(jù)還是要用datetime.但是timestamp 所占存儲(chǔ)空間比較小。
2.timestamp 類型的列還有個(gè)特性:默認(rèn)情況下,在 insert, update 數(shù)據(jù)時(shí),timestamp 列會(huì)自動(dòng)以當(dāng)前時(shí)間(CURRENT_TIMESTAMP)填充/更新。
3.timestamp比較受時(shí)區(qū)timezone的影響以及MYSQL版本和服務(wù)器的SQL MODE的影響。

浙公網(wǎng)安備 33010602011771號(hào)