服務(wù)項目:網(wǎng)站建設(shè)、仿站、程序開發(fā)、APP開發(fā)設(shè)計、移動網(wǎng)站開發(fā)設(shè)計、企業(yè)網(wǎng)站設(shè)計、電子商務(wù)網(wǎng)站開發(fā)、網(wǎng)站維護(hù)、網(wǎng)站推廣、UX/UI 、HTML5、CSS3、JS / Jquery ...
四川???萍加邢薰?></a></div>
                    <div   id=四川???萍加邢薰? title=
四川???萍加邢薰?(開發(fā)設(shè)計官網(wǎng))TEL : 15308000360 / QQ : 38585404

您的位置:首頁 > 技術(shù)經(jīng)驗 > 數(shù)據(jù)庫 > 正文

MYSQL中SET字段類型的使用方法
技術(shù)支持服務(wù)電話:15308000360 【7x24提供運維服務(wù),解決各類系統(tǒng)/軟硬件疑難技術(shù)問題】

經(jīng)過最近一個項目的開發(fā),才發(fā)現(xiàn)了MYSQL中SET類型的真正含義,以前都犯了Martin Fowler 在《重構(gòu)--改善既有代碼的設(shè)計》指出的 "基本型別偏執(zhí)"錯誤,自己濫用INT類型導(dǎo)致錯過了其它數(shù)據(jù)類型對于項目開發(fā)所帶來的好處,現(xiàn)在好好記錄一下SET類型的真正用法:

實際上,SET可以包含最多64個成員,其值為一個整數(shù)。這個整數(shù)的二進(jìn)制碼表示該SET的值的哪些成員為真。例如有`Status` set('ForSale','AuthSuccess','AuditSuccess','IntentionReached','SaleCanceled'),那么它們的值為:

SET member    Decimal value    Binary value
-----------------------------
ForSale     1 0001
AuthSuccess  2 0010
AuditSuccess 4 0100
IntentionReached 8   1000

如果將9存入Status字段,那么其二進(jìn)制值為1001,也就是說這個值中'ForSale'和'IntentionReached'為真。

可以想到,如果這樣的話,大家可以用LIKE命令和 FIND_IN_SET() 函數(shù)來檢索SET值:

SELECT * FROM tbl_name WHERE Status LIKE '%value%';

SELECT * FROM tbl_name WHERE FIND_IN_SET('value',Status)>0;

當(dāng)然,以下SQL語句也是合法的,他們顯得更加簡潔(注意兩個成員的順序及連接符,):

SELECT * FROM tbl_name WHERE Status = 'ForSale,IntentionReached';

同時我們還可以直接使用數(shù)值來查詢:

SELECT * FROM tbl_name WHERE Status = 9

因為SET類型的成員的位置都是固定的,數(shù)值9永遠(yuǎn)表示'ForSale'和'IntentionReached'為真;這樣即使以后再添加了一個狀態(tài),也不會影響之前的查詢邏輯。我們再來看看修改SET類型字段的SQL語句使用技巧:

修改Status讓其'ForSale'成員為真

 UPDATE tbl_name SET Status = 1  WHERE Id = 333

修改Status讓其'ForSale'、'AuthSuccess'、'IntentionReached' 成員為真

UPDATE tbl_name SET Status = 1 | 2 | 4  WHERE Id = 333;

在確認(rèn)目前狀態(tài)為7時去掉'ForSale'成員,讓7也作為操作的條件是確保目前狀態(tài)就是為7,如果沒有此需求可直接 SET Status = 6 ;

UPDATE tbl_name SET Status = 7 & ~1  WHERE Id = 333;

呵呵,利用SET類型保存權(quán)限等數(shù)據(jù)確實讓開發(fā)方便清晰了不少哇。



上一篇:Windows下MySQL ZIP免安裝包 安裝配置(壓縮包,安裝包)
下一篇:mysql數(shù)據(jù)類型之enum類型

相關(guān)熱詞搜索:mysql