MySQL資料型別及欄位屬性
MySQL 資料型別MySQL中定義資料欄位的型別對你資料庫的優化是非常重要的。MySQL支援多種型別,大致可以分為三類:
- 數值
- 日期/時間
- 字串(字元)
數值型別
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值。