1. 程式人生 > >04-MySQL中的資料型別

04-MySQL中的資料型別

1 整體說明
MYsql的資料型別
#1. 數字:
    整型:tinyint  int  bigint
    小數:
        float :在位數比較短的情況下不精準
        double :在位數比較長的情況下不精準
            0.000001230123123123
            存成:0.000001230000

        decimal:(如果用小數,則用推薦使用decimal)
            精準
            內部原理是以字串形式去存

#2. 字串:
    char(10):簡單粗暴,浪費空間,存取速度快
            root存成root000000
    varchar:精準,節省空間,存取速度慢

    sql優化:建立表時,定長的型別往前放,變長的往後放
                    比如性別           比如地址或描述資訊

    >255個字元,超了就把檔案路徑存放到資料庫中。
            比如圖片,視訊等找一個檔案伺服器,資料庫中只存路徑或url。


#3. 時間型別:
    最常用:datetime


#4. 列舉型別與集合型別
   enum 和set

2 數值型別
整型型別:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:儲存年齡、等級、id、各種號碼等。
說明:
(1)預設是有符號的
(2)定義無符號的資料型別:
unsigned :表示無符號  當前欄位新增約束
示例:create table t2(x int unsigned);
(3)該型別指定寬度時,僅僅只是指定查詢結果的顯示寬度,與儲存範圍無關(預設的顯示寬度,都是在最大值的基礎上加1),儲存範圍如下
(4)為什麼int型別預設顯示寬度為11
   int的儲存寬度是4個Bytes,即32個bit,即2**32

    無符號最大值為:4294967296-1

    有符號最大值:2147483648-1

    有符號和無符號的最大數字需要的顯示寬度均為10,而針對有符號的最小值則需要11位才能顯示完全,所以int型別預設的顯示寬度為11是非常合理的

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                -128 ~ 127
            無符號:
                0 ~ 255

            PS: MySQL中無布林值,使用tinyint(1)構造。
========================================
        int[(m)][unsigned][zerofill]

            整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -2147483648 ~ 2147483647
            無符號:
                    0 ~ 4294967295
========================================
        bigint[(m)][unsigned][zerofill]
            大整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號:
                    -9223372036854775808 ~ 9223372036854775807
            無符號:
                    0  ~  18446744073709551615

3. 浮點型
(1)定點數型別: DEC等同於DECIMAL

(2)浮點型別:FLOAT DOUBLE

(3)作用:儲存薪資、身高、體重、體質引數等
-------------------------FLOAT-------------------
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
#引數解釋:單精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

#有符號:
           -3.402823466E+38 to -1.175494351E-38,
           1.175494351E-38 to 3.402823466E+38

#無符號:
           1.175494351E-38 to 3.402823466E+38
#精確度:
           **** 隨著小數的增多,精度變得不準確 ****


 -------------------------DOUBLE-----------------------
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

#引數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30

#有符號:
           -1.7976931348623157E+308 to -2.2250738585072014E-308
           2.2250738585072014E-308 to 1.7976931348623157E+308

#無符號:
           2.2250738585072014E-308 to 1.7976931348623157E+308

#精確度:
           ****隨著小數的增多,精度比float要高,但也會變得不準確 ****

======================================
--------------------DECIMAL------------------------
decimal[(m[,d])] [unsigned] [zerofill]

#引數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。


#精確度:
           **** 隨著小數的增多,精度始終準確 ****
           對於精確數值計算時需要用此型別
           decaimal能夠儲存精確值的原因在於其內部按照字串儲存。

4 日期型別
(1)型別:DATE TIME DATETIME TIMESTAMP YEAR
(2)作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生時間,過期時間等
(3)語法:
        YEAR
            YYYY(1901/2155)

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)

(4)datatime和timestamp的區別

    在實際應用的很多場景中,MySQL的這兩種日期型別都能夠滿足我們的需要,儲存精度都為秒,但在某些情況下,會展現出他們各自的優劣。
    下面就來總結一下兩種日期型別的區別。

    1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。

    2.DATETIME儲存時間與時區無關,TIMESTAMP儲存時間與時區有關,顯示的值也依賴於時區。在mysql伺服器,
    作業系統以及客戶端連線都有時區的設定。

    3.DATETIME使用8位元組的儲存空間,TIMESTAMP的儲存空間為4位元組。因此,TIMESTAMP比DATETIME的空間利用率更高。

    4.DATETIME的預設值為null;TIMESTAMP的欄位預設不為空(not null),預設值為當前時間(CURRENT_TIMESTAMP),
    如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。

5 列舉和集合
        create table consumer(
                  id int,
                  name varchar(50),
                  sex enum('male','female','other'),
                  level enum('vip1','vip2','vip3','vip4'),#在指定範圍內,多選一
                  fav set('play','music','read','study') #在指定範圍內,多選一和多選多
                );
        insert into consumer values (1,'alex','other','vip2','play,read,study');