前言

  数据库中存储IP地址的时候,推荐使用整数存储而不是字符串。一般来说, 在保证正确性的前提下,尽量使用最小的数据类型来存储和展示数据;小的数据类型一般比大的更快,因为小的数据类型占用的磁盘空间,内存和cup缓存都相对小,需要的cpu处理也要相对少; 这个原则很重要,设计的时候不要低估待存储数据的数据范围。另外,转换之后,还便于使用范围查询(BETWEEN...AND),且效率更高。

  对于转换来说,MySQL提供了相关的函数来把字符串格式的IP转换成整数INET_ATON,以及把整数格式的IP转换成字符串的INET_NTOA。如下所示:

mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
1 row in set (0.00 sec) mysql> select inet_ntoa(3232235521);
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1 |
+-----------------------+
1 row in set (0.00 sec)

对于IPv6来说,使用VARBINARY可获得相同的好处,同时MySQL也提供了转换函数INET6_ATONINET6_NTOA

IPv4地址和int类型数字互转

package com.hoss.ext.authentication;

import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* IPv4地址和int类型数字互转
*
* @author Wiener
* @date 2021/4/29
*/
public class SaveIp { public static void main(String[] args) {
String ip = "127.0.0.1";
String ip33 = "172.16.24.33";
String ip13 = "172.16.10.13";
String ip89 = "111.112.113.114";
intToIp(ipToInt(ip89));
} /**
* (Ip转Integer)
* 方法名:ipToInt
*
* @throws
* @since 1.0.0
*/
public static int ipToInt(String ip) {
if (!isIPv4Address(ip)) {
throw new RuntimeException("Invalid ip address");
}
String[] ips = ip.split("\\.");
int ipInt = 0;
//因为每个位置最大255,刚好在2进制里表示8位
for (String ip4 : ips) {
Integer ip4a = Integer.parseInt(ip4);
//这里应该用+也可以,但是位运算更快
ipInt = (ipInt << 8) | ip4a;
}
System.out.println(ipInt); return ipInt;
} /**
* 判断是否为ipv4地址
*
* @param ipv4Addr
* @return true 是ipv4地址
*/
private static boolean isIPv4Address(String ipv4Addr) {
// 0-255的数字
String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])";
String regex = lower + "(\\." + lower + "){3}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(ipv4Addr);
return matcher.matches();
} /**
* (Integer转IP)
* 方法名:intToIp
*
* @param ip数字
* @return String
*/
public static String intToIp(int ip) {
//思路很简单,每8位拿一次,就是对应位的IP
StringBuilder sb = new StringBuilder();
for (int i = 3; i >= 0; i--) {
int ipa = (ip >> (8 * i)) & (0xff);
sb.append(ipa + ".");
}
sb.delete(sb.length() - 1, sb.length());
System.out.println("数字转IP:" + sb);
return sb.toString();
} }

Reference

MySQL中以数值类型存储IP地址的更多相关文章

  1. MySQL和PHP中以整型存储IP地址

    正文:将IP地址以整型存储 一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般是用varchar或char类型存储.但是其实有更好的存储方法就是以整型存储IP地址. 因为c ...

  2. 【mysql】MySQL存储IP地址

    为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...

  3. MySQL怎样存储IP地址

    为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...

  4. MySQL如何有效的存储IP地址

    前几天,阿淼的一个朋友去面试,他回来告诉我,面试官问他 IP 地址是怎么存在数据库的?他当时也没多想,直接就回答的存字符串啊(心想:这么简单的问题,怕不是看不起我吧) 前面这段权当看看,毕竟 IP地址 ...

  5. 如何在数据库中存储IP地址

    最近改一个比较老的web系统,该系统是通过账号或者ip地址(白名单)验证限制访问权限的. 由于运营的时间比较长了,发现进入网站巨卡... 原因就是:之前的数据库(sqlserver)存储ip地址是用的 ...

  6. MySQL怎样存储IP地址 IP转数字 互转

    MySQL怎样存储IP地址 - cn三少 - 博客园 https://www.cnblogs.com/cnsanshao/p/3326648.html

  7. 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法

    原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...

  8. Mysql中的一些类型

    列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...

  9. 解析MySQL中存储时间日期类型的选择问题

    解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...

  10. mysql 使用inet_aton和inet_ntoa处理ip地址数据

    mysql 使用inet_aton和inet_ntoa处理ip地址数据 mysql提供了两个方法来处理ip地址 inet_aton 把ip转为无符号整型(4-8位) inet_ntoa 把整型的ip转 ...

随机推荐

  1. Abaqus压电材料分析

    目录 1. ABAQUS压电材料定义[快速版] 2. 压电材料的主要特性参数 3. Abaqus 压电分析 1 电响应 2 initial condition & BCs 4 Load 5 M ...

  2. 全面的C#/.NET/.NET Core面试宝典(永久免费)

    前言 C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺.扩充知识面和大家共同学习.携手进步. 该知识库主要由自己平时学习和工作实践总结.网上优秀文章资料 ...

  3. 记录使用wsl环境nginx代理超时的处理方法

    有问题的配置 set $webpack_server http://127.0.0.1:3030; location ~ ^/static-dist { proxy_pass $webpack_ser ...

  4. rust学习笔记(8)

    cargo cargo是一个用来帮助控制项目开发的工具 cargo.toml 这是一个用来管理项目的文件 首先是[package]部分 [package] name = "foo" ...

  5. 查看docker容器占用内存

    ps -ef|grep 容器Id 1 2 3 [root@wentao-2 order]# ps -ef|grep 3a61cb3fd4f6 root      7358 12956  0 09:14 ...

  6. 团队小规模本地大模型服务平台搭建 - Ubuntu

    实现目标和考虑因素 部署一个支持多用户同时使用.多模型运行的离线局域网大模型服务器 需要考虑以下几个关键因素: 大模型的加载和管理.使用一个基础大模型,根据实战需要创建多个专用模型,模型管理方便可靠. ...

  7. Python进阶知识:多进程/多线程/装饰器

    本文写作于2025.3.20,恰好作者正好在外面实习,于此同时在实际工作中遇到这些知识点,因此就进行一个简短汇总方便后续回顾,内容同步更新(显示问题可以直接看):https://www.big-yel ...

  8. 目前国内可用Docker镜像源汇总(截至2024年11月)

    本文主要讲述了由于特殊原因国内的 Docker 镜像源出现问题,国内许多常见的镜像源如网易.百度等已不可用.文中介绍了中科大镜像源的暂时关闭情况,以及阿里镜像源包括私人阿里镜像加速器的使用方式,并提供 ...

  9. 解密prompt系列52. 闲聊大模型还有什么值得探索的领域

    在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有 ...

  10. Python科学计算系列5—导数

    1.一元函数的导数 例1:求下列函数的导数 例2:求下列函数的50阶导数 代码如下: from sympy import * x = symbols('x') f1 = diff(tan(x)) f2 ...