zoukankan      html  css  js  c++  java
  • 关于IP在MySQL中的存储

    对于很多新手而言,他们总会纠结,怎样才能更好的设计MySQL数据库呢;作为一个从菜鸟走过来的人,深有体会,刚开始我也不知道什么是外键、什么是事务处理、怎样合理的定义一个字段,说到字段,今天我就带领大家一起来学习PHP中的函数ip2long()的用法;

    相信大家也能在百度中搜索到关于该函数的用法,而我却是在总结大家可能不知道的一些知识,好了,废话少说,让我们进入正题吧!

    PHP手册中关于ip2long()函数的介绍:将一个IPV4的字符串互联网协议转换成数字格式,这里指的是IPV4,而不是IPV6!

    很多程序员设计数据库表时都喜欢创建一个varchar(15)字段来存储IP的值, 一些高级工程师给出的建议是使用int类型,只需要4个字节,这样不仅能够节省空间,最重要的是查询比较快,对于少量数据是体现不出来的,如果将来有一天我们的数据越来越多时,这点小小的优化将会表现的非常重要了,作为一名PHP工程师要有一个良好的编程习惯,不要觉得项目小就不在乎;

    那么ip2long函数就起到作用了,当你存储IP之前,使用ip2long('ip')转成int类型存储,读取的时候使用long2ip()就可以了;

    下面一点是我在调试中做的总结,希望给读者朋友们带来便利

    ipv4大家都知道是从0.0.0.0到255.255.255.255;然而使用ip2long函数转换后并不是我们想象中的0到4294967295,而是0.0.0.0-127.255.255.255转换后为0到2147483647;128.0.0.0-255.255.255.255转换后为-2147483647到-1;

    咦,你是不是发现一个很神奇的问题IP地址转换成int类型正好是int的有符号取整范围,为什么呢?大家知道MySQL中int类型占4个字节,每个字节占8位,总大小为28*28*28*28=255*255*255*255,是不是和IP地址的范围很类似;实际开发中其实我们并不需要关心ip转换成int类型的值,存的时候ip2long,读的时候long2ip就可以了;

    我们来思考一个问题:这是我在网上看到的一篇博文

    ip2long('10.52.1.129');// 171180417

    ip2long('10.052.1.129');//170525057

    ip中有前导零导致的转换结果不一致,他说是bug,请问同学们,这是bug吗?如果这真是bug,PHP经历这么多版本,居然没有解决?聪明的同学立马会看懂,有前导零还是标准的IP吗?对不对?

  • 相关阅读:
    thinkphp 模板文件
    thinkphp 目录安全文件
    thinkphp 防止sql注入
    thinkphp 表单令牌
    thinkphp 表单合法性检测
    thinkphp 输入过滤
    thinkphp 静态缓存
    thinkphp sql解析缓存
    thinkphp 查询缓存
    thinkphp 快速缓存
  • 原文地址:https://www.cnblogs.com/xiaozong/p/4961935.html
Copyright © 2011-2022 走看看