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.