mysql 數據類型_Mysql的數據類型

Mysql中分為三大數據類型:數值型、字符型、時間日期型

30c312195c6a47dd5547fabac41b5d02.png

數值型

數值型分為整型和小數型(包含小數部分的數據類型)

整形

Mysql中光整型數據類型就有五種:tinyint,smallint,mediumint,int,bigint

Tinyint:迷你整型,占用一個字節保存數據,能夠表示256個數值

Smallint:小整型,占用2個字節保存數據,能夠表示65536個數值

Mediumint:中整型,占用3個字節保存數據

Int:標准整型,占用4個字節,42億多

Bigint:大整型,占用8個字節保存數據

類型

字節

最小值(有符號/無符號)

最大值(有符號/無符號)

TINYINT

1

-128/0

127/255

SMALLINT

2

-32768/0

32767/65535

MEDIUMINT

3

-8388608/0

8388607/16777215

INT/INTEGE

4

-2147483648/0

2147483647

/4294967295

BIGINT

8

-9223372036854775808/0

9223372036854775807/18446744073709551615

為什么要有這么多整型?

1.      能夠最大效率的使用磁盤空間,做到最少浪費。根據實際業務分配內存空間來進行數據保證

2.      查詢的效率變高

如何在項目中選擇使用何種整型?

根據業務需求,某一類數據的邊界值,看邊界值落在那個整型范圍,就是用最小的那個。

在實際操作中tinyint,int使用的較多

無符號:表示數值只能是正的,不能有負數

語法:在字段類型后面使用unsigned進行標識

Agetinyint  unsigned//年齡是一個迷你整型,無符號表示(0,255);

顯示寬度:占的位數,當某個數值沒有達到顯示寬度的時候,在數值的左邊使用0來補足顯示寬度

默認的,系統不會進行0填充,需要給字段顯示增加一個屬性:zerofill,0填充

系統默認顯示的寬度是數據類型是能顯示的最大寬度

0填充有一個特點:使用0填充必須使用無符號類型,不能用負數填充

0填充式專門用來配合顯示寬度:顯示寬度只是在數據的值沒有達到指定寬度的時候使用0填充,0填充或者顯示寬度都不會顯示原理數值的大小,值的大小有數據類型決定

什么地方會使用顯示寬度?

在一些需要使用0填充地方不改變原來值的大小,卻能夠用寬度來固定顯示數據,保證前段數據的顯示不會改變原來的css結構。比如說月份、日期、時間

小數型

帶有小數部分的數據

Mysql中小數型分為兩種:浮點型,定點型

浮動型:float和double

Float:采用4個字節保存數據

Double:采用8個字節保存數據

f14395b961de5bbade5f1137ea111295.png

浮點數的存儲使用4個字節32位儲存,第一位叫符號位,會使用符號位后面的8位用來存儲街碼(底數+指數),其它的用來表示數據。

浮點數會丟失精度

Float:最大有效位7位左右

Double:最大有效位15位左右

浮點數的使用方式

Float(M,D):M表示整個長度,D表示小數位的長度

數據處理

如果小數位超出指定長度,會自動四舍五入

如果在沒有指定小數位時,小數部分直接忽略,整數部分超出精度進行四舍五入

浮點數只適用於那些對數值精度要求不高m但是數量特別大的數據

凡是跟錢相關絕對不用浮點數

定點型:decimal

能夠自動的擴展寬度來保存數據,保證數據的精度,基於小數部分,如果超出指定長度,仍然會進行四舍五入

語法:decimal(M,D):M表示總長度,D小數長度

定點型和浮點型的區別

定點型能夠保證精度,二浮點型只能保證精度之內的數據的准確性,二精度之外都會變成0

浮動型如果在四舍五入過程中,如果會讓數據進行超出指定的整數長度,那么系統也是運行的

定點型如果在進位過程中超出指定的數據長度,那么將會報錯

定點型的數據范圍

8c8ab9b3ff041eff9adf4cbd74151e16.png

最大長度:Decimal(65,30)

凡是涉及到錢的都會在數據庫端使用decimal來進行數據的存儲和運算。

字符串型

Mysql有以下字符串類型:char,varchar,text,blob,enum,set

char(定長字符串):表示磁盤會分配固定的長度的空間去存儲數據

1.      如果數據不夠長度,空間依然被占用

2.      如果數據超出長度,系統會報錯

語法:char(L),L表示長度,L表示的字符長度,L的最多值255

varchar(變長字符串):表示磁盤空間會根據實際的長度來分配存儲空間,但是長度不能超過指定長度vachar(L),存儲的數據只能小於或者等於L個字符,L的理論值65535

varchar在存儲之外還有一個額外的1到2個字節來保存當前varchar的實際占用長度

char和varchar對比(utf8):一個字符= 3個字節

字符

Char(4)占用字節數

Varchar(4)占用字節數

Char實際所占字節數

