mysql中怎樣使用合適的字段和字段長度
下面是mysql一個字段中含有哪些信息
一般重要的字段為類型,長度,屬性,非空,索引,自增等等。
注:A_I:auto_increment,代表自增。
字段的類型有好多種,先說下字段中比較常用的類型和長度
整數(shù)型
1、整數(shù)型的數(shù)值類型已經限制了取值范圍,有符號整型和無符號整型都有,而M值并不代表可以存儲的數(shù)值字符長度,它代表的是數(shù)據(jù)在顯示時顯示的最小長度;
2、當存儲的字符長度超過M值時,沒有任何的影響,只要不超過數(shù)值類型限制的范圍;
3、當存儲的字符長度小于M值時,只有在設置了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。
舉例子,如果你設置int(11),那么有個字段值是123,那么這個值在顯示寬度上是3位,而設計的是顯示的是11位,所以這時候,你如果在字段設計的時候,選擇zerofill就可以發(fā)現(xiàn),123變成了00000000123,也就是剩下的8位用0補足了。
所以我們在設計mysql數(shù)據(jù)庫時,建表時,mysql會自動分配長度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
所以,就用這些默認的顯示長度就可以了。不用再去自己填長度,比如搞個int(10)、tinyint(1)之類的,基本沒用。而且導致表的字段類型多樣化。
字符串型
CHAR(M), VARCHAR(M)
CHAR(M)定義的列的長度為固定的,M取值可以為0~255之間,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。CHAR存儲定長數(shù)據(jù)很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數(shù)據(jù)是否達到了10個字節(jié),都要占去10個字節(jié)的空間,不足的自動用空格填充。
VARCHAR(M)定義的列的長度為可變長字符串,M取值可以為0~65535之間,(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節(jié))。VARCHAR值保存時只保存需要的字符數(shù),另加一個字節(jié)來記錄長度(如果列聲明的長度超過255,則使用兩個字節(jié))。VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標準SQL。varchar存儲變長數(shù)據(jù),但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。
CHAR和VARCHAR最大的不同就是一個是固定長度,一個是可變長度。
總結一下,從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據(jù)實際情況找到權衡點,所有當需要大量查詢需求的時候,用char。當對于保存數(shù)據(jù)量過大的需求時,為了節(jié)省儲存空間用varchar。
TEXT
最大長度為65,535(2的16次方–1)字符的TEXT列。
Text主要是用來存放非二進制的文本,如論壇帖子,題目,或者百度知道的問題和回答之類。TEXT列不能有默認值,存儲或檢索過程中,不存在大小寫轉換,后面如果指定長度,不會報錯誤,但是這個長度是不起作用的,意思就是你插入數(shù)據(jù)的時候,超過你指定的長度還是可以正常插入。其實可以總結為用來儲存大批量的文本信息的時候,使用TEXT。
總結
1,長度的區(qū)別,char范圍是0~255,varchar最長是64k,如果遇到了大文本,考慮使用text,最大能到4G。
2,效率來說基本是char>varchar>text。
3,char和varchar可以有默認值,text不能指定默認值。
時間型
- DATETIME:類型用在你需要同時包含日期和時間信息的值時。MySQL檢索并且以'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值,支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。
- DATE:類型用在你僅需要日期值時,沒有時間部分。MySQL檢索并且以'YYYY-MM-DD'格式顯示DATE值,支持的范圍是'1000-01-01'到'9999-12-31'。
- TIMESTAMP:列類型提供一種類型,你可以使用它自動地用當前的日期和時間標記INSERT或UPDATE的操作。
- TIME:數(shù)據(jù)類型表示一天中的時間。MySQL檢索并且以"HH:MM:SS"格式顯示TIME值。支持的范圍是'00:00:00'到'23:59:59'。
datetime和timestamp的區(qū)別:
1.datetime 的日期范圍比較大;如果有1970年以前的數(shù)據(jù)還是要用datetime.但是timestamp 所占存儲空間比較小。
2.timestamp 類型的列還有個特性:默認情況下,在 insert, update 數(shù)據(jù)時,timestamp 列會自動以當前時間(CURRENT_TIMESTAMP)填充/更新。
3.timestamp比較受時區(qū)timezone的影響以及MYSQL版本和服務器的SQL MODE的影響。
字段的屬性值及用處
- BINARY:不是函數(shù),是類型轉換運算符,它用來強制它后面的字符串為一個二進制字符串,可以理解為在字符串比較的時候區(qū)分大小寫。
- UNSIGNED:既為非負數(shù),用此類型可以增加一倍數(shù)據(jù)長度!
UNSIGNED ZEROFILL:剛說過了,數(shù)字型字段當存儲的字符長度小于INT(M)中的M值時,只有在設置了zerofill用0來填充,才能夠看到效果,換句話就是說,沒有zerofill,M值就是無用的。
timestamp有兩個屬性,分別是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP兩種,使用情況分別如下
1,CURRENT_TIMESTAMP
當要向數(shù)據(jù)庫執(zhí)行insert操作時,如果有個timestamp字段屬性設為
CURRENT_TIMESTAMP,則無論這個字段有沒有set值都插入當前系統(tǒng)時間
2,ON UPDATE CURRENT_TIMESTAMP
當執(zhí)行update操作是,并且字段有ON UPDATE CURRENT_TIMESTAMP屬性。則字段無論值有沒有變化,它的值也會跟著更新為當前UPDATE操作時的時間。
字段的索引以及設置
先說下對索引的最簡單的理解:
如果你給一個唯一性的字段加上索引,比如一個字段是房間號,你不設置字段的情況下去搜索RoomNumber=101,那么數(shù)據(jù)庫會去一條一條的搜索數(shù)據(jù)庫中的RoomNumber字段,直到找到101給你返回,但如果你把RoomNumber設置為索引,那么數(shù)據(jù)庫就會直接找到RoomNumber=101這條信息給你返回。
所以索引的作用是加快數(shù)據(jù)庫搜索的效率,但是同樣的,你給一個字段設置為索引,是要消耗資源的。
- 普通索引(INDEX):最基本的索引,沒有任何限制。
- 唯一索引(UNIQUE):與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
- 主鍵索引(PRIMARY):它 是一種特殊的唯一索引,不允許有空值。
- 全文索引(FULLTEXT ):僅可用于 MyISAM 表, 用于在一篇文章中,檢索文本信息的, 針對較大的數(shù)據(jù),生成全文索引很耗時耗空間。
說一下字段的長度問題
- 位(bit):數(shù)據(jù)存儲的最小單位。每個二進制數(shù)字0或者1就是1個位;
- 字節(jié)(byte): 8個位構成一個字節(jié);即:1 byte (字節(jié))= 8 bit(位);
- 字符:是指計算機中使用的字母、數(shù)字、字和符號。
比如不同的酒店的房間號的方式是不同的,可能是101,或者是FD101,再或者是亞特蘭蒂斯101,這樣不確定的字段,為了提高表的復用性,我們可以給出一個長度,比如char(32),我們可以確定酒店的房間號無論如何都會超過這個長度,這樣就可以在節(jié)省空間的情況下適應所有的情況,
但是還有一種情況比如數(shù)據(jù)庫中要存MAC地址,MAC地址格式為XX-XX-XX-XX-XX-XX,一共為12個數(shù)字和五個分隔符,那么我們就可以直接char(17)來定死這個字段的長度,因為無論如何MAC地址都不會超過17位。
其實也會有人覺得我定為char(32)那能比char(17)的查詢效率低多少?確實微乎其微,但是從習慣的角度來說,建表要養(yǎng)成一種好的習慣,所以當我們可以確定一個字段的長度的時候,就要直接用規(guī)則定死,避免掉后期可能出現(xiàn)的優(yōu)化。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
深入講解數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法
MySQL?DECIMAL數(shù)據(jù)類型用于在數(shù)據(jù)庫中存儲精確的數(shù)值,我們經常將DECIMAL數(shù)據(jù)類型用于保留準確精確度的列,例如會計系統(tǒng)中的貨幣數(shù)據(jù),下面這篇文章主要給大家介紹了關于數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法的相關資料,需要的朋友可以參考下2022-02-02