{ MySQL基礎數據類型}一 介紹 二 數值類型 三 日期類型 四 字符串類型 五 枚舉類型與集合類型
閱讀目錄
- 一 介紹
- 二 數值類型
- 三 日期類型
- 四 字符串類型
- 五 枚舉類型與集合類型
一 介紹
存儲引擎決定了表的類型,而表內存放的數據也要有不同的類型,每種數據類型都有自己的寬度,但寬度是可選的
詳細參考:
- http://www.runoob.com/mysql/mysql-data-types.html
- http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html
mysql常用數據類型概覽:
#1. 數字:
整型:tinyinit int bigint
小數:
float :在位數比較短的情況下不精準
double :在位數比較長的情況下不精準
0.000001230123123123
存成:0.000001230000
decimal:(如果用小數,則用推薦使用decimal)
精準
內部原理是以字符串形式去存
#2. 字符串:
char(10):簡單粗暴,浪費空間,存取速度快
root存成root000000
varchar:精準,節省空間,存取速度慢
sql優化:創建表時,定長的類型往前放,變長的往後放
比如性別 比如地址或描述信息
>255個字符,超了就把文件路徑存放到數據庫中。
比如圖片,視頻等找一個文件服務器,數據庫中只存路徑或url。
#3. 時間類型:
最常用:datetime
#4. 枚舉類型與集合類型
二 數值類型
1、整數類型
整數類型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
作用:存儲年齡,等級,id,各種號碼等
整數類型分類整數類型範圍驗證
註意:對於整型來說,數據類型後面的寬度並不是存儲長度限制,而是顯示限制,假如:int(8),那麽顯示時不夠8位則用0來填充,夠8位則正常顯示,通過zerofill來測試,存儲長度還是int的4個字節長度。默認的顯示寬度就是能夠存儲的最大的數據的長度,比如:int無符號類型,那麽默認的顯示寬度就是int(10),有符號的就是int(11),因為多了一個符號,所以我們沒有必要指定整數類型的數據,沒必要指定寬度,因為默認的就能夠將你存的原始數據完全顯示
int的存儲寬度是4個Bytes,即32個bit,即2**32
無符號最大值為:4294967296-1
有符號最大值:2147483648-1
有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值則需要11位才能顯示完全,所以int類型默認的顯示寬度為11是非常合理的
最後:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok
說到這裏我想提一下MySQL的mode設置,看我這篇博客:https://www.cnblogs.com/clschao/articles/9962347.html,看完博客應該就能理解MySQL的mode了。
2、浮點型
定點數類型 DEC,等同於DECIMAL
浮點類型:FLOAT DOUBLE
作用:存儲薪資、身高、溫度、體重、體質參數等
浮點型分類
浮點型測試
3、位類型(了解,不講~~)
BIT(M)可以用來存放多位二進制數,M範圍從1~64,如果不寫默認為1位。
註意:對於位字段需要使用函數讀取
bin()顯示為二進制
hex()顯示為十六進制
三 日期類型
類型:DATE,TIME,DATETIME ,IMESTAMP,YEAR
作用:存儲用戶註冊時間,文章發布時間,員工入職時間,出生時間,過期時間等
日期類型分類
日期類型測試
mysql的日期格式對字符串采用的是‘放松‘政策,可以以字符串的形式插入。
datetime與timestamp的區別工作中一般都用datetime就可以了。
對上面datetime與timestamp的區別中第四條的驗證
四 字符串類型
類型:char,varchar
作用:名字,信息等等
char和varchar的介紹
下面我們來進行一些測試,在測試之前,我們需要學一下mysql給我們提供的兩個方法:
length(字段):查看該字段數據的字節長度
char_length(字段):查看該字段數據的字符長度
char和varchar測試
測試結果總結:
針對char類型,mysql在存儲的時候會將不足規定長度的數據使用後面(右邊補全)補充空格的形式進行補全,然後存放到硬盤中,但是在讀取或者使用的時候會自動去掉它給你補全的空格內容,因為這些空格並不是我們自己存儲的數據,所以對我們使用者來說是無用的。
char和varchar性能對比:
以char(5)和varchar(5)來比較,加入我要存三個人名:sb,ssb1,ssbb2
char:
優點:簡單粗暴,不管你是多長的數據,我就按照規定的長度來存,5個5個的存,三個人名就會類似這種存儲:sb ssb1 ssbb2,中間是空格補全,取數據的時候5個5個的取,簡單粗暴速度快
缺點:貌似浪費空間,並且我們將來存儲的數據的長度可能會參差不齊
varchar:
varchar類型不定長存儲數據,更為精簡和節省空間
例如存上面三個人名的時候類似於是這樣的:sbssb1ssbb2,連著的,如果這樣存,請問這三個人名你還怎麽取出來,你知道取多長能取出第一個嗎?(超哥,我能看出來啊,那我只想說:滾犢子!)
不知道從哪開始從哪結束,遇到這樣的問題,你會想到怎麽解決呢?還記的嗎?想想?socket?tcp?struct?把數據長度作為消息頭。
所以,varchar在存數據的時候,會在每個數據前面加上一個頭,這個頭是1-2個bytes的數據,這個數據指的是後面跟著的這個數據的長度,1bytes能表示2**8=256,兩個bytes表示2**16=65536,能表示0-65535的數字,所以varchar在存儲的時候是這樣的:1bytes+sb+1bytes+ssb1+1bytes+ssbb2,所以存的時候會比較麻煩,導致效率比char慢,取的時候也慢,先拿長度,再取數據。
優點:節省了一些硬盤空間,一個acsii碼的字符用一個bytes長度就能表示,但是也並不一定比char省,看一下官網給出的一個表格對比數據,當你存的數據正好是你規定的字段長度的時候,varchar反而占用的空間比char要多。
Value | CHAR(4) | Storage Required | VARCHAR(4) | Storage Required |
---|---|---|---|---|
‘‘ |
‘ ‘ |
4 bytes | ‘‘ |
1 byte |
‘ab‘ |
‘ab ‘ |
4 bytes | ‘ab‘ |
3 bytes |
‘abcd‘ |
‘abcd‘ |
4 bytes | ‘abcd‘ |
5 bytes |
‘abcdefgh‘ |
‘abcd‘ |
4 bytes | ‘abcd‘ |
5 bytes |
缺點:存取速度都慢
總結:
所以需要根據業務需求來選擇用哪種類型來存
其實在多數的用戶量少的工作場景中char和varchar效率差別不是很大,最起碼給用戶的感知不是很大,並且其實軟件級別的慢遠比不上硬件級別的慢,所以你們公司的運維發現項目慢的時候會加內存、換nb的硬盤,項目的效率提升的會很多,但是我們作為專業人士,我們應該提出來這樣的技術點來提高效率。
但是對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(所有數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度的CHAR列不一定比使用可變長度VARCHAR列性能要好。因而,主要的性能因素是數據行使用的存儲總量。由於CHAR平均占用的空間多於VARCHAR,因此使用VARCHAR來最小化需要處理的數據行的存儲總量和磁盤I/O是比較好的。
所以啊,兩個選哪個都可以,如果是大型並發項目,追求高性能的時候,需要結合你們服務器的硬件環境來進行測試,看一下char和varchar哪個更好,這也能算一個優化的點吧~~~~
官網詳解
其他的字符串類型:BINARY、VARBINARY、BLOB、TEXT
其他類型簡單介紹
五 枚舉類型與集合類型
字段的值只能在給定範圍中選擇,如單選框,多選框,如果你在應用程序或者前端不做選項限制,在MySQL的字段裏面也能做限制
enum 單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female
set 多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)
枚舉類型(enum)
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM(‘x-small‘, ‘small‘, ‘medium‘, ‘large‘, ‘x-large‘)
);
INSERT INTO shirts (name, size) VALUES (‘dress shirt‘,‘large‘), (‘t-shirt‘,‘medium‘),(‘polo shirt‘,‘small‘);
集合類型(set)
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET(‘a‘, ‘b‘, ‘c‘, ‘d‘));
INSERT INTO myset (col) VALUES (‘a,d‘), (‘d,a‘), (‘a,d,a‘), (‘a,d,d‘), (‘d,a,d‘);
測試
{ MySQL基礎數據類型}一 介紹 二 數值類型 三 日期類型 四 字符串類型 五 枚舉類型與集合類型