我的应用程序上有一个表,存储了数万个事件(例如用户登录时),并且数量还在不断增长。每个事件记录 IP 地址,可以是 IPv4/6。这不是优雅的设计,对于存储记录或索引也不是高效的。
IPv4 应存储为 INT(10) UNSIGNED
,IPv6 应存储为 BINARY(16)
(我对吗?)。我想创建两个新列,例如ipv4
和 ipv6
并使用 NULL
或 IPv4/6 地址填充它们。目前,所有 IP 地址都以 longtext
形式存储在名为 event_meta
的列中。
这可以做到吗?
最佳答案
您质疑“...应该存储为...我说得对吗?”很难回答,但也可能不是。这里的错误在于问题本身,特别是您没有指定存储这些值的要求。在某些情况下,打包的二进制表示形式(IPv4 为 8 个八位字节,IPv8 为 16 个八位字节)是最好的,而在其他情况下,通常的文本表示形式更好。您的情况取决于您的(未知)要求。
现在,对于这个特殊情况,我将按照正常默认执行以下操作:
将 IPv4 转换为 IPv6。从 IPv4 到 IPv6 存在一种明确的、可逆的映射,因此每个 IPv4 地址在 IPv6 数字空间中都只有一种表示形式。
将 IP 地址格式化为文本。 RFC 4291 定义了此格式,请参阅维基百科页面作为开始。
您得到的是最多包含 39 个字符的单列。这是人类可读的,用于诊断和维护任务。此外,即使只有几千个条目,它也可以被有效地索引。
关于mysql - 将存储 IPv4/6 地址的 LONGTEXT 记录转换为 INT(10) UNSIGNED 和 BINARY(16),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260992/