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

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

  •  
  •   woomly · 2022-09-20 10:29:30 +08:00 · 4368 次点击
    这是一个创建于 828 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    比如加白、拉黑
    676529483
        6
    676529483  
       2022-09-20 10:43:57 +08:00
    @fisherwei 转换成 int ,走位运算
    fisherwei
        7
    fisherwei  
       2022-09-20 10:46:14 +08:00
    @676529483 那为啥不直接存成 int
    tramm
        8
    tramm  
       2022-09-20 10:48:03 +08:00
    随意啦,需要存 IP 地址的地方也不多吧...
    rekulas
        9
    rekulas  
       2022-09-20 10:48:12 +08:00
    @fisherwei 不纠结都存就行了,兼顾可阅读性和效率,空间不值钱
    lmshl
        10
    lmshl  
       2022-09-20 10:48:54 +08:00   ❤️ 1
    UNSIGNED INT ,遇到取 cidr 的时候,直接 BETWEEN 就搞定了
    picone
        11
    picone  
       2022-09-20 10:50:55 +08:00
    @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-09-20 11:06:15 +08:00
    磁盘便宜,怎么方便怎么来
    QKgf555H87Fp0cth
        13
    QKgf555H87Fp0cth  
       2022-09-20 11:07:16 +08:00
    一切从简,VARCHAR
    knightdf
        14
    knightdf  
       2022-09-20 11:08:44 +08:00
    你可以都存
    agagega
        15
    agagega  
       2022-09-20 11:11:11 +08:00 via iPhone
    用 unsigned int 小心 ipv6
    IDAEngine
        16
    IDAEngine  
       2022-09-20 11:20:15 +08:00
    存 16 进制
    loginv2
        17
    loginv2  
       2022-09-20 13:03:29 +08:00
    两个都存
    masterclock
        18
    masterclock  
       2022-09-20 13:19:34 +08:00
    ipv4 ,存字符串的话,存前先同一个格式吗?
    比如 127.0.0.1
    127.1
    0177.0.0.1
    0177.1
    0x7F000001
    167772673
    adoal
        19
    adoal  
       2022-09-20 14:33:49 +08:00
    PostgreSQL 原生 inet/cidr 类型
    NoString
        20
    NoString  
       2022-09-20 14:42:24 +08:00
    clickhouse 有 ipv4 和 ipv6 的类型
    msg7086
        21
    msg7086  
       2022-09-20 15:15:20 +08:00
    IPv4 存 int32 ,IPv6 用 binary(16)。
    newmlp
        22
    newmlp  
       2022-09-20 19:51:14 +08:00
    当然 int ,需要显示的地方让前端自己转一下就行了
    JohnBull
        23
    JohnBull  
       2022-09-20 19:56:38 +08:00
    PostgreSQL 内置了 CIDR 类型,支持 v4 和 v6
    ericls
        24
    ericls  
       2022-09-21 02:11:36 +08:00 via iPhone
    看要解决什么问题
    julyclyde
        25
    julyclyde  
       2022-09-21 08:52:59 +08:00
    varchar 显然是错误的

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