(二)數據類型


1、基本介紹

數據類型:
  數據類型是指列、存儲過程參數、表達式和局部變量的數據特征,其決定了數據的存儲格式,代表了不同的信息類型。具體包括:整型、小數型、日期時間型、字符型、復合型、二進制型。


2、整型

數據類型 存儲范圍 字節
TINYINT 有符號值:-128至127(-27至27-1)<br />無符號值:0至255(0至2^8-1) 1
SMALLINT 有符號值:-32768至32767(-215至215-1)<br />無符號值:0至65535(0至2^16-1) 2
MEDIUMINT 有符號值:-8388608至8388607(-223至223-1)<br />無符號值:0至16777215(0至2^24-1) 3
INT 有符號值:-2147483648至2147483647(-231至231-1)<br />無符號值:0至4294967295(0至2^32-1) 4
BIGINT 有符號值:-9223372036854775808至9223373036854775807(-263至263-1)<br />無符號值:0至18446744073709551615(0至2^64-1) 8

注意:

  1. 計算機在最終存儲數據時,是以二進制的形式存儲的,此時就涉及到存儲數字時正負數的問題。有符號位是指數字的最高位用0或1來表示數字是正數還是負數;無符號位則不存在數字是負數的情況,但二者的實際存儲范圍是一致的。詳細的介紹可以參考已完結的二進制基礎專題。
    <br />
  2. 假設說需要存儲一個人的年齡,一般來說大致范圍是0至100多一點,當然在存儲時可以選擇BIGINT類型,但是一條BIGINT類型的數據就占用8個字節,而TINYINT類型只占用1個字節,當待存儲數據的數量是上千萬條時,選擇TINYINT類型的優越性就會凸顯出來,因此在數據優化時的原則之一,就是選擇最合適的而不是最大的數據類型

3、小數型

數據類型 | 存儲范圍
----|------|----
DECIMAL(M,D)| M的取值范圍為1-65,取0時會被設為默認值,超出范圍會報錯。<br />D的取值范圍為0-30,而且必須<=M,超出范圍會報錯。<br />M是數字總位數,D是小數點后面的位數。<br /> M的默認取值為10,D默認取值為0。<br />用于表示精度確定的小數類型。
FLOAT[(M,D)]| -3.402823466E+38至-1.175494351E-38,<br />1.175494351E-38至3.402823466E+38。<br />M是數字總位數,D是小數點后面的位數。<br />如果M和D被省略,則根據硬件允許的限制來儲存值。<br />單精度浮點數精確到大約7位小數位。
DOUBLE[(M,D)]| -1.7976931348623157E+308至-2.2250738585072014E-308,<br />0,<br />2.2250738585072014E-308至1.7976931348623157E+308。<br />M是數字總位數,D是小數點后面的位數。

注意:

  1. “E+38”代表科學計數法,即1038,同理“E-38”指的是10-38。
    <br />
  2. M始終是大于或等于D,例如FLOAT(5,2),表示總共有5位數,小數點后有2位數,因此最大值為999.99。

4、日期時間型

列類型 | 格式| 存儲范圍| 存儲需求
----|------|----
YEAR| yyyy|‘1901’至‘2155’ |1
TIME| hh:mm:ss|'-838:59:59'至'838:59:59'| 3
DATE| yyyy-MM-dd|'1000-01-01'-'9999至12-31'| 3
DATETIME| yyyy-MM-dd hh:mm:ss|'1000-01-01 00:00:00'<br />至<br />'9999-12-31 23:59:59'| 8
TIMESTAMP| yyyy-MM-dd hh:mm:ss|'1970-01-01 00:00:01' UTC <br />至<br />'2038-01-19 03:14:07' UTC| 4

注意:

  1. YEAR可以儲存為2位或4位,默認是4位,當存儲為2位時,范圍是‘1970’至‘2069’。
    <br />
  2. TIMESTAMP即時間戳,會自動獲取當前的服務器時間,且與時區密切相關,如果以我國所在的東八區為例,則時間戳的范圍是'1970-01-01 08:00:01' UTC 至'2038-01-19 11:14:07'
    <br />
  3. TIME類型的小時數如此之大,是因為其不僅可以用于表示一天的時間,還可以為表示事件之間的時間間隔。

5、字符型

列類型 | 存儲需求
----|------|----
CHAR(M)| M個字節,0<=M<=255
VARCHAR(M)|如果記錄存儲長度在0-255字節之間,則共L+1個字節<br />如果記錄存儲長度超過255字節,則共L+2個字節<br />其中L<=M,且0<=M<=65535
TINYTEXT| L+1個字節,其中L<2^8
TEXT| L+2個字節,其中L<2^16
MEDIUMTEXT| L+3個字節,其中L<2^24
LONGTEXT| L+4個字節,其中L<2^32

注意:

  1. CHAR屬于定長類型,VARCHAR屬于變長類型,且都必須用括號注明其大小;不同的是,當存儲的數據小于指定長度時,CHAR類型會用空格補齊,而VARCHAR則不會,可參考下圖示例:



      當指定長度為4個字節的時候,不論存儲的值是多少,CHAR類型始終存儲4個字節,空缺用空格補齊;而VARCHAR類型則是根據數據的實際多少進行存儲,且用1個字節來記錄長度;當達到存儲設定的上限時,未被儲存的值會舍棄。
    <br />

  2. “L+x個字節”的意思是指對于變長類型在處理數據時,需要把數據內容和數據長度都保存起來,因此會保存需要的L個字節,另加x個字節來記錄長度。

6、復合型

列類型 | 存儲需求
----|------|----
ENUM('value1','value2',……)| 1或2個字節,取決于枚舉值的個數,最多65535個值
SET('value1','value2',……)| 1、2、3、4或8個字節,取決于SET成員的數目,最多64個成員

注意:

  1. ENUM類型只允許在枚舉值中取得一個值,可以更好的處理例如“人的性別”這種相互排拆的數據,類似于單選項。
    <br />
  2. SET類型可以從預定義的集合中取得任意數量的值,類似于多項選。

7、二進制型

列類型 | 存儲需求
----|------|----
BINARY(M)| M個字節,0<=M<=255
VARBINARY(M)|L+1個字節,其中L<=M,且0<=M<=65535
TINYBLOB| L+1個字節,其中L<2^8
BLOB| L+2個字節,其中L<2^16
MEDIUMBLOB| L+3個字節,其中L<2^24
LONGBLOB| L+4個字節,其中L<2^32

注意:

  1. BINARY和VARBINARY類型,類似于CHAR和VARCHAR類型。但是不同的是,其存儲的不是字符串,而是二進制串。
    <br />
  2. BLOB類型與TEXT類型相似,同樣具有4種大小不同的類型,只不過用來存儲二進制數據。
    <br />
  3. 二進制類型與字符串類型的區別在于:字符串類型的數據按字符為單位進行存儲,因此存在多種字符集、多種字符序;而二進制類型的數據按字節為單位進行存儲,僅存在二進制字符集binary。

版權聲明:歡迎轉載,歡迎擴散,但轉載時請標明作者以及原文出處,謝謝合作!             ↓↓↓
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容