在MySQL中存储IP地址的最有效方法

ens*_*are 69 mysql sql ip-address

在MySQL中存储和检索IP地址的最有效方法是什么?现在我正在做:

SELECT * FROM logins WHERE ip = '1.2.3.4'
Run Code Online (Sandbox Code Playgroud)

ip是一个VARCHAR(15)字段.

有一个更好的方法吗?

Dan*_*llo 109

对于IPv4地址,您可能希望将它们存储为a int unsigned并使用INET_ATON()INET_NTOA()函数从其数值返回IP地址,反之亦然.

例:

SELECT INET_ATON('127.0.0.1');

+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 | 
+------------------------+
1 row in set (0.00 sec)


SELECT INET_NTOA('2130706433');

+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1               | 
+-------------------------+
1 row in set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

  • IPv6怎么样? (17认同)
  • 对于**IPv6**和**IPv4**使用函数[INET6_ATON()](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton) (11认同)
  • 你不会存储为"INT"而是"INT UNSIGNED".我喜欢使用有意内置的功能.+1 (4认同)
  • 对于IPv6,我在选择IP地址时得到了NULL,后来我理解将INET6_NTOA与HEX()和UNHEX()函数一起使用以提高可读性,并且在使用此函数时,还要查询此列上的忽略索引。我把我的想法放在这里http://www.rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html (2认同)

Dea*_*ing 58

如果您只想存储IPv4地址,则可以将它们存储在32位整数字段中.

如果你也想支持IPv6,那么一个字符串可能是最容易阅读/使用的方式(虽然你可以在技术上将它们存储在一个16字节的VARBINARY()字段中,但是尝试生成SQL语句来选择它会很烦人IP地址"手工")

  • +1:预测IPv6使用的唯一答案 (25认同)
  • 就在使用IPV6时,功能是不同的(INET6_ATON(ip)).IPV4需要VARBINARY(4),IPV6需要VARBINARY(16)(当然也适用于V4地址).您可以将V4 IP(INT)转换为兼容的格式,如下所示:INET6_ATON(INET_NTOA(ip)) (3认同)
  • `INET6_ATON('172.32.x.x')` 可以将 IPv4 和 IPv6 地址转换为 `blob`。可以使用“INET6_NTOA”将其转换回来。不需要像@John 所说的那样做`INET6_ATON(INET_NTOA(ipv4))` (3认同)

DGM*_*DGM 5

无论您使用什么最容易使用的东西。大小或速度问题不是问题,除非您通过分析知道这是一个问题。在某些情况下,如果您需要进行部分匹配,则使用字符串可能更容易使用。但作为空间或性能问题,除非您确实有理由担心,否则不必担心。