热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在mysql中如何用int类型代替varchar类型存储IP与PHP的转换

2019独角兽企业重金招聘Python工程师标准1、首先我们应该先明白为什么要这样存储ip而用varchar直接存储IP呢?其实做任何程序设计都要在功能实现的基

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、首先我们应该先明白为什么要这样存储ip而用varchar直接存储IP呢?
其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。

利用函数算法处理:
在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间。因为varchar是可变长形,需要多余的一个字节存储长度。另外int型在逻辑运算上要比varchar速度快。

接下来我们找一个ip地址分析一下它应int存储的过程:
先来看IP的结构, 127.0.0.1
学计算机的对2的n次方比较敏感,一看就猜到是由 4个8位的二进制数字组成, 对, 你猜的没错,就是这样!也就是说IP转换成二进制可以这样:  

select concat(bin(127),lpad(bin(0),8,0),lpad(bin(0),8,0),lpad(bin(1),8,0));

把每一位的前边补0, 然后拼接起来,得到这样的结果: 1111111000000000000000000000001    

 系统的INET_ATON()函数也是这么算的,不信可以对比一下结果:

select bin(inet_aton('127.0.0.1'));

得到的结果也是这样:  1111111000000000000000000000001      
所以得出结论: INET_ATON() 就是把IP的每一段转为二进制拼接起来,然后将这个32位的二进制数字转为10进制
示例:

select INET_ATON('127.0.0.1'); -----------------转为数字
select INET_NTOA(2130706433); ------------------转为IP

 为什么这么存储呢?      
有人说节省空间, 也对, 不过比较蛋疼, 现在的硬盘那么便宜在乎这点空间?更为合理的解释是, 方便查询, 比如要查某一网段的所有IP就可以 :
 

select * from table where ip between inet_aton('192.168.0.1') and inet_aton('192.168.0.255');

到这里我们就已经把如何用int类型代替varchar类型存储ip的过程分析完了。上面的分析中我们用到了两个函数INET_ATON()和INET_NTOA(),下面我们用具体的实例来说一下这两个函数的具体用法。
IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思。

2、实例分析

将IP以整型的方式存储到数据库中
在实现某些功能时有时会用到用户的IP地址,因为IP地址有四段,在保存到MySQL数据库中的时候可能会使用varchar(15)或者char(15),其实还有更好的方式那就是将IP地址转换成整型,这样占用空间更小,查询速度快,同时还方便比较。在数据库设计时要用无符号INT UNSIGNED,否则长度不够。下面给出主要PHP代码:

$ip = '这里是获取到的IP';
echo $intip = sprintf('%u',ip2long($ip)); //转换为无符号整型
echo long2ip($intip);//将整型转换为ip
?>


这样保存到数据库之后也很容易比较,例如类似between之类的语句,在sql语句中也可以通过函数实现转换:
将IP地址转换为整型可以使用

select inet_aton(ip) from users;

将整型转换为IP地址可以使用

select inet_ntoa(intip) from users;


 


转:https://my.oschina.net/u/2364788/blog/2873642



推荐阅读
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文讨论了在进行 MySQL 数据迁移过程中遇到的所有 .frm 文件报错的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
author-avatar
陌-天佑_807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有