IP地址在数据库里面的存储方式

大多数公司的表结构都需要经过DBA进行审核,有时候你会看到存储IP地址采用varchar(15),这种方式都是传统的做法,这种方法需要占用15个字节,那么有更省空间的做法么?肯定是有的,那就是用int存储。如果采用int存储这里又有2种处理方式。

1. 利用MySQL函数进行处理。可以采用INET_ATON,INET_NTOA函数进行转换。

2. 利用开发语言的函数进行处理,以php进行举例。可以采用ip2long,long2ip函数进行转换。

上面2种方法得到的结果都是一致的。因为算法都是一样的。

下面进行函数用法的演示。首先看看用MySQL自己的函数如何玩。先把ip地址转换int。

mysql> SELECT INET_ATON(‘192.168.0.1‘);
+--------------------------+
| INET_ATON(‘192.168.0.1‘) |
+--------------------------+
|               3232235521 |
+--------------------------+
1 row in set (0.00 sec)

mysql> 

然后把int类型转换为ip地址:

mysql> SELECT INET_NTOA(3232235521);
+-----------------------+
| INET_NTOA(3232235521) |
+-----------------------+
| 192.168.0.1           |
+-----------------------+
1 row in set (0.00 sec)

mysql> 

下面看php函数的使用:

<?php
echo ip2long(‘192.168.0.1‘);
?>
php test.php
3232235521

可以看到结果是一样的,如果要把整形转换为ip地址,再使用php的long2ip()就行,这里就不再写了。
MySQL存储这个值是字段需要用int UNSIGNED。不用UNSIGNED的话,128以上的IP段就存储不了。当然可以使用bigint,但是请记住,能抠门就要抠门。省一点是一点,哈哈。

PHP存入时:$ip = ip2long($ip);
MySQLl取出时:SELECT INET_ATON(ip) FROM table ...
PHP取出时,多一步:$ip = long2ip($ip);

那么以前就是varchar类型,那么如何转换呢?下面慢慢道来。

1. 把以前的varchar()数据转换为int型的SQL语句如下。

UPDATE t1 SET ip =  INET_ATON(ip) WHERE INET_ATON(ip) is NOT NULL ;
mysql> select * from t1;
+------+-------------+
| id   | ip          |
+------+-------------+
|    1 | 192.168.0.1 |
|    2 | 192.168.0.2 |
+------+-------------+
2 rows in set (0.00 sec)

mysql> UPDATE t1 SET ip =  INET_ATON(ip) WHERE INET_ATON(ip) is NOT NULL ;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from t1;
+------+------------+
| id   | ip         |
+------+------------+
|    1 | 3232235521 |
|    2 | 3232235522 |
+------+------------+
2 rows in set (0.00 sec)

2. 把字段改为INT类型。

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `ip` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ALTER TABLE `t1` modify ip INT UNSIGNED NOT NULL;

3. 程序代码改动。

总结:

字段类型用合适的,够用就行,能省则省,在数据量上去以后,10个字节和5个字节相差的数据量会让你吃惊。

时间: 2024-10-25 12:57:55

IP地址在数据库里面的存储方式的相关文章

C#获取指定IP地址的数据库所有数据库实例名

/// <summary> /// 获取指定IP地址的数据库所有数据库实例名. /// </summary> /// <param name="ip">指定的 IP 地址.</param> /// <param name="username">登录数据库的用户名.</param> /// <param name="password">登陆数据库的密码.</p

小记--------hbase数据库介绍及存储方式

一.Hbase基本原理 1.hbase基本介绍 HBASE是一个分布式的,面向列的开源数据库.Hbase的存储是基于hadoop的.因为Hadoop实现了一个分布式文件系统(HDFS),基于hadoop意味着hbase与生俱来的超强的扩展性和吞吐量,hbase采用的是key.value的存储方式.意味着即使随着数据量增大,也几乎不会导致查询的性能下降. 2.hbase存储方式 hbase将数据按列簇分别存储,而并非简单的列式存储:首先了解几个概念:行式存储.列式存储.列簇式存储. A.行式存储:

