Regex на IP числовое значение в MySQL? - PullRequest
2 голосов
/ 13 марта 2009

Допустим, таблица под названием «транзакции»

Типичный запрос: select * from transactions where ip=INET_ATON('127.0.0.1');

Мне нужна возможность регулярного поиска всех ip с определенным первым октетом (т.е. 127), но я не могу понять синтаксис.

Спасибо!

Ответы [ 4 ]

1 голос
/ 13 марта 2009

‘Transactions.ip’ уже является целым числом, поэтому спрашивающий использует INT_ATON. Бесполезно пытаться сопоставить его напрямую со строкой, такой как / regexp, сначала вам придется преобразовать ее обратно в адрес IPv4, используя обратную функцию INT_NTOA:

SELECT * FROM transactions WHERE INT_NTOA(ip) LIKE '127.%';

Для конвертации и сравнения требуется полное сканирование таблицы (уничтожение индексов).

Мне нужна возможность выполнять регулярное выражение для всех ip с определенным первым октетом (т. Е. 127)

Однако, если вы хотите сравнить с передней частью IP-адреса, вы можете воспользоваться тем, что первый октет хранится в старших значащих битах числа, и сказать:

SELECT * FROM transactions WHERE ip BETWEEN INT_NTOA('127.0.0.0') AND INT_NTOA('127.255.255.255');

Что можно сделать с помощью индекса на «ip», что может быть значительно более эффективным.

1 голос
/ 13 марта 2009

Вы сравниваете ip с результатом INET_ATON, что подразумевает, что ip является 32-битным целым числом. Ваша операция должна быть просто ...

SELECT * FROM transactions WHERE (longip & 0xFF000000) = (0x7F000000)

Это будет намного быстрее, чем применение регулярного выражения к точечному IP в строке, и быстрее, чем решение LIKE '127.%'.

0 голосов
/ 13 марта 2009
SELECT * FROM transactions WHERE ip LIKE '127.%';
0 голосов
/ 13 марта 2009

Как это?

select * from transactions where ip REGEXP "^[1-2][1-9][1-9]"
...