1. 程式人生 > >{ MySQL基礎數據類型}一 介紹 二 數值類型 三 日期類型 四 字符串類型 五 枚舉類型與集合類型

{ MySQL基礎數據類型}一 介紹 二 數值類型 三 日期類型 四 字符串類型 五 枚舉類型與集合類型

場景 簡單介紹 post big varchar run cnblogs 磁盤 table

閱讀目錄

  • 一 介紹
  • 二 數值類型
  • 三 日期類型
  • 四 字符串類型
  • 五 枚舉類型與集合類型

一 介紹

  存儲引擎決定了表的類型,而表內存放的數據也要有不同的類型,每種數據類型都有自己的寬度,但寬度是可選的

  詳細參考:

  • 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,DATETIMEIMESTAMP,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要多。

ValueCHAR(4)Storage RequiredVARCHAR(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基礎數據類型}一 介紹 二 數值類型 三 日期類型 四 字符串類型 五 枚舉類型與集合類型