将IP存储到mysql数据库中

Posted

技术标签:

【中文标题】将IP存储到mysql数据库中【英文标题】:Store IP into mysql database 【发布时间】: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 个字符,我应该如何将此列设为十进制?

我很困惑……

【问题讨论】:

【参考方案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') ))

以上是关于将IP存储到mysql数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何比较mysql数据库中的IP地址?

将 HTML 存储到 MySQL 数据库中

将十进制数存储到 MySQL 数据库中

如何使用javascript将数据存储到mysql数据库中?

Mysql:如何将数据添加到存储在变量中的现有数据中?

如果将json格式数据存储到类似mysql这样的关系型数据库中,怎么查