數(shù)據(jù)庫的數(shù)據(jù)類型

數(shù)據(jù)類型(列類型)
所謂的數(shù)據(jù)類型:對數(shù)據(jù)進行統(tǒng)一的分類,從系統(tǒng)的角度出發(fā)為了能夠使用統(tǒng)一的方式進行管理,更好的利用有限的空間。

SQL中將數(shù)據(jù)類型分成了三大類:數(shù)值類型、字符類型和日期時間類型。

image.png

數(shù)值型

系統(tǒng)將數(shù)值型分為整數(shù)型和小數(shù)型

整數(shù)型

在SQL中因為更多要考慮如何節(jié)省磁盤空間,所以系統(tǒng)將整型又細分成5類:

  • Tinyint:迷你整型,使用1個字節(jié)存儲
  • Smallint:小整型,使用2個字節(jié)存儲
  • Mediumint:中整型,使用3個字節(jié)存儲
  • Int:標準整型,使用4個字節(jié)存儲
  • Bigint:大整型,使用8個字節(jié)存儲
image.png

創(chuàng)建一張整型表
插入數(shù)據(jù):只能插入范圍內(nèi)的整型
SQL中的數(shù)值類型全部都是默認有符號:分正負
所有有時候需要使用無符號數(shù)據(jù):需要給數(shù)據(jù)類型限定:int unsigned;(無符號,從0開始)

-- 給表增加一個無符號類型
alter table my_int add int_5 tinyint unsigned;
image.png

顯示寬度:沒有特別的含義,只是默認的告訴用戶可以顯示的形式而已,實際上用戶是可以控制的,這種控制不會改變數(shù)據(jù)本身的大小

-- 插入一個規(guī)定顯示寬度的字段,指定寬度為1
alter table my_int add int_6 tinyint(1) unsinged;

顯示寬度的意義:在于當數(shù)據(jù)不夠顯示寬度的時候,會自動讓數(shù)據(jù)變成對應的顯示寬度,通常需要搭配一個前導0來增加寬度,不改變值大小:zerofill(零填充);零填充會導致數(shù)值自動變成無符號

-- 增加一個字段,顯示寬度為2,0填充
alter table my_int add int_7 tinyint(2) zerofill;

零填充的意義:保證數(shù)據(jù)格式。

小數(shù)型

小數(shù)型:帶有小數(shù)點或者超出整型的數(shù)值類型
SQL中,將小數(shù)型細分為兩種:浮點型和定點型

  • 浮點型:小數(shù)點浮動,精度有限,而且會丟失精度。
  • 定點型:小數(shù)點固定,精度固定,不會丟失精度。
1.浮點型

浮點型數(shù)據(jù)就是一種精度型數(shù)據(jù),因為超出指定范圍之后,會丟失精度(自動四舍五入)
浮點型:理論上分為兩種精度

  • Float:單精度,占用4個字節(jié)存儲數(shù)據(jù),精度范圍大概為7位左右
  • Double:雙精度,占用8個字節(jié)存儲數(shù)據(jù),精度范圍大概為15位左右。
image.png

創(chuàng)建浮點表:浮點的使用方式,直接float表示沒有小數(shù)部分,float(M,D):M代表總長度,D代表小數(shù)部分長度,整數(shù)部分長度為M-D。
插入數(shù)據(jù):可以是直接小數(shù),也可以是科學計數(shù)法。
浮點型數(shù)據(jù)的插入:整數(shù)部分是不能超出長度的,但是小數(shù)部分可以超出長度(系統(tǒng)會自動四舍五入)。
查看數(shù)據(jù)結果:浮點數(shù)一定會進行四舍五入(超出精度范圍),浮點數(shù)如果是因為系統(tǒng)進位導致整數(shù)部分超出指定的長度,那么系統(tǒng)也允許成立。

2.定點型

定點型:絕對的保證整數(shù)部分不會被四舍五入(不會丟失精度),小數(shù)部分有可能(理論上小數(shù)部分也不會丟失精度)

