MySql學習05---數據類型
MySql支持多種數據類型,主要有數值類型、日期/時間類型和字符串類型。
- 數值數據類型:包括整數類型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、浮點小數數據類型FLOAT和DOUBLE,定點小數類型DECIMAL。
- 日期/時間類型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。
- 字符串類型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串類型又分為文本字符串和二進制字符串。
一. 整數類型
說明:TINYINT需要1個字節(8bits)來存儲,那麽它的無符號數的最大值為2的八次方減1. 有符號的最大值是2的7次方減1.
id int(4) 代表的是在id字段中的數據一般只顯示4位數字的寬度。
note:顯示寬度和數據類型的取值範圍是無關的。顯示寬度只是指明了Mysql最大可能顯示的數字個數,數值的位數小於指定的寬度時會由空格填充;如果插入了大於顯示寬度的值,只要該值不超過該類型整數的取值範圍,數值依然可以插入,而且能夠顯示出來。比如:假如向id字段插入一個數值19999,當使用select查詢該列的時候,Mysql顯示的將時完整的帶有5位數字的19999,而不是4位數字的值。
note:其它整型數據類型也可以在定義表結構時指定所需要的顯示寬度,如果不指定,則系統為每一種類型指定默認的寬度值。比如:
說明:系統將添加不同的默認顯示寬度。這些顯示寬度能夠保證顯示每一種數據類型可以取到取值範圍內的所有值。例如TINYINT有符號和無符號數的取值範圍分別為-128-127,由於負號占了1個數字,因此TINYINT默認的顯示寬度為4.同理,其它整數類型的默認顯示寬度與其它符號數的最小值的寬度相同。
note:顯示寬度只用於顯示,並不能限制取值範圍和占用空間。如:INT(3)會占用4個字節的存儲空間,並且允許的最大值也不會是999,而是INT整型所允許的最大值。
二. 浮點數類型和定點數類型
MySql中使用浮點數和定點數來表示小數。浮點類型有兩種:單精度浮點類型(FLOAT)和雙精度類浮點類型(DOUBLE)。定點類型只有一種:DECIMAL。浮點類型和定點類型可以用(M,N)來表示,其中M稱為精度,表示總共的位數;N稱為標度,是表示小數的位數。
note:不論是定點還是浮點類型,如果用戶指定的精度超出精度範圍,則會四舍五入進行處理。
說明:可以看到FLOAT和DOUBLE在進行四舍五入時候沒有給出警告,但是DECIMAL卻給出了數據被截斷的警告。
浮點數相對於定點數的有點事在長度一定的情況下,浮點數能夠表示更大的數據範圍,它的缺點是會引起精度問題。
float,double,decimal的區別:
float數值類型用於表示單精度浮點數值,而double數值類型用於表示雙精度浮點數值,float和double都是浮點型,而decimal是定點型;
MySQL 浮點型和定點型可以用類型名稱後加(M,D)來表示,M表示該值的總共長度,D表示小數點後面的長度,M和D又稱為精度和標度,如float(7,4)的 可顯示為-999.9999,MySQL保存值時進行四舍五入,如果插入999.00009,則結果為999.0001。
FLOAT和DOUBLE在不指 定精度時,默認會按照實際的精度來顯示,而DECIMAL在不指定精度時,默認整數為10,小數為0。
1、CREATE TABLE test(f FLOAT(5,2) DEFAULT NULL,d DOUBLE(5,2) DEFAULT NULL,de DECIMAL(5,2) DEFAULT NULL);
2、DESC test;
3、INSERT INTO test(f,d,de) VALUES(1.23,1.23,1.23);
數據插入都正確
4、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.23);
數據插入都正確,但是f和d由於標度的限制,舍去了最後一位。
5、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);
數據也插入成功,但是有一個警告提示:
1 queries executed, 1 success, 0 errors, 1 warnings
Note Code : 1265
Data truncated for column ‘de‘ at row 1
6、將id1,id2,id3的精度和標度都去掉
ALTER TABLE test MODIFY f FLOAT;
ALTER TABLE test MODIFY d DOUBLE;
ALTER TABLE test MODIFY de DECIMAL;
DELETE FROM test;
DESC test;
7、INSERT INTO test(f,d,de) VALUES(1.234,1.234,1.234);
1 queries executed, 1 success, 0 errors, 1 warnings
Note Code : 1265
Data truncated for column ‘de‘ at row 1
f和d的數據正確插入,而de被截斷。
浮點數如果不寫精度和標度,則會按照實際顯示,如果有精度和標度,則會將數據四舍五入後插入,系統不報錯,定點數如果不設置精度和標度,剛按照默認的(10,0)進行操作,如果數據超過了精度和標度值,則會警告!
同時,對數據求SUM()時會出現不同的結果,float和double求SUM都會出現很多小數點,而decimal求SUM得到的是精準數值:
8、INSERT INTO test(f,d,de) VALUES(1.234,0.01,1.23);
數據都插入成功
9、SELECT SUM(f),SUM(d),SUM(de) FROM test;
理論上SUM(f)=3.698,SUM(d)=2.474,SUM(de)=3.46,但f,d都出現後面很長的一串浮點小數點。
三. 日期與時間類型
1. YEAR
存儲年。有兩種方式,輸入2位的或者4位的。並且,既可以輸入整型,也可以輸入字符串。
(1)輸入2位的
(2)插入4位的
2. TIME
TIME類型用於只需要時間信息的值。
3. 查看系統當前日期
NOW()
四. 文本字符串類型
VARCHAR和TEXT、BLOB都是變長類型。對於其存儲需求取決於列值得實際長度(在上面表格中用L表示),而不是取決於類型的最大可能尺寸。例如,一個VARCHAR(10)列能保存最大長度為10個字符的一個字符串,實際的存儲需要是姐夫穿的長度L,加上1個字節以記錄字符串的長度。對於字符“abcd”,L為4,而存儲要求是5個字節。
1. CHAR和VARCHAR類型
CHAR(M)為固定長度字符串,在定義時指定字符串列長。當保存時在右側填充空格以達到指定的長度。M表示列長度。比如,CHAR(4)定義了一個固定長度的字符串列,其包含的字符個數最大為4.當檢索到CHAR值時,尾部的空格將被刪除掉。
VARCHAR(M)是長度可變的字符串,M表示最大列長度。VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,而其實際占用的空間為字符串的實際長度加1.比如,VARCHAR(50)定義了一個最大長度為50的字符串,如果插入的字符串只有10個字符,則實際存儲的字符串為10個字符和一個字符串結束字符。VARCHAR在值保存和檢索時尾部的空格依然保留。
當查詢時CHAR(4)和VARCHA(4)的值並不一定相同,比如:
會發現:ch在保存“ab "時,將末尾的兩個空格刪除了,而vch沒有刪除。
2. TEXT類型
3. ENUM類型
可以看到,這裏的索引值和前面所述的相同。
在比如:
系統報錯,因為字符串值test不再ENUM列表中。並且,發現插入列表中的值”good“或者插入其對應的序號‘2‘的結果時一樣的。
4. SET類型
5. 二進制字符串類型
具體用的時候再研究。
參考文獻
《Mysql5.7從入門到精通》
MySql學習05---數據類型