04-MySQL中的資料型別
1 整體說明
MYsql的資料型別
#1. 數字:
整型:tinyint int bigint
小數:
float :在位數比較短的情況下不精準
double :在位數比較長的情況下不精準
0.000001230123123123
存成:0.000001230000
decimal:(如果用小數,則用推薦使用decimal)
精準
內部原理是以字串形式去存
#2. 字串:
char(10):簡單粗暴,浪費空間,存取速度快
root存成root000000
varchar:精準,節省空間,存取速度慢
sql優化:建立表時,定長的型別往前放,變長的往後放
比如性別 比如地址或描述資訊
>255個字元,超了就把檔案路徑存放到資料庫中。
比如圖片,視訊等找一個檔案伺服器,資料庫中只存路徑或url。
#3. 時間型別:
最常用:datetime
#4. 列舉型別與集合型別
enum 和set
2 數值型別
整型型別:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:儲存年齡、等級、id、各種號碼等。
說明:
(1)預設是有符號的
(2)定義無符號的資料型別:
unsigned :表示無符號 當前欄位新增約束
示例:create table t2(x int unsigned);
(3)該型別指定寬度時,僅僅只是指定查詢結果的顯示寬度,與儲存範圍無關(預設的顯示寬度,都是在最大值的基礎上加1),儲存範圍如下
(4)為什麼int型別預設顯示寬度為11
int的儲存寬度是4個Bytes,即32個bit,即2**32
無符號最大值為:4294967296-1
有符號最大值:2147483648-1
有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值則需要11位才能顯示完全,所以int型別預設的顯示寬度為11是非常合理的
========================================
tinyint[(m)] [unsigned] [zerofill]
小整數,資料型別用於儲存一些範圍的整數數值範圍:
有符號:
-128 ~ 127
無符號:
0 ~ 255
PS: MySQL中無布林值,使用tinyint(1)構造。
========================================
int[(m)][unsigned][zerofill]
整數,資料型別用於儲存一些範圍的整數數值範圍:
有符號:
-2147483648 ~ 2147483647
無符號:
0 ~ 4294967295
========================================
bigint[(m)][unsigned][zerofill]
大整數,資料型別用於儲存一些範圍的整數數值範圍:
有符號:
-9223372036854775808 ~ 9223372036854775807
無符號:
0 ~ 18446744073709551615
3. 浮點型
(1)定點數型別: DEC等同於DECIMAL
(2)浮點型別:FLOAT DOUBLE
(3)作用:儲存薪資、身高、體重、體質引數等
-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
#引數解釋:單精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30
#有符號:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
#無符號:
1.175494351E-38 to 3.402823466E+38
#精確度:
**** 隨著小數的增多,精度變得不準確 ****
-------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
#引數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30
#有符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
#無符號:
2.2250738585072014E-308 to 1.7976931348623157E+308
#精確度:
****隨著小數的增多,精度比float要高,但也會變得不準確 ****
======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]
#引數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。
#精確度:
**** 隨著小數的增多,精度始終準確 ****
對於精確數值計算時需要用此型別
decaimal能夠儲存精確值的原因在於其內部按照字串儲存。
4 日期型別
(1)型別:DATE TIME DATETIME TIMESTAMP YEAR
(2)作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生時間,過期時間等
(3)語法:
YEAR
YYYY(1901/2155)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
(4)datatime和timestamp的區別
在實際應用的很多場景中,MySQL的這兩種日期型別都能夠滿足我們的需要,儲存精度都為秒,但在某些情況下,會展現出他們各自的優劣。
下面就來總結一下兩種日期型別的區別。
1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。
2.DATETIME儲存時間與時區無關,TIMESTAMP儲存時間與時區有關,顯示的值也依賴於時區。在mysql伺服器,
作業系統以及客戶端連線都有時區的設定。
3.DATETIME使用8位元組的儲存空間,TIMESTAMP的儲存空間為4位元組。因此,TIMESTAMP比DATETIME的空間利用率更高。
4.DATETIME的預設值為null;TIMESTAMP的欄位預設不為空(not null),預設值為當前時間(CURRENT_TIMESTAMP),
如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。
5 列舉和集合
create table consumer(
id int,
name varchar(50),
sex enum('male','female','other'),
level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一
fav set('play','music','read','study') #在指定範圍內,多選一和多選多
);
insert into consumer values (1,'alex','other','vip2','play,read,study');