【问题标题】:What type should I store IP addresses for MySQL?我应该为 MySQL 存储什么类型的 IP 地址?
【发布时间】:2011-01-04 02:32:45
【问题描述】:

我打算使用varchar(20),但我想知道如果我应该做 INT 并去掉句点,应该怎么做。什么会更好,为什么?

【问题讨论】:

  • 这取决于您将对数据执行哪些操作。
  • 你不能只去掉句点,否则你必须用零填充每个八位字节,这样它们都是 3 个字符长。否则 IP 的 192.168.45.5 和 192.168.4.55 看起来是一样的。当人们建议使用 int(32 位)时,他们的意思是您将每个八位字节(每个 8 位)打包成一个 int。
  • 对于 ipv4 + ipv6 混合,VARBINARY(16)

标签: mysql


【解决方案1】:

我想你只对 IPv4 地址感兴趣,而不是 IPv6。

我将使用INT UNSIGNED 作为列,然后使用INET_ATONINET_NTOA 在文本表示和int 值之间来回转换。

mysql> SELECT INET_ATON('192.168.10.50');
+----------------------------+
| INET_ATON('192.168.10.50') |
+----------------------------+
|                 3232238130 |
+----------------------------+
1 row in set (0.00 sec)

mysql> SELECT INET_NTOA(3232238130);
+-----------------------+
| INET_NTOA(3232238130) |
+-----------------------+
| 192.168.10.50         |
+-----------------------+
1 row in set (0.00 sec)

【讨论】:

    【解决方案2】:

    【讨论】:

    • 有趣,我不知道这些函数存在。
    • @ajreal - 二进制或 x2 bigint 无符号
    • 我总是看到很多将 IP 存储为整数的建议,但没有解释为什么要这样做。多一个。你能解释一下为什么在这里 int 比 (var)char 更好吗?
    • @zerkms - 简单的场景,我想记录用户活动,所以假设我们有一个包含 1000 万行的日志表(我知道它很小)。仅使用 char 就可以获得 1000 万 * 15 字节 = 143MB 的 IP 数据。 1000 万行 * 4 字节 = 38MB 的 IP 数据(相差 105MB)。因此,使用 INT 缓冲的值大约是 4 倍。在您看来,为什么在这里使用 char 会更好?
    • @f00: 因为我们不需要用 inet_ntoa() 将其转换回来显示。而且,是的,大小是一个论点。不是很重要,但确实很重要。
    【解决方案3】:

    如果你真的关心节省空间,你可以把它打包成一个 4 字节的 int。 IPv4 IP 地址的每个块可以有 256 个可能的值,这恰好是单个字节的范围。

    -- 编辑--> 我刚才描述的可以用他的答案中链接的 mysql 函数 f00 来完成

    但是,将其存储为字符串将节省一些编码时间。老实说,除非您在非常大的范围内执行此操作,否则从更密集的存储格式进行优化并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2019-05-20
      • 2015-05-20
      • 2015-06-17
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多