gpt4 book ai didi

sql - 完善 SQL 二进制到 IP 地址字符串的转换

转载 作者:行者123 更新时间:2023-12-02 10:26:36 25 4
gpt4 key购买 nike

我们使用二进制 (16) 字段来存储 IP 地址。我们这样做是因为它可以同时保存 IPv4 和 IPv6 地址,并且可以轻松地与 .Net IPAddress 类一起使用。

但是,我创建了以下 SQL 函数来将二进制地址转换为 IP 地址字符串以用于报告目的。

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 = '0123456789ABCDEF'

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

目前,如果第 5 个字节为 0,我认为它是 IPv4 地址。这是一个安全的假设吗?检查所有剩余字节是否为零更好还是有更好的方法?

编辑删除了不必要的 Actor

最佳答案

我想说你也应该存储地址族,要么编码在字节数组中,要么作为单独的列。如果将 16 个字节传递给 IPAddress 构造函数,它将构造为 IPv6 地址,因此您还需要检查代码以确定地址族。直接保留此信息似乎要容易得多(并且不依赖于有关 IPv6 地址字节的假设)。

或者使用 varbinary(16),然后您可以检查 (length=4 => IPv4 地址) 的长度

关于sql - 完善 SQL 二进制到 IP 地址字符串的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3665997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com