PHP与MYSQL配合完成IP的存取
如何存储IP
程序设计要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的重要部分,巧存IP地址可以一定程度提升性能。
利用函数算法处理
MySQL没有直接提供IP类型字段,但有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,更节省存储空间。varchar是可变长类型,需要多余的一个字节长度。另外int型在逻辑运算上要比varchar速度快。
IP转数字函数inet_aton()
我们转换下几个常用的IP地址
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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
*******************华丽分割***********************
以上为原文内容,实际使用中,换了一台IP地址较大的机器登陆后,发现数据库中竟存入了一个负值...
环境PHP+MYSQL+32位WIN7
于是查找原因...此处省略3000字
结果如下:
原因:PHP自带的ip2logng('192.168.1.17'),转换IP地址后,其值超出了32位系统INT的取值范围,导致溢出,结果为负
解决方案:将MYSQL存储IP的字段设置为bigint类型,否则会溢出
存储IP之前,将ip2long转换过的值处理为2进制,再处理回10进制,示例:bindec(decbin(ip2long('192.168.1.17'))); //3232235793
至此问题解决,后遗症暂未发现,发现再纠正...
from:http://www.qttc.net/201208193.html 修正:Faddei
PHP与MYSQL配合完成IP的存取的更多相关文章
- ERROR 2003 (HY000): Can't connect to MySQL server on 'ip address' (111)的处理办法
远程连接mysql数据库时可以使用以下指令 mysql -h 192.168.1.104 -u root -p 如果是初次安装mysql,需要将所有/etc/mysql/内的所有配置文件的bind-a ...
- 在Jena框架下基于MySQL数据库实现本体的存取操作
在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'ip'(111)
问题描述: 从一台linux远程连接另一台linux上的MySQL, 出现ERROR 2003 (HY000): Can't connect to MySQL server on 'ip'(111) ...
- 连接mysql数据库时提示2003 can't connect to MySQL server on ip(10060)的解决办法
今天部署 JavaWeb 项目到云服务器,突然出现can t connect to MySQL server on ip的问题 经过了一些检查,认为很有可能是防火墙的原因.下面是检查的具体操作: 因为 ...
- MySQL怎样存储IP地址 IP转数字 互转
MySQL怎样存储IP地址 - cn三少 - 博客园 https://www.cnblogs.com/cnsanshao/p/3326648.html
- mysql设置指定ip远程访问连接的方法
本文实例讲述了mysql设置指定ip远程访问连接的方法,分享给大家供大家参考.具体实现方法如下: 1. 授权用户root使用密码jb51从任意主机连接到mysql服务器: 复制代码 代码如下: GRA ...
- ERROR 2003 (HY000): Can't connect to MySQL server on 'ip地址' (110)
用windows能远程连接数据库服务器,用ubuntu就报错,怎么都连不上,报这个错ERROR 2003 (HY000): Can't connect to MySQL server on 'ip地址 ...
- mysql 监听ip地址修改
如何修改MySQL监听IP地址 Mysql默认在本地环路地址127.0.0.1的3306端口监听,要使用其它IP地址需要修改配置文件. 1.编辑/etc/my.cnf 在[mysqld]节中增加下面一 ...
- MYSQL数据库无法使用IP地址访问的解决办法
1.在运行中输入CMD,确定,进入文本方式. 2.输入mysql -h localhost -u root -p 回车,使用ROOT用户登录. 3.输入use mysql; 显示Database ch ...
随机推荐
- 获取文件路径 分类: WinForm 2014-07-25 14:27 103人阅读 评论(0) 收藏
//可获得当前执行的exe的文件名. string str1 =Process.GetCurrentProcess().MainModule.FileName; //获取和设置当前目录(即该进程从中启 ...
- java链接mysql
比喻不是很合适,但能凑合用 解释 javaweb链接数据步骤 加载JDBC驱动 Class.forName("com.mysql.jdbc.Driver);//加载JDBC驱动 提供链接数据 ...
- Android开源项目分类汇总【畜生级别】[转]
Android开源项目分类汇总 欢迎大家推荐好的Android开源项目,可直接Commit或在 收集&提交页 中告诉我,欢迎Star.Fork :) 微博:Trinea 主页:www.t ...
- Javascript --扩展String实现替换字符串中index处字符
String.prototype.replaceCharAt = function(n,c){ return this.substr(0, n)+ c + this.substr(n+1,this.l ...
- valgrind 打印程序调用树+进行多线程性能分析
使用valgrind的callgrind工具进行多线程性能分析 yum install valgrind / wget http://valgrind.org/downloads/valgrind-3 ...
- 再回首,Java温故知新(十):数组
数组是程序中用来存储同一类型值的集合,基本所有编程语言中都有这种类型存在.声明数组时需要指出数组类型和数组变量名,初始化后数组的长度不可变,使用过程中通过下标来访问数组中的元素,示例代码如下: int ...
- 解读dbcp自动重连那些事---转载
http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式,不一 ...
- spring mvc DispatcherServlet详解之一---处理请求深入解析(续)
上文中,我们知道分发过程有以下步骤: 分发过程如下: 1. 判断是否设置了multipart resolver,设置的话转换为multipart request,没有的话则继续下面的步骤. 2. 根据 ...
- C#开发学习——内联表达式
<%@ 表示:引用 <%# 表示:绑定 <%= 表示:取值 <%= 变量名%> Response.Write()输出和<%=%>输出最后的效果是一样的 ...
- thread跟Runnable实现多线程
//两种实现方式的区别和联系: //在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: //避免点继承的局限,一个类可以继承 ...