Тип данных для хранения IP-адреса в SQL Server

Необходимо определить интерфейс, как только необходимо вызвать поведение для класса.

поведение Животного может включить Обход, Еду, Выполнение, и т.д. Поэтому Вы определяете их как интерфейсы.

Другим практическим примером является ActionListener (или Выполнимый) интерфейс. Вы реализовали бы их, когда необходимо отслеживать конкретное событие. Поэтому необходимо обеспечить реализацию для actionPerformed(Event e) метод в классе (или подкласс). Точно так же для интерфейса Runnable, Вы обеспечиваете реализацию для public void run() метод.

кроме того, можно было реализовать эти интерфейсы любое количество классов.

Другой экземпляр, где Интерфейсы используются (в Java) должен реализовать множественное наследование, предлагаемое в C++.

106
задан gotqn 5 November 2017 в 07:45
поделиться

5 ответов

Извините, если вы не считаете это IDE, но Emacs + CEDET меня никогда не подводили. Если CEDET не идеален, у вас все еще есть голова. :)
Конечно, если бы Emacs работал с вашим SPARC, я бы не знал, но я считаю, что он будет работать нормально. Стоит потратить каждый час, чтобы научиться им пользоваться. Вот руководство о том, как начать работу.

но все же сохранить повторное использование кода функции - вместо этого использовать iTVF (встроенную функцию с табличным значением). Вот как первая функция выше (строка в двоичный код) может быть переписана как 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'))
125
ответ дан 24 November 2019 в 03:51
поделиться

Вы можете использовать varchar. Длина IPv4 статична, но длина IPv6 может сильно варьироваться.

Если у вас нет веской причины хранить его как двоичный, используйте строковый (текстовый) тип.

22
ответ дан 24 November 2019 в 03:51
поделиться

Обычно я использую простую фильтрацию VARCHAR для IP-адреса, отлично работает.

Если вы хотите фильтровать диапазоны IP-адресов, я бы разбил их на четыре целых числа.

2
ответ дан 24 November 2019 в 03:51
поделиться

sys.dm_exec_connections использует varchar (48) после SQL Server 2005 SP1. Для меня это звучит достаточно хорошо, особенно если вы хотите использовать его по сравнению с вашей ценностью.

На самом деле, вы еще не увидите IPv6 в качестве мейнстрима в течение некоторого времени, поэтому я бы предпочел маршрут 4 tinyint. Сказав это, я использую varchar (48), потому что мне нужно использовать sys.dm_exec_connections ...

В противном случае. В ответе Марка Редмана упоминается предыдущий вопрос SO

.
7
ответ дан 24 November 2019 в 03:51
поделиться

Спасибо, 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
1
ответ дан 24 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: