sql 將數(shù)據(jù)類型分為三大類:數(shù)值類型层宫,字符串,日期時(shí)間型
一、數(shù)值型:
數(shù)值大類:整數(shù)型和小數(shù)型
整數(shù)型
整數(shù)型又分類五大類:
- tinyint :迷你整型措嵌,使用一個(gè)字節(jié)存儲(chǔ)。表示的狀態(tài)最多為256
- smallint:小整型芦缰,使用兩個(gè)字節(jié)企巢。表示的狀態(tài)最多為65536
- mediumint:中整型,使用3個(gè)字節(jié)让蕾。
- int:標(biāo)準(zhǔn)整形浪规,使用4個(gè)字節(jié)存儲(chǔ)
-
bigint:大整型,使用8個(gè)字節(jié)存儲(chǔ)
WechatIMG22.jpeg
SQL中所有的數(shù)值類型都默認(rèn)有符號(hào)探孝,分正負(fù)笋婿。
有時(shí)候需要使用無(wú)符號(hào)數(shù)據(jù),需要給數(shù)據(jù)類型限定:int unsigned
顯示寬度:
WechatIMG3.jpeg
設(shè)置顯示寬度并不能真正影響數(shù)據(jù)存儲(chǔ)的大小顿颅,顯示寬度的意義在于數(shù)據(jù)不夠顯示寬度的時(shí)候缸濒,會(huì)自動(dòng)讓數(shù)據(jù)變成對(duì)應(yīng)的顯示寬度。通常需要搭配一個(gè)前置的0來(lái)增加寬度
小數(shù)型
帶有小數(shù)點(diǎn)或者范圍超出整數(shù)型的數(shù)據(jù)類型。
SQL中將小數(shù)型兩種:浮點(diǎn)型和定點(diǎn)型
浮點(diǎn)型:小數(shù)點(diǎn)浮動(dòng)庇配,精度有限斩跌,會(huì)丟失精度
定點(diǎn)型:小數(shù)點(diǎn)固定,精度固定捞慌,不會(huì)丟失精度
- 浮點(diǎn)型:浮點(diǎn)型數(shù)據(jù)是一種精度型數(shù)據(jù)耀鸦,超出指定范圍就會(huì)丟失精度,自動(dòng)四舍五入
float:?jiǎn)尉刃ピ瑁加盟膫€(gè)存儲(chǔ)字節(jié)袖订,精度范圍為7位左右
double:雙精度,占用八個(gè)字節(jié)嗅虏,精度范圍為15位左右
創(chuàng)建浮點(diǎn)數(shù)據(jù)表:直接使用float表示沒(méi)有小數(shù)部分洛姑;
float(M,D)M:代表總長(zhǎng)度,D代表小數(shù)部分長(zhǎng)度
插入的數(shù)據(jù)可以是直接小數(shù)也可以是科學(xué)計(jì)數(shù)法
浮點(diǎn)型數(shù)據(jù)的插入:整數(shù)部分是不能超過(guò)長(zhǎng)度的旋恼,但小數(shù)部分可以超出長(zhǎng)度(系統(tǒng)會(huì)自動(dòng)四舍五入)吏口,
-
定點(diǎn)型
決定保證整數(shù)部分不會(huì)被四舍五入,小數(shù)部分有可能丟失精度
WechatIMG6.jpeg
創(chuàng)建decimal表 與float 做對(duì)比
CREATE TABLE my_decimal(f1 float(10,2),d2 decimal(10,2))charset=utf8;
插入數(shù)據(jù):定點(diǎn)數(shù)的整數(shù)部分一定不能超出指定長(zhǎng)度(不可進(jìn)位)
冰更,小數(shù)部分可以超出预鬓。
INSERT INTO my_decimal VALUES(12345678.90,12345678.90); --有效數(shù)據(jù)
INSERT INTO my_decimal VALUES(1234.123456,1234.1234567); --有效數(shù)據(jù),小數(shù)部分超出
浮點(diǎn)數(shù)進(jìn)位導(dǎo)致整數(shù)部分長(zhǎng)度溢出沒(méi)有問(wèn)題纹因,但定點(diǎn)數(shù)不行闸翅。
INSERT INTO my_decimal VALUES(99999999.99,99999999.99); --有效數(shù)據(jù),float 超出精度贵扰,會(huì)進(jìn)位,是整數(shù)部分長(zhǎng)度溢出
INSERT INTO my_decimal VALUES(99999999.99,99999999.999);
--無(wú)效效數(shù)據(jù),decimal整數(shù)部分溢出
時(shí)間日期類型
- datetime 格式:YYYY-mm-dd HH:ii:ss 表示范圍:1000到9999奠衔,有0值 0000-00-00 00:00:00
- date 日期谆刨,就是datetime 中的date部分。
- time 時(shí)間段归斤,指定某個(gè)區(qū)間 痊夭,-時(shí)間 到 +時(shí)間
- timestamp 時(shí)間戳,從1970開(kāi)始的 YYYY-mm-dd HH:ii:ss 脏里,格式與datetime完全一致 可以自動(dòng)更新她我,存儲(chǔ)時(shí)還是以時(shí)間格式存儲(chǔ)
- year 年份,兩種形式迫横,year(2)和year(4)
網(wǎng)站是以PHP為實(shí)現(xiàn)的主要操作對(duì)象番舆,PHP中非常強(qiáng)大時(shí)間日期處理函數(shù):date(),只需要一個(gè)時(shí)間戳,就可以轉(zhuǎn)換為任意格式的時(shí)間矾踱,已PHP為主的時(shí)候恨狈,都是在數(shù)據(jù)庫(kù)使用時(shí)間戳(整型)來(lái)存儲(chǔ)時(shí)間。
字符串類型
在SQL中將字符串類型分為了6類:char ,varchar, text ,blob,enum,set
定長(zhǎng)字符型
- char 呛讲,磁盤(二維表)在定義結(jié)構(gòu)的時(shí)候禾怠,就已經(jīng)確定了最終的存儲(chǔ)長(zhǎng)度
char(L):length代表長(zhǎng)度返奉,可以存儲(chǔ)的長(zhǎng)度,單位代表字符
吗氏,最大長(zhǎng)度為255
char(4)在UTF8環(huán)境下衡瓶,需要4*3=12個(gè)字節(jié)(UTF8三個(gè)字節(jié)表示一個(gè)字符)
變長(zhǎng)字符串
- varchar ,在分配空間的時(shí)候,按照最大的空間分配牲证,但實(shí)際上最終用了多少,是根據(jù)具體的數(shù)據(jù)來(lái)確定关面。
varchar(L) L 表示字符長(zhǎng)度坦袍,理論長(zhǎng)度是65536字符,但是會(huì)多出1到2個(gè)字節(jié)等太,來(lái)確定存儲(chǔ)的實(shí)際長(zhǎng)度捂齐,1個(gè)字節(jié)表示長(zhǎng)度小于255 2個(gè)字節(jié)最大數(shù)能存65536正好等于最大長(zhǎng)度。所以是1到2個(gè)字節(jié)缩抡。
但實(shí)際上如果字符長(zhǎng)度超過(guò)255奠宜,既不是用char也不實(shí)用varchar,而是使用text
varchar(10) :如果存儲(chǔ)了10個(gè)漢字,在UTF8環(huán)境中瞻想,10*3+1 = 31個(gè)字節(jié)
如果存儲(chǔ)了3個(gè)漢字压真,在UTF8環(huán)境中,3*3+1 = 10個(gè)字節(jié)
如何選擇定長(zhǎng)或者邊長(zhǎng)字符串蘑险?
定長(zhǎng)字符串比較浪費(fèi)磁盤空間滴肿,但效率高
邊長(zhǎng)字符串比較節(jié)省磁盤空間,但效率低
文本字符串
通常來(lái)說(shuō)佃迄,如果字符長(zhǎng)度超過(guò)255泼差,就會(huì)使用文本字符串
文本字符串根據(jù)根據(jù)存儲(chǔ)的數(shù)據(jù)格式進(jìn)行分類:text和blob
- text 存儲(chǔ)文字
- blob 存儲(chǔ)二進(jìn)制數(shù)據(jù)(通常不用)二進(jìn)制文件通常只存路徑。
枚舉字符串
枚舉:將所有可能出現(xiàn)的結(jié)果都提前設(shè)計(jì)好呵俏,實(shí)際上存儲(chǔ)的數(shù)據(jù)必須是規(guī)定好的數(shù)據(jù)中的其中一個(gè)堆缘。
使用方法:
定義:enum(可能出現(xiàn)的元素列表)
如enum('男','女');
存儲(chǔ)數(shù)據(jù)時(shí)普碎,只能使用上面定義好的數(shù)據(jù):男或女
枚舉是從1開(kāi)始
作用之一:規(guī)范數(shù)據(jù)格式
作用之二:節(jié)省存儲(chǔ)空間 枚舉實(shí)際存儲(chǔ)的是數(shù)值吼肥,而不是字符串本身,按照元素出現(xiàn)的順序從1編號(hào)随常。
證明:將取出來(lái)的枚舉做+0處理潜沦,就能判斷其存儲(chǔ)的類型。
因?yàn)槊杜e存儲(chǔ)的是數(shù)值绪氛,所以可以直接插入數(shù)值
集合型字符串
集合跟枚舉很類似:實(shí)際存儲(chǔ)的是數(shù)值而不是字符串唆鸡,但集合是多選。
集合使用方式:
定義:set(集合列表)
使用:可以使用元素列表中的元素(多個(gè))枣察,使用逗號(hào)分隔争占。
創(chuàng)建集合表:
create table my_set(
hobby set('籃球','足球','乒乓球','羽毛球','游泳','跑步');
) charset=utf8;
插入數(shù)據(jù):可以使用多個(gè)元素字符組合燃逻,也可以直接插入數(shù)值
insert into my_set('籃球,足球');
insert into my_set(3);-- 000011 表示選中籃球和足球
集合中:每個(gè)元素代表一個(gè)二進(jìn)制位,被選中位1 臂痕,未被選中0伯襟,集合列表第一位代表二進(jìn)制中的最低位
集合的強(qiáng)大在于規(guī)范數(shù)據(jù)和節(jié)省空間。但對(duì)PHP來(lái)說(shuō)握童,效率優(yōu)先姆怪。基本用的很少澡绩。
mysql記錄長(zhǎng)度
mysql規(guī)定一條記錄的最長(zhǎng)不超過(guò)65535個(gè)字節(jié)
(varchar永遠(yuǎn)都達(dá)不到理論長(zhǎng)度)
varchar 的實(shí)際存儲(chǔ)長(zhǎng)度能達(dá)到多少稽揭?看字符集編碼
- UTF8環(huán)境:
21844個(gè)字符 -
GBK
32766
WechatIMG4.jpeg
如果想要把少出的一個(gè)字節(jié)用掉,則可以添加一個(gè)新字段肥卡,類型為tinyint 且類型not null ,因?yàn)樵趍ysql中溪掀,如果數(shù)據(jù)的屬性默認(rèn)為空,會(huì)占用一個(gè)字節(jié)存儲(chǔ)null步鉴,想要釋放null占用的字節(jié)揪胃,則字段屬性不能為空
- mysql text 數(shù)據(jù)類型,不占用記錄長(zhǎng)度氛琢。
即可以額外存儲(chǔ)喊递,但是text類型的字符串也屬于記錄的一部分,一定需要占用記錄中的的部分長(zhǎng)度:10個(gè)字節(jié)艺沼。(保存數(shù)據(jù)的地址和長(zhǎng)度)