明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

對于MySQL數(shù)據(jù)分類的一些說明

[摘要]MySQL中定義數(shù)據(jù)字段的類型對你數(shù)據(jù)庫的優(yōu)化是非常重要的;MySQL支持多種類型,大致可以分為三類:數(shù)值、日期/時間和字符串(字符)類型;整數(shù)類型Int(N)中N的涵義定義了 init(5)zerofill 當和int(10)join時顯示寬度對不上有可能出現(xiàn)臨時表N表示顯示寬度為N,但仍占4字...
MySQL中定義數(shù)據(jù)字段的類型對你數(shù)據(jù)庫的優(yōu)化是非常重要的;

MySQL支持多種類型,大致可以分為三類:數(shù)值、日期/時間和字符串(字符)類型;

整數(shù)類型

關于MySQL數(shù)據(jù)類型的一些介紹

Int(N)中N的涵義

定義了 init(5)zerofill 當和int(10)join時顯示寬度對不上有可能出現(xiàn)臨時表

N表示顯示寬度為N,但仍占4字節(jié)存儲,存儲范圍不變;

>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  
+------------+

關于浮點數(shù)類型:1)能不用到盡量不要用,2)浮點數(shù)不能用在等號比較的場景

建議TINYINT替換enum

日期和時間類型

表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。

關于MySQL數(shù)據(jù)類型的一些介紹

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。該節(jié)描述了這些類型如何工作以及如何在查詢中使用這些類型;

字符型

關于MySQL數(shù)據(jù)類型的一些介紹

varchar與char的區(qū)別

關于MySQL數(shù)據(jù)類型的一些介紹

char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區(qū)別是: char(M)類型的數(shù)據(jù)列里,每個值都占用M個字節(jié),如果某個長度小于M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)在varchar(M)類型的數(shù)據(jù)列里,每個值只占用剛好夠用的字節(jié)再加上一個用來記錄其長度的字節(jié)(即總長度為L+1字節(jié))varchar存儲可變長字符串,小于255字節(jié)時需要1個額外字節(jié)(大于255需要2個額外字節(jié))存儲長度,最大長度為65532字節(jié)(所有列總和);

char存儲定長,讀取時會截斷末尾空格,長度最大為255字符;

1)CHAR(M)的涵義:

實際分配的長度是:M*字符編碼長度=存儲空間

例如:存儲了255個字符 中文漢字是占用3個字節(jié)

255*3 = 765 一共是765字節(jié)


2)varchar(N)中N的涵義
最大存儲N個字符;varchar(5)和varchar(200)存儲hello所占空間一樣,但后者在排序時會消耗更多內(nèi)存,因為order by col采用fixed_length計算col長度(memory引擎也一樣)
例如:

varchar(200)utf8下面占用多少字節(jié)

200*3+ 2

varchar(64) utf8

64*3=192<255
192+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的原因是實際行存儲從第二個字節(jié)開始’;

減2的原因是varchar頭部的2個字節(jié)表示長度;

除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個字節(jié);

減30*3的原因是char(30)占用90個字節(jié),編碼是utf8。

以上就是關于MySQL數(shù)據(jù)類型的一些介紹的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!


學習教程快速掌握從入門到精通的SQL知識。