Mysql數據類型

sql 將數據類型分為三大類:數值類型,字符串,日期時間型

數據庫數據類型.jpeg

一、數值型:

數值大類:整數型和小數型

整數型

整數型又分類五大類:

  • tinyint :迷你整型,使用一個字節存儲。表示的狀態最多為256
  • smallint:小整型,使用兩個字節。表示的狀態最多為65536
  • mediumint:中整型,使用3個字節。
  • int:標準整形,使用4個字節存儲
  • bigint:大整型,使用8個字節存儲


    WechatIMG22.jpeg

    SQL中所有的數值類型都默認有符號,分正負。
    有時候需要使用無符號數據,需要給數據類型限定:int unsigned
    顯示寬度:


    WechatIMG3.jpeg

    設置顯示寬度并不能真正影響數據存儲的大小,顯示寬度的意義在于數據不夠顯示寬度的時候,會自動讓數據變成對應的顯示寬度。通常需要搭配一個前置的0來增加寬度

小數型

帶有小數點或者范圍超出整數型的數據類型。
SQL中將小數型兩種:浮點型和定點型
浮點型:小數點浮動,精度有限,會丟失精度
定點型:小數點固定,精度固定,不會丟失精度

  • 浮點型:浮點型數據是一種精度型數據,超出指定范圍就會丟失精度,自動四舍五入
    float:單精度,占用四個存儲字節,精度范圍為7位左右
    double:雙精度,占用八個字節,精度范圍為15位左右
WechatIMG5.jpeg

創建浮點數據表:直接使用float表示沒有小數部分;
float(M,D)M:代表總長度,D代表小數部分長度

插入的數據可以是直接小數也可以是科學計數法

浮點型數據的插入:整數部分是不能超過長度的,但小數部分可以超出長度(系統會自動四舍五入),

  • 定點型
    決定保證整數部分不會被四舍五入,小數部分有可能丟失精度


    WechatIMG6.jpeg

    創建decimal表 與float 做對比

CREATE TABLE my_decimal(f1 float(10,2),d2 decimal(10,2))charset=utf8;

插入數據:定點數的整數部分一定不能超出指定長度(不可進位)
,小數部分可以超出。

INSERT INTO my_decimal VALUES(12345678.90,12345678.90); --有效數據
INSERT INTO my_decimal VALUES(1234.123456,1234.1234567); --有效數據,小數部分超出

浮點數進位導致整數部分長度溢出沒有問題,但定點數不行。

INSERT INTO my_decimal VALUES(99999999.99,99999999.99); --有效數據,float 超出精度,會進位,是整數部分長度溢出
INSERT INTO my_decimal VALUES(99999999.99,99999999.999); 
--無效效數據,decimal整數部分溢出

時間日期類型

  • datetime 格式:YYYY-mm-dd HH:ii:ss 表示范圍:1000到9999,有0值 0000-00-00 00:00:00
  • date 日期,就是datetime 中的date部分。
  • time 時間段,指定某個區間 ,-時間 到 +時間
  • timestamp 時間戳,從1970開始的 YYYY-mm-dd HH:ii:ss ,格式與datetime完全一致 可以自動更新,存儲時還是以時間格式存儲
  • year 年份,兩種形式,year(2)和year(4)
WechatIMG1.jpeg

網站是以PHP為實現的主要操作對象,PHP中非常強大時間日期處理函數:date(),只需要一個時間戳,就可以轉換為任意格式的時間,已PHP為主的時候,都是在數據庫使用時間戳(整型)來存儲時間。

字符串類型

在SQL中將字符串類型分為了6類:char ,varchar, text ,blob,enum,set

定長字符型

  • char ,磁盤(二維表)在定義結構的時候,就已經確定了最終的存儲長度
    char(L):length代表長度,可以存儲的長度,單位代表字符
    ,最大長度為255

char(4)在UTF8環境下,需要4*3=12個字節(UTF8三個字節表示一個字符)

變長字符串

  • varchar ,在分配空間的時候,按照最大的空間分配,但實際上最終用了多少,是根據具體的數據來確定。

