mysql中IP地址的正确字段类型是什么?什么是使用PHP存储它的正确方法?
本周我们在办公室里进行了一场健康的辩论.我们正在创建一个Db来存储代理信息,因为除了我们应该如何存储IP之外,我们大部分都已经制定了模式.一个阵营想要使用4个小点,一个用于每个八位位组,另一个想要使用一个大的int,INET_ATON.
这些表格将是巨大的,因此性能是关键.我在这里中间,因为我通常在我的世界中使用MS SQL和4个小的int.我对这种类型的卷存储IP没有足够的经验.
我们将使用perl和python脚本来访问数据库,以进一步将数据规范化为其他几个表,用于顶级谈话者,有趣的流量等.
我确信社区中有一些人已经做了类似于我们正在做的事情,我有兴趣听听他们的经历,哪条路线最好,1个大的int,或4个小的IP地址.
编辑 - 我们关注的一个问题是空间,这个数据库将像每天500,000,000条记录一样巨大.所以我们试图权衡空间问题和性能问题.
编辑2一些谈话已经转移到我们要存储的数据量......这不是我的问题.问题是哪个是存储IP地址的最佳方式以及原因.就像我在评论中所说的那样,我们为一家大型财富50强公司工作.我们的日志文件包含来自用户的使用数据.反过来,这些数据将用于安全上下文中,以驱动一些指标并驱动多个安全工具.
我正在尝试使用Laravel 4将用户IP地址保存到我的数据库.我发现以下函数返回一个字符串
Request::getClientIp()
Run Code Online (Sandbox Code Playgroud)
我如何将它存储在我的模型中?只是一个字符串或有更有效的方式?
$table->string('ip_address');
Run Code Online (Sandbox Code Playgroud) 我有一个表A,其中IP地址(ipNumeric)存储为无符号整数,表B包含子网(subnetNumeric):
INET_NTOA(ipNumeric) = 192.168.0.1
INET_NTOA(subnetNumeric) = 192.168.0.0
Run Code Online (Sandbox Code Playgroud)
我想检查一下这个IP是否是子网的成员.
子网是A,B和C类.
这是否可以在MySQL中的合理时间内进行,或者子网范围是否应该预先计算?
我发现这种使用 INET_ATON 将 IP 地址作为整数存储在 MySQL 数据库中的方法:https ://stackoverflow.com/a/5133610/4491952
由于 IPv4 地址的长度为 4 个字节,因此您可以使用正好为 4 个字节的INT( UNSIGNED):
`ipv4` INT UNSIGNED
Run Code Online (Sandbox Code Playgroud)
INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;
Run Code Online (Sandbox Code Playgroud)
对于 IPv6 地址,您可以改用 a BINARY:
`ipv6` BINARY(16)
Run Code Online (Sandbox Code Playgroud)
并使用PHP 的inet_ptonandinet_ntop进行转换:
'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);
Run Code Online (Sandbox Code Playgroud)
但是如何使用 INET_ATON 和 PHP 的 ip2long 函数进行通配符搜索,例如 192.168.%?
这是我试图用来存储客户端的IP地址的代码.我试图通过尝试在这个问题中看到的东西将ip地址存储到unsigned int:用于IP地址的MySQL数据类型是什么?
这是我的代码:
$client_ip = $_SERVER['REMOTE_ADDR'];
$ip_insert = "SELECT INET_ATON('$client_ip')";
$sql = "INSERT INTO rtv_sign_cispa (name_cispa,ip_cispa,email_cispa,message_cispa) VALUES ('$name','$ip_insert','$email','$message')";
Run Code Online (Sandbox Code Playgroud)
该语句中还有其他内容存储但只是忽略那些,它们有效,而不是IP地址.
错误:
错误:SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在第1行'192.168.2.1''','email@email.com','Hmmmm')附近使用正确的语法
接近后的ip地址实际上显示了正确的IP,我当然只是出于安全原因将其切换到本地IP.email@email.com和Hmmm来自填写的表单以激活它,所以不要太介意.
有谁知道我做错了什么?我是SQL的新手.