von einem 64 BIT Feld können nur 32 genutzt werden

F.o.G.

Erfahrenes Mitglied
Hallo,
ich habe ja vor einiger Zeit hier mal über das Rechte Management per Bitmuster Informationen bekommen. Nun ist ein neues Problem aufgetaucht:

Ich benutze als RechteFeld ein BIGINT Feld mit 20 Stellen, dass ja theoretisch 64 Bits hat. Diese Feld habe ich auf UNSIGNED gestellt, da dann ja alle 20 Stellen im positiven Zahlenbereich zur Verfügung stehen. Wenn ich allerdings das 32. Bit setze, wird bei PHP anstatt dem 32. Bit das erste Bit gesetzt. Liegt das an MySQL, das ja 64 bittige Zahlen zulässt oder liegt das an PHP? Was kann ich dagegen tun?

Wie gesagt, bis 32 Bit ist das alles kein Problem.

Dann hätt ich noch eine andere Frage: Wenn ich ein MYSQL Feld habe, welches Bitmuster enthält, und ich eine ganze Palette von Bits überprüfen möchte, könnte ich ja theoretisch im SELECT Befehl schon per & Operator vergleichen. Wenn ich allerdings eine Palette mit meheren Bits mit dem in der Tabelle gepeicherten Wert vergleiche, gibt mir MySQL auch Results, wo nur eins der in der Palette gespeicherten Bits aktiviert ist.

Um wirklich nur die zu bekommen, wo sagen wir mal die ersten 3 Bits gesetzt sind, müsste ich alle 3 Abfragen per AND verknüpfen ( WHERE bitlist & 1 AND bitlist & 2 AND bitlist & 3). Wie kann ich das ganze so machen, dass ich nur die Palette aus 1|2|3 in das Query aufnehmen muss?

Ciao, F.o.G.
 
ich würde mal eher sagen, dass das weder an mysql noch an php liegt. das liegt wohl eher an dem rechner, der die zahlen verarbeitet. die prozessoren, die heute auf dem markt für privatanwender verkauft werden (also alle 80x86-cpu's mit ausnahme vom intel itanium und athlon xp 2600+) haben 32bit-register und können daher von sich aus nicht mehr als 32bit auf einmal verarbeiten.
mit dem itanium bzw. xp 2600+ ist die nächste generation mit 64bit aber schon da und damit sind dann auch grössere zahlen möglich.

kann allerdings auch sein, dass ich mich da irre, denn ich weiss nicht, was bei puretec oder anderen anbietern für server stehen. aber auch da sollten 32bit-cpu's am weitesten verbreitet sein.
 
jo das liegt an php
da gibt es nur integer
sprich eine 32 bit zahl wobei die erste das vorzeichen ist
sprich du kannst nur 31 bits nutzen
wie schon damals gesagt du brauchst in mysql 2 felder für deine
rechtegeschichte
 
achja zu deiner 2. frage

wenn du sagst where bitlist & 3

dann bekommst du als antwort die datensätze wo das
"rechtebit 1" und "rechtebit 2" gesetzt sind

du kannst die rechte addieren :-)

mal nachgefragt warum setzt du denn bit > 32 bei 20 rechten
<grübel>
 
Zuletzt bearbeitet:
@melmager: Schon mal was von der Editierfunktion gehört? :D

Um deine Frage zu beantworten: F.o.G. hat nie etwas von 20 Rechten gesagt :p Es ging nur darum, dass ein BIGINT-Feld in MySQL 20-stellige Zahlen aufnehmen kann... ;)
 
Hmm, ok, dann kann ich mir also 32 Bit beim Feld sparen. Kostet ehh nur Speicherplatz.

Bei dem angesprochenen Problem mit der Abfrage der Bitmuster: bitlist & 3 sollte mir ja wirklich theoretisch alle Datensätze liefern, die das erste und das 2. Bit gesetzt haben. Aber dem ist nicht so. Ich bekomme auch Datensätze zurückgeliefert, bei denen nur das erste Bit gesetzt ist.

Ich habe auch herum experimentiert was die Anordnung betrifft. So scheint es in MySQL auch kein Problem zu sein, dass man zum Beispiel zuerst die Pattern nennt, und dann das zu überprüfende Feld.

So ist es ja in PHP: man prüft eine Liste von Bits gegen eine Bitliste. Ich habe das ganze nun so in MySQL versucht:

WHERE ($pattern & bitlist) ... wobei bitlist das Feld der Tabelle ist. Mysql verarbeitet das, aber es kommt wieder ein Ergebnis raus, was nicht sein dürfte (zu viele Datensätze).

Bisher geht das ganze nur so:

WHERE bitlist & 1 AND bitlist & 2 ...

aber nicht:

WHERE bitlist & 3 ...

aus oben genannten Gründen.

Zur Anzahl: Jo stimmt, ich meinte die Anzahl der Stellen der Zahl. Ich benutze diese Liste wo ich an die 32 Bits rankomme aber nicht fürs Rechte Management sondern auch für ein Immobilienmodul, wo man dann so Yes/No Sachen wie Golfplatz, Fitnesscenter, Kindergarten usw. setzen kann.
Beim suchen von Objekten soll der User halt eine Liste dieser Optionen mit Checkboxen bekommen und dann sollte eigentlich ein ganz einfaches Query zusammen gesetzt werden, dass halt eine Pallette der gewählten Optionen gegen die Bitliste in der DB prüft. Das wäre sehr schnell und effizient, auch in der Programmierung. Aber wenn ich nun jedes Bit innerhalb eines eigenen AND Zweiges prüfen muss, ist die Einfachheit und womöglich auch der Geschwindigkeitsvorteil weg.

Vielleicht gibt es ja eine Lösung ...

Ciao, F.o.G.
 
Zurück