MySQL之數(shù)據(jù)類型

引用

  1. 整型
數(shù)據(jù)類型 字節(jié)數(shù) 帶符號最小值 帶符號最大值 不帶符號最小值 不帶符號最大值
TINYINT 1 -128 127 0 255
SMALLINT 2 -32768 32767 0 65535
MEDIUMINT 3 -8388608 8388607 0 16777215
INT 4 -2147483648 2147483647 0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807 0 18446744073709551616
  • 整型(N)形式
    在開發(fā)中,我們會碰到有些定義整型的寫法是int(11),這種寫法從我個人開發(fā)的角度看我認為是沒有多大用,不過作為一個知識點做一下講解吧。
    int(N)我們只需要記住兩點:

    • 無論N等于多少,int永遠占4個字節(jié)
    • N表示的是顯示寬度,不足的用0補足,超過的無視長度而直接顯示整個數(shù)字,但這要整型設(shè)置了unsigned zerofill才有效
  • 常用SQL語句

    -- 如果存在就刪除表
    drop table if exists test_int;
    
    -- 新建數(shù)據(jù)表
    create table test_int (
    a int(5) ,
    b int(5) unsigned,
    c int(5) unsigned zerofill,
    ) engine=innodb charset=utf8;
    
    -- 插入數(shù)據(jù)
    insert into test_int values(1,2,3);
    
    -- 刪除數(shù)據(jù)
    delete from test_int where a = 1;
    
    -- 更新數(shù)據(jù)
    update test_int set b = 6 where a= 1;
    
    -- 查詢數(shù)據(jù)
    select * from test_int;
    
  1. 浮點型
數(shù)據(jù)類型 字節(jié)數(shù) 備注
float 4 單精度浮點型
double 8 雙精度浮點型
decimal 定點型
  • float(M,D)、double(M、D)的用法規(guī)則

    • 前面的M指定了總的位數(shù),后面的D指定了小數(shù)的位數(shù),所以整數(shù)位數(shù)為M-D
    • D表示浮點型數(shù)據(jù)小數(shù)點之后的精度,假如超過D位則四舍五入,即1.233四舍五入為1.23,1.237四舍五入為1.24
    • M表示浮點型數(shù)據(jù)總共的位數(shù),D=2則表示總共支持五位,即小數(shù)點前只支持三位數(shù)
    • 不指定M、D的時候,會按照實際的精度來處理
  • decimal和float/double的區(qū)別,主要體現(xiàn)在兩點上:

    • float/double在db中存儲的是近似值,而decimal則是以字符串形式進行保存的
    • decimal(M,D)的規(guī)則和float/double相同,但區(qū)別在float/double在不指定M、D時默認按照實際精度來處理而decimal在不指定M、D時默認為decimal(10, 0)
  • 常用SQL語句

    -- 新建數(shù)據(jù)表
    create table if not exists test_float (
      f float(5,2),
      d double(5,3),
    ) engine=innodb charset=utf8;
    
    -- 插入數(shù)據(jù)
    insert into test_float values(1.23,1.234);
    
    -- 刪除數(shù)據(jù)
    delete from test_float where f >= 1.23;
    
    -- 更新數(shù)據(jù)
    update test_float set d = 2.234 where f >= 1.23;
    
    -- 查詢數(shù)據(jù)
    select * from test_float;  
    
  1. 日期類型
日期時間類型 占用空間 日期格式 最小值 最大值 零值表示
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4 bytes YYYY-MM-DD HH:MM:SS 19700101080001 2038 年的某個時刻 00000000000000
DATE 3 bytes YYYY-MM-DD 1000-01-01 9999-12-31 0000-00-00
TIME 3 bytes HH:MM:SS -838:59:59 838:59:59 00:00:00
YEAR 1 bytes YYYY 1901 2155 0000
  • DATETIME
    DATETIME 用于表示 年月日 時分秒,是 DATE 和 TIME 的組合,并且記錄的年份(見上表)比較長久。如果實際應(yīng)用中有這樣的需求,就可以使用 DATETIME 類型。

  • TIMESTAMP
    TIMESTAMP 用于表示 年月日 時分秒,但是記錄的年份(見上表)比較短暫。
    TIMESTAMP 和時區(qū)相關(guān),更能反映當前時間。當插入日期時,會先轉(zhuǎn)換為本地時區(qū)后再存放;當查詢?nèi)掌跁r,會將日期轉(zhuǎn)換為本地時區(qū)后再顯示。所以不同時區(qū)的人看到的同一時間是 不一樣的。
    表中的第一個 TIMESTAMP 列自動設(shè)置為系統(tǒng)時CURRENT_TIMESTAMP)。當插入或更新一行,但沒有明確給 TIMESTAMP 列賦值,也會自動設(shè)置為當前系統(tǒng)時間。如果表中有第二個 TIMESTAMP 列,則默認值設(shè)置為0000-00-00 00:00:00。
    TIMESTAMP 的屬性受 Mysql 版本和服務(wù)器 SQLMode 的影響較大。
    如果記錄的日期需要讓不同時區(qū)的人使用,最好使用 TIMESTAMP。

  • DATE
    DATE 用于表示 年月日,如果實際應(yīng)用值需要保存 年月日 就可以使用 DATE。

  • TIME
    TIME 用于表示 時分秒,如果實際應(yīng)用值需要保存 時分秒 就可以使用 TIME。

  • YEAR
    YEAR 用于表示 年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年。 默認是4位。如果實際應(yīng)用只保存年份,那么用 1 bytes 保存 YEAR 類型完全可以。不但能夠節(jié)約存儲空間,還能提高表的操作效率。

  • 如需存儲時間戳,可用BIGINT保存指定時間的毫秒值。

    -- 新建數(shù)據(jù)表
    create table if not exists test_datetime (
      date0 date,
      time0 time,
      year0 year,
      timestamp0 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP(),
      datetime0 datetime,
      create_time timestamp default current_timestamp comment "創(chuàng)建時間",
      update_time timestamp default current_timestamp on update current_timestamp comment "修改時間",
    ) engine=innodb charset=utf8;
    
    -- 插入數(shù)據(jù)
    insert into test_datetime values(now(),now(),now(),now(),now());
    
    -- 刪除數(shù)據(jù)
    delete from test_datetime where date0 < now();
    
    
  1. 字符串
