使用PHP将IP地址存储在MySQL数据库中

16 浏览
0 Comments

使用PHP将IP地址存储在MySQL数据库中

在MySQL中,IP地址的正确字段类型是什么?并且使用PHP存储它的正确方式是什么?

0
0 Comments

问题的原因是在存储IP地址时,使用了长度为45的VARCHAR类型,这样做在存储IPv6地址时会浪费空间。即使IPv6地址的最大长度为16个字节,但是使用了45个字节的存储空间。对于IPv4地址来说,浪费的空间更多,因为IPv4地址只需要4个字节的存储空间,但是却使用了15个字节的字符串表示。

解决方法是使用适当的数据类型来存储IP地址,以减少空间的浪费。可以使用VARBINARY或者BINARY类型来存储IPv6地址,因为IPv6地址是二进制的。使用VARBINARY(16)类型可以确保存储空间的最大利用率。对于IPv4地址,可以使用INT UNSIGNED类型来存储,因为IPv4地址可以被表示为一个32位的无符号整数。

下面是使用PHP和MySQL数据库存储IP地址的示例代码:

// 创建IP地址表
CREATE TABLE ip_addresses (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  ip_address VARBINARY(16) NOT NULL
);
// 存储IPv6地址
$ip = inet_pton('2001:0db8:85a3:0000:0000:8a2e:0370:7334');
$query = "INSERT INTO ip_addresses (ip_address) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $ip);
$stmt->execute();
// 存储IPv4地址
$ip = ip2long('192.168.0.1');
$query = "INSERT INTO ip_addresses (ip_address) VALUES (?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $ip);
$stmt->execute();

这样做可以确保存储IP地址时不会浪费额外的空间,并且保证数据的准确性和一致性。

0
0 Comments

IP地址在MySQL数据库中存储使用PHP的原因是为了能够存储IPv4和IPv6地址,并且能够进行转换和检索。为了存储IP地址,可以将其转换为二进制表示,并将其存储在长度为128位(16字节)的二进制字段中,可以使用BINARY(16)VARBINARY(16)类型。

要将任何IP地址转换为其二进制表示,可以使用PHP函数inet_pton。这种方法适用于IPv4和IPv6地址。要获取存储的IP地址的字符串表示(无论是IPv4还是IPv6),可以使用inet_ntop函数。

关于IPv6地址的长度,它始终为128位。不同的字符串表示可以给出不同的字符串长度。对于隧道IPv6地址,它可能类似于以下内容:1234:4567:89ab:cdef:1234:ffff:127.127.127.127(并不完全正确,通常是::ffff:127.127.127.127,其中80位为零,16位为一,32位为IPv4地址)。

pton表示“presentation to network”,ntop表示“network to presentation”。

从给出的链接中可以看出,在这种情况下,BINARY(16)不适合使用,应该使用VARBINARY(16)

为了在MySQL数据库中存储IP地址并进行转换和检索,可以使用PHP的inet_ptoninet_ntop函数,将IP地址转换为二进制表示,并存储在长度为128位的VARBINARY(16)字段中。

0
0 Comments

在使用PHP将IP地址存储在MySQL数据库中时,可能会遇到以下问题:如何高效地存储IPv4地址以及如何存储IPv6地址。

对于IPv4地址,最高效的存储方式是使用INT字段而不是VARCHAR字段。可以使用PHP的ip2long函数将IP地址转换为整数,并使用MySQL的INET_NTOA函数或PHP的long2ip函数将其转换回来。

对于IPv6地址,应使用BINARY字段,并使用PHP的inet_pton函数进行转换。

需要注意的是,ip2bin函数并不存在,但可以自己编写一个函数来实现转换,例如:function ip2bin($ip) { return inet_pton($ip); }。

在64位系统上运行时,MySQL的INT字段必须是UNSIGNED类型。

即使在32位系统上运行,也会将其视为BIGINT UNSIGNED进行计算。对于存储IPv6地址,可以使用INET6_ATON()和INET6_NTOA()函数以及HEX()和UNHEX()函数将IP地址存储为BINARY列。数据类型的选择取决于对数据的具体操作。

更多详细信息可以参考rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html。

0