標籤:
所謂的資料類型:對資料進行統一的分類。從系統的角度出發,是為了使用統一的方式進行管理,更好的利用有限的空間。
SQL中將資料類型分了三大類:數實值型別、字串類型和時間日期類型
數值型
數值型資料:都是數值
系統將數值型分為整數型和小數型
整數型
存放整形資料:在SQL中 因為更多要考慮如何節省磁碟控制項,所以系統將整型又細分了5類
1. Tinyint:迷你整型,使用一個位元組儲存,表示的狀態最多為256種。(常用)
2. Smallint:小整型,使用2個位元組儲存,表示的狀態最多為65536中。
3. Mediumint:中整型,使用3個位元組儲存
4. Int:標準整型,使用4個位元組儲存(常用)
5. Bigint:大整型,使用8個位元組儲存
建立一張整型表
插入資料:智能插入整型,只能插入範圍內的資料
SQL中數實值型別全部都是預設有符號:分正負
有時候需要使用無符號資料:需要給資料類型限定:int unsigned
數值的插入
查看錶結構的時候,發現每個欄位的資料類型之後都會內建一個括弧,裡面有指定的數字,代表顯示寬度。
顯示寬度:沒有特別的含義,只是預設的告訴使用者可以顯示的形式而已,實際上使用者是可以控制的,這種控制不會改變資料本身的大小。
顯示寬度的意義:在於當資料不夠顯示寬度的時候,會自動讓資料編程對應的顯示寬度。通常需要搭配一個前置 0 來增加寬度,不改變值大小,zerofill(零填充),零填充會導致數值會自動變成無符號。
零填充 + 顯示寬度的效果:
零填充的意義(顯示寬度):保證資料格式
小數型
小數型:帶有小數點或者範圍超出整型的數實值型別。
SQL中:將小數型細分成兩種:浮點型和定點型
浮點型:小數點浮動,精度有限,而且會丟失精度
定點型:小數點固定,精度固定,不會丟失精度
浮點型
浮點型資料是一種精度型資料,因為超出指定範圍之後,會丟失精度(自動四捨五入)
浮點型:理論分為兩種精度
1. Float:單精確度,佔用 4 個位元組儲存資料,精度範圍大概為7位左右
2. Double:雙精確度,佔用 8 個位元組儲存資料,精度範圍大概為 15 位左右
建立浮點數表:浮點的使用方式,直接 float表示沒有小數部分,float(M,D):M代表總長度,D代表小數部分長度,整數部分長度為 M-D
插入資料:可以是直接小數,也可以是科學計數法
浮點型資料的插入:整數部分是不能超出長度的,但是小數部分可以超出長度(系統會自動四捨五入)
結果:浮點數一定會進行四捨五入,浮點數如果是因為系統進位導致整數部分超出指定長度,那麼系統也允許成立。
定點型
定點型:絕對的保證整數部分不會被四捨五入,小數部分有可能(理論上也不會丟失精度)
建立定點資料表:以浮點數作為對比
插入資料:定點數的整數部分一定不能超出長度,小數部分的長度可以隨意超出(四捨五入)
浮點數如果進位導致長度超出沒有問題,但是定點數不行。
查看資料:
===華麗的分割線===時間日期類型
datetime:時間日期,格式 YYYY-mm-dd HH:ii:ss,表示範圍是從1000 到 9999 年,有0值 0000-00-00 00::00:00
data:日期,就是 datetime 中的 date 部分
time:時間(段),指定的摸個區間之間
timestamp:時間戳記,並不是時間戳記,只是從 1970 年開始的 YYYY-mm-dd HH:ii:ss
year:年份,兩種形式,year(2) 和 year(4)
建立時間日期表
插入資料:時間time可以是負數,而且可以是很大的負數,year可以使用2位元插入,也可以使用4位元
timestamp欄位:只要當前所在的記錄被更新,該欄位一定會自動更新
字串類型
在SQL中,將字串類型分成了 6 類:char,varchar,text,blob,enum,set
定長字串:
定長字串:char。磁碟(二維表)在定義結構的時候,就已經確定了最終資料的儲存長度
char(L):L表示可以儲存的長度,單位為字元,最大長度值可以為255
char(4) 在 UTF8下,需要12個位元組
變長字串:
變長字串:varchar。在分配空間的時候,按照最大的空間分配,但是實際上最終用了多少,是根據具體的資料來確定。
varchar(L),L的理論長度是65536個字元,但是會多出 1~2個位元組來確定儲存的實際長度。
varchar(10) 的確存了10個漢字,utf8下 10*3 + 1 =31(bytes)
儲存 3 個漢字,3 * 3 +1 =10(bytes)
如何選擇定長或者變長字串呢?
定長的磁碟空間比較浪費,但是效率高。比如身份證,手機號,用定長
變長的磁碟空間比較節省,但是效率低。比如姓名,地址,用變長。
文本字串
如果資料量非常大,通常說超過255個字元,就會使用文本字串
文本字串根據儲存的資料的格式分為 text 和 blob
Text:儲存文字(位元據實際上都是儲存路徑)
Blob:儲存位元據(通常不用)
枚舉字串
枚舉:enum,事先將所有可能出現的結果都設計好,實際上儲存的資料必須是規定好的資料中的一個。
枚舉的使用方式
定義enum可能出現的元素列表: //如:enum(‘男’,’女’,’不男不女’,’妖’,’保密’);
使用:儲存資料,只能儲存上面定義好的資料。
建立枚舉表
加入資料:作用之一,規範資料格式
作用之二:節省儲存空間:枚舉實際儲存的是數值,而不是字串本身。
找出了枚舉元素的規律:按照元素出現的順序,從一開始編號。
枚舉原理:枚舉在進行資料規範的時候,系統會自動建立一個數字與枚舉元素的對應關係(關係放到日誌中),然後在進行資料插入的時候,系統自動將字元轉換成對應的數字儲存,然後在進行資料提取的時候,系統自動將數值轉換成對應的字串顯示。
因為枚舉實際儲存的是數值,,所以可以直接插入數字
集合字串
集合跟枚舉類似:實際儲存的是數值,而不是字串(集合是多選)
集合使用方式:
定義:set(元素列表)
使用:可以使用元素列表中的多個,使用逗號分割
插入資料:可以使用多個元素字串組合,也可以直接插入數值。
查看資料:數值 + 資料查看
集合中每一個元素都是對應一個對應二進位位
集合中元素的順序沒有關係,最終系統都會去匹配順序。
集合的強大在於能夠規範資料和節省空間的
Mysql 記錄長度
Mysql中規定:任何一條記錄最長不能超過 65535 個位元組(varchar永遠達不到理論值)
varchar實際儲存長度能達到多少呢?看字元集編碼
UTF8下varchar的實際頂配:21844
GBK下varchar的實際頂配:32766
想用完整個65535個位元組長度,增加一個tinyint欄位 (not null)
Mysql中text文本字串,不佔用記錄長度:額外儲存,但是text文本字串也是屬於記錄的一部分,一定需要佔據記錄中的部分長度:10個位元組(儲存資料的地址以及長度)
Mysql資料類型