Wenn es Dir um die Datenbankgröße geht, dann nimm BigInt (feste Größe 4 Byte).
Hüstel. 8.
Wenn über
IP-Adressen gesucht wird, und auch über -Bereiche, schreit das erst einmal nach int, CHAR(4) oder BINARY(4). Allerdings würde ich CHAR wirklich nicht empfehlen, da es -abhängig von der Codepage und der Collation bei der Darstellung zu Problemen führen kann. BINARY und INT werden dagegen nicht interpretiert.
INT hat den Vorteil, das man auch auch (bit-)maskieren kann. BINARY hat den Vorteil, das man eine Ordnung aufbauen kann (Index, ORDER BY) und das in der Darstellung (reines SELECT auf dem Server) die Octets sichtbar werden, da im SSMS dieser Datentyp in hex dargestellt wird. Ich tendiere zur Speicherung als BINARY(4), weil das dem Grundformat am nächsten kommt (4 Bytes und eben kein Integer)
Hier eine T-
SQL Funktion, die einen String in ein Binary(4) umwandelt:
Code:
create function IPToBinary (@
IP VarChar(15))
returns binary (4)
as
begin
declare @b1 tinyint, @b2 tinyint, @b3 tinyint, @b4 tinyint
set @b4= cast(PARSENAME(@
IP, 4) as tinyint)
set @b3= cast(PARSENAME(@
IP, 3) as tinyint)
set @b2= cast(PARSENAME(@
IP, 2) as tinyint)
set @b1= cast(PARSENAME(@
IP, 1) as tinyint)
return cast(char(@b4)+char(@b3)+char(@b2)+char(@b1) as binary(4))
end
In deiner Tabelle deklarierst Du dann z.B. so:
Code:
CREATE TABLE [dbo].[MyComputers](
[IPAddress] AS ([dbo].[IPToBinary]([IPAddressString])),
[IPAddressString] [varchar](15) NULL
) ON [PRIMARY]
Du findest dann alle PC im Bereich '123.123.123.0' und '123.124.123.255' mit
Code:
select *
from MyComputers
where IPAddress between dbo.IPToBinary('123.123.123.0') and dbo.IPToBinary ('123.124.123.255')