1

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テーブルに小数点以下の桁数が多い数値を格納できますか?その場合、使用するデータ型は何ですか?ご意見をお聞かせください。

前もって感謝します!

4

3 に答える 3

5

いくつかのオプションがあります。

  • VARCHARとして保存します。IPアドレスは、実際には計算を行う可能性のある数値ではないので、なぜ数値形式で保存するのでしょうか。
  • 1つの数値として16進数で格納します。実際には10進数でそれを行うことはできませんが、16進数ではIPは8桁の数字です。
  • (最大)4つの別々のフィールドとして保存します。おそらく不要ですが、特定のアプリケーション(主にIPの一部のみに関係する場合)では、これが役立つ場合があります。
于 2013-02-21T03:44:20.587 に答える
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);

127.0.0.1 を使用して、これらのいずれかが ip->decimal を実行する簡単な SQL を次に示します。

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;
于 2013-02-21T03:49:13.983 に答える
1

値を文字列として保存し、引用符を使用してみてください。

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

その後 。。。

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

各コンポーネントを別々のフィールドに保存することをお勧めします。

于 2013-02-21T03:44:35.247 に答える