image.png

創(chuàng)建定點數(shù)表
插入數(shù)據(jù):定點數(shù)的整數(shù)部分一定不能超出長度(進位不可以),小數(shù)部分的長度可以隨意超出(系統(tǒng)自動四舍五入)。
注意:浮點數(shù)如果進位導致長度溢出沒有問題,但是定點數(shù)不行。

日期時間型

Datetime:時間日期,格式是YYYY-mm-dd HH:ii:ss,表示的范圍是從10000到9999年,有0值:0000-00-00 00:00:00
Date:日期,就是datetime中的date部分
Time:時間(段),指定的某個區(qū)間之間,-時間到+時間
Timestamp:時間戳,并不是時間戳,只是從1970年開始的YYYY-mm-dd HH:ii:ss格式與datetime完全一致
Year:年份,有兩種形式,year(2)和year(4)

image.png

創(chuàng)建時間表
插入數(shù)據(jù):時間time可以是負數(shù),而且可以是很大的負數(shù),year可以使用2位數(shù)插入,也可以使用4位數(shù)
Timestamp字段:只要當前所在的記錄被更新,該字段一定會自動更新成當前時間。

網(wǎng)站是以PHP為實現(xiàn)的主要操作對象:PHP中有非常強大的時間日期處理函數(shù):date,只需要一個時間戳就可以轉(zhuǎn)換成任意類型的時間,以PHP為主的時候,都是在數(shù)據(jù)庫使用時間戳(整型)來存儲時間。

字符串類型

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

定長字符串

定長字符串:char,磁盤(二維表)在定義結構的時候,就已經(jīng)確定了最終數(shù)據(jù)的存儲長度。
char(L):L代表length,可以存儲的長度,單位為字符,最大長度可以為255.
char(4): 在UTF8環(huán)境下,需要4*3=12個字節(jié)。

變長字符串

變長字符串:varchar,在分配空間的時候,按照最大的空間分配,但是實際上最終用不了多少,是根據(jù)具體的數(shù)據(jù)來確定
varchar(L):L表示字符長度,理論上長度為65536個字符,但是會多出1到2個字節(jié)來確定存儲的實際長度,255字符以下會多出1個,實際上長度超過255,既不用定長也不用變長,使用文本字符串text。

問:如何選擇定長或者變長字符串呢?
答:定長的磁盤空間比較浪費,但是效率高;如果數(shù)據(jù)基本上確定長度都一樣,就使用定長,如身份證號,電話號碼,手機號碼等。
變長的磁盤空間比較節(jié)省,但是效率低;如果數(shù)據(jù)不能確定長度(不同數(shù)據(jù)有變化),就使用變長,如姓名,地址等。

文本字符串

如果數(shù)據(jù)量非常大,通常說超過255個字符就會使用文本字符串。
文本字符串根據(jù)存儲的數(shù)據(jù)的格式進行分類:text和blob
text:存儲文字(二進制數(shù)據(jù)實際上都是存儲路徑)
blob:存儲二進制數(shù)據(jù)(通常不用)

枚舉字符串

枚舉:enum,事先將所有可能的結果都設計好,實際上存儲的數(shù)據(jù)必須是規(guī)定好的數(shù)據(jù)中的一個

-- 創(chuàng)建枚舉表
create table my_enum(
gender enum('男', '女', '保密')
)charset utf8;

作用:

  • 加入數(shù)據(jù)時,規(guī)范了數(shù)據(jù)格式,數(shù)據(jù)只能是規(guī)定的數(shù)據(jù)的其中一個。
  • 節(jié)省存儲空間(枚舉通常有一個別名:單選框),枚舉實際存儲的是數(shù)值而不是字符串本身。

