mysql - 将存储 IPv4/6 地址的 LONGTEXT 记录转换为 INT(10) UNSIGNED 和 BINARY(16)

标签 mysql

我的应用程序上有一个表,存储了数万个事件(例如用户登录时),并且数量还在不断增长。每个事件记录 IP 地址,可以是 IPv4/6。这不是优雅的设计,对于存储记录或索引也不是高效的。

IPv4 应存储为 INT(10) UNSIGNED,IPv6 应存储为 BINARY(16)(我对吗?)。我想创建两个新列,例如ipv4ipv6 并使用 NULL 或 IPv4/6 地址填充它们。目前,所有 IP 地址都以 longtext 形式存储在名为 event_meta 的列中。

这可以做到吗?

最佳答案

您质疑“...应该存储为...我说得对吗?”很难回答,但也可能不是。这里的错误在于问题本身,特别是您没有指定存储这些值的要求。在某些情况下,打包的二进制表示形式(IPv4 为 8 个八位字节,IPv8 为 16 个八位字节)是最好的,而在其他情况下,通常的文本表示形式更好。您的情况取决于您的(未知)要求。

现在,对于这个特殊情况,我将按照正常默认执行以下操作:

  1. 将 IPv4 转换为 IPv6。从 IPv4 到 IPv6 存在一种明确的、可逆的映射,因此每个 IPv4 地址在 IPv6 数字空间中都只有一种表示形式。

  2. 将 IP 地址格式化为文本。 RFC 4291 定义了此格式,请参阅维基百科页面作为开始。

您得到的是最多包含 39 个字符的单列。这是人类可读的,用于诊断和维护任务。此外,即使只有几千个条目,它也可以被有效地索引。

关于mysql - 将存储 IPv4/6 地址的 LONGTEXT 记录转换为 INT(10) UNSIGNED 和 BINARY(16),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260992/

相关文章:

mysql - 在 mysql 中收到 "data truncated for column"警告

php mysql 查询一次将字段名称及其数据提取到表中

php - 来自 MySQL 的 XML 数据

php - 下拉菜单的查询结果

php - 如何解决共享主机上 PHP/MySQL 中的 CWE-259(硬编码密码)?

php - 如何组织数据库中的表?

php - 插件无法激活,因为它触发了 fatal error : unexpected 'require_once'

Mysql外键关系选择语句

MYSQL 5.6.10 ANALYZE TABLE 锁问题

mysql - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column in 'field list' using Criteria and mapping annotation