2013-02-21 45 views
1

我创建了一个表来存储IP地址。在Oracle SQL表中存储IP地址

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 2013-02-21 03:44:07

+0

是的..这个我只是一个例子,我加了 – 2013-02-21 03:44:53

回答

4

您有几种选择:

  • 其存储为VARCHAR。 IP地址并不是真正的数字,因此为什么要以数字格式存储它?
  • 将其以十六进制存储为单个数字。虽然你不能用十进制真正做到这一点,但在十六进制中,IP是一个8位数字。
  • 将其存储为(最多)四个单独的字段。可能不必要,但对于某些应用程序(您可能希望主要只关注IP的一部分),这可能会有用。
+0

感谢您的回复,我只是想知道是否有一个数据类型在SQL中存储一个数字有很多小数位? – 2013-02-21 03:47:19

+1

@frozenhaart不幸的是没有这种内在的数据类型。不存在具有多个小数点的数字数据类型。 IP地址确实是一个复合“数字”。每个存储选项都有排序语义和范围查询等缺点。 – 2013-02-21 03:51:42

+2

IP地址中的时间段不是小数。他们只是字段分隔符;写'192:168:213:153'而不是带点是合法的。 – Joe 2013-02-21 03:53:12

1

尝试存储的值作为一个字符串,并使用引号:

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;