1. 程式人生 > >MySQL數據庫8(七)列類型

MySQL數據庫8(七)列類型

最終 字段名 但是 ont 表示 英文 保存 15位 結果

列類型

整數類型

tinyint

迷你整型,系統采用一個字節來保存的整型,一個字節=8byte,最大能表示的數據是0-255。

smallint

小整型,系統采用兩個字節來保存的整型,能表示0-65535之間的整型

mediumint

中整型,采用三個字節來保存數據

int

整型,(標準整型),采用四個字節來保存數據。

bigint

大整型,采用八個字節來保存數據。

技術分享圖片

實際應用中,應該根據對應的數據範圍來選定對應的整型類型,通常使用的比較多的是tinyint和int。

無符號標識設定

無符號,表示存儲的數據在當前字段中,沒有負數(只有正數,如tinyint區間為0-255)

基本語法:在列類型之後加上一個unsigned。

顯示長度

技術分享圖片

顯示長度:指數據在數據顯示的時候,到底可以顯示多長位。

tinyint(3):表示最長可以顯示3位,unsigned說明只能是正數,0-255永遠不會超過三個字節長度。

tinyint(4):表示最長可以顯示4位,-128~127,帶符號(有符號位),需要四個字節。

顯示長度只是代表了數據是否可以達到指定的長度,但是不會自動滿足到指定長度:如果想要數據顯示的時候,保持最高位(顯示長度),那麽還需要給字段增加一個zerofill屬性才可以。

zerofill:從左側開始填充0(左側不會改變數值大小),所以負數的時候就不能使用zerofill,一旦使用zerofill就相當於確認該字段為unsigned。

技術分享圖片

數據顯示的時候,zerofill會在左側填充0到指定位,如果不足3位,那麽填充到3位,如果本身已經夠了或者超出,那麽就不再填充。

顯示長度可以自己設定,超出長度不超出範圍不會影響,只會對不夠長度(顯示長度)的進行補充

技術分享圖片

小數型

專門用來存儲小數的。

在mysql中將小數類型又分為兩類,浮點型和定點型。

浮點型

浮點型又稱之為精度類型,是一種有可能丟失精度的數據類型,數據有可能不那麽準確(尤其是在超出範圍的時候)。

浮點型之所以能夠存儲較大的數值(不精確),原因就是利用存儲數據的位來存儲指數。

整型:所有位都為數據位。

浮點型:有部分用於存儲數據,部分用於存指數。

float

float又稱之為單精度類型,系統提供4個字節用來存儲數據,但是能表示的數據範圍比整型大的多,大概是10^38;缺點:只能保證大概7個左右的精度(如果數據在7位數以內,那麽基本是準確的,但是如果超過了7位數,那麽就是不準確的)

基本語法:

float:表示不指定小數位的浮點數

float(M,D):表示一共存儲M個有效數字,其中小數部分占D位

float(10,2):整數部分為8位,小數部分為2位

技術分享圖片

註意:如果數據精度丟失,浮點型是按照四舍五入的方式進行計算。

技術分享圖片

說明:用戶不能直接插入數據超過指定的整數部分長度,但是如果是系統自動進位導致,系統可以承擔。

技術分享圖片

浮點數可以采用科學計數法存儲數據

技術分享圖片

double

double由稱之為雙精度類型,系統用 8個字節來存儲數據,表示的範圍約為10^308次方,但是精度也只有15位左右。

定點數

定點數:能夠保證數據精確的小數(小數部分可能不精確,超出長度會四舍五入),整數部分一定精確。

decimal

decimal定點數:系統自動根據存儲的數據來分配存儲空間,每大概9個數就會分配四個字節來進行存儲,同時整數和小數部分是分開的。

decimal(M,D):M表示總長度,最大值不能超過65位;D表示小數部分長度,最長不能超過30位。

時間日期型

date

日期類型:系統使用三個字節來存儲數據,對應的格式為:YYYY-mm-dd,能表示的範圍是從1000-01-01到9999-12-12,初始值為0000-00-00。

time

時間類型:能夠表示某個指定的時間,但是系統同樣是提供3個自己來存儲,對應的格式為:HH-ii-ss,但是mysql中的time類型能夠表示的時間範圍要到得多,能表示從-838:59:59~838:59:59,在mysql中具體的用處是用來描述時間段。

time類型特殊性:本質是用來表示時間區間,能表示的範圍比較大。在進行時間類型錄入的時候,可以使用一個簡單的日期代替時間,在時間格式之前加一個空格,然後指定一個數字(可以是負數),系統會自動將該數字轉化成 天數*24小時加上後面的時間。

技術分享圖片

datetime

日期時間類型:即時將date和 time合並起來,表示的時間,使用8個字節來存儲數據,格式為:YYYY-mm-dd HH-ii-ss,能表示的區間1000-01-01 00:00:00到9999-12-12 23:59:59,其可以為0值:0000-00-00 00:00:00

timestamp

時間戳類型:mysql中的時間戳只是表示從格林威治時間開始,但是其格式依然是:YYYY-mm-dd HH-ii-ss

技術分享圖片技術分享圖片

year

年類型:占用一個字節來保存,能表示1900~2155年,但是year有兩種數據插入方式:0-99和四位數的具體年。

year進行兩位數插入的時候,有一個區間劃分,零界點為69和70;當輸入69以下(包括69),那麽系統時間為20+數字,如果是70以上(包括70),那麽系統時間為19+數字

技術分享圖片

