站长们要为IPv6普及可能带来的数据库储存问题做好准备。

By lincanbin at 2015-04-11 • 1人收藏 • 471人看过

有不少人喜欢把IP v4转换成整数,然后用一个unsigned int(10)来储存用户IP,这个方法可能会在IP v6普及后导致用户访问异常。

站长们最好先做好准备。

3 个回复 | 最后更新于 2015-04-11
2015-04-11   #1

blob.png

像我不需要做范围查询,只是做个记录,用一个足够大的字符串字段来储存IPv6就是一个最简单的解决方案。

或者将IPv6也转换为整数,不过MySQL中的unsigned bigint也只有64位,最大也就是18446744073709551615,比起IPv6的128位还是差了许多,如果硬要这么做也可以开两个bigint储存然后联合索引。

或者用binary(16)储存?

不过IPv6转换为长整形之后,从数据库都出后,一些语言处理长整形也是会溢出的,需要警惕。

2015-04-11   #2
<?php
printf("%u\n", ip2long('255.255.255.255')); 
?>

Result:

4294967295

目前大部分人储存IPv4应该还是用的unsigned int(10),范围也是0到4294967295。

2015-04-11   #3
<?php
echo ip2long('192.168.1.1'); 
?>

Result:

-1062731519

在这里IPv4也已经超越了signed long int的上限,溢出了。

所以用长整形处理IPv6实际上也并不理想。

登录后方可回帖

登 录
信息栏
购买PHP虚拟主机 / VPS

Carbon Forum是一个基于话题的高性能轻型PHP论坛

下载地址:Carbon Forum v5.0.1
QQ群:12607708(QQ我不常上)

donate

手机支付宝扫描上方二维码可向本项目捐款

Loading...