【问题标题】:Store IP into mysql database将IP存储到mysql数据库中
【发布时间】:2015-08-26 11:32:05
【问题描述】:

我正在使用一种简单的方法来获取真实的 ip。我在这里找到了它:How to get Real IP from Visitor?

IP 将存储到数据库中,列宽为 VARCHAR 15。我使用长度为 15 的 Varchar,因为我知道 IP 地址可以是 123.456.789.123,它有 12 个数字和 3 个点。

现在...我看到 IPv6 有更多字符。我不明白。所有用户都有一个特定的 IPv4,或者可能是一些使用 IPv6 而不是 IPv4 的用户?

我需要了解,因为我想优化这一列IP,正如我在这里看到的:insert ip into mysql 最好将其设为十进制。

如果 ip(版本 6)可以有超过 15 个字符,我应该如何将此列设为十进制?

我很困惑……

【问题讨论】:

    标签: php mysql ip ipv6 ipv4


    【解决方案1】:

    要处理和存储 IPv4 和 IPv6 地址,您可以使用数据类型 VARBINARY(16)

    在 5.6 版中,MySQL(终于!)引入了 IPv6 地址的转换函数:INET6_ATON,因此您不必在应用程序中进行转换。

    如果您只处理 IPv4 地址,您可以继续使用 INET6_ATON 函数,BINARY(4) 是存储它的合适数据类型。

    还可以方便地使用反函数,将二进制表示转换回点分十进制形式(用于 IPv4 地址)或十六进制冒号形式(用于 IPv6 地址)。

    参考:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton

    问:如果 ip(版本 6)可以有超过 15 个字符,我应该如何将此列设为十进制?

    答:不要将列设为DECIMAL,将其设为VARBINARY(16),同时转换 IPv4 点分十进制表示和 IPv6 十六进制冒号表示转换成二进制表示来存储它。

    【讨论】:

    • 有点问题,有没有一种简单的方法可以将 [VAR]BINARY(4) 转换为整数?我似乎无法使 CAST/CONVERT 工作,而我发现 确实 工作的唯一事情就是混乱:CAST(CONV(HEX(binfield),16,10) as UNSIGNED)
    • @Sammitch:拼凑是做到这一点的方法;我不知道任何其他 MySQL 提供的进行转换的函数。 MySQL INET_ATON 函数返回一个整数,因此(未测试)您可以使用 INET6_NTOABINARY(4) 转换为点分十进制字符串表示法,然后转换为整数.... INET_ATON(INET6_NTOA( UNHEX('C0A80164') ))
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2023-03-05
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2018-11-20
    • 2011-09-19
    相关资源
    最近更新 更多