<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
工作中經常遇到多選值儲存問題,例如:使用者有多種認證方式,密碼認證、簡訊認證、掃碼認證等,一個使用者可能只開啟了其中某幾種認證方式。
比較容易理解的兩種實現方式,多欄位儲存、單個欄位拼接儲存。
每種認證方式用一個欄位儲存,0表示未開啟,1表示已開啟。
缺點:每增加一種認證方式都需要新增一個表欄位,擴充套件性差。
單欄位儲存,已開啟的認證方式用逗號(或其他分割符)拼接。例如:開始了密碼認證和簡訊認證,則儲存為:密碼認證,簡訊認證。
缺點:不利於查詢,需要使用模糊查詢,搞不好會影響效能。
參考Linux許可權控制思路,將每種認證方式對應到二進位制位中,例如:密碼認證–10000000,簡訊認證–01000000,掃碼認證–00100000,然後將其轉換成10進位制,密碼認證–1, 簡訊認證–2,掃碼認證–4。Mysql儲存時使用單欄位(auth_method)int型別儲存,如果開啟了多種認證方式將多種認證方式對應的列舉數值相加後儲存,例如開啟了密碼認證和簡訊認證,則儲存為3(1+2)。
## 例1:判斷使用者是否開啟了密碼認證--1 (滿足條件時返回查詢結果,沒有滿足條件時返回為空) Select * from user where auth_method & 1; ## 例2:判斷使用者是否開啟了密碼認證 + 簡訊認證 (1+2) Select * from user where auth_method & 3; ## 例2:判斷使用者是否開啟了密碼認證 + 簡訊認證 + 掃碼認證 (1+2+4) Select * from user where auth_method & 7;
import com.google.common.collect.Lists; import lombok.Getter; import org.springframework.util.CollectionUtils; import java.util.Arrays; import java.util.List; @Getter public enum AuthMethodEnum { PASSWORD(1, "密碼認證"), SMS(2, "簡訊認證"), QR_CODE(4, "掃碼認證"); private Integer method; private String name; AuthMethodEnum(Integer method, String name) { this.method = method; this.name = name; } /** * 將mysql儲存值解析成多種認證方式 * @param method * @return */ public static List<Integer> parseAuthMethod(Integer method) { List<Integer> list = Lists.newArrayList(); if (null == method) { return list; } AuthMethodEnum[] arr = AuthMethodEnum.values(); // 需要先將method從大到小排序 Arrays.sort(arr, (o1, o2) -> { if (o1.method > o2.method) { return -1; } else { return 0; } }); for (AuthMethodEnum e : arr) { if (method >= e.method) { list.add(e.method); method = method - e.method; } } return list; } /** * 將任意種認證方式計算後得到儲存值 * @param methods * @return */ public static Integer calculateAuthMethod(List<Integer> methods) { if (CollectionUtils.isEmpty(methods)) { return 0; } return methods.stream().mapToInt(p -> p).sum(); } public static void main(String[] args) { System.out.println(parseAuthMethod(8)); } }
通過位運算的轉換,實現了單個欄位儲存不同的認證狀態,增加一個新的認證方式時只需要新增一個列舉值。不僅可以節省儲存空間,大大增加了可延伸性,對效能幾乎沒有影響。
符號 | 含義 |
---|---|
a|b | 位或 |
a&b | 位與 |
a^b | 位互斥或 |
~a | 位取反 |
a<<b | 位左移 |
a>>b | 位右移 |
到此這篇關於教你巧用mysql位運算解決多選值儲存問題的文章就介紹到這了,更多相關mysql位運算解決多選值儲存內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45