Mysql: получить бинарную сетевую маску IPv6 из двоичного ip и подсети - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть таблица, в которой адреса IPv6 хранятся как BINARY (16), а подсеть - как INT (3)

Я думал, что было бы просто получить маску сети, выполнив:

SELECT ~INET6_ATON('::') << (128 - subnet);

но это возвращает ноль, фактически все битовые операторы, кажется, дают целочисленные результаты, когда я использую их в двоичной строке: - (

Я использую 10.1.30-MariaDB

+-----------------+
| VERSION()       |
+-----------------+
| 10.1.30-MariaDB |
+-----------------+

любая помощь высоко ценится.

РЕДАКТИРОВАТЬ: Я полностью неверно истолковал строку версии Марии, извините :-(

1 Ответ

0 голосов
/ 04 ноября 2018

Битовые операции в 5.5 ограничены 64 битами. (8.0 ослабляет ограничение. 5.5 становится довольно старым. Если вы обновляете, либо дамп и перезагрузка, или обновить в 3 шага: 5.5-> 5.6-> 5.7-> 8.0)

Вы, вероятно, хотели вправо смещение >>. Или, может быть, (1 << amt) - 1. Пример (используется только 64-битная арифметика):

SELECT HEX(~((1 << 8) - 1)); --> FFFFFFFFFFFFFF00

Некоторые 128-битные операции доступны в ссылке «Эталонная реализация для IPv6» от http://mysql.rjweb.org/doc.php/ipranges. Функция «сдвиг» отсутствует, но вы можете адаптировать методы (использующие HEX()) для достижения своей цели. Он имеет добавление / вычитание 1 к / из значения IPv6. Это удобно для определенных операций по созданию и маскированию масок.

Если вы хотите объяснить, что вы будете делать с результатом этого SELECT, я мог бы дать вам больше ответа.

(встречается в примечаниях к выпуску 5.7.11):

Битовые функции и операторы включают BIT_COUNT () , BIT_AND () , BIT_OR () , BIT_XOR () , & , | , ^ , ~ , << </a> и >> . В настоящее время битовые функции и операторы требуют аргументов BIGINT (64-разрядное целое) и возвращают значения BIGINT , поэтому они имеют максимальный диапазон 64 бит. Аргументы других типов преобразуются в BIGINT , и может произойти усечение.

Расширение для MySQL 8.0 изменяет это приведение к BIGINT : битовые функции и операторы допускают аргументы типа двоичной строки ( BINARY , VARBINARY и BLOB ), что позволяет им принимать аргументы и возвращать значения, превышающие 64 бита. Следовательно, битовые операции над двоичными строковыми аргументами в MySQL 5.7 могут давать разные результаты в MySQL 8.0. Чтобы заранее уведомить об этом потенциальном изменении в поведении, сервер теперь выдает предупреждения для битовых операций, для которых двоичные строковые аргументы не преобразуются в целое число в MySQL 8.0. Эти предупреждения дают возможность переписать затронутые заявления. Чтобы явно создать поведение MySQL 5.7 способом, который не изменится после обновления до 8.0, приведите двоичные строковые аргументы битовой операции, чтобы преобразовать их в целое число. Для получения дополнительной информации и примеров см. Битовые функции и операторы .

...