列類型
- 整型(默認是有符號的)
類型 | 字節(jié)數(shù) | 有符號型范圍 | 無符號型范圍(unsigned) |
---|---|---|---|
tinyint(M) | 1字節(jié) | -128~127 | 0~255 |
smallint(M) | 2字節(jié) | -32768~32767 | 0~65535 |
mediumint(M) | 3字節(jié) | -8388608~8688607 | 16777215 |
int(M) | 4字節(jié) | -2147483648~2147483647 | 4294967295 |
integer | 4字節(jié) | ||
bigint(M) | 8字節(jié) | -9223372036854775808~9223372036854775807 | |
float(X) 浮點型 | 4 | -3.4E38~3.4E38(7個有效位) 如果 X < = 24 或 8 如果 25 < = X < = 53 | |
float | 4 個字節(jié) | ||
double 雙精度實型 | 8 個字節(jié) | -1.7E308~1.7E308(15個有效位) | |
double precision | 8 個字節(jié) | ||
real | 8 個字節(jié) | ||
decimal(M,D)數(shù)字型 | M字節(jié)(D+2 , 如果M < D) | 128bit鄙漏,不存在精度損失,常用于銀行帳目計算(28個有效位) | |
numeric(M,D) | M字節(jié)(D+2 , 如果M < D) |
日期和時間類型
類型 | 字節(jié)數(shù) |
---|---|
DATE | 3 個字節(jié) |
DATETIME | 8 個字節(jié) |
TIMESTAMP | 4 個字節(jié) |
TIME | 3 個字節(jié) |
YEAR | 1 字節(jié) |
字符串類型
類型 | 字節(jié)數(shù)和范圍 |
---|---|
CHAR(M) | M字節(jié)唯绍,1 <= M <= 255 |
VARCHAR(M) | L+1 字節(jié), 在此L <= M和1 <= M <= 255 |
TINYBLOB, TINYTEXT | L+1 字節(jié), 在此L< 2 ^ 8 |
BLOB, TEXT | L+2 字節(jié), 在此L< 2 ^ 16 |
MEDIUMBLOB, MEDIUMTEXT | L+3 字節(jié), 在此L< 2 ^ 24 |
LONGBLOB, LONGTEXT | L+4 字節(jié), 在此L< 2 ^ 32 |
ENUM(‘value1’,’value2’,…) | 1 或 2 個字節(jié), 取決于枚舉值的數(shù)目(最大值65535) |
SET(‘value1’,’value2’,…) | 1,2馋辈,3覆获,4或8個字節(jié), 取決于集合成員的數(shù)量(最多64個成員) |
1 整型
如何驗證存儲的數(shù)據(jù)范圍 ? 編程計算機 或者 python代碼
?符號與有符號為什么?大?小不同? 因為需要用?個bit存儲符號
默認是有符號好使?符號呢?
來?個測試,創(chuàng)建表 添加tinyint類型字段 插?255 發(fā)現(xiàn)最大還是127 說明
默認是有符號的 如何設置有符號?
創(chuàng)建表是在數(shù)據(jù)類型后?添加unsigned 選擇哪個來使用呢?
常規(guī)int就?夠使?了
全?bigint也行 只不過會多占一些空間,但是硬盤好像也不值錢 ?而且對你的程序運行速度沒啥影響
最好是根據(jù)你的實際情況 ?如存年齡tinyint就最夠
思考: 可以給整型加上寬度限制嗎? 可以,嘗試一下,在建表時 為int指定寬度為更大的范圍
插?超過int范圍的數(shù)據(jù)
查看結果 發(fā)現(xiàn)任然只能存儲4字節(jié)最大值
也就是說: 整型的數(shù)據(jù)能保存的數(shù)據(jù)范圍由數(shù)據(jù)類來決定
那么寬度對于整型?言有什么意義嗎?
對于整型?言 寬度用于控制顯示的長度
例如 int(10) 則表示顯示的時候 如果不足10位則不足10位
嘗試一下 發(fā)現(xiàn)沒什么? 因為你僅僅告訴她需要填充10位 并沒有說?什么 填充
所以 要控制顯示寬度 不僅需要指定寬度還要指定 zerofill 以0填充 有沒有發(fā)現(xiàn)?個問題 我們之前創(chuàng)建的表并沒有指定顯示寬度 那他有沒有呢?
desc查看一下
有?且剛好就是 能夠存儲的最大范圍的長度 所以如果你使用的是整型 則
沒有必要指定顯示寬度
2浮點
float(m,d) 4字節(jié)
double(m,d) 8字節(jié)
decimal(m,d) 根據(jù)長度確定
在浮點類型中 后面的m表示整體?度 d表示小數(shù)長度 注意:是長度和字節(jié)數(shù)?關 那么整數(shù)部分的長度就是m-d
例例如 float(5,3) 最?能存出 99,999
三種類型的區(qū)別
相同處: ?數(shù)部分最大精度都是30 不同處:
1.float double 總長度最大為255
2.float double 都是不清準的小數(shù) decimal是精準的 3.double的精度?float?一些
如何取舍根據(jù)實際情況 如果對精度要求? 比如銀行系統(tǒng) 就是用decimal 否則一般使用float
3char和varchar
寬度?于限制字符的長度(字符數(shù)) char 為定?
超出范圍則報錯 不足則用空格在右邊補?長度 varchar為變?
超出范圍則報錯 不足則有幾個字符就存幾個
測試:
create table t10(a char(4),b varchar(4)); insert into t10 values("a","a");
select *from t10;
decimal為65
發(fā)現(xiàn)并沒有區(qū)別!
介紹一個函數(shù) lenght(列名) 可以查詢某?列的長度 select char_length(a),char_length(b) from t10; 發(fā)現(xiàn)?度也相同!
這是為什么?
因為mysql?動把后面的空格給干掉了了! 那怎么能看一下呢?
需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH set global sql_mode =
"PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 再次查看:select char_length(a),char_length(b) from t10; 由此可以看出定長的char mysql的確?動將后?面的空格處理掉了
再來看一個例子:
create table t5(name char(4)); insert into t5 value("yh") insert into t5 value("egon")
select *from t5 where name = "yh "
無論后面有多少個空格都會?動去掉
換?種寫法:
select *from t5 where name =like "yh " 此時就不行了 自動去除空格僅在第一種寫法中生效
總結:使?用char類型時 如果數(shù)據(jù)長度不足則會?動補? 在讀取數(shù)據(jù)時 mysql會自動去除其中的空格
因為這是mysql內(nèi)部的一個存儲機制 與我們的應?程序邏輯?關
注意的是 如果數(shù)據(jù)不足規(guī)定長度 使用like 來模糊匹配時 硬盤上存儲 的空格也算作有效字符
所以我們應該在后面加上% 表示后面任意長度的字符都匹配 像這樣 :select *from t5 where name =like "yh%" 當然你也可以使用_ 表示一個任意字符 模糊匹配后續(xù)會詳細講
如何抉擇?
你覺得那種類型好呢? 到底哪種好我們得分析一下 相同點:都是字符類型 不同點:
1.char 是固定長度 會浪費空間 存取速度快
2.varchar 是可變長度 節(jié)省空間
存取速度慢 思考 可變長度如何實現(xiàn)?
假設我們有兩個類型 char(4)
存儲: axx bx bbbbcccc varcahr(4)
存儲:axxbxbbbbcccc
如何取出某個名字?
需要在前面保存字符串的長度 (1btyes+axx)(1bytes+bx)(1bytes+bbbb)(1bytes+cccc) 長度最?為兩個字節(jié)2bytes
這就意味著 一些情況下 varchar更占用空間 并且需要計算字符串長度 所以存取速度慢
TIMESTAMP 自帶默認狀態(tài)墩新,默認時間就是當前時間