存储 IP 地址

Cle*_*kod 26 mysql database-design datatypes

我必须将所有注册用户的 IP 地址存储在数据库中。我想知道,我应该为这样的列声明多少个字符?

我也应该支持 IPv6 吗?如果是,IP地址的最大长度是多少?

Mr *_*unz 28

不要存储为字符串。使用的int unsigned柱和存储/检索与INET_ATON()INET_NTOA()分别。AFAIK mysql 不支持 INET_* for ipv6。

根据评论编辑

使用内置函数将 IP 转换为整数(并将这些整数存储在数据库中)具有自动验证这些 IP 的副作用。假设您将 IP 存储为 VARCHAR(16),您必须确保不要通过一些自定义验证存储无效的 IP(例如 999.999.999.999)。INET_* 函数负责解决这个问题。

  • [IPv4](http://en.wikipedia.org/wiki/IP_address) 是 32 位。128 位用于 IPv6,正如他所提到的,INET_* 不支持。 (4认同)

jkj*_*jkj 7

我建议迁移到 PostgreSQL 并使用INET 或 CIDR数据类型。

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d
Run Code Online (Sandbox Code Playgroud)


Bil*_*hor 6

可能是时候开始考虑 IPv6 了。MySQL 没有将 IPv6 地址转换为二进制格式的方法。四十个字符的字符串将处理任何普通的 IPv6 地址。有一种格式可能会超过 40 个字符,我会考虑那些不太可能发生的练习。

您可以根据当时的信息计算大小,即最多有 8 个四个字符组,其中包含 7 个分隔符。异常格式将最后两组替换为 IPv4 格式地址。如果没有地址压缩,它将用最多 15 个字符替换最后 9 个字符。

如果您正在存储块,则块大小指示可能需要 4 个字符,而不是 IPv4 所需的 3 个字符。

你应该确保你得到的格式是一致的,但我见过的所有软件都为地址提供了一致的格式。

  • 我完全同意,IPv6 即将到来,准备好迎接它比像 Y2K 那样等待它更好:D (3认同)