Cara yang benar secara teknis untuk menyimpan IPv4 adalah biner(4), karena itulah yang sebenarnya (tidak, bahkan bukan INT32/INT(4), bentuk tekstual numerik yang kita semua tahu dan sukai (255.255.255.255) menjadi adil konversi tampilan konten binernya).
Jika Anda melakukannya dengan cara ini, Anda ingin fungsi dikonversi ke dan dari format tampilan tekstual:
Berikut cara mengonversi bentuk tampilan tekstual ke biner:
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
Dan berikut ini cara mengonversi biner kembali ke bentuk tampilan tekstual:
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
Berikut demo cara menggunakannya:
SELECT dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
SELECT dbo.fnDisplayIPv4( 0xC04144C9 )
-- should return '192.65.68.201'
go
Terakhir, saat melakukan pencarian dan perbandingan, selalu gunakan bentuk biner jika Anda ingin memanfaatkan indeks Anda.
PEMBARUAN:
Saya ingin menambahkan bahwa salah satu cara untuk mengatasi masalah kinerja yang melekat pada UDF skalar di SQL Server, tetapi masih mempertahankan penggunaan kembali kode suatu fungsi adalah dengan menggunakan iTVF (fungsi bernilai tabel sebaris) sebagai gantinya. Begini cara fungsi pertama di atas (string ke biner) dapat ditulis ulang sebagai 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
Ini dia contohnya:
SELECT bin FROM dbo.fnBinaryIPv4('192.65.68.201')
--should return 0xC04144C9
go
Dan inilah cara Anda menggunakannya dalam INSERT
INSERT INTo myIpTable
SELECT {other_column_values,...},
(SELECT bin FROM dbo.itvfBinaryIPv4('192.65.68.201'))