为啥存储 IP 用 bigint 而不是 char

需求

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

考虑

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

过程

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

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

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

总结

  1. 节省空间
  2. 索引体积更少
  3. 支持IP范围查询
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 8

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

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

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

4年前 评论
ALMAS 4年前
laaa 4年前
ALMAS 4年前
Epona

string完事😂

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

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

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

timestamp +1

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

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

4年前 评论

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 一致。

4年前 评论
xianyunyehe

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

4年前 评论

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