สมมติเราค่า permission ที่ set ไว้ต่างๆดังนี้
Permission
8 = Superadmin
4 = Publish
2 = Write
1 = Read
อันนี้คือตารางวิทธิของ user แต่ละคน ซึ่งฟิลด์ Settings จะเก็บค่าที่ได้จากการวก permission ต่างๆเข้าด้วยกัน
สมมติ UserID 1 ก็คือเป็น 8 + 4 + 2 + 1 ก็คือจะมี permission ทุกอย่างตามข้างบน
Settings
UserID | Settings
1 15
2 2
3 4
4 7
5 5
แล้วเขียนคำสั่ง query เพื่อดู่าใครมีสิทธิ superadmin บ้าง ดังนี้
SELCT UserID FROM Settings WHERE Settings & 8=8
Query แล้วก็จะได้ผลออกเป็น
UserID = 1
รู้สึกจะเป้นเรื่อง bitwise มีใครพออธิบายเป้นภาษาง่ายให้เข้าใจได้บ้างมั๊ยครับ เหอะๆ
ขอบคุณครับ
Quote
MultiQuote
Edit
มันเป็นการ or (bitwise operation) ครับ ไม่ใช่ การบวก
ต้องมองแบบนี้ครับ
ค่าของแต่ละตัวเป็น flag แล้วก็เอามา or กัน จากตัวอย่างที่ยกมานะครับ
( << คือ right shift operation)
ถ้าหากว่ามี user ที่มีสิทธิ์ เป็น publish กับ read ก็ จะได้ ค่า permission = publish | read
ซึ่งก็จะเท่ากับ 4 | 1 หรือ ก็คือ 5 นั้นเอง
ที่นี้ เวลาจะตรวจสถานะ ก็ให้เอา ค่าของสถานที่ต้องการมาทำการ and (bitwise operation) ก็จะรู้ว่า มีสิทธิ์อะไรบ้าง ยกตัวอย่าง
ถ้าค่า permission = 9
ก็เอาค่า flag ของแต่ละตัวมา and ก็จะรู้ว่ามีสิทธิ์อะไรบ้าง
นั่นคือ user คนนี้ มีสิทธิ์ superadmin กับ read
ถ้าคิดในอีกมุมหนึ่งคือ 9 = 8 | 1 ซึ่งก็คือ superadmin | read นั้นเอง
ใส่วงเล็บเพื่อให้ดูง่ายขึ้น (Settings & 8) = 8
แปลง SQL เป็นคำพูดในที่นี้จะอธิบายว่า
Bitwise คือการคำนวณในฐานสอง ก่อนอื่นต้องแปลงค่าก่อน
ค่า UserID 1 ที่ใส่ลงไปในตารางคือ 15 (เกิดจาก 8+4+2+1) เขียนเป็นฐานสองได้ว่า 1111
ค่าที่นำมาเปรียบเทียบในที่นี้คือ 8 เขียนเป็นฐานสองได้ว่า 1000
Bitwise AND หมายถึงหาก Bit เป็นหนึ่งทั้งคู่ในแถวใดให้แทนด้วย 1
เสร็จแล้วนำผลลัพภ์มาแปลงกลับ 1000 = 8 ฐานสิบ เท่ากับตัวอย่างที่ให้มา ทำให้วลีนี้ถูกต้อง มันจึงนำข้อมูลในแถวนี้มาแสดง
ลองดูข้อมูลเพิ่มเติม http://en.wikipedia.org/wiki/Bitwise_operation#AND
ขอบคุณมากๆครับ
ขอบคุณครับ
ดูดๆๆ ความรู้