优化MD5在(MySQL)数据库中的存储

1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的值可以使用UNHEX()和HEX()函数来存储在BINARY(16)在BINARY(16)数据类型的中且更为高效.用这 种转换可以让每行占用的存储空间从32字节减少到16字节. 下面的示例展示了原始MD5以及压缩后的MD5占用的空间对比: 这个原则也适用其他16进制的值,例如为所有列的散列值而定义的

linux文本三剑客匹配网卡IP地址大PK(CentOS 7系统)

    运维工程师在做配置的过程中很多时候都需要去获取目标服务器网卡上的IP地址,那究竟用什么方式获取更便捷了,博主今天就带大家使用linux文本三剑客分别获取一下网卡的IP地址,最后我们再来对比一下. 实验环境: 系统:CentOS 7.2 网卡张数:双网卡 linux文本三剑客之grep 获取ifconfig输出中的IP地址 ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>.(\

(1)认识IP地址

在网络上,只要利用IP地址都可以找到目标主机.因此,如果想要攻击某个网络主机,首先就要找到该主机的域名或IP地址,域名和IP的数量并不是一一对应的,一个域名指向多个IP地址.想要了解更过关于网络协议的内容的读者可以参考笔者的其他文章.IP地址其实就是一种编址方式,跟我们的电话号码一样.但不同的IP协议给每个连接在Internet上的分配一个32位(bit)的地址,也成为国际协议地址. 根据TCP/IP(Transport Control Protocol/Internet Protocol,传输

判断任意两台计算机的IP地址是否属于同一子网络

#include "OJ.h" #include<string> #include<iostream> using namespace std; /* 功能: 判断两台计算机IP地址是同一子网络. 原型: int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask); 输入参数: char * pcIP1: 计算机1的IP地址,格式:"192.168.0.254&qu

给虚拟机CentOS配置IP地址

我们以Minimal方式安装的CentOS虚拟机是不能直接上网的,需要为它配置IP地址.配置IP有两种方式,一种是使用DHCP服务动态获取IP地址,另一种是以手动方式配置静态IP地址.不管哪一种方式,首先要确保VMware开启了DHCP服务. 在本地主机桌面上右击"我的电脑",选择"管理",选择"服务和应用程序",双击打开"服务",开启虚拟机的相关服务. 打开虚拟机,以root用户登录系统.使用ifconfig -a查看系统中

IP地址、子网掩码和地址分类

http://blog.csdn.net/bluishglc/article/details/47909593?utm_source=tuicool&utm_medium=referral 实际工作中用到网络知识的机会并不多,虽然以前学习过,但是许久不用自然也就生疏了.最近拿到几台云上的虚拟机,需要为它们建立一个VPC(虚拟私有云,就是一个虚拟的局域网),得益于虚拟化技术,作为用户,我们省去了绝大多数的网路配置和调试工作,唯一需要我们亲自操刀主持的就是对网络的划分了.划分网络需要清楚三个基本概念

&lt;TCP/IP&gt;记一次关于IP地址和MAC物理地址的思考

是的,从3月6日第一次上计算机网络课起,我还是今天第一次对这本书里讲的知识点有了自己的疑问..之前看书就是 嗯嗯这好像很有道理,嗯嗯也许再多看几章就知道它在讲什么了.. 不过今天已经自学到了网络层了,这章主要介绍了IP地址和物理地址即MAC的关系还有路由选择协议的工作原理,看到ARP高速缓存工作原理时不禁觉得这搞事方法和以太网交换机还有点像.. 问题来了,这ARP协议就是把IP转换为物理地址,既然已经有了物理地址为何还要多此一举使用IP地址呢? 知其然要知其所以然.    IP地址,大家都形象的