Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#14

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

  Alt 10. Dez 2014, 07:27
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')

Geändert von Dejan Vu (10. Dez 2014 um 07:30 Uhr)
  Mit Zitat antworten Zitat