枚舉元素的實際順序:按照元素出現(xiàn)的順序,從1開始編號。
枚舉原理:枚舉在進行數(shù)據(jù)規(guī)范的時候(定義時),系統(tǒng)會自動建立一個數(shù)字與枚舉元素的對應關系(關系放到日志中),然后在進行數(shù)據(jù)插入時,系統(tǒng)自動將字符轉(zhuǎn)換成對應的數(shù)字存儲,然后再進行數(shù)據(jù)提取的時候,系統(tǒng)自動將數(shù)值轉(zhuǎn)換成對應的字符串顯示。
因為枚舉實際存儲的是數(shù)值,所以可以直接插入數(shù)值。

集合字符串

集合跟枚舉很類似:實際存儲的是數(shù)值,而不是字符串(集合是多選的)
集合使用方式:
定義:set(元素列表)
使用:可以使用元素列表中的多個元素,用逗號隔開。

-- 創(chuàng)建集合表
create table my_set(
hobby set('籃球', '足球', '乒乓球', '羽毛球', '排球', '臺球', '網(wǎng)球', '棒球')
)charset utf8;
-- 插入多個元素
insert into my_set values('足球, 臺球, 網(wǎng)球');

插入數(shù)據(jù):可是使用多個元素字符串組合,也可以直接插入數(shù)值。
集合中,每一個元素都是對應一個二進制位,被選中為1,沒有則為0,最后反過來。

select hobby + 0, hobby from my_set;
-- 會發(fā)現(xiàn)數(shù)據(jù)為'足球, 臺球,網(wǎng)球'對應的數(shù)值為98,對應的二進制是1100010

集合中元素的順序沒有關系,最終系統(tǒng)都會去匹配順序。
集合的強大在于能夠規(guī)范數(shù)據(jù)和節(jié)省空間。

Mysql記錄長度

Mysql中規(guī)定:任何一條記錄最長不能超過65535個字節(jié)(而varchar最長是65536個字符,所以varchar永遠達不到理論值)

varchar實際存儲長度能達到多少呢?看字符集編碼。
utf8下的varchar的實際最大值21844字符
21844 * 3 + 2 = 65534字節(jié)
gbk下的varchar的實際最大值32766字符
32766 * 2 + 2 = 65534字節(jié)

想要完整的65525個字節(jié)長度,增加一個tinyint字段
發(fā)現(xiàn)問題:太大了
因為Mysql記錄中,如果有任何一個字段允許為空,那么系統(tǒng)會自動從整個記錄中保留一個字節(jié)來存儲NULL。
所以正確創(chuàng)建為:

create table my_utf8(
name varchar(21844) not null,
age tinyint no null
)charset utf8;

Mysql中text文本字符串, 不占用記錄長度:額外存儲,但是text文本字符串也是屬于記錄的一部分,一定需要占據(jù)記錄中的部分長度:10個字節(jié)(保存數(shù)據(jù)的地址以及長度)。

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

相關閱讀更多精彩內(nèi)容

  • 回顧 數(shù)據(jù)庫基礎知識:關系型數(shù)據(jù)庫(磁盤)和非關系型數(shù)據(jù)庫(內(nèi)存) 關系型數(shù)據(jù)庫:建立在關系模型上的數(shù)據(jù)庫數(shù)據(jù)結構...
    翊溪閱讀 619評論 0 1
  • 本文基于MySQL5.6版本進行描述從大的方面來講,MySQL的數(shù)據(jù)類型分為4種 數(shù)值類型 日期和時間 字符串類型...
    黑哥兒666閱讀 805評論 0 0
  • 1.C語言數(shù)據(jù)類型 1.1 基本類型:其值不可以再分解為其他類型1.1.1 整型:整型常量,整型變量。整型常量:有...
    Eric_Hunter閱讀 1,095評論 0 0
  • 晚上回到家,兒子正在寫作業(yè),看到我進來,兒子對我說:媽媽,你先出去,等到快十點的時候再進來,我在寫作業(yè)呢。...
    微笑的石子媽媽閱讀 292評論 1 8
  • 讀書最高的快樂是眼淚。情感的作用。好的文學作品必定是情感的引領。
    閑庭信步_3ba7閱讀 218評論 1 1

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