Mysql中分為三大數據類型:數值型、字符型、時間日期型
數值型
數值型分為整型和小數型(包含小數部分的數據類型)
整形
Mysql中光整型數據類型就有五種:tinyint,smallint,mediumint,int,bigint
Tinyint:迷你整型,占用一個字節保存數據,能夠表示256個數值
Smallint:小整型,占用2個字節保存數據,能夠表示65536個數值
Mediumint:中整型,占用3個字節保存數據
Int:標准整型,占用4個字節,42億多
Bigint:大整型,占用8個字節保存數據
類型
字節
最小值(有符號/無符號)
最大值(有符號/無符號)
TINYINT
1
-128/0
127/255
SMALLINT
2
-32768/0
32767/65535
MEDIUMINT
3
-8388608/0
8388607/16777215
INT/INTEGE
4
-2147483648/0
2147483647
/4294967295
BIGINT
8
-9223372036854775808/0
9223372036854775807/18446744073709551615
為什么要有這么多整型?
1. 能夠最大效率的使用磁盤空間,做到最少浪費。根據實際業務分配內存空間來進行數據保證
2. 查詢的效率變高
如何在項目中選擇使用何種整型?
根據業務需求,某一類數據的邊界值,看邊界值落在那個整型范圍,就是用最小的那個。
在實際操作中tinyint,int使用的較多
無符號:表示數值只能是正的,不能有負數
語法:在字段類型后面使用unsigned進行標識
Agetinyint unsigned//年齡是一個迷你整型,無符號表示(0,255);
顯示寬度:占的位數,當某個數值沒有達到顯示寬度的時候,在數值的左邊使用0來補足顯示寬度
默認的,系統不會進行0填充,需要給字段顯示增加一個屬性:zerofill,0填充
系統默認顯示的寬度是數據類型是能顯示的最大寬度
0填充有一個特點:使用0填充必須使用無符號類型,不能用負數填充
0填充式專門用來配合顯示寬度:顯示寬度只是在數據的值沒有達到指定寬度的時候使用0填充,0填充或者顯示寬度都不會顯示原理數值的大小,值的大小有數據類型決定
什么地方會使用顯示寬度?
在一些需要使用0填充地方不改變原來值的大小,卻能夠用寬度來固定顯示數據,保證前段數據的顯示不會改變原來的css結構。比如說月份、日期、時間
小數型
帶有小數部分的數據
Mysql中小數型分為兩種:浮點型,定點型
浮動型:float和double
Float:采用4個字節保存數據
Double:采用8個字節保存數據
浮點數的存儲使用4個字節32位儲存,第一位叫符號位,會使用符號位后面的8位用來存儲街碼(底數+指數),其它的用來表示數據。
浮點數會丟失精度
Float:最大有效位7位左右
Double:最大有效位15位左右
浮點數的使用方式
Float(M,D):M表示整個長度,D表示小數位的長度
數據處理
如果小數位超出指定長度,會自動四舍五入
如果在沒有指定小數位時,小數部分直接忽略,整數部分超出精度進行四舍五入
浮點數只適用於那些對數值精度要求不高m但是數量特別大的數據
凡是跟錢相關絕對不用浮點數
定點型:decimal
能夠自動的擴展寬度來保存數據,保證數據的精度,基於小數部分,如果超出指定長度,仍然會進行四舍五入
語法:decimal(M,D):M表示總長度,D小數長度
定點型和浮點型的區別
定點型能夠保證精度,二浮點型只能保證精度之內的數據的准確性,二精度之外都會變成0
浮動型如果在四舍五入過程中,如果會讓數據進行超出指定的整數長度,那么系統也是運行的
定點型如果在進位過程中超出指定的數據長度,那么將會報錯
定點型的數據范圍
最大長度:Decimal(65,30)
凡是涉及到錢的都會在數據庫端使用decimal來進行數據的存儲和運算。
字符串型
Mysql有以下字符串類型:char,varchar,text,blob,enum,set
char(定長字符串):表示磁盤會分配固定的長度的空間去存儲數據
1. 如果數據不夠長度,空間依然被占用
2. 如果數據超出長度,系統會報錯
語法:char(L),L表示長度,L表示的字符長度,L的最多值255
varchar(變長字符串):表示磁盤空間會根據實際的長度來分配存儲空間,但是長度不能超過指定長度vachar(L),存儲的數據只能小於或者等於L個字符,L的理論值65535
varchar在存儲之外還有一個額外的1到2個字節來保存當前varchar的實際占用長度
char和varchar對比(utf8):一個字符= 3個字節
字符
Char(4)占用字節數
Varchar(4)占用字節數
Char實際所占字節數
Varchar實際所占字節數
A
4*3=12
12
3+1=4
ABCD
4*3=12
4*3+1=13
12
13
Char(255)
Varchar(256)
256個字符
255*3=765
256*3+2=770
765
770
255個字符
255*3=765
255*3+1=766
765
766
在非嚴格模式下(集成環境中),都是對類型要求不嚴格,所以當數據類型不符合要求,所以當數據類型不符合要求的時候,系統會進行自動轉換或者截取,從而不報錯。但是在嚴格模式中,系統不會做任何處理,只會做判斷,如果失敗就報錯。
如何區分使用vhar還是varchar
1. 所有字符串長度必須在255之內
2. 如果之風范創長度是固定,那么使用char
Md5值,身份證,手機號等等
3. 如果字符串長度不固定,那么所有vharchar
姓名,郵箱…
Char和varchar效率區別
1. Char的效率比varchar要高
2. Varchar比char節省空間
當字符串長度超過255之后,就不會使用varchar來進行數據保存,使用text
Text:字符串文本
Blob:二進制文本
在記錄里面不計算長度(不占記錄長度),基本可以“無限”存儲數據
Enum:枚舉,列出一系列的元素,可以從一堆元素中任選一個作為實際的值(單選框)
語法:enum(元素1,元素2….)
枚舉的意義?
1. 限制用戶的輸入(規划數據)
2. 能夠節省內存空間
枚舉使用兩個字節來保存數據,能夠保持65535個數據,是因為枚舉實際保存的不是字符串而是字符串元素所對應的數組
在定義枚舉的過程中,使用的雖然是字符串元素,但是在實際保存數據的時候,保存的是元素對應的數值
如何證明枚舉實際存儲的是數組呢?
使用算術運算符:mysql會在碰到算術運算符之后,自動進行數據轉換,轉換成數組類型
轉換的標准與PHP一致
語法:select字段+ 0 from表名
Set:集合,在定義字段之初,為字段值做一系列的限制,實際存儲值的時候,可以是集合類型中的多個元素。集合相當於多選框
Hobby set(‘游泳’,‘爬山’,’打球’,‘騎車’,’旅游’);
集合是使用8個字節,只能保持64個數據。集合定義的數據類型里面出現的可能的元素的最多個數為64個。
集合可以在插入數據的時候,將實際的順序打亂,但是在最終保持的時候,系統會將順序與定義的時候的順序對比,變成原來的
集合實際存儲的也是數值
原理:每一個枚舉元素,都占據一個位作為自己的空間,該空間上,如果當前元素被選中,那么值為1,否則為0。最終去計算十進制結果的時候,是將所有的二進制先顛倒過來,在計算。
使用set的好處
1. 節省空間
2. 能夠規范數據
對於枚舉和集合,在進行數據插入的時候,還可以使用數值插入
數據庫的字符串類型有很多,但是是從數據庫管理員的角度出發去考慮問題
1. 考慮磁盤空間的開銷
2. 考慮執行效率
做完PHP程序員,基本不考慮這些,只考慮如何方便PHP進行操作。所以真正配合PHP使用的字符串:char,varchar,和text
時間日期格式
類型
顯示格式
取值
存儲空間
零值
DATETIME
YYYY-MM-DD HH:MM:SS
'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
8
0000-00-00 00:00:00
TIMESTAMP
YYYY-MM-DD HH:MM:SS
是‘1970-01-01 00:00:00’到2038-01-19 03:14:07
4
0000-00-00 00:00:00
DATE
YYYY-MM-DD
'1000-01-01'到'9999-12-31
3
0000-00-00
TIME
HH:MM:SS
-838:59:59'到'838:59:59'
3
00:00:00
YEAR
YYYY
1901到2155
1
0000
Datetime:表示年月日時分秒,能夠表示9000年,占用8個字節
Timestamp:時間戳,使用標准整型存儲,表示確是年月日,時分秒
Date:日期部分,可以表示1000-9999年
Time:時間部分,表示的是一個時間段,從過去什么時間到以后某個時間
Year:年,使用一個字節存在,一個字節只能表示256個數值,在計算的時候加上1900再輸出
時間戳不能是PHP中的時間戳,而應該是時間戳范圍內對應的時間格式
注意:
1. 在mysql中,任意一條記錄(所有字段的集合)的長度不能超過65535個字節。
所以varchar能夠存儲的數據的真實長度會變化很大
GBK:varchar能夠存儲多少個字符?
65535/2 = 32767.5
utf8:varchar能夠存儲多少個字符?
(65535– 2) / 3 = 21844.3
2. 在mysql中,如果所有的字段里,沒有全部不允許為null,那么需要一個字節來保存null
所有字段都不為null
留出一個字節保存null
3. text不占存儲長度空間,但是text本身需要占據10個字節來保存字段名。