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
Lời khuyên tuyệt vời cảm ơn bạn. – Magpie