標簽:MYSQL/數據庫/DBA/整形/字符串/
概述
當你學習一門數據庫語言的時候了解其數據類型尤為的重要,接下來會詳細講解MYSQL支持的每一種數據類型。
所有的測試基於MYSQL 5.6以上版本。
目錄
數據類型
整形
以TINYINT為例,該數據類型是1個字節長度,一個字節=8bit,所以對於無符號存儲的數值最大=11111111=2的8次方-1=255,對於有符號就是[-128-127]
在整形數值類型中比較常用到的有INT、BIGINT這兩種類型,可以指定在數據類型后面加上類型的長度例如INT(3),默認INT數據類型是11位長度,即INT(11)。
CREATE TABLE Tb(ID INT,ID1 INT(3)); DESC Tb;
還可以在定義數據類型的時候使用zerofill,即以0填充不夠的空間。語法如下:
ALTER TABLE Tb modify ID1 INT(5) zerofill; INSERT INTO Tb VALUES(1,1); SELECT * FROM Tb;
DESC Tb;
如果插入的數據長度大於數據類型的長度會不會截斷呢?
INSERT INTO Tb VALUES(2,2222222); SELECT * FROM Tb;
如果不是填充字段,插入的數據長度大於字段數據類型的長度則無法插入。
INSERT INTO Tb VALUES(222222222222222,2222222);
整形中的AUTO_INCREMENT屬性:一個表中只能存在一個AUTO_INCREMENT列,該列默認是非空,且該列必須定義成PRIMARY KEY 或者UNIQUE建,AUTO_INCREMENT值默認從1開始。
CREATE TABLE Ta( ID INT AUTO_INCREMENT NOT NULL ,PRIMARY KEY(ID)); DESC Ta;
INSERT INTO Ta VALUES();
浮點型
浮點數如果不寫精度和標度(M,D)【數值總長M位(不包含小數點),小數點后D位】,會按照實際精度值顯示,如果存在精度和標度,如果小數點的位數超過D會自動插入四舍五入的結果不會返回錯誤,如果總長度超過M-D位會插入失敗。
CREATE TABLE TP(ID1 FLOAT,ID2 FLOAT(4,2),ID3 DOUBLE,ID4 DOUBLE(4,2)); INSERT INTO TP VALUES(1.5678,1.5678,1.5678,1.5678); SELECT * FROM TP;
定點類型
定點數如果不寫精度和標度會以默認值decimal(10,0)來存儲,寫精度和標度(M,D)【數值總長M位(不包含小數點),小數點后D位】,會按照實際精度值顯示,如果存在精度和標度,如果小數點的位數超過D會自動插入四舍五入的結果並返回錯誤,如果總長度超過M-D位會插入失敗。。
CREATE TABLE TP1(ID1 DECIMAL,ID2 DECIMAL(4,2)); INSERT INTO TP1 VALUES(1.5678,1.5678); SELECT * FROM TP1;
插入的過程中會報數據被截斷“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'warning' at line 1”
位類型主要主要用來存放二進制數,SELECT查詢默認顯示10進制,可以使用bin()(顯示二進制格式)、hex()(顯示十六進制格式)函數來進行查詢.
CREATE TABLE T(ID BIT(4)); INSERT INTO T VALUES(2); SELECT BIN(ID),hex(ID) FROM T;
字符串類型
1、char(n)和varchar(n)中括號中n代表字符的個數,並不代表字節個數,所以當使用了中文的時候(UTF8)意味着可以插入m個中文,但是實際會占用m*3個字節。
2、同時char和varchar最大的區別就在於char不管實際value都會占用n個字符的空間,而varchar只會占用實際字符應該占用的空間+1,並且實際空間+1<=n。
3、超過char和varchar的n設置后,字符串會被截斷。
4、char的上限為255字節,varchar的上限65535字節,text的上限為65535。
5、char在存儲的時候會截斷尾部的空格,varchar和text不會。
6、varchar會使用1-3個字節來存儲長度,text不會。
在mysql5.6中varchar數據類型默認一個中文算一個長度,一個英文也算一個長度。而函數length()默認一個英文算一個長度,一個中文算三個長度。
時間日期類型
默認系統日期:CURRENT_TIMESTAMP,當前日期now(),
datetime有時候發現是占用6個字節長度
時間值類型默認有兩個屬性,分別是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP兩種,使用情況分別如下:
1. CURRENT_TIMESTAMP 當要向數據庫執行insert操作時,如果有字段屬性設為 CURRENT_TIMESTAMP,則無論這個字段有木有set值都插入當前系統時間。 2. ON UPDATE CURRENT_TIMESTAMP
當當前行有UPDATE操作時無論該操作是否是更新包含‘ON UPDATE CURRENT_TIMESTAMP’數學的字段,該字段的值也會被更改。
總結
每個版本的數據類型在長度上面可能會存在差異,如果沒把握可以使用help 命令查詢當前版本的數據類型的信息,使用help 'data types'查詢當前版本的所有數據類型,使用help 'char'可以查詢char數據類型的信息。
注意:類似char(m)、varchar(m)、binary(m)這里的m指的不是字節而是字符個數,在utf8中一個中文也算一個字符,所以可以存儲m個中文,但是實際的物理存儲還是根據官方規定的數據類型占用的字節來存儲,而不是這里的字符數,具體的數據類型存儲鎖占用的字節參考:http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html
備注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。 《歡迎交流討論》 |