PHP中有非常強大的時間日期轉換函數:date將時間戳轉換成想要的格式,strtotime又可以將很多格式轉換成對應的時間戳。PHP通常不需要數據庫來幫助處理這麽復雜的時間日期,所以通常配合PHP的時候,時間的保存通常使用時間戳,從而用整型來保存。

字符串類型

char

定長字符:指定長度之後,系統一定會分配指定的空間用於存儲數據

基本語法:char(L),L代表字符數(英文字母和中文一樣),L長度為0到255

varchar

變長字符:指定長度後,系統會根據實際存儲的數據來計算長度,分配合適的長度(數據沒有超出長度)

基本語法:varchar(L),L代表字符數,L的長度理論值為0到65535

因為varchar要記錄數據長度(系統根據數據長度自動分配長度),所以每二個varchar數據產生後,系統都會在數據後面增加1-2個字節的額外開銷:是用來保存數據所占用的空間長度。如果數據本身小於127個字符,額外開銷一個字節;如果大於127個,就開銷兩個字節。

char和varchar數據存儲對比(utf8,一個字符都回占用3個字節):

存儲數據

Char(2)

Varchar(2)

Char所占字節

Varchar所占字節

A

A

A

2*3=6

1*3+1 =4

AB

AB

AB

2*3=6

2*3+1=7

char和varchar的 區別:

1、char一定會使用指定的空間,varchar是根據數據來定空間

2、char的數據查詢效率比varchar高:varchar是需要通過後面的記錄數來計算

如果確定數據一定是占指定長度,那麽適應char類型。

如果不確定數據到底占多少,那麽使用varchar類型

如果數據長度超過255個字符,不論是否固定長度,都回使用text,不再使用char和varchar

text

文本類型:本質上mysql提供了兩種文本類型

text:存儲普通的字符文本

blob:存儲二進制文本(圖片,文件),一般不會使用blob來存儲文件本身,通常是使用一個鏈接來指向對應的文件本身。

text:系統中提供四種text

tinytext:系統使用一個字節來保存,實際能夠存儲的數據為:2^8 + 1字符數

text:使用兩個字節保存,實際存儲為:2^16+2字符數

mediumtext:使用三個字節保存,實際存儲為:2^24+3字符數

longtext:使用四個字節保存,實際存儲為:2^32+4

註意:

1、在選擇對應的存儲文本的時候,不用刻意去選擇text類型,系統會自動根據存儲的數據長度來選擇合適的文本類型

2、在選擇字符存儲的時候,如果數據超過255個字符,那麽一定選擇text存儲

enum

枚舉類型:在數據插入之前,先設定幾個項,這幾個項就是可能最終出現的數據結果。

如果確定某個字段的數據只有那麽幾個值:如性別,男、女、保密,系統就可以在設定字段的時候規定當前字段只能存放固定的幾個值:使用枚舉

基本語法:enum(數據值1,數據值2…)

系統提供了1-2個字節來存儲枚舉數據:通過計算enum列舉的具體值來選擇時機的存儲空間;如果數據值列表在255個以內,那麽一個字節就夠了,如果超過255但是小於65535,那麽系統采用兩個字節保存。

技術分享圖片

枚舉enum的存儲原理:實際上字段上所存儲的值並不是真正的字符串,而是字符串對應的下標;當系統設定枚舉類型的時候,會給枚舉中每個元素定義一個下標,這個下標規則從1開始

enum(1=>’男’,2=>‘女’,3=>‘保密’);

特性:在mysql中系統是自動進行類型轉換的,如果數據用到到“+、-、*、/”系統就會自動將數據轉換為數值,而普通字符串轉換成數值為0

select 字段名 + 0 from 表名;

技術分享圖片

既然實際enum字段存儲的結果是數值,那麽在進行數據插入的時候,就可以使用對用的數值來進行

技術分享圖片

枚舉的意義:

1、規範數據本身,限定只能插入規定的數據項

2、節省存儲空間

set

集合:是一種將多個數據選項可以同時保存的數據類型,本質是將指定的項按照對應的二進制位來進行控制,1表示該選項被選中,0表示該選項沒有被選中。

基本語法:set(’值1’,’值2 ’…);

系統為set提供了多個字節進行保存,但是系統會自動計算來選擇具體的存儲單元

1個字節:set中只能有8個選項

2個字節:set中只能有16個選項

3個字節:set中只能有24個選項

8個字節:set中只能有64個選項(最多)

set和enum一樣,最終存儲大數據字段中的依然是數字而不是真實的字符串,可以數字插入數據。

插入數據:可以插入多個數據,使用逗號進行分割。

技術分享圖片

數據選項所在的順序與數據插入順序無關,最終都會變成選項對應的順序。

系統按照數據選項順序編排,從第一個開始進行占位,每一個對應一個二進制位。數據存儲時,被選中的項對應的位值為1,否則為0 ,系統在進行存儲的時候會自動將得到的最終的二進制顛倒過來,然後再進行轉換為10進制(系統要補足八個,如果不夠八位,則數據就會變得很大)

和enum類似,也可以進行數字插入。

註意:數字插入的前提是對應的二進制位上都有對應的數據項

set的意義:

1、規範數據

2、節省存儲空間

enum和set的對比:

enum:單選框

set:復選框

MySQL記錄長度

在mysql中,mysql的記錄長度(record = 行 row)總長度不能超過65535個字節

varchar能夠存儲的理論值為65535個字符:字符在不同的字符集下可能占用多個字節。

Varchar能夠存儲的長度:(varchar有1~2個放置長度的字節)

utf8最多只能存儲21844個字符(65535/3 - 1)

gbk最多只能存儲32766個字符(65535/2 - 1)

MySQL數據庫8(七)列類型