sql 將數據類型分為三大類:數值類型,字符串,日期時間型
一、數值型:
數值大類:整數型和小數型
整數型
整數型又分類五大類:
- tinyint :迷你整型,使用一個字節存儲。表示的狀態最多為256
- smallint:小整型,使用兩個字節。表示的狀態最多為65536
- mediumint:中整型,使用3個字節。
- int:標準整形,使用4個字節存儲
-
bigint:大整型,使用8個字節存儲
WechatIMG22.jpeg
SQL中所有的數值類型都默認有符號,分正負。
有時候需要使用無符號數據,需要給數據類型限定:int unsigned
顯示寬度:
WechatIMG3.jpeg
設置顯示寬度并不能真正影響數據存儲的大小,顯示寬度的意義在于數據不夠顯示寬度的時候,會自動讓數據變成對應的顯示寬度。通常需要搭配一個前置的0來增加寬度
小數型
帶有小數點或者范圍超出整數型的數據類型。
SQL中將小數型兩種:浮點型和定點型
浮點型:小數點浮動,精度有限,會丟失精度
定點型:小數點固定,精度固定,不會丟失精度
- 浮點型:浮點型數據是一種精度型數據,超出指定范圍就會丟失精度,自動四舍五入
float:單精度,占用四個存儲字節,精度范圍為7位左右
double:雙精度,占用八個字節,精度范圍為15位左右
創建浮點數據表:直接使用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)
網站是以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個字節
如何選擇定長或者邊長字符串?
定長字符串比較浪費磁盤空間,但效率高
邊長字符串比較節省磁盤空間,但效率低
文本字符串
通常來說,如果字符長度超過255,就會使用文本字符串
文本字符串根據根據存儲的數據格式進行分類:text和blob
- text 存儲文字
- blob 存儲二進制數據(通常不用)二進制文件通常只存路徑。
枚舉字符串
枚舉:將所有可能出現的結果都提前設計好,實際上存儲的數據必須是規定好的數據中的其中一個。
使用方法:
定義:enum(可能出現的元素列表)
如enum('男','女');
存儲數據時,只能使用上面定義好的數據:男或女
枚舉是從1開始
作用之一:規范數據格式
作用之二:節省存儲空間 枚舉實際存儲的是數值,而不是字符串本身,按照元素出現的順序從1編號。
證明:將取出來的枚舉做+0處理,就能判斷其存儲的類型。
因為枚舉存儲的是數值,所以可以直接插入數值
集合型字符串
集合跟枚舉很類似:實際存儲的是數值而不是字符串,但集合是多選。
集合使用方式:
定義: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個字節。(保存數據的地址和長度)