2011-07-16 6 views
0

IP範囲を含むテーブルを作成するには、2つの128ビット(16バイト)のint値をMySQLレコードに格納する必要があります。 MySQLは最大8バイトの整数しかサポートしていないので、バイナリカラム(tinyblob)を使う必要があることが分かりました。このMySQLのtinyblobキーの長さはどのくらいですか?

CREATE TABLE `ip_ranges` (
    `ip_start` tinyblob NOT NULL, 
    `ip_end` tinyblob NOT NULL, 
    ... 
    UNIQUE KEY `index_ip_ranges_on_ip_start_and_ip_end` (`ip_start`(16),`ip_end`(16)) 
); 

私はこれらの2つの列のユニークなインデックスに問題があります。私の知る限り、IPv6の整数表現は128ビット(16バイト)です。そのため、固有鍵のip_startip_end列のユニークインデックスを16バイトに設定しました。残念ながら、私は本当のIPv6データを取り込む際に重複キーエラーが発生して終わる:

> INSERT INTO `ip_ranges` (`ip_end`, `ip_start`, ...) VALUES ("42540649945883696925221210589465935872", "42540649945883696943667954663175487487", ...); 
    Duplicate entry '42540649945883696925221210589465935872-4254064994588369694366795' for key 'index_ip_ranges_on_ip_start_and_ip_end' 

上記「重複したエントリ」の行に表示されるキー値はip_end値の一部がオフloppedされているように見えます。最後の13桁が欠落しています: "4663175487487"これは、バイトを表すユニークなキーの長さに私が提供している "16"について私が間違っていると思うようになります。

ここでは何が起こっていて、どうすれば修正できますか?

+0

も参照してください:http://stackoverflow.com/questions/4444771/how-to-storeを-a-128-bit-a-a-single-column-in-mysql – Mchl

答えて

1

No.いいえTINYBLOB。 VARBINARYを使用します。 それでも、各桁は1バイトとして格納されるため、キーは39B長くする必要があります。

別の方法としては、DECIMAL(39)

を使用するか、ネイティブIPv6をサポートしたのMySQL 5.6になるまで待つことができる; P

関連する問題