類型 大小 用途
CHAR 0-255字節(jié) 定長字符串
VARCHAR 0-65535 字節(jié) 變長字符串
TINYBLOB 0-255字節(jié) 不超過 255 個字符的二進制字符串
TINYTEXT 0-255字節(jié) 短文本字符串
BLOB 0-65 535字節(jié) 二進制形式的長文本數(shù)據(jù)
TEXT 0-65 535字節(jié) 長文本數(shù)據(jù)
MEDIUMBLOB 0-16 777 215字節(jié) 二進制形式的中等長度文本數(shù)據(jù)
MEDIUMTEXT 0-16 777 215字節(jié) 中等長度文本數(shù)據(jù)
LONGBLOB 0-4 294 967 295字節(jié) 二進制形式的極大文本數(shù)據(jù)
LONGTEXT 0-4 294 967 295字節(jié) 極大文本數(shù)據(jù)
  • 區(qū)別

    • CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉(zhuǎn)換。

    • BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節(jié)字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。

    • BLOB 是一個二進制大對象,可以容納可變數(shù)量的數(shù)據(jù)。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區(qū)別在于可容納存儲范圍不同。

    • TEXT 有 4 種文本類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應(yīng)的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據(jù)實際情況選擇。

  • char和varchar類型


    1. char是固定長度字符串,其長度范圍為0~255且與編碼方式無關(guān),無論字符實際長度是多少,都會按照指定長度存儲,不夠的用空格補足;
    2. varchar為可變長度字符串,在utf8編碼的數(shù)據(jù)庫中其長度范圍為0~21844;
    3. char實際占用的字節(jié)數(shù)即存儲的字符所占用的字節(jié)數(shù),varchar實際占用的字節(jié)數(shù)為存儲的字符+1或+2或+3;
    4. MySQL處理char類型數(shù)據(jù)時會將結(jié)尾的所有空格處理掉而varchar類型數(shù)據(jù)則不會;
    5. 如果char插入的字符串的長度已經(jīng)大于了可以插入的最大值,那么這個時候數(shù)據(jù)庫會報錯,而varchar會截取字符串。
  • varchar、text和blob

    1. 先說一下text,text和varchar是一組既有區(qū)別又有聯(lián)系的數(shù)據(jù)類型,其聯(lián)系在于當varchar(M)的M大于某些數(shù)值時,varchar會自動轉(zhuǎn)為text:
      M>255時轉(zhuǎn)為tinytext
      M>500時轉(zhuǎn)為text
      M>20000時轉(zhuǎn)為mediumtext
      所以過大的內(nèi)容varchar和text沒有區(qū)別,同事varchar(M)和text的區(qū)別在于:

    2. 單行64K即65535字節(jié)的空間,varchar只能用63352/65533個字節(jié),但是text可以65535個字節(jié)全部用起來。
      text可以指定text(M),但是M無論等于多少都沒有影響
      text不允許有默認值,varchar允許有默認值
      varchar和text兩種數(shù)據(jù)類型,使用建議是能用varchar就用varchar而不用text(存儲效率高),varchar(M)的M有長度限制,之前說過,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。

    3. 至于text和blob,簡單過一下就是text存儲的是字符串而blob存儲的是二進制字符串,簡單說blob是用于存儲例如圖片、音視頻這種文件的二進制數(shù)據(jù)的。

  • ENUM類型(枚舉類型)

    • ENUM('值1','值2',...,'值n')
      n-代表參數(shù)列表中的第n個值,這些值末尾的空格會被系統(tǒng)直接刪除。
      ENUM類型的值只能取列表中的一個元素。
      取值列表中最多能有65535成員。
      列表中的每一個值都有一個順序排列的編號,MySQL存入的是這個編號,而不是值。
  • SET類型
    在創(chuàng)建表時,SET類型的取值范圍就以列表的形式指定了。
    SET('值1','值2',...,'值n')
    SET類型的值最多只以是有64個元素構(gòu)成的組合。取值可以是其中的一個或多個。其它特性,與ENUM類似。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容