SQL位運算

壹頁書發表於2015-12-28
做網站的人都應該明白
有一些瓷,不可說,說不得,不可思,不可議.
但是,你懂的.

結構和資料:
  1. create table SENSITIVE_WORD(  
  2.     id int primary key auto_increment,  
  3.     word varchar(20) not null,  
  4.     module int  
  5. );  
  6.   
  7. insert into SENSITIVE_WORD(word) values('官窯');  
  8. insert into SENSITIVE_WORD(word) values('民窯');  
  9. insert into SENSITIVE_WORD(word) values('大寶劍');  
  10. commit;  

單位的敏感詞庫,同樣的敏感詞,不同的模組認定卻不一樣.
比如大寶劍,作為暱稱輸入,認為他是敏感詞,直接過濾;但是內容的模組,聊天的模組卻不認為是敏感詞.

也可以考慮用SQL位運算的方式設計.
假設現在一共有如下模組,
暱稱  2
內容  4
聊天  8
歌詞  16
評論  32

  1. mysql> select id,power(2,id) from nums where id<=5;  
  2. +----+-------------+  
  3. | id | power(2,id) |  
  4. +----+-------------+  
  5. |  1 |           2 |  
  6. |  2 |           4 |  
  7. |  3 |           8 |  
  8. |  4 |          16 |  
  9. |  5 |          32 |  
  10. +----+-------------+  
  11. rows in set (0.08 sec)  

每個模組代表一個二進位制位,如果一個詞在所有的模組都是敏感詞,他的module (11111),轉為10進位制(2+4+8+16+32)=64

設定大寶劍在暱稱,內容,歌詞模組為敏感詞
設定官窯在內容,聊天模組為敏感詞
設定民窯在暱稱,聊天模組為敏感詞
  1. update SENSITIVE_WORD set module=(2+4+16) where word='大寶劍';  
  2. update SENSITIVE_WORD set module=(4+8) where word='官窯';  
  3. update SENSITIVE_WORD set module=(2+8) where word='民窯';  
  4.   
  5. mysql> select * from SENSITIVE_WORD;  
  6. +----+--------+--------+  
  7. | id | word   | module |  
  8. +----+--------+--------+  
  9. |  1 | 官窯   |     12 |  
  10. |  2 | 民窯   |     10 |  
  11. |  3 | 大寶劍 |     22 |  
  12. +----+--------+--------+  
  13. rows in set (0.00 sec)  


應用在啟動的時候,拉取暱稱的敏感詞.
  1. mysql> select * from SENSITIVE_WORD where module & 8=8;  
  2. +----+------+--------+  
  3. | id | word | module |  
  4. +----+------+--------+  
  5. |  1 | 官窯 |     12 |  
  6. |  2 | 民窯 |     10 |  
  7. +----+------+--------+  
  8. rows in set (0.00 sec)  


這樣的好處是
1.動態擴充套件模組而不需要修改表結構.否則每增加一個模組,就需要增加一個欄位.
2.同時拉取多個模組的敏感詞也比較簡單,比如同時拉取暱稱和歌詞的敏感詞
where module & (16+2) = (16+2)


MySQL相關二進位制操作
  1. # BIN(N)返回二進位制值N的一個字串表示  
  2. mysql> select bin(123);  
  3. +----------+  
  4. | bin(123) |  
  5. +----------+  
  6. | 1111011  |  
  7. +----------+  
  8. 1 row in set (0.00 sec)  
  9.   
  10. # OCT(N)返回八進位制值N的一個字串表示  
  11. mysql> select oct(123);  
  12. +----------+  
  13. | oct(123) |  
  14. +----------+  
  15. | 173      |  
  16. +----------+  
  17. 1 row in set (0.00 sec)  
  18.   
  19. # HEX(N)返回十六進位制值N的一個字串表示  
  20. mysql> select hex(123);  
  21. +----------+  
  22. | hex(123) |  
  23. +----------+  
  24. | 7B       |  
  25. +----------+  
  26. 1 row in set (0.00 sec)  
  27.   
  28. mysql> select concat('0x', hex(123));  
  29. +------------------------+  
  30. | concat('0x', hex(123)) |  
  31. +------------------------+  
  32. | 0x7B                   |  
  33. +------------------------+  
  34. 1 row in set (0.00 sec)  

Oracle 有bitand函式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1966195/,如需轉載,請註明出處,否則將追究法律責任。

相關文章