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類型類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。
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類型的快。
1.varchar可指定n,text不能指定,内部存儲varchar是存入的實際字元數+1個位元組(n<=255)或2個位元組(n>255),text是實際字元數+2個位元組。
2.text類型不能有預設值。
3.varchar可直接建立索引,text建立索引要指定前多少個字元。varchar查詢速度快于text,在都建立索引的情況下,text的索引似乎不起作用。
類類似于char和varchar,不同的是它們包含二進制字元串而不要非二進制字元串。也就是說,它們包含位元組字元串而不是字元字元串。這說明它們沒有字元集,并且排序和比較基于列值位元組的數值值。
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關鍵字
含義
null
資料列可包含null值
not null
資料列不允許包含null值
default
預設值
primary key
主鍵
auto_increment
自動遞增,适用于整數類型
unsigned
無符号
character set name
指定一個字元集
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屬性隻會在實際數值寬度小于我們定義的寬度時才用空格進行補齊,任何情況下都不會影響實際數值的存儲和展示。
當length屬性結合zerofill屬性一起使用時,補齊的就不是空格了,而是0。比如我們定義的列屬性為int(4) zerofill,如果資料庫中存儲的值是5的話,查詢出來便會是0005。注意,此時資料庫中的值依然是5,隻是查詢出來是0005。
如果我們使用了unsigned,則存儲的最大值翻倍,如tinyint unsigned的取值範圍就由(-128~127)變成了(0~256)。
如果我們定義的列是zerofill的,那麼mysql會自動給這個列加上unsigned屬性。
如果我們給一個列添加了autoincrement屬性,那麼當我們插入null或0值時,列值便會自動設定成下一個序列号,一般是目前value+1。注意,隻有當列值屬性設定為not null時,插入null值才會autoincrement,否則便會直接插入null值。