在 Oracle SQL 表中存储 IP 地址 [重复]
Posted
技术标签:
【中文标题】在 Oracle SQL 表中存储 IP 地址 [重复]【英文标题】:Storing an IP Address in a Oracle SQL Table [duplicate] 【发布时间】:2013-02-21 03:39:30 【问题描述】:我创建了一个表来存储 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 表中存储一个带有很多小数位的数字,如果可以,我应该使用什么数据类型?请指教。
提前致谢!
【问题讨论】:
一个有效的 IP 地址不能包含大于255
的部分(它是一个 32 位值)。你不能在那里有698
或365
。
是的..这只是我添加的一个例子
【参考方案1】:
您有多种选择:
将其存储为 VARCHAR。 IP 地址并不是您真正可能用来计算的数字,那么为什么要以数字格式存储它呢? 将其以十六进制形式存储为单个数字。虽然您无法真正使用十进制,但在十六进制中,IP 是一个 8 位数字。 将其存储为(最多)四个单独的字段。可能没有必要,但对于某些应用程序(您可能希望主要只关注 IP 的一部分),这可能很有用。【讨论】:
感谢回复,我只想知道SQL中是否有数据类型可以存储小数位数很多的数字? @frozenhaart 不幸的是没有这样的内在数据类型。不存在多于一个小数点的数字数据类型。 IP 地址实际上是一个复合“数字”。每个存储选项都有一些缺点,例如排序语义和范围查询。 IP 地址中的句点不是小数。它们只是字段分隔符;写192:168:213:153
而不是用点写是合法的。
好的..感谢您的澄清!【参考方案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,它使用 127.0.0.1 执行其中之一的操作 ip->decimal
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;
【讨论】:
【参考方案3】:尝试将值存储为字符串并使用引号:
CREATE TABLE ipdetails( ip_address varchar(15) NOT NULL, vlan_id varchar(50) );
然后。 . .
INSERT INTO ipdetails VALUES ('192.169.698.365', 'Sample1')
您可能希望将每个组件存储在单独的字段中。
【讨论】:
以上是关于在 Oracle SQL 表中存储 IP 地址 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 PL/SQL 的输出(XML)存储在 oracle 表中