varchar(L) L 表示字符長度,理論長度是65536字符,但是會多出1到2個字節,來確定存儲的實際長度,1個字節表示長度小于255 2個字節最大數能存65536正好等于最大長度。所以是1到2個字節。
但實際上如果字符長度超過255,既不是用char也不實用varchar,而是使用text

varchar(10) :如果存儲了10個漢字,在UTF8環境中,10*3+1 = 31個字節

如果存儲了3個漢字,在UTF8環境中,3*3+1 = 10個字節

WechatIMG7.jpeg
如何選擇定長或者邊長字符串?

定長字符串比較浪費磁盤空間,但效率高
邊長字符串比較節省磁盤空間,但效率低

文本字符串

通常來說,如果字符長度超過255,就會使用文本字符串
文本字符串根據根據存儲的數據格式進行分類:text和blob

  • text 存儲文字
  • blob 存儲二進制數據(通常不用)二進制文件通常只存路徑。

枚舉字符串

枚舉:將所有可能出現的結果都提前設計好,實際上存儲的數據必須是規定好的數據中的其中一個。
使用方法:
定義:enum(可能出現的元素列表)
如enum('男','女');
存儲數據時,只能使用上面定義好的數據:男或女
枚舉是從1開始
作用之一:規范數據格式
作用之二:節省存儲空間 枚舉實際存儲的是數值,而不是字符串本身,按照元素出現的順序從1編號。
證明:將取出來的枚舉做+0處理,就能判斷其存儲的類型。

WechatIMG3.jpeg

因為枚舉存儲的是數值,所以可以直接插入數值

集合型字符串

集合跟枚舉很類似:實際存儲的是數值而不是字符串,但集合是多選。

集合使用方式:
定義:set(集合列表)
使用:可以使用元素列表中的元素(多個),使用逗號分隔。

創建集合表:

create table my_set(
 hobby set('籃球','足球','乒乓球','羽毛球','游泳','跑步');
) charset=utf8;

插入數據:可以使用多個元素字符組合,也可以直接插入數值

insert into my_set('籃球,足球');
insert into my_set(3);-- 000011 表示選中籃球和足球

集合中:每個元素代表一個二進制位,被選中位1 ,未被選中0,集合列表第一位代表二進制中的最低位

集合的強大在于規范數據和節省空間。但對PHP來說,效率優先。基本用的很少。

mysql記錄長度

mysql規定一條記錄的最長不超過65535個字節
(varchar永遠都達不到理論長度)
varchar 的實際存儲長度能達到多少?看字符集編碼

  • UTF8環境:
    21844個字符
  • GBK
    32766


    WechatIMG4.jpeg

如果想要把少出的一個字節用掉,則可以添加一個新字段,類型為tinyint 且類型not null ,因為在mysql中,如果數據的屬性默認為空,會占用一個字節存儲null,想要釋放null占用的字節,則字段屬性不能為空

  • mysql text 數據類型,不占用記錄長度。

即可以額外存儲,但是text類型的字符串也屬于記錄的一部分,一定需要占用記錄中的的部分長度:10個字節。(保存數據的地址和長度)

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

推薦閱讀更多精彩內容

  • 本文基于MySQL5.6版本進行描述從大的方面來講,MySQL的數據類型分為4種 數值類型 日期和時間 字符串類型...
    黑哥兒666閱讀 773評論 0 0
  • 所謂的數據類型:對數據進行統一的分類,從系統的 角度出發為了能夠使用統一的方式進行管理,更好的利用有限的空間;SQ...
    coder_hong閱讀 632評論 0 0
  • 1、MySQL數據類型 ·整型: tinyint、INT、smallint、mediumint、bigint in...
    娑婆訶閱讀 864評論 0 2
  • 1. 優化數據結構 盡量避免null.可為NULL的列使索引,索引統計和值比較都更加復雜.它需要更多的存儲空間, ...
    滬上最強亞巴頓閱讀 1,062評論 2 18
  • 最近瘋狂的迷上block,紀錄一下初步使用block的情形。 1.先看一個最簡單的例子,網上很多類似的: int(...
    candy_r閱讀 1,175評論 1 9