2013-02-21 2 views
1

Я создал таблицу для хранения IP-адресов.Хранение IP-адреса в таблице Oracle SQL

CREATE TABLE ipdetails( ip_address DECIMAL(16,4) NOT NULL, vlan_id varchar(50) );

Но когда я пытаюсь вставить в таблицу он дает мне ошибку:

INSERT INTO ipdetails VALUES (192.169.165.128, 'Sample1') 

есть в любом случае я мог бы сохранить номер с большим количеством знаков после запятой в таблице SQL, если поэтому какой тип данных я должен использовать? Пожалуйста посоветуй.

Спасибо заранее!

+0

Действительный IP-адрес не может содержать частей, которые больше, чем '255' (это 32-битное значение). У вас не может быть '698' или' 365'. – dasblinkenlight

+0

да .. это я просто пример, я добавил –

ответ

4

У вас есть несколько вариантов:

  • сохранить как VARCHAR. IP-адрес не является номером, на который вы, вероятно, будете заниматься математикой, поэтому зачем хранить его в цифровом формате?
  • Храните его в шестнадцатеричном виде как одно число. Хотя вы не можете сделать это в десятичном формате, в шестнадцатеричном виде IP - это 8-значное число.
  • Сохраните его как (до) четырех отдельных полей. Возможно, это необязательно, но для определенных приложений (где вы, возможно, захотите в первую очередь заботиться только об одной части IP), это может быть полезно.
+0

Спасибо за ответ, я просто хочу знать, есть ли тип данных в SQL для хранения числа с большим количеством десятичных знаков? –

+1

@frozenhaart К сожалению, такого встроенного типа данных нет. Существует не такая вещь, как числовой тип данных с более чем одной десятичной точкой. IP-адрес действительно является составным «числом». У каждой опции хранения есть недостатки, такие как семантика сортировки и запрос диапазона. –

+2

Периоды в IP-адресе не являются десятичными. Это просто полевые разделители; так же законно писать «192: 168: 213: 153» вместо точек. – Joe

1

Try хранящие значение в виде строки и с помощью цитаты:

CREATE TABLE ipdetails(ip_address varchar(15) NOT NULL, vlan_id varchar(50)); 

, а затем. , ,

INSERT INTO ipdetails VALUES ('192.169.698.365', 'Sample1') 

Возможно, вы захотите сохранить каждый компонент в отдельном поле.

2

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

#include <arpa/inet.h> 
/* 
* Returns a pointer to an internal array containing the string, which is overwritten with each call to the function. 
* You need to copy the string if you want to keep the value returned. 
*/ 
extern char *inet_ntoa (struct in_addr in); 

/* 
* Convert Internet host address from numbers-and-dots notation in CP 
* into binary data and store the result in the structure inp. 
*/ 
extern int inet_aton (const char *cp, struct in_addr *inp); 

Вот несколько простых SQL, который делает то, что один из они делают ip-> decimal, используя 127.0.0.1

SELECT 
TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,1))*POWER(2,24) 
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,2))*POWER(2,16) 
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,3))*POWER(2,8) 
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,4))*POWER(2,0) IP 
FROM 
DUAL; 
Смежные вопросы