为啥存储 IP 用 bigint 而不是 char

需求

现在业务需要存储用户的ip,设计的时候ip只是一个类似备注的字段

考虑

之后数据量增多的情况下,需要对字段大小进行控制

过程

使用ip2long方法,将ip转化成int类型能够减少一定储存空间,但会出现负数的情况

//转换
$data['ip'] = sprintf("%u",ip2long($data['ip'])); 

转换后的ip会超过int上限,所以改成bigint

总结

  1. 节省空间
  2. 索引体积更少
  3. 支持IP范围查询
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

可读性胜过那点空间,就像存时间用 datetime 不用 int

5年前 评论
小丑路人 5年前
AloneUtopia 5年前
农村闲散劳动力 5年前
pikalu 5年前
Epona 5年前
韩槑槑 5年前
CrazyZard

@晨雨零稀 我不是很清楚ip要啥可读性?存ip 不是为了之后的数据分析嘛?

5年前 评论
ALMAS 5年前
laaa 5年前
ALMAS 5年前
Epona

string完事😂

5年前 评论
CrazyZard (楼主) 5年前

减少存储空间可以用inet_aton,没必要省这个空间

5年前 评论
CrazyZard (楼主) 5年前
Kamicloud (作者) 5年前

timestamp +1

5年前 评论
cnguu
  • timestamp 通常用于记录经常更新的场景
  • datetime 通常用于记录固定的场景

以上是一般情况,实际取舍需要结合范围和时区

5年前 评论

php 函数 ip2long 返回值类型为 long 的原因是 php 整形变量只有 signed int, 无法声明为 unsigned int。而 ipv4 地址和 int (signed 或 unsigned int) 使用的字节长度一致,都是 4 字节 32 位。
因此使用 bigint (8字节64位) 存储 ip2long 是完完全全的浪费。只需要声明 mysql column 是 unsinged int,那么 php 读写数据库时,会自动处理为 signed long。这个效果和使用 mySql 函数 inet_aton 一致。

5年前 评论
xianyunyehe

int 省空间,加索引 整型索引快。字符就不要想了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!