2016-04-03 4 views
0

У меня есть таблица FT, содержащая столбец с именем IPaddress. Данные в столбце - это все IP-адрес в виде «100.45.4.7». Мне просто интересно, могу ли я выбрать все эти IP-адреса от 100.45.x.x до 100.150.x.x. (я не забочусь о последних двух узлах). У меня есть следующий код, который работает без ошибок, но я не уверен, правильно ли я понял.Sql LIKE диапазон чисел

  select * from FT where IPaddress like "100.[45-150]%" 

thx!

+0

[IP-адрес хранения в базе данных MySQL] (http://stackoverflow.com/questions/ 6427786/ip-address-storing-in-mysql-database) – lad2025

ответ

4

Не храните IP-адреса в виде строк. Храните их как целые числа.

Используйте функцию MySQL INET_ATON() для преобразования строки IP-адреса в число и INET_NTOA() для преобразования назад. Как только это преобразование будет выполнено, номера, соответствующие IP-адресам, будут последовательными, поэтому вы можете использовать в своем запросе такие условия, как IPaddress BETWEEN INET_ATON('100.45.0.0') AND INET_ATON('100.150.255.255').

(Ваш язык программирования может иметь аналогичные функции, а также, например, PHP имеет ip2long() и long2ip() Те же принципы будут работать там.).

+0

Можете ли вы перевернуть более одного раза? : P – xQbert

+0

thx !! Я сохранял IP-адреса как INT. Затем сохраненные данные стали «1215» вместо «100.45.7.8». Неужели вы еще раз подтвердите это? большое спасибо! –

+0

@ duskwuff фактически все данные хранятся как 1215, а не в исходном формате из 4 узлов (например, «100.45.7.8») –

1

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

Но если вы вынуждены сохранить текущую структуру, вы можете сделать вашу работу запроса, как это:

select * from FT where SUBSTRING_INDEX(IPaddress , '.', 1) = 100 AND SUBSTRING_INDEX(SUBSTRING_INDEX(IPaddress , '.', 2),'.',-1) BETWEEN 45 AND 150 
+0

THX для ответа! Я использовал sql-инструкцию для python, и он говорит, что подобная функция для substring_index не существует, и вы знаете, почему? большое спасибо!!!!!! –

+0

Скорее всего, из-за вашей версии mysql, не имеющей ее. Попробуйте 5.1 и выше. –

Смежные вопросы