MySQL之選擇字段資料型別

2021-08-09 16:48:40 字數 2453 閱讀 3062

mysql支援的資料型別很多,選擇正確的資料型別對於 獲得高效能至關重要。在選擇時有個簡單的原則有助於做出更好的選擇。

簡單的原則:

a、通常最小的是最好的

因為這樣可以用更少的磁碟、內容、cpu快取,大大減少io開銷。

b、簡單就好

簡單的資料型別操作通常需要更少的cpu週期。例如,整型比字元操作代價更小,因為字符集和校對規則(排序規則)使它比整型更複雜。比如應該使用mysql內建的型別而不是使用字元型來儲存日期和時間。

c、盡量避免使用null

null是列缺省的屬性,通常我們要指定為not null。有null的列值會使得索引、索引統計和值比較更加複雜。可為null的列會使用更多的儲存空間,在mysql中也需要對它進行特殊處理,當可為null列做索引時,每個索引需要乙個額外的位元組,在myisam更有可能導致固定大小的索引變成可變大小索引,在innodb中使用單獨的位(bit)儲存null值。

1、整數型別

幾種整數型別:tinyint(8位),smallint(16位),mediumint(24位),int(32位),bigint(64位),它們的範圍是-2的(n-1)次方到2的(n-1)次方-1。如果選擇了unsigned表示非負,它可以使整數最大值提高一倍,有符號和無符號使用相同的儲存空間,具有相同的效能。

為整型指定寬度,如int(11),對於儲存來說int(1)和int(20)是相同的,它不會限制值的合法範圍,只是規定了mysql與客戶端的互動應該顯示多少位而已,比如你向int(1)中插入了123456值,資料庫中其實已經存入了123456,只是對於客戶端查出來是1而已。

2、實數型別

實數是帶小數部分的數字,然而它不只是為了儲存小數部分,也可以使用decimal儲存比bigint還大的整數,float和double型別支援使用標準的浮點運算進行四捨五入。decimal用於儲存精確的小數。float占用4個位元組,dobule占用8個位元組,它比decimal占用空間更小、計算浮更更快,因此在非儲存財務資料時,可以考慮其它的型別,如放大n倍後存為bigint。

3、字串型別

mysql支援多種字串型別,每個字串列可以定義自己的字符集和排序規則,或者說校對規則,這些東西很大程度上影響效能。

a、varchar和char型別

char是定長的,每個列無論字串長度大小都會分配固定儲存空間,char適合儲存字元很短,或者所有值接近乙個長度時,如儲存md5碼、session_id等,對於經常變更的資料char也比varchar好,再乙個是對於非常短的列,char比varchar更節省空間,例如使用char(1)和varchar(1)來儲存y或n時,char需要乙個字元,而varchar需要兩個,因為還有乙個長度位元組

b、blob和text型別

它們都是為儲存大資料而設計的,blob是採用二進位制/text採用字元儲存。mysql不能將blob和text列全部進行索引(只能做前面某長度的索引,因此在查詢sql時不能用like前模糊匹配,那樣就走不到索引了),也不能使用這些索引進行排序。

技巧:使用列舉代替字串型別,列舉可以把一些重複的字串儲存成乙個預定義的集合,mysql在儲存列舉時非常緊湊,mysql在列中儲存值為列舉中的位置整數。列舉最不好的是字串是固定的,新增或刪除必須使用alter table。因此對於未來會改變的字串,使用列舉不是乙個好主意,除非能接受在列舉末尾新增元素,由於列舉有乙個對映轉換過程,所以列舉雖然能減少儲存空間,但是也會增加一些額外開銷。

4、時間和時期型別

datetime:這個型別能儲存1001到2023年,精度為秒,與時區無關,使用8個位元組儲存,儲存格式封裝為yyyymmddhhmmss的整數,因此它是一種可排序的型別,顯示時以ansi標準定義的日期和時間表示方法顯示。

timestamp:它儲存了從2023年1月1日午夜以來的秒數,也就是常說的時間戳,它使用4個位元組來儲存,依賴於時區。除了特殊情況外,通常我們應該盡量使用timestamp,因為它比datetime更省空間,現實中有些人喜歡使用int來儲存時間戳(包括剛出來工作時的我),這並不會帶來任何收益,用整數儲存時間戳不方便,因為取出來之後還需要程式轉換下,所以不推薦這樣做。

5、位資料型別

mysql有少數幾種儲存型別使用緊湊的位儲存資料。不管底層儲存格式如何處理,從技術上說都是字元型。

bit:bit(1)表示定義乙個包含一位的長度,bit(2)表示2個位,以此類推,bit列最大長度是64位,mysql把bit當字串處理,而不是數字,當檢索bit(1)的值時,結果是乙個包含二進位制0或1的字串,而不是ascii碼的0或1,例如00111001,它的二進位制等於57,檢索它時得到是乙個字元碼為57的字元,也就是ascii碼57對應字元為9。一般在應用中盡量避免使用bit,對於大部分應用來說最好是不用。

MySQL 字段資料型別說明

型別說明 儲存量tinyint m unsigned zerofill 乙個很小的整數。有符號的範圍是 128到127,無符號的範圍是0到255。1 位元組 smallint m unsigned zerofill 乙個小整數。有符號的範圍是 32768到32767,無符號的範圍是0到65535。2...

修改字段資料型別

我們假設相關表中沒有資料,使用sql語句修改字段型別的相關操作,以下就是具體方案的描述。如果表中沒有資料 直接這樣就可以了 alter table 表名 modify 欄位名 型別 eg alter table student id number 4 如果原表中存在data那麼方法就大不相同了,請看...

資料庫 MySQL欄位資料型別

欄位是列表中 的列名,列是表的重要組成部分,mysql資料庫中,列中的每乙個資料都需要指定其所屬型別,以確保資料的準確性和系統 的穩定性。字段資料型別分為三類 數值型別 字串型別 時間日期型別。數值型 整數 tinyint 1byte 128 127 tinyint unsigned 0 255 s...