国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - 要慎用mysql的enum字段的原因

要慎用mysql的enum字段的原因

2020-04-17 14:54hebedich Mysql

背景:時(shí)下都流行enum類型的使用tinyint,那enum就真沒有用的價(jià)值了么?

PHP低級編程的兄弟是這樣來看這個問題的,我作下筆錄如下,期望能客觀的理解這個enum字段的優(yōu)點(diǎn)及缺點(diǎn):

膘哥觀點(diǎn):
    enum有優(yōu)點(diǎn)。但個人覺得。。。缺點(diǎn)更多,客觀的講:優(yōu)點(diǎn)主要是在建數(shù)據(jù) 庫的時(shí)候就可以把一些值給規(guī)范好。缺點(diǎn)是。。enum不適合PHP。主要是PHP是弱類型,如:你insert into ..... set a= 1,你沒法知道你是想 a= '1' 還是 a= 1(a='1'是插入值1,a=1是插入enum的第一個值,尤其php弱類型的,如果int的,很少有人在sql里加雙引號。),這是PHP和mysql 在使用enum 最大的問題。所以。。安心點(diǎn)啦。干脆點(diǎn)直接tinyint。

單曲觀點(diǎn):
    我覺得沒什么優(yōu)點(diǎn),對數(shù)字型的enum,簡直就是夢魘,boolean  tinyint(1) 0,1 status  tinyint(1)  1,2,3,4,5,6..tinyint歡淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出現(xiàn)膘哥所說的混淆。

簡單觀點(diǎn):
   少用,一般都是用tinyint替代。

天楓觀點(diǎn):
   我覺得除了狀態(tài)直觀  沒什么優(yōu)點(diǎn),我一般直接int,tinyint([1or2or3]) 到底有啥區(qū)別?(后面會簡單探討下,這里面的1or2or3區(qū)別。)

中庸觀點(diǎn):
   a=1是插入enum的第一個值,尤其php弱類型的,如果int的,很少有人在sql里加雙引號,基本上是不加引號的。

豎琴螺觀點(diǎn):
   六種情況就:tinyint(1)  -1,-2,1,2,3,4

上面各種觀點(diǎn)重點(diǎn)集中在PHP這種弱類型語言對引號不重視,程序員不寫容易引起插入的語句不是自己想要的結(jié)果的問題,容易出現(xiàn)int時(shí)沒有用引號導(dǎo)致插入了新值而不是定的那個值:

表結(jié)構(gòu)如下: 

?
1
2
3
4
5
CREATE TABLE `enum2tinyint` (
 `switchs` enum('none','success','fail','delete','skip','1') DEFAULT NULL,
 `switch` tinyint(1) NOT NULL,
 KEY `switchs` (`switchs`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 
正常帶引號插入enum: 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES ('1', '1');
1 1

PHP的弱類型問題,特別是對int類型的情況,實(shí)踐如下: 
如果沒有帶引號插入enum字段后如下(是第一個值none): 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (1, '1');
none 1

如果沒有帶引號插入enum字段后如下(是第2個值success): 

?
1
2
INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (2, '1');
success 1


結(jié)論:要插入enum的值,字段必須加引號,不加引號當(dāng)然是數(shù)字,數(shù)字就是key,不是value。

規(guī)勸:
1)enum是整型這樣的錯誤很容易發(fā)生,尤其是php弱類型的,一般新來一個人,沒注意enum類型,就會犯錯。
2)數(shù)據(jù)庫說明清楚的話,或者可選擇的全是字符串的話,還沒什么,但是里面有數(shù)字,難免有新手犯錯,養(yǎng)成加引號的習(xí)慣很重要。

