Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#19

AW: SQL Select gesucht - IP Adresse zwischen IP Min und IP Max

  Alt 10. Dez 2014, 20:09
Wirklich, mir ist es auch egal für welche Lösung er sich entscheidet oder ob er überhaupt eine davon nimmt.
Du hast auch recht damit, dass Binary(4) das effektivste Format ist, um die 32 Bit große IP in der DB zu speichern.
Das Vergleichen gegen ein extrem teuer indizierbares berechnetes Feld ist aber ineffektiver Bockmist.

Zitat von Dejan Vu:
In deiner Tabelle deklarierst Du dann z.B. so:
markieren Code:
Code:
CREATE TABLE [dbo].[MyComputers](
   [IPAddress] AS ([dbo].[IPToBinary]([IPAddressString])),
   [IPAddressString] [varchar](15) NULL
) ON [PRIMARY]
Zitat von Dejan Vu:
Du findest dann alle PC im Bereich '123.123.123.0' und '123.124.123.255' mit
markieren Code:
Code:
select * 
  from MyComputers
  where IPAddress between dbo.IPToBinary('123.123.123.0') and dbo.IPToBinary ('123.124.123.255')
[/QUOTE]
Zudem glaube ich (ohne das jetzt prüfen oder nachlesen zu wollen), dass Delphi ein Binary Feld nicht direkt auslesen kann. Falls die Daten mal außerhalb der DB, in seiner Delphi Anwendung genutzt werden sollen, dann wird er das Feld vermutlich (wie ein Blob) krampfig über einen Stream auslesen müssen. BigInt ginge direkt.

Ich werde mein DP Konto nach diesem Post löschen.
Jedesmal wenn ich mir die Arbeit mache, um für irgendwelche Fragestellungen eine funktionierende Lösung zu erarbeiten und zu posten, habe ich danach stundenlange Klarstellungen und Längenvergleiche am Hals. Seit Jahren findet sich immer jemand, der in allen Posts irgendwelche Bagatellfehler sucht und die investierte Arbeit danach ins Absurdum dreht.
Ich will meine Zeit zukünftig nicht mehr so sinnlos verschwenden.

Ein paar kleine Sachen noch:

INT ist zu klein. Da passen laut Adam Ries keine 4 Byte rein.
Bist Du dir da wirklich sicher?
Mich persönlich stört bei 'int' das Vorzeichen. Was hat ein '-' mit einer IP-Adresse am Hut?
(BigInt=8 Bytes, siehe Link ) Ich muss hier ja eigentlich nichts belegen, aber... IP-Adressen sind als 4 einzelne Bytes definiert, nicht als eine Zahl.
Du hast den richtigen MSDN Artikel gefunden, hast gesehen das der INT Datentyp 4 Byte groß ist, hast auch gesehen INT nicht vorzeichenlos ist, und, Dir ist bewusst, dass IP Adressen per se nicht negativ werden können.

Dann ist deine Aussage "INT geht" fachlich einfach falsch, wenn Du nicht zeitgleich auf die passenden Shift Funktionen verweist.
Der INT hat 2 Byte im positiven und 2 Byte im negativen Bereich.
In dem 2 Byte großen positiven Bereich kann man nun mal keine 4 Byte große positive Zahl hineinschreiben.
Probiere es aus, schau Dir die Exception an und lerne.

Wenn Dein "4 Byte Binary passt natürlich easy in einen 4 Byte INT Datentyp" ein Einsteiger liest, dann bringst Du den zum Verzweifeln. Der glaubt er macht was Anderes falsch, wenn der SQL Server ihm eine "Value out of Range" Exception an den Kopf wirft.
Und ehrlich, alle berechneten Werte nochmal shiften, damit sie doch irgendwie in den INT hineinpassen ... Das ist für mich eher eine Notlösung als eine Lösung.

So, zerreiß meine Klarstellung in der Luft. Ich bin dann mal weg.
  Mit Zitat antworten Zitat