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_start
とip_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"について私が間違っていると思うようになります。
ここでは何が起こっていて、どうすれば修正できますか?
も参照してください:http://stackoverflow.com/questions/4444771/how-to-storeを-a-128-bit-a-a-single-column-in-mysql – Mchl