将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_NTOA
将 BINARY(4)
转换为点分十进制字符串表示法,然后转换为整数.... INET_ATON(INET6_NTOA( UNHEX('C0A80164') ))
以上是关于将IP存储到mysql数据库中的主要内容,如果未能解决你的问题,请参考以下文章