1. 程式人生 > >MySQL資料型別及欄位屬性

MySQL資料型別及欄位屬性

MySQL 資料型別MySQL中定義資料欄位的型別對你資料庫的優化是非常重要的。MySQL支援多種型別,大致可以分為三類:

  1. 數值
  2. 日期/時間
  3. 字串(字元)

數值型別

MySQL支援所有標準SQL數值資料型別。
這些型別包括嚴格數值資料型別(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值資料型別(FLOAT、REAL和DOUBLE PRECISION)。

這裡寫圖片描述

日期和時間型別

表示時間值的日期和時間型別為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間型別有一個有效值範圍和一個”零”值,當指定不合法的MySQL不能表示的值時使用”零”值。TIMESTAMP型別有專有的自動更新特性。

這裡寫圖片描述

字串型別

字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。

這裡寫圖片描述

char和varchar

CHAR和VARCHAR型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在儲存或檢索過程中不進行大小寫轉換。
1.char(n) 若存入字元數小於n,則以空格補於其後,查詢之時再將空格去掉。所以char型別儲存的字串末尾不能有空格,varchar不限於此。
2.char(n) 固定長度,char(4)不管是存入幾個字元,都將佔用4個位元組,varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),所以varchar(4),存入3個字元將佔用4個位元組。
3.char型別的字串檢索速度要比varchar型別的快。

varchar和text:

1.varchar可指定n,text不能指定,內部儲存varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。
2.text型別不能有預設值。
3.varchar可直接建立索引,text建立索引要指定前多少個字元。varchar查詢速度快於text,在都建立索引的情況下,text的索引似乎不起作用。

BINARY和VARBINARY

類類似於CHAR和VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於列值位元組的數值值。

二進位制資料(_Blob)

BLOB是一個二進位制大物件,可以容納可變數量的資料。有4種BLOB型別:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同。有4種TEXT型別:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對應4種BLOB型別,有相同的最大長度和儲存需求。
1._BLOB和_text儲存方式不同,_TEXT以文字方式儲存,英文儲存區分大小寫,而_Blob是以二進位制方式儲存,不分大小寫。
2._BLOB儲存的資料只能整體讀出。
3._TEXT可以指定字符集,_BLO不用指定字符集。

MySQL欄位屬性

MySQL有如下欄位屬性:

MySQL關鍵字 含義
NULL 資料列可包含NULL值
NOT NULL 資料列不允許包含NULL值
DEFAULT 預設值
PRIMARY KEY 主鍵
AUTO_INCREMENT 自動遞增,適用於整數型別
UNSIGNED 無符號
CHARACTER SET name 指定一個字符集

關於length屬性

MySQL支援給一個數值型別新增一個length屬性,它代表這個欄位值的展示寬度。比如INT(4)定義了這個欄位會按四個字元的寬度進行展示。這個功能有什麼用呢?當我們在查詢這個欄位時,如果欄位值小於定義的展示寬度,那麼在展示時系統會自動在這個數值的左側通過空格進行補齊。

這個length屬性只是定義了展示數值的寬度,絕對不會影響數值實際儲存的大小。不管我們定義的是INT(4)、INT(11)還是INT(20),我們最終儲存的數值大小都佔4個位元組, 範圍都是 (-2 147 483 648,2 147 483 647)。當實際儲存的數值寬度大於我們定義的寬度時,會按實際寬度進行展示。比如我們定義的寬度時INT(5),而實際數值是123456共6位,那麼查詢時顯示的還是123456。

總之一句話,length屬性只會在實際數值寬度小於我們定義的寬度時才用空格進行補齊,任何情況下都不會影響實際數值的儲存和展示。

關於zerofill屬性

當length屬性結合zerofill屬性一起使用時,補齊的就不是空格了,而是0。比如我們定義的列屬性為INT(4) ZEROFILL,如果資料庫中儲存的值是5的話,查詢出來便會是0005。注意,此時資料庫中的值依然是5,只是查詢出來是0005。

關於unsigned屬性

如果我們使用了unsigned,則儲存的最大值翻倍,如tinyint unsigned的取值範圍就由(-128~127)變成了(0~256)。
如果我們定義的列是zerofill的,那麼MySQL會自動給這個列加上unsigned屬性。

關於autoincrement屬性

如果我們給一個列添加了autoincrement屬性,那麼當我們插入null或0值時,列值便會自動設定成下一個序列號,一般是當前value+1。注意,只有當列值屬性設定為NOT NULL時,插入null值才會autoincrement,否則便會直接插入null值。