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_* 函数负责解决这个问题。
我建议迁移到 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)
可能是时候开始考虑 IPv6 了。MySQL 没有将 IPv6 地址转换为二进制格式的方法。四十个字符的字符串将处理任何普通的 IPv6 地址。有一种格式可能会超过 40 个字符,我会考虑那些不太可能发生的练习。
您可以根据当时的信息计算大小,即最多有 8 个四个字符组,其中包含 7 个分隔符。异常格式将最后两组替换为 IPv4 格式地址。如果没有地址压缩,它将用最多 15 个字符替换最后 9 个字符。
如果您正在存储块,则块大小指示可能需要 4 个字符,而不是 IPv4 所需的 3 个字符。
你应该确保你得到的格式是一致的,但我见过的所有软件都为地址提供了一致的格式。