2010-09-08 29 views
8

Chúng tôi sử dụng trường nhị phân (16) để lưu trữ Địa chỉ IP. Chúng tôi làm điều này vì nó có thể chứa cả địa chỉ IPv4 và IPv6 và dễ dàng sử dụng với lớp .Net IPAddress.Hoàn thiện chuỗi nhị phân SQL thành Địa chỉ IP chuyển đổi

Tuy nhiên tôi đã tạo hàm SQL sau để chuyển đổi địa chỉ nhị phân thành chuỗi Địa chỉ IP cho mục đích báo cáo.

CREATE FUNCTION fn_ConvertBinaryIPAddressToString 
(
    @binaryIP binary(16) 
) 
RETURNS nvarchar(39) 
AS 
BEGIN 
    DECLARE @ipAsString nvarchar(39) 

    -- Is IPv4 
    IF (substring(@binaryIP, 5, 1) = 0x00) <-- Is there a better way? 
    BEGIN 

     SELECT @ipAsString = CAST(CAST(substring(@binaryIP, 1, 1) AS int) AS nvarchar(3)) + '.' + 
     CAST(CAST(substring(@binaryIP, 2, 1) AS int) AS nvarchar(3)) + '.' + 
     CAST(CAST(substring(@binaryIP, 3, 1) AS int) AS nvarchar(3)) + '.' + 
     CAST(CAST(substring(@binaryIP, 4, 1) AS int) AS nvarchar(3)) 

    END 
    ELSE 
    BEGIN 
    -- Is IPv6 
     -- taken and modified from http://support.microsoft.com/kb/104829 
     DECLARE @i int 
     DECLARE @length int 
     DECLARE @hexstring char(16) 

     SELECT @ipAsString = '' 
     SELECT @i = 1 
     SELECT @length = 16 
     SELECT @hexstring = 'ABCDEF' 

     WHILE (@i <= @length) 
     BEGIN 
      DECLARE @tempint int 
      DECLARE @firstint int 
      DECLARE @secondint int 

      SELECT @tempint = convert(int, substring(@binaryIP,@i,1)) 
      SELECT @firstint = floor(@tempint/16) 
      SELECT @secondint = @tempint - (@firstint*16) 

      SELECT @ipAsString = @ipAsString + substring(@hexstring, @firstint+1, 1) + substring(@hexstring, @secondint+1, 1) 

      IF (@i % 2 = 0) 
       SELECT @ipAsString = @ipAsString + ':' 

      SELECT @i = @i + 1 
     END 
    END 

    -- Return the result of the function 
    RETURN @ipAsString 

END 
GO 

Hiện tại nếu 5 byte bằng 0 tôi giả sử đó là địa chỉ IPv4. Đây có phải là một giả định an toàn không? Nó là tốt hơn để kiểm tra tất cả các byte còn lại cho số không hoặc là có một cách tốt hơn?

EDIT tháo dàn diễn viên không cần thiết

Trả lời

5

Tôi muốn nói rằng bạn phải được lưu trữ các gia đình địa chỉ cũng có, hoặc mã hóa trong mảng byte hoặc như một cột riêng. Nếu bạn chuyển 16 byte cho hàm tạo IPAddress, nó sẽ xây dựng như địa chỉ IPv6, vì vậy bạn cần kiểm tra trong mã của bạn cũng để xác định họ địa chỉ. Nó có vẻ dễ dàng hơn nhiều (và không dựa vào các giả định về byte của địa chỉ IPv6) để giữ thông tin này trực tiếp.

Hoặc sử dụng varbinary (16), sau đó bạn có thể kiểm tra độ dài (length = 4 => địa chỉ IPv4)

+0

Lời khuyên tuyệt vời cảm ơn bạn. – Magpie

Các vấn đề liên quan