在 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 位值)。你不能在那里有698365 是的..这只是我添加的一个例子 【参考方案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 表中

oracle的存储过程

在 Oracle SQL 中使用存储过程将数据插入表中

将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

在数据库表中存储IP地址

并行执行 oracle PL/SQL [重复]