前言:雖說這是件小事兒,但本寶寶思前想后,還是為它留下一筆,嘿嘿。反正寫博客不浪費紙和筆!好久沒有開啟我的逗比模式了,我親愛的乖徒弟DBA,DBB,DBAA等,好久不見你們,遙祝幸福快樂+DB。
整個事情其實使這樣的,最近的項目中,有一個表,最終是這樣的:一共3位,每一位的取值是1和0(額,后來還有2,哈哈哈),1代表已認證,0代表未認證。 當時為什么這么設計呢,是因為會高頻率的出現 XXX 身份已認證、郵箱已認證等等的打標簽,就把之前的三個字段變成了一個,當時說是按位取值運算(怎奈何,功力不到位,咱們說的按位取值運算,壓根兒不是一個頻道哇,尷尬5秒中)
附錄:本寶寶的頻道:不是有3位嘛,我一個一個字符的截取,1就是已認證,0就是未認證。嗯,這就是傳說中的按位取值運算!
一、問題出現過程
上文也說到了當初這個字段為什么這么設計的,但在用的過程中,就出現了這么個問題(別笑我,雖然我現在想想當時的邏輯,我也挺想笑的,所以,實在想笑,可別憋壞了) 當時有一個查詢,每一種認證狀態都是一個查詢條件,這個其實不重要。重要的是,每一個條件都還有 “全部” 的選項。
本寶寶當時就在想啊,我呸,我就0和1,老娘哪兒去給你弄 全部,要么未認證要么已認證,老娘難道要3*3 組合排列 or + like 爽死人的SQL拼接嗎?我才不會告訴所有人,我真的拼過一次。 但結合到我蠢了N多年的經驗來看,我不會,我蠢,並不代表其他人也不會(每次團隊里有我,誰都不用擔心智商墊底兒) 我就默默的問了我一個同事,問如果是他,他會怎么做。。。。。。呵 呵 噠 最終的結果是,在進度統計的時候,老大知道啦,剛開始我們說還是換成3個字段,老大說:不用,這個很好解決。
當時心里那個恨呀,他知道怎么做,但是不告訴我。 所幸,老大后來還是給了我一條生路+明路:位運算
二、位運算
話說,即使我明白了要用位運算,卻也是一波三折。因為其實,我就在想Linux給文件授權,每次打chmod 7的時候,就是全部權限嘛,但其實是4+2+1得到的。 然后我就在測試我的那個認證狀態字段,發現一個現象:我每次都不能用 status & 7 查出我期望的數據。 然后,就問我旁邊的老大了:為什么我這條語句出不了效果呢,我查了查語法,沒錯啊,你看我都能單獨查出來。
老大看了看,就跟我說:你想想你的數據類型? 我當時就想的很簡單,因為是111這種格式的嘛,那這3個1其實轉成二進制就是 4 2 1 ,完全沒問題 啊,為什么就是查不出來呢,這個時候,剛好又遇到了另外一個case,就是要授權和取消授權。 我當時就特別蒙,你說授權方便,我直接更改數值,但取消授權,我怎么做呢?我當時想了好久都很苦惱,后來老大說:你就沒有理解什么是位運算,好好想想。 后來我就想明白了:第一,我們當時用的數據類型是char,這本身就不對;第二,授權或者取消授權,只要加減對應的數值就OK了,做位運算的時候,會轉換成二進制運算。所以,后來的處理方案是:
1,首先將char類型,轉換為了int;2,對應的語句大概是:查詢 where status & 1 ; set status=status+1 或者set status=status-1等。 舉個例子:我們設置1為個人認證;2為郵箱認證;4為渠道認證;8為主管理員認證; 那如果要查詢即通過個人認證(1),又通過了渠道認證(4)的數據,那么語句應該是:where status & 5,直接將數值加起來作為條件。 最合適的類比,我用到過得,也就只有Linux的授權chmod了
附錄:具體的,隨便搜就能找到資料,我就不copy and paste了哈
三、個人總結
其實,寫這篇文章,最主要不是記錄這個位運算的具體查詢和使用,而是,老大明明就知道具體該怎么做,然而,他為什么沒有直接告訴我呢? 說實在的,這個東西當時也就卡着了,他老人家就看我在那兒折騰。 而且,我不會,還專門挑我去解決這個事兒。
其實,就突然想起來之前老大讓我去做一個分享的時候,我們的一次對話:
老大:怎么樣啊,7點就要開始了,你准備准備?
我:PPT就是那天早上給你看的,哎呀,不用准備的,我就是塊磚,主要的用途就是引出你這塊玉,我說不下去了,不是還有你頂着嘛,嘿嘿
老大:你應該想想自己怎么能夠成為那塊玉,別把自己當磚使! (PS: 也許,這就是領導和小兵的區別)
我,也要成為一個被團隊依靠的人,加油!
