ฉันควรเลือกประเภทข้อมูลใดเพื่อจัดเก็บที่อยู่ IP ใน SQL Server
การเลือกประเภทข้อมูลที่ถูกต้องจะง่ายพอที่จะกรองตามที่อยู่ IP หรือไม่?
ฉันควรเลือกประเภทข้อมูลใดเพื่อจัดเก็บที่อยู่ IP ใน SQL Server
การเลือกประเภทข้อมูลที่ถูกต้องจะง่ายพอที่จะกรองตามที่อยู่ IP หรือไม่?
คำตอบ:
วิธีที่ถูกต้องในทางเทคนิคในการจัดเก็บ IPv4 คือไบนารี (4) เนื่องจากนั่นคือสิ่งที่เป็นจริง (ไม่ใช่ไม่ใช่แม้แต่ INT32 / INT (4) รูปแบบข้อความตัวเลขที่เราทุกคนรู้จักและชื่นชอบ (255.255.255.255) เป็นเพียง การแปลงการแสดงผลของเนื้อหาไบนารี)
หากคุณทำเช่นนี้คุณจะต้องการให้ฟังก์ชันแปลงเป็นและจากรูปแบบการแสดงข้อความ:
วิธีการแปลงรูปแบบการแสดงข้อความเป็นไบนารีมีดังนี้
CREATE FUNCTION dbo.fnBinaryIPv4(@ip AS VARCHAR(15)) RETURNS BINARY(4)
AS
BEGIN
DECLARE @bin AS BINARY(4)
SELECT @bin = CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
RETURN @bin
END
go
และนี่คือวิธีการแปลงไบนารีกลับเป็นรูปแบบการแสดงข้อความ:
CREATE FUNCTION dbo.fnDisplayIPv4(@ip AS BINARY(4)) RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @str AS VARCHAR(15)
SELECT @str = CAST( CAST( SUBSTRING( @ip, 1, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 2, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 3, 1) AS INTEGER) AS VARCHAR(3) ) + '.'
+ CAST( CAST( SUBSTRING( @ip, 4, 1) AS INTEGER) AS VARCHAR(3) );
RETURN @str
END;
go
นี่คือตัวอย่างวิธีการใช้งาน:
SELECT dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
SELECT dbo.fnDisplayIPv4( 0xC04144C9 )
-- should return '192.65.68.201'
go
สุดท้ายเมื่อทำการค้นหาและเปรียบเทียบให้ใช้รูปแบบไบนารีเสมอหากคุณต้องการใช้ประโยชน์จากดัชนีของคุณ
UPDATE:
ฉันต้องการเพิ่มวิธีหนึ่งในการแก้ไขปัญหาประสิทธิภาพโดยธรรมชาติของ UDF สเกลาร์ใน SQL Server แต่ยังคงไว้ซึ่งการใช้โค้ดซ้ำของฟังก์ชันคือการใช้ iTVF (ฟังก์ชันค่าตารางแบบอินไลน์) แทน ต่อไปนี้เป็นวิธีที่ฟังก์ชันแรกด้านบน (string to binary) สามารถเขียนใหม่เป็น iTVF ได้:
CREATE FUNCTION dbo.itvfBinaryIPv4(@ip AS VARCHAR(15)) RETURNS TABLE
AS RETURN (
SELECT CAST(
CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
AS BINARY(4)) As bin
)
go
นี่คือตัวอย่าง:
SELECT bin FROM dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
และนี่คือวิธีที่คุณจะใช้ใน INSERT
INSERT INTo myIpTable
SELECT {other_column_values,...},
(SELECT bin FROM dbo.itvfBinaryIPv4('192.65.68.201'))
คุณสามารถใช้ varchar ความยาวของ IPv4 เป็นแบบคงที่ แต่ IPv6 อาจมีความผันแปรสูง
หากคุณไม่มีเหตุผลที่ดีในการจัดเก็บเป็นไบนารีให้ใช้ประเภทสตริง (ข้อความ)
นี่คือรหัสบางส่วนสำหรับแปลง IPV4 หรือ IPv6 ในรูปแบบ varchar เป็น binary (16) และย้อนกลับ นี่เป็นรูปแบบที่เล็กที่สุดที่ฉันคิดได้ ควรจัดทำดัชนีให้ดีและเป็นวิธีที่ค่อนข้างง่ายในการกรองเครือข่ายย่อย ต้องใช้ SQL Server 2005 หรือใหม่กว่า ไม่แน่ใจว่ากันกระสุนได้ทั้งหมด หวังว่านี่จะช่วยได้
-- SELECT dbo.fn_ConvertIpAddressToBinary('2002:1ff:6c2::1ff:6c2')
-- SELECT dbo.fn_ConvertIpAddressToBinary('10.4.46.2')
-- SELECT dbo.fn_ConvertIpAddressToBinary('bogus')
ALTER FUNCTION dbo.fn_ConvertIpAddressToBinary
(
@ipAddress VARCHAR(39)
)
RETURNS BINARY(16) AS
BEGIN
DECLARE
@bytes BINARY(16), @vbytes VARBINARY(16), @vbzone VARBINARY(2)
, @colIndex TINYINT, @prevColIndex TINYINT, @parts TINYINT, @limit TINYINT
, @delim CHAR(1), @token VARCHAR(4), @zone VARCHAR(4)
SELECT
@delim = '.'
, @prevColIndex = 0
, @limit = 4
, @vbytes = 0x
, @parts = 0
, @colIndex = CHARINDEX(@delim, @ipAddress)
IF @colIndex = 0
BEGIN
SELECT
@delim = ':'
, @limit = 8
, @colIndex = CHARINDEX(@delim, @ipAddress)
WHILE @colIndex > 0
SELECT
@parts = @parts + 1
, @colIndex = CHARINDEX(@delim, @ipAddress, @colIndex + 1)
SET @colIndex = CHARINDEX(@delim, @ipAddress)
IF @colIndex = 0
RETURN NULL
END
SET @ipAddress = @ipAddress + @delim
WHILE @colIndex > 0
BEGIN
SET @token = SUBSTRING(@ipAddress, @prevColIndex + 1, @Colindex - @prevColIndex - 1)
IF @delim = ':'
BEGIN
SET @zone = RIGHT('0000' + @token, 4)
SELECT
@vbzone = CAST('' AS XML).value('xs:hexBinary(sql:variable("@zone"))', 'varbinary(2)')
, @vbytes = @vbytes + @vbzone
IF @token = ''
WHILE @parts + 1 < @limit
SELECT
@vbytes = @vbytes + @vbzone
, @parts = @parts + 1
END
ELSE
BEGIN
SET @zone = SUBSTRING('' + master.sys.fn_varbintohexstr(CAST(@token AS TINYINT)), 3, 2)
SELECT
@vbzone = CAST('' AS XML).value('xs:hexBinary(sql:variable("@zone"))', 'varbinary(1)')
, @vbytes = @vbytes + @vbzone
END
SELECT
@prevColIndex = @colIndex
, @colIndex = CHARINDEX(@delim, @ipAddress, @colIndex + 1)
END
SET @bytes =
CASE @delim
WHEN ':' THEN @vbytes
ELSE 0x000000000000000000000000 + @vbytes
END
RETURN @bytes
END
-- SELECT dbo.fn_ConvertBinaryToIpAddress(0x200201FF06C200000000000001FF06C2)
-- SELECT dbo.fn_ConvertBinaryToIpAddress(0x0000000000000000000000000A0118FF)
ALTER FUNCTION [dbo].[fn_ConvertBinaryToIpAddress]
(
@bytes BINARY(16)
)
RETURNS VARCHAR(39) AS
BEGIN
DECLARE
@part VARBINARY(2)
, @colIndex TINYINT
, @ipAddress VARCHAR(39)
SET @ipAddress = ''
IF SUBSTRING(@bytes, 1, 12) = 0x000000000000000000000000
BEGIN
SET @colIndex = 13
WHILE @colIndex <= 16
SELECT
@part = SUBSTRING(@bytes, @colIndex, 1)
, @ipAddress = @ipAddress
+ CAST(CAST(@part AS TINYINT) AS VARCHAR(3))
+ CASE @colIndex WHEN 16 THEN '' ELSE '.' END
, @colIndex = @colIndex + 1
IF @ipAddress = '0.0.0.1'
SET @ipAddress = '::1'
END
ELSE
BEGIN
SET @colIndex = 1
WHILE @colIndex <= 16
BEGIN
SET @part = SUBSTRING(@bytes, @colIndex, 2)
SELECT
@ipAddress = @ipAddress
+ CAST('' as xml).value('xs:hexBinary(sql:variable("@part") )', 'varchar(4)')
+ CASE @colIndex WHEN 15 THEN '' ELSE ':' END
, @colIndex = @colIndex + 2
END
END
RETURN @ipAddress
END
ตามที่ฉันต้องการจัดการทั้งIPv4
และIPv6
ฉันกำลังใช้VARBINARY(16)
และSQL CLR
ฟังก์ชันต่อไปนี้เพื่อแปลงtext
การนำเสนอที่อยู่ IP เป็นไบต์และย้อนกลับ:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlBytes GetIPAddressBytesFromString (SqlString value)
{
IPAddress IP;
if (IPAddress.TryParse(value.Value, out IP))
{
return new SqlBytes(IP.GetAddressBytes());
}
else
{
return new SqlBytes();
}
}
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetIPAddressStringFromBytes(SqlBytes value)
{
string output;
if (value.IsNull)
{
output = "";
}
else
{
IPAddress IP = new IPAddress(value.Value);
output = IP.ToString();
}
return new SqlString(output);
}
สำหรับผู้ที่ใช้. NET สามารถใช้คลาส IPAddress เพื่อแยกวิเคราะห์สตริง IPv4 / IPv6 และจัดเก็บเป็นไฟล์VARBINARY(16)
. สามารถใช้คลาสเดียวกันเพื่อแปลงbyte[]
เป็นสตริง หากต้องการแปลงVARBINARY
ใน SQL:
--SELECT
-- dbo.varbinaryToIpString(CAST(0x7F000001 AS VARBINARY(4))) IPv4,
-- dbo.varbinaryToIpString(CAST(0x20010DB885A3000000008A2E03707334 AS VARBINARY(16))) IPv6
--ALTER
CREATE
FUNCTION dbo.varbinaryToIpString
(
@varbinaryValue VARBINARY(16)
)
RETURNS VARCHAR(39)
AS
BEGIN
IF @varbinaryValue IS NULL
RETURN NULL
IF DATALENGTH(@varbinaryValue) = 4
BEGIN
RETURN
CONVERT(VARCHAR(3), CONVERT(INT, SUBSTRING(@varbinaryValue, 1, 1))) + '.' +
CONVERT(VARCHAR(3), CONVERT(INT, SUBSTRING(@varbinaryValue, 2, 1))) + '.' +
CONVERT(VARCHAR(3), CONVERT(INT, SUBSTRING(@varbinaryValue, 3, 1))) + '.' +
CONVERT(VARCHAR(3), CONVERT(INT, SUBSTRING(@varbinaryValue, 4, 1)))
END
IF DATALENGTH(@varbinaryValue) = 16
BEGIN
RETURN
sys.fn_varbintohexsubstring(0, @varbinaryValue, 1, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 3, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 5, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 7, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 9, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 11, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 13, 2) + ':' +
sys.fn_varbintohexsubstring(0, @varbinaryValue, 15, 2)
END
RETURN 'Invalid'
END
sys.dm_exec_connections
ใช้ varchar (48) หลัง SQL Server 2005 SP1 ฟังดูดีพอสำหรับฉันโดยเฉพาะหากคุณต้องการใช้เปรียบเทียบกับคุณค่าของคุณ
ตามความเป็นจริงคุณจะไม่เห็น IPv6 เป็นกระแสหลักไปสักพักแล้วดังนั้นฉันจึงต้องการ 4 เส้นทางเล็ก ๆ พูดอย่างนั้นฉันใช้ varchar (48) เพราะฉันต้องใช้sys.dm_exec_connections
...
มิฉะนั้น. คำตอบของ Mark Redman กล่าวถึงคำถามการอภิปราย SO ก่อนหน้านี้
ขอบคุณ RBarry ฉันกำลังรวบรวมระบบการจัดสรรบล็อก IP และการจัดเก็บเป็นไบนารีเป็นวิธีเดียวที่จะไป
ฉันกำลังจัดเก็บการแสดง CIDR (เช่น 192.168.1.0/24) ของบล็อก IP ในฟิลด์ varchar และใช้ฟิลด์ที่คำนวณได้ 2 ฟิลด์เพื่อเก็บรูปแบบไบนารีของจุดเริ่มต้นและจุดสิ้นสุดของบล็อก จากนั้นฉันสามารถเรียกใช้การสืบค้นอย่างรวดเร็วเพื่อดูว่าบล็อกที่กำหนดตามที่จัดสรรไว้แล้วหรือมีอิสระที่จะมอบหมาย
ฉันแก้ไขฟังก์ชันของคุณเพื่อคำนวณที่อยู่ IP สิ้นสุดดังนี้:
CREATE FUNCTION dbo.fnDisplayIPv4End(@block AS VARCHAR(18)) RETURNS BINARY(4)
AS
BEGIN
DECLARE @bin AS BINARY(4)
DECLARE @ip AS VARCHAR(15)
DECLARE @size AS INT
SELECT @ip = Left(@block, Len(@block)-3)
SELECT @size = Right(@block, 2)
SELECT @bin = CAST( CAST( PARSENAME( @ip, 4 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 3 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 2 ) AS INTEGER) AS BINARY(1))
+ CAST( CAST( PARSENAME( @ip, 1 ) AS INTEGER) AS BINARY(1))
SELECT @bin = CAST(@bin + POWER(2, 32-@size) AS BINARY(4))
RETURN @bin
END;
go
ฉันมักจะใช้การกรอง VARCHAR แบบเก่าธรรมดาสำหรับ IPAddress ทำงานได้ดี
หากคุณต้องการกรองช่วงของที่อยู่ IP ฉันจะแบ่งออกเป็นจำนวนเต็มสี่จำนวน
ฉันชอบฟังก์ชั่นของ SandRock แต่ผมพบว่ามีข้อผิดพลาดในรหัสของdbo.fn_ConvertIpAddressToBinary พารามิเตอร์ขาเข้าของ @ipAddress VARCHAR (39) มีขนาดเล็กเกินไปเมื่อคุณต่อ @delim เข้ากับพารามิเตอร์นี้
SET @ipAddress = @ipAddress + @delim
คุณสามารถเพิ่มเป็น 40 หรือดีกว่า แต่ใช้ตัวแปรใหม่ที่ใหญ่กว่าและใช้ภายใน ด้วยวิธีนี้คุณจะไม่สูญเสียคู่สุดท้ายในจำนวนมาก
SELECT dbo.fn_ConvertIpAddressToBinary('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
คำตอบต่อไปนี้มาจากคำตอบของM. TurnhoutและJerry Birchlerสำหรับคำถามนี้ แต่มีการปรับปรุงดังต่อไปนี้:
sys.fn_varbintohexsubstring
, fn_varbintohexstr
) ด้วยCONVERT()
สำหรับรูปแบบไบนารีCAST('' as xml).value('xs:hexBinary())
) ด้วยCONVERT()
สำหรับรูปแบบไบนารีfn_ConvertIpAddressToBinary
(ตามที่C.Plockชี้ให้เห็น )รหัสได้รับการทดสอบในSQL Server 2014และSQL Server 2016 (ดูกรณีทดสอบในตอนท้าย)
แปลงค่า 4 ไบต์เป็นค่าIPV4และ 16 ไบต์เป็นการแสดงสตริงIPV6 โปรดทราบว่าฟังก์ชันนี้ไม่ได้ทำให้ที่อยู่สั้นลง
ALTER FUNCTION dbo.IPAddressVarbinaryToString
(
@varbinaryValue VARBINARY( 16 )
)
RETURNS VARCHAR(39)
AS
BEGIN
IF @varbinaryValue IS NULL
RETURN NULL;
ELSE IF DATALENGTH( @varbinaryValue ) = 4
RETURN
CONVERT( VARCHAR(3), CONVERT(TINYINT, SUBSTRING( @varbinaryValue, 1, 1 ))) + '.' +
CONVERT( VARCHAR(3), CONVERT(TINYINT, SUBSTRING( @varbinaryValue, 2, 1 ))) + '.' +
CONVERT( VARCHAR(3), CONVERT(TINYINT, SUBSTRING( @varbinaryValue, 3, 1 ))) + '.' +
CONVERT( VARCHAR(3), CONVERT(TINYINT, SUBSTRING( @varbinaryValue, 4, 1 )));
ELSE IF DATALENGTH( @varbinaryValue ) = 16
RETURN
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 1, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 3, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 5, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 7, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 9, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 11, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 13, 2 ), 2 ) + ':' +
CONVERT( VARCHAR(4), SUBSTRING( @varbinaryValue, 15, 2 ), 2 );
RETURN 'Invalid';
END
SELECT dbo.IPAddressVarbinaryToString(0x00000000000000000000000000000000) -- 0000:0000:0000:0000:0000:0000:0000:0000 (no address shortening)
SELECT dbo.IPAddressVarbinaryToString(0x00010002000300400500060070000089) -- 0001:0002:0003:0040:0500:0600:7000:0089
SELECT dbo.IPAddressVarbinaryToString(0xC0A80148) -- 255.168.1.72
SELECT dbo.IPAddressVarbinaryToString(0x7F000001) -- 127.0.0.1 (no address shortening)
SELECT dbo.IPAddressVarbinaryToString(NULL) -- NULL
แปลงการแสดงสตริงIPV4และIPV6เป็นค่าไบนารี 4 ไบต์และ 16 ไบต์ตามลำดับ โปรดทราบว่าฟังก์ชันนี้สามารถแยกวิเคราะห์การแทนค่าที่อยู่ชวเลขได้ส่วนใหญ่ (เช่น 127 ... 1 และ 2001: db8 :: 1319: 370: 7348) เพื่อบังคับให้ฟังก์ชัน thins ส่งคืนค่าไบนารี 16 ไบต์เสมอโดยไม่ใส่เครื่องหมายนำหน้าการต่อ 0s ที่ส่วนท้ายของฟังก์ชัน
ALTER FUNCTION [dbo].[IPAddressStringToVarbinary]
(
@IPAddress VARCHAR( 39 )
)
RETURNS VARBINARY(16) AS
BEGIN
IF @ipAddress IS NULL
RETURN NULL;
DECLARE @bytes VARBINARY(16), @token VARCHAR(4),
@vbytes VARBINARY(16) = 0x, @vbzone VARBINARY(2),
@tIPAddress VARCHAR( 40 ),
@colIndex TINYINT,
@delim CHAR(1) = '.',
@prevColIndex TINYINT = 0,
@parts TINYINT = 0, @limit TINYINT = 4;
-- Get position if IPV4 delimiter
SET @colIndex = CHARINDEX( @delim, @ipAddress );
-- If not IPV4, then assume IPV6
IF @colIndex = 0
BEGIN
SELECT @delim = ':', @limit = 8, @colIndex = CHARINDEX( @delim, @ipAddress );
-- Get number of parts (delimiters)
WHILE @colIndex > 0
SELECT @parts += 1, @colIndex = CHARINDEX( @delim, @ipAddress, @colIndex + 1 );
SET @colIndex = CHARINDEX( @delim, @ipAddress );
IF @colIndex = 0
RETURN NULL;
END
-- Add trailing delimiter (need new variable of larger size)
SET @tIPAddress = @IPAddress + @delim;
WHILE @colIndex > 0
BEGIN
SET @token = SUBSTRING( @tIPAddress, @prevColIndex + 1, @Colindex - @prevColIndex - 1 );
IF @delim = ':'
BEGIN
SELECT @vbzone = CONVERT( VARBINARY(2), RIGHT( '0000' + @token, 4 ), 2 ), @vbytes += @vbzone;
-- Handles consecutive sections of zeros representation rule (i.e. ::)(https://en.wikipedia.org/wiki/IPv6#Address_representation)
IF @token = ''
WHILE @parts + 1 < @limit
SELECT @vbytes += @vbzone, @parts += 1;
END
ELSE
BEGIN
SELECT @vbzone = CONVERT( VARBINARY(1), CONVERT( TINYINT, @token )), @vbytes += @vbzone
END
SELECT @prevColIndex = @colIndex, @colIndex = CHARINDEX( @delim, @tIPAddress, @colIndex + 1 )
END
SET @bytes =
CASE @delim
WHEN ':' THEN @vbytes
ELSE /*0x000000000000000000000000 +*/ @vbytes -- Return IPV4 addresses as 4 byte binary (uncomment leading 0s section to force 16 byte binary)
END
RETURN @bytes
END
กรณีที่ถูกต้อง
SELECT dbo.IPAddressStringToVarbinary( '0000:0000:0000:0000:0000:0000:0000:0001' ) -- 0x0000000000000000000000000001 (check bug fix)
SELECT dbo.IPAddressStringToVarbinary( '0001:0002:0003:0040:0500:0600:7000:0089' ) -- 0x00010002000300400500060070000089
SELECT dbo.IPAddressStringToVarbinary( '2001:db8:85a3:8d3:1319::370:7348' ) -- 0x20010DB885A308D31319000003707348 (check short hand)
SELECT dbo.IPAddressStringToVarbinary( '2001:db8:85a3:8d3:1319:0000:370:7348' ) -- 0x20010DB885A308D31319000003707348
SELECT dbo.IPAddressStringToVarbinary( '192.168.1.72' ) -- 0xC0A80148
SELECT dbo.IPAddressStringToVarbinary( '127...1' ) -- 0x7F000001 (check short hand)
SELECT dbo.IPAddressStringToVarbinary( NULL ) -- NULL
SELECT dbo.IPAddressStringToVarbinary( '' ) -- NULL
-- Check that conversions return original address
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '0001:0002:0003:0040:0500:0600:7000:0089' )) -- '0001:0002:0003:0040:0500:0600:7000:0089'
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '127...1' )) -- 127.0.0.1
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '192.168.1.72' )) -- 192.168.1.72
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '2001:db8:85a3:8d3:1319::370:7348' )) -- 2001:0db8:85a3:08d3:1319:0000:0370:7348
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '2001:db8:85a3:8d3:1314:0000:370:7348' )) -- 2001:0db8:85a3:08d3:1319:0000:0370:7348
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '2001:db8:85a3:8d3::370:7348' )) -- 2001:0DB8:85A3:08D3:0000:0000:0370:7348
-- This is technically an invalid IPV6 (according to Wikipedia) but it parses correctly
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '2001:db8::1319::370:7348' )) -- 2001:0DB8:0000:0000:1319:0000:0370:7348
กรณีไม่ถูกต้อง
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '2001:db8::1319::7348' )) -- 2001:0DB8:0000:0000:0000:1319:0000:7348 (ambiguous address)
SELECT dbo.IPAddressStringToVarbinary( '127.1' ) -- 127.0.0.1 (not supported short-hand)
SELECT dbo.IPAddressVarbinaryToString( dbo.IPAddressStringToVarbinary( '127.1' )) -- 127.0.0.1 (not supported short-hand)
SELECT dbo.IPAddressStringToVarbinary( '0300.0000.0002.0353' ) -- octal byte values
SELECT dbo.IPAddressStringToVarbinary( '0xC0.0x00.0x02.0xEB' ) -- hex values
SELECT dbo.IPAddressStringToVarbinary( 'C0.00.02.EB' ) -- hex values
ฉันใช้varchar(15)
ทุกอย่างที่ทำงานเพื่อฉันจนถึงตอนนี้ แทรกอัปเดตเลือก ฉันเพิ่งเริ่มแอพที่มีที่อยู่ IP แม้ว่าฉันจะยังไม่ได้ทำงานด้านการพัฒนามากนัก
นี่คือคำสั่งเลือก:
select * From dbo.Server
where [IP] = ('132.46.151.181')
Go