站长们要为IPv6普及可能带来的数据库储存问题做好准备。
站长们要为IPv6普及可能带来的数据库储存问题做好准备。
By lincanbin
at 2015-04-11
1人收藏 • 3251人看过
有不少人喜欢把IP v4转换成整数,然后用一个unsigned int(10)来储存用户IP,这个方法可能会在IP v6普及后导致用户访问异常。
站长们最好先做好准备。
- 登录后方可回帖
3 个回复 | 最后更新于 2015-04-11
像我不需要做范围查询,只是做个记录,用一个足够大的字符串字段来储存IPv6就是一个最简单的解决方案。
或者将IPv6也转换为整数,不过MySQL中的unsigned bigint也只有64位,最大也就是18446744073709551615,比起IPv6的128位还是差了许多,如果硬要这么做也可以开两个bigint储存然后联合索引。
或者用binary(16)储存?
不过IPv6转换为长整形之后,从数据库都出后,一些语言处理长整形也是会溢出的,需要警惕。
<?php printf("%u\n", ip2long('255.255.255.255')); ?>
Result:
4294967295
目前大部分人储存IPv4应该还是用的unsigned int(10),范围也是0到4294967295。
<?php echo ip2long('192.168.1.1'); ?>
Result:
-1062731519
在这里IPv4也已经超越了signed long int的上限,溢出了。
所以用长整形处理IPv6实际上也并不理想。