Varchar實際所占字節數

A

4*3=12

12

3+1=4

ABCD

4*3=12

4*3+1=13

12

13

Char(255)

Varchar(256)

256個字符

255*3=765

256*3+2=770

765

770

255個字符

255*3=765

255*3+1=766

765

766

在非嚴格模式下(集成環境中),都是對類型要求不嚴格,所以當數據類型不符合要求,所以當數據類型不符合要求的時候,系統會進行自動轉換或者截取,從而不報錯。但是在嚴格模式中,系統不會做任何處理,只會做判斷,如果失敗就報錯。

如何區分使用vhar還是varchar

1.      所有字符串長度必須在255之內

2.      如果之風范創長度是固定,那么使用char

Md5值,身份證,手機號等等

3.      如果字符串長度不固定,那么所有vharchar

姓名,郵箱…

Char和varchar效率區別

1.      Char的效率比varchar要高

2.      Varchar比char節省空間

當字符串長度超過255之后,就不會使用varchar來進行數據保存,使用text

Text:字符串文本

Blob:二進制文本

在記錄里面不計算長度(不占記錄長度),基本可以“無限”存儲數據

Enum:枚舉,列出一系列的元素,可以從一堆元素中任選一個作為實際的值(單選框)

語法:enum(元素1,元素2….)

枚舉的意義?

1.      限制用戶的輸入(規划數據)

2.      能夠節省內存空間

枚舉使用兩個字節來保存數據,能夠保持65535個數據,是因為枚舉實際保存的不是字符串而是字符串元素所對應的數組

在定義枚舉的過程中,使用的雖然是字符串元素,但是在實際保存數據的時候,保存的是元素對應的數值

如何證明枚舉實際存儲的是數組呢?

使用算術運算符:mysql會在碰到算術運算符之后,自動進行數據轉換,轉換成數組類型

轉換的標准與PHP一致

語法:select字段+ 0 from表名

Set:集合,在定義字段之初,為字段值做一系列的限制,實際存儲值的時候,可以是集合類型中的多個元素。集合相當於多選框

Hobby set(‘游泳’,‘爬山’,’打球’,‘騎車’,’旅游’);

集合是使用8個字節,只能保持64個數據。集合定義的數據類型里面出現的可能的元素的最多個數為64個。

集合可以在插入數據的時候,將實際的順序打亂,但是在最終保持的時候,系統會將順序與定義的時候的順序對比,變成原來的

集合實際存儲的也是數值

原理:每一個枚舉元素,都占據一個位作為自己的空間,該空間上,如果當前元素被選中,那么值為1,否則為0。最終去計算十進制結果的時候,是將所有的二進制先顛倒過來,在計算。

使用set的好處

1.      節省空間

2.      能夠規范數據

對於枚舉和集合,在進行數據插入的時候,還可以使用數值插入

數據庫的字符串類型有很多,但是是從數據庫管理員的角度出發去考慮問題

1.      考慮磁盤空間的開銷

2.      考慮執行效率

做完PHP程序員,基本不考慮這些,只考慮如何方便PHP進行操作。所以真正配合PHP使用的字符串:char,varchar,和text

時間日期格式

類型

顯示格式

取值

存儲空間

零值

DATETIME

YYYY-MM-DD HH:MM:SS

'1000-01-01 00:00:00'到'9999-12-31 23:59:59'

8

0000-00-00 00:00:00

TIMESTAMP

YYYY-MM-DD HH:MM:SS

是‘1970-01-01 00:00:00’到2038-01-19 03:14:07

4

0000-00-00 00:00:00

DATE

YYYY-MM-DD

'1000-01-01'到'9999-12-31

3

0000-00-00

TIME

HH:MM:SS

-838:59:59'到'838:59:59'

3

00:00:00

YEAR

YYYY

1901到2155

1

0000

Datetime:表示年月日時分秒,能夠表示9000年,占用8個字節

Timestamp:時間戳,使用標准整型存儲,表示確是年月日,時分秒

Date:日期部分,可以表示1000-9999年

Time:時間部分,表示的是一個時間段,從過去什么時間到以后某個時間

Year:年,使用一個字節存在,一個字節只能表示256個數值,在計算的時候加上1900再輸出

時間戳不能是PHP中的時間戳,而應該是時間戳范圍內對應的時間格式

注意:

1.      在mysql中,任意一條記錄(所有字段的集合)的長度不能超過65535個字節。

所以varchar能夠存儲的數據的真實長度會變化很大

GBK:varchar能夠存儲多少個字符?

65535/2 = 32767.5

utf8:varchar能夠存儲多少個字符?

(65535– 2) / 3 = 21844.3

2.      在mysql中,如果所有的字段里,沒有全部不允許為null,那么需要一個字節來保存null

所有字段都不為null

留出一個字節保存null

3.      text不占存儲長度空間,但是text本身需要占據10個字節來保存字段名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值