對于MySQL數(shù)據(jù)分類的一些說明
發(fā)表時間:2023-09-04 來源:明輝站整理相關軟件相關文章人氣:
[摘要]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ù)類型
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。
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é)描述了這些類型如何工作以及如何在查詢中使用這些類型;
字符型
varchar與char的區(qū)別
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知識。