MYSQL 資料型別

good000發表於2021-10-25

標籤: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

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結,否則保留追究責任的權利。

《歡迎交流討論》

 

相關文章