[mysql] BIT_OR functie; wat doe ik fout?

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Voor een website die ik beheer ben ik bezig een nieuw rechtensysteem te ontwerpen. In dit rechtensysteem worden alle rechten per persoon in een enkel int(8) opgeslagen. Elke toegangsflag heeft dan zijn eigen flag. Tot zover alles prima, ik wil echter ook de mogelijkheid geven om iemand met een simpele query alle mogelijke rechten te geven. Hiervoor kom ik uit op de BIT_OR functie van MySQL:
BIT_OR(expr)

Returns the bitwise OR of all bits in expr. The calculation is performed with 64-bit (BIGINT) precision.

This function returns 0 if there were no matching rows.
Echter, bij mij doet deze functie eigenlijk wat MAX hoort te doen. Een voorbeeld:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> SELECT mPid FROM mProject;
+------+
| mPid |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|   10 |
|   11 |
|   12 |
|   13 |
|   14 |
|   15 |
+------+
15 rows in set (0.00 sec)

mysql> SELECT BIT_OR(2 ^ (mPid - 1)) FROM mProject;
+------------------------+
| BIT_OR(2 ^ (mPid - 1)) |
+------------------------+
|                     15 |
+------------------------+
1 row in set (0.01 sec)
Als ik het goed uitgerekend heb, zou de uitkomst 32767 moeten zijn. Het zou in ieder geval geen vijftien moeten zijn. Wat doe ik fout?

Ik ontken het bestaan van IE.


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Je bitwise or is prima, maar als je de MySQL documentatie erop naslaat is ^ de bitwise Exclusive or en geen machtsverheffen, dat doe je met POW().

Overigens is 2 tot de 15de macht al 32768. Als je dat alles bitwise or't met de overige machten van twee dan zul je uitkomen op 65535. Niks aan de hand, ik had die -1 ff over het hoofd gezien.

[ Voor 67% gewijzigd door Creepy op 31-08-2006 21:06 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Probleem opgelost. Voor de duidelijkheid, het is dus het volgende geworden:

SQL:
1
SELECT BIT_OR(POW(2, mPid - 1)) FROM mProject;

Ik ontken het bestaan van IE.