【问题标题】:MYSQL - SELECT IP v4/v6, inet_pton & bin2hexMYSQL - 选择 IP v4/v6、inet_pton 和 bin2hex
【发布时间】:2012-03-03 09:45:36
【问题描述】:

我在从我的 mysql sql 服务器中选择正确的值时遇到了一些问题。

ip可以是ipv6和v4。

表:用户{

...

ip二进制(16)

}

$ip = '192.168.10.115';
$ip = bin2hex(inet_pton($ip)); // Returns c0a80a73
$result = $this->db->select("SELECT * FROM User WHERE HEX(ip) = $ip");
// $result empty because in db its stored as:
// HEX(ip) = C0A80A73000000000000000000000000

如何获得与 * 00000 * 的可行匹配?

如果输入是 ipv6 匹配,则可以,但 ip v4 不匹配。

【问题讨论】:

  • 试试改成ip VARBINARY(16) ?
  • 如果您将变量存储为十六进制数字,请将列更改为数字...HEX() 将适用于数字输入。
  • @drew010 我使用了你的解决方案,效果很好。

标签: php mysql select hex ip


【解决方案1】:

您可以使用VARBINARY 代替BINARY 吗?

来自Binary/Varbinary 上的 MySQL 手册:

如果检索到的值必须与为 没有填充的存储,最好使用 VARBINARY 或 一种 BLOB 数据类型。

【讨论】:

    【解决方案2】:

    更新:

    MySQL 5.6.3 及更高版本支持 IPv6 地址 - 请参阅以下内容:“INET6_ATON(expr)”

    数据类型是VARBINARY(16) 而不是BINARY(16) 之前的 cmets 在这里建议。唯一的原因是 MySQL 函数适用于 IPv6 和 IPv4 地址。 BINARY(16) 适合仅存储 IPv6 地址并节省一个字节。处理 IPv6 和 IPv4 地址时应使用VARBINARY(16)

    【讨论】:

    • 很遗憾不适用于 IPv6
    • 如果你想在同一个字段中同时处理ipv4和ipv6,并且如果你使用的是Mysql 5.6或更高版本,你可以使用varbinary(16)和inet6_aton和inet6_ntoa函数。这是一个更好的例子,说明为什么应该使用 MySQL 函数
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多