MySQL存储IP地址的方法

为什么要问如何存储IP?

首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗?

其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。

利用函数算法处理

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

IP转数字函数inet_aton()

我们转换下几个常用的IP地址

 mysql> select inet_aton('255.255.255.255');
 +------------------------------+
 | inet_aton('255.255.255.255') |
 +------------------------------+
 |          4294967295 |
 +------------------------------+
 1 row in set (0.00 sec)

 mysql> select inet_aton('192.168.1.1');
 +--------------------------+
 | inet_aton('192.168.1.1') |
 +--------------------------+
 |        3232235777 |
 +--------------------------+
 1 row in set (0.00 sec)

 mysql> select inet_aton('10.10.10.10');
 +--------------------------+
 | inet_aton('10.10.10.10') |
 +--------------------------+
 |        168430090 |
 +--------------------------+
 1 row in set (0.00 sec)

所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思

数字转IP函数inet_ntoa()

 mysql> select inet_ntoa(4294967295);
 +-----------------------+
 | inet_ntoa(4294967295) |
 +-----------------------+
 | 255.255.255.255    |
 +-----------------------+
 1 row in set (0.00 sec)

 mysql> select inet_ntoa(3232235777);
 +-----------------------+
 | inet_ntoa(3232235777) |
 +-----------------------+
 | 192.168.1.1      |
 +-----------------------+
 1 row in set (0.00 sec)

 mysql> select inet_ntoa(168430090);
 +----------------------+
 | inet_ntoa(168430090) |
 +----------------------+
 | 10.10.10.10     |
 +----------------------+
 1 row in set (0.00 sec)

 mysql> select inet_ntoa(0);
 +--------------+
 | inet_ntoa(0) |
 +--------------+
 | 0.0.0.0   |
 +--------------+
 1 row in set (0.00 sec)

注意,0转换为 0.0.0.0

整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适(最小),最简单的数据类型。
inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

以上讲解的就是MySQL存储IP地址的方法,希望能够对大家的学习有所帮助。

(0)

相关推荐

  • MySQL 性能优化的最佳20多条经验分享

    当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 这里最主要

  • 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

    mysql> create table jackbillow (ip int unsigned, name char(1)); Query OK, 0 rows affected (0.02 sec) mysql> insert into jackbillow values(inet_aton('192.168.1.200'), 'A'), (inet_aton('200.100.30.241'), 'B'); Query OK, 2 rows affected (0.00 sec) Reco

  • MySQL存储IP地址的方法

    为什么要问如何存储IP? 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升. 利用函数算法处理 在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间.因为varchar是可变长形

  • MySql通过ip地址进行访问的方法

    1.登录mysql: mysql -u root -h 127.0.0.1 -p 2.切换数据库 use mysql 3.授权 grant all privileges on *.* to 'root'@'127.0.0.1'identified by '密码'; 将127.0.0.1换成公网的ip地址. 4.检查my.ini 4.1 看看是否有skip-networking skip-networking开启该选项后就不能远程访问MySQL 为安全考虑希望指定的IP访问MySQL,可以在配置文

  • 详解MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串.但是没有给出具体原因.为了搞清楚这个原因,查了一些资料,记录下来. 相对字符串存储,使用无符号整数来存储有如下的好处: 节省空间,不管是数据存储空间,还是索引存储空间 便于使用范围查询(BETWEEN...AND),且效率更高 通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15

  • php使用preg_match()函数验证ip地址的方法

    本文实例讲述了php使用preg_match()函数验证ip地址的方法.分享给大家供大家参考,具体如下: <?php /* *@return Boolen *@param String $ip 要匹配的ip地址 *@param String $pat 匹配的正则规则 *@param Boolen 匹配成功后返回的布尔值 *preg_match() *0为不成功,1为成功 */ function fun($ip){ //0.0.0.0--- 255.255.255.255 $pat = "/

  • 查看连接mysql的IP地址的实例方法

    具体方法: 首先打开命令提示符: 然后执行[mysql -u root -p]命令进入mysql: 最后执行如下命令即可: select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip; 到此这篇关于查看连接mysql的IP地址的实例方法的文章就介绍到这了,更多相关怎么查看连接mysql的IP地址内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多

  • jsp获取客户端IP地址的方法

    本文实例讲述了jsp获取客户端IP地址的方法.分享给大家供大家参考,具体如下: public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request

  • Linux通过命令仅获取IP地址的方法

    一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定.真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问你可以通过什么命令,让其只输出IP地址192.168.42.128 看似简单的问题,实现起来也不是太简单.看看下面的思路吧 [root@DB-Server ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:9E:70:0E inet

  • TCP Wrappers防火墙介绍与封锁IP地址的方法

    Tcp_Wrappers是一个用来分析TCP/IP封包的软件,类似的IP封包软件还有iptables,linux默认都安装了此软件,作为一个安全的系统,Linux本身有两层安全防火墙,通过IP过滤机制的iptables实现第一层防护,iptables防火墙通过直观地监视系统的运行状况,阻挡网络中的一些恶意攻击,保护整个系统正常运行,免遭攻击和破坏.如果通过了第一层防护,那么下一层防护就是tcp_wrappers了,通过Tcp_Wrappers可以实现对系统中提供的某些服务的开放与关闭.允许和禁止

  • python使用Flask框架获取用户IP地址的方法

    本文实例讲述了python使用Flask框架获取用户IP地址的方法.分享给大家供大家参考.具体如下: 下面的代码包含了html页面和python代码,非常详细,如果你正使用Flask,也可以学习一下最基本的Flask使用方法. python代码如下: from flask import Flask, render_template, request # Initialize the Flask application app = Flask(__name__) # Default route,

随机推荐