MySQL中定義資料欄位的類型對你資料庫的最佳化是非常重要的;
MySQL支援多種類型,大致可以分為三類:數值、日期/時間和字串(字元)型態;
Int(N)中N的涵義
定義了init(5 )zerofill 當和int(10)join時顯示寬度對不上有可能出現臨時表
N表示顯示寬度為N,但仍佔4字節存儲,存儲範圍不變;
>create table int_test(a int zerofill NOT NULL auto_increment, PRIMARY KEY (a)); >createtable int_test_4(a int(4) zerofill NOT NULL auto_increment, PRIMARY KEY (a)); >select * from int_test_4; +------------+ |a | +------------+ | 0001 | | 0002 | |2147483648 | +------------+ >select * from int_test; +------------+ |a | +------------+ |0000000001 | |0000000002 | |2147483648 | +------------+
關於浮點數類型:1)能不用到盡量不要用,2)浮點數不能用在等號比較的場景
建議TINYINT取代enum
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
#MySQL5.6不支援year(2)
日期類型注意事項
Timestamp,datatime從MySQL5.6.5支援自動更新為目前的時間:current timestamp
日期轉換:cast(datatime_col as DATE)
> ;select now()+0;
5.6的us支援
>select now(4),MICROSECOND(now(4)); +--------------------------+---------------------+ |now(4) |MICROSECOND(now(4)) | +--------------------------+---------------------+ |2016-04-16 08:50:01.6589 | 658900 | +--------------------------+---------------------+
timestamp5.6.6之後支援null
建議datetime 來取代timestamp
字串型別
字串型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何運作以及如何在查詢中使用這些類型;字元類型
varchar與char的區別
char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的差異是: char(M)類型的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足. (在檢索作業中那些填補出來的空格字元會被去掉)在varchar(M)類型的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組)varchar儲存可變長字串,小於255位元組時需要1個額外位元組(大於255需要2個額外位元組)儲存長度,最大長度為65532位元組(所有列總和);char儲存定長,讀取時會截斷末尾空格,長度最大為255字元;1)CHAR(M)的涵義:實際分配的長度是:M*字元編碼長度=儲存空間例如:儲存了255個字元 中文漢字是佔用3個位元組
255*3 = 765 一共是765字節
2)varchar(N)中N的涵義
最大儲存N個字元;varchar(5)和varchar(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多內存,因為
er by col採用fixed_length計算col長度(memory引擎也一樣)
例如:varchar(200)utf8下面佔用多少位元組200*3+ 2
varchar(64) utf8
64*3=192<255192+1=193
#建議:
通常使用MySQL是innodb引擎innodb引擎本來就是變長儲存
行儲存著:
trx_id, row-id,rollback, filed_pointer, null-flag, filed1,....
innodb儲存引擎建議varchar
char比較快是針對MyISAM這種堆表char 定長分配會更快一點
###計算範例######舉兩個例說明一下實際長度的計算。
a)若一個表只有一個varchar類型,如定義為
createtable t4(c varchar(N)) charset=gbk;
則此處N的最大值為(65535-1-2)/2= 32766。
減1的原因是實際行儲存從第二個位元組開始';
減2的原因是varchar頭部的2個位元組表示長度;
#除2的原因是字元編碼是gbk。
b)若一個表定義為
createtable t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
則此處N的最大值為(65535-1-2-4-30*3)/3=21812
減1和減2與上例相同;
減4的原因是int類型的c佔4個位元組;
減30*3的原因是char(30)佔用90個字節,編碼是utf8。
以上是關於MySQL資料類型的一些介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!