最終結(jié)論:
歷史原因,要把enum改成tinyint程序改動太大了,用了的沒必要改·~,以后新建的時(shí)候,盡量使用tinyint就好。
這種字段的重復(fù)內(nèi)容過多的,索引建不建,關(guān)系不大,這種在mysql叫索引的勢太低,其查詢效果不太好:(英文是這么翻譯的:https://justwinit.cn/post/1405/)。
————————————————————————————————————————————————————————————————————
tinyint(1)和tinyint(4)一樣的,都是-127到128或者0到256。unsigned屬性全是正,和c語言unsigned int有點(diǎn)類似:
tinyint(1)   -128 ~ 127
tinyint(1) unsigned  0 ~ 255

為何表示的最大正數(shù)比最小負(fù)數(shù)的絕對值少1呢?
第一位是符號位,1表示負(fù)數(shù)
所以負(fù)數(shù)可以到128,正數(shù)只能到127
-128正127
如:0111 1111  正數(shù)  ,負(fù)數(shù) 1111 1111

提問:

Mysql里int(1)和int(11)差別很大的,mysql的int,有個屬性 ,UNSIGNED ZEROFILL  后面的ZEROFILL,就是有定義的位數(shù)不夠則用零補(bǔ)齊對齊一下(這兒可能涉及到索引的性能罷):int,  長度(M)=5, 屬性=UNSIGNED ZEROFILL(無符號,用0來填充位數(shù)),00001,00002。

但這個tinyint呢,tinyint(1)和tinyint(4)一樣的?

看這文章后:http://www.jfrwli.cn/article/58585.html

我估計(jì):mysql這塊對一個字節(jié)不像int這種四個字節(jié)要進(jìn)行對其前部分進(jìn)行部分字節(jié)索引,如果說tinyint(1)和tinyint(4)是一樣的表示范圍情況下,但mysql對tinyint數(shù)字長度位數(shù)作了可設(shè)置的限定,從理論上說其存在硬盤里的字節(jié)是不一樣才是合乎邏輯的,這塊估計(jì)還是為了對字節(jié)進(jìn)行對齊方便索引等,以提升效率為主罷,l如:ike keyword%    索引有效,如果統(tǒng)一對齊,索引效果會不會更好呢?我也只是猜測。
————————————————————————————————————————————————————————————————————

在網(wǎng)上找了下這個enum的mysql的大體實(shí)現(xiàn)如下:

一)enum的存儲原理我仔細(xì)查看了下手冊。是這樣的:
在建立這個字段時(shí),我們會給他規(guī)定一個范圍比如enum('a','b','c'),這時(shí)mysql內(nèi)部會建立一張hash結(jié)構(gòu)的map表,類似:0000 -> a,0001 -> b,0002 -> c。
當(dāng)我插入一條數(shù)據(jù),此字段的值位a或b或c時(shí),他存儲在里面的不是這個字符,而是對應(yīng)他的索引,也就是那個0000或0001或0002。
同樣,enum在mysql手冊上的說明:
ENUM('value1','value2',...)
1或2個字節(jié),取決于枚舉值的個數(shù)(最多65,535個值)
除非enum的個數(shù)超過了一定數(shù)量,否則他所占的存儲空間也總是1字節(jié)。

二)tinyint:
類型  字節(jié)  最小值  最大值
      (帶符號的/無符號的)  (帶符號的/無符號的)
TINYINT  1  -128  127
他的最小存儲所占空間也是1字節(jié)。

最后,Enum,既然要用它,就不必要使用什么0,1,2來代替實(shí)際的字符串了。甚至中文字符串。他并不會對數(shù)據(jù)庫性能進(jìn)行多余開銷。因?yàn)閷τ谒鼇碚f,你使用'0','1','2'和'張三','李四','王五'數(shù)據(jù)表所占的存儲空間一樣。但是考慮到我們實(shí)際應(yīng)用時(shí)數(shù)據(jù)需要從db服務(wù)器回傳到web app,所以在網(wǎng)絡(luò)傳輸時(shí),當(dāng)然還是盡可能的傳輸小數(shù)據(jù)比較好。所以如果很在意這些,還是不用它好了。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕亚洲一区二区va在线 | 成人av在线网站 | 日韩欧美在线视频 | 亚洲国产综合在线观看 | 91视频黄色| 蜜桃视频成人在线观看 | 日韩在线视频观看 | 欧美日韩一级视频 | 亚洲国产青草 | 99精品一区 | 青青草综合| 免费国产一区二区 | 日韩综合一区 | 久久综合久久久 | 欧美日韩精品一区二区三区 | 免费黄色小视频 | 亚洲国产综合在线 | 久久久久久国产一级毛片高清版 | 精品国产91亚洲一区二区三区www | 日韩一区电影 | 久久久www成人免费无遮挡大片 | 亚洲成人av在线 | 看a网址| 国产真实精品久久二三区 | 91色乱码一区二区三区 | 亚洲国产精品一区久久av篠田 | 国产一区日韩在线 | 久久久av | 欧美一区二区三区免费 | 北条麻妃99 | 青娱乐99 | 久国产精品韩国三级视频 | 九一精品 | 欧美日韩在线一区二区三区 | 久久女人 | 欧美日韩在线一区二区 | 亚洲色吧 | 曰韩免费视频 | 91亚洲一区 | 日韩欧美精品一区二区三区 | 91久久国产综合久久91精品网站 |