V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
woomly
V2EX  ›  数据库

IP 地址,你们一般用什么数据类型存储?

  •  
  •   woomly · 2022 年 9 月 20 日 · 4794 次点击
    这是一个创建于 1227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我查网上资料,在数据库中存储 IP 地址,通常有使用 VARCHARUNSIGNED INT 两种方案,各有利弊。请问各位在项目中使用哪种方案存储 IP 地址字段?

    30 条回复    2022-09-21 11:30:11 +08:00
    GeorgeGalway
        1
    GeorgeGalway  
       2022 年 9 月 20 日
    VARCHAR
    danbai
        2
    danbai  
    PRO
       2022 年 9 月 20 日
    VARCHAR
    0o0O0o0O0o
        3
    0o0O0o0O0o  
       2022 年 9 月 20 日
    VARBINARY(4) 或者 VARBINARY(16)
    LeegoYih
        4
    LeegoYih  
       2022 年 9 月 20 日
    都可以,varchar 方便读,int 节约一点点空间,IP 应该不会有模糊查询的需求吧?
    同一个项目中使用统一规范即可,不用纠结
    fisherwei
        5
    fisherwei  
       2022 年 9 月 20 日
    你们用 varchar 存储的,遇到需要匹配 x.x.x.x/y 的需求怎么处理的?

    比如加白、拉黑
    676529483
        6
    676529483  
       2022 年 9 月 20 日
    @fisherwei 转换成 int ,走位运算
    fisherwei
        7
    fisherwei  
       2022 年 9 月 20 日
    @676529483 那为啥不直接存成 int
    tramm
        8
    tramm  
       2022 年 9 月 20 日
    随意啦,需要存 IP 地址的地方也不多吧...
    rekulas
        9
    rekulas  
       2022 年 9 月 20 日
    @fisherwei 不纠结都存就行了,兼顾可阅读性和效率,空间不值钱
    lmshl
        10
    lmshl  
       2022 年 9 月 20 日   ❤️ 1
    UNSIGNED INT ,遇到取 cidr 的时候,直接 BETWEEN 就搞定了
    picone
        11
    picone  
       2022 年 9 月 20 日
    @LeegoYih @fisherwei 即使模糊查询,int 类型应该是最高效的,特别是 ipv6 有简写。可以把查询的 ip 也转成 int ,然后位运算。
    require 1.1.1.0/24 => 16843008/24
    query = 1.1.1.234 => 16843242
    最后判断 16843242 & 0xFFFFFF00 == 16843008
    Wdafff
        12
    Wdafff  
       2022 年 9 月 20 日
    磁盘便宜,怎么方便怎么来
    QKgf555H87Fp0cth
        13
    QKgf555H87Fp0cth  
       2022 年 9 月 20 日
    一切从简,VARCHAR
    knightdf
        14
    knightdf  
       2022 年 9 月 20 日
    你可以都存
    agagega
        15
    agagega  
       2022 年 9 月 20 日 via iPhone
    用 unsigned int 小心 ipv6
    IDAEngine
        16
    IDAEngine  
       2022 年 9 月 20 日
    存 16 进制
    loginv2
        17
    loginv2  
       2022 年 9 月 20 日
    两个都存
    masterclock
        18
    masterclock  
       2022 年 9 月 20 日
    ipv4 ,存字符串的话,存前先同一个格式吗?
    比如 127.0.0.1
    127.1
    0177.0.0.1
    0177.1
    0x7F000001
    167772673
    adoal
        19
    adoal  
       2022 年 9 月 20 日
    PostgreSQL 原生 inet/cidr 类型
    NoString
        20
    NoString  
       2022 年 9 月 20 日
    clickhouse 有 ipv4 和 ipv6 的类型
    msg7086
        21
    msg7086  
       2022 年 9 月 20 日
    IPv4 存 int32 ,IPv6 用 binary(16)。
    newmlp
        22
    newmlp  
       2022 年 9 月 20 日
    当然 int ,需要显示的地方让前端自己转一下就行了
    JohnBull
        23
    JohnBull  
       2022 年 9 月 20 日
    PostgreSQL 内置了 CIDR 类型,支持 v4 和 v6
    ericls
        24
    ericls  
       2022 年 9 月 21 日 via iPhone
    看要解决什么问题
    julyclyde
        25
    julyclyde  
       2022 年 9 月 21 日
    varchar 显然是错误的

    如果没有特定的类型,应该用某种 uint32 保存 IPv4 地址
    bthulu
        26
    bthulu  
       2022 年 9 月 21 日
    varchar, 要相信现代数据库的查询能力
    cheng6563
        27
    cheng6563  
       2022 年 9 月 21 日
    char(15)
    并且 1.2.3.4 存成 001.002.003.004
    nothingistrue
        28
    nothingistrue  
       2022 年 9 月 21 日
    看业务需求,一般没有防火墙处理的话,VARCHAR 即可,因为你业务上就是把它当字符串用的。
    RRRoger
        29
    RRRoger  
       2022 年 9 月 21 日
    postgres 有专门存储 ip 的字段
    Junzhou
        30
    Junzhou  
       2022 年 9 月 21 日
    直接 long 就可以了,或者无符号 int ,存取的时候使用 mysql 运算函数转换。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    ♥ Do have faith in what you're doing.