Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tipe data untuk menyimpan alamat ip di SQL Server

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'))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbaiki "nama profil tidak valid" Saat Memperbarui Profil Email Database di SQL Server (T-SQL)

  2. Sisipkan bidang lebar tetap secara massal

  3. Ekspor data tabel dari satu SQL Server ke yang lain

  4. Berapa nomor telepon dunia terpanjang yang harus saya pertimbangkan dalam SQL varchar(panjang) untuk telepon

  5. menentukan set karakter dari tabel / database?