MySQL中以数值类型存储IP地址
前言
数据库中存储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_ATON和INET6_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地址的更多相关文章
- MySQL和PHP中以整型存储IP地址
正文:将IP地址以整型存储 一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般是用varchar或char类型存储.但是其实有更好的存储方法就是以整型存储IP地址. 因为c ...
- 【mysql】MySQL存储IP地址
为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...
- MySQL怎样存储IP地址
为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...
- MySQL如何有效的存储IP地址
前几天,阿淼的一个朋友去面试,他回来告诉我,面试官问他 IP 地址是怎么存在数据库的?他当时也没多想,直接就回答的存字符串啊(心想:这么简单的问题,怕不是看不起我吧) 前面这段权当看看,毕竟 IP地址 ...
- 如何在数据库中存储IP地址
最近改一个比较老的web系统,该系统是通过账号或者ip地址(白名单)验证限制访问权限的. 由于运营的时间比较长了,发现进入网站巨卡... 原因就是:之前的数据库(sqlserver)存储ip地址是用的 ...
- MySQL怎样存储IP地址 IP转数字 互转
MySQL怎样存储IP地址 - cn三少 - 博客园 https://www.cnblogs.com/cnsanshao/p/3326648.html
- 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法
原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...
- Mysql中的一些类型
列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...
- 解析MySQL中存储时间日期类型的选择问题
解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...
- mysql 使用inet_aton和inet_ntoa处理ip地址数据
mysql 使用inet_aton和inet_ntoa处理ip地址数据 mysql提供了两个方法来处理ip地址 inet_aton 把ip转为无符号整型(4-8位) inet_ntoa 把整型的ip转 ...
随机推荐
- asp.net core配置项示例代码
1.IConfigurationSource:表示一个配置源,其Build方法生成的IConfigurationProvider用于从当前配置源中读取key-value值(TryGey读取.Set设置 ...
- 墨者学院SQL注入(MySQL)的总结:
我们打开靶机 在这个界面我们可以看见在密码的下面有一个停机公告,我们点进去,会发现可以发现这个公告是存在id的,又可以会出现漏洞.所以我们尝试着在id=1的后面加上and 1=1 我们可以 ...
- 【记录】C/C++-关于I/O的坑与教训
吐槽 每每读取字符串时,倘若稍有灵活的操作,总会遇上诡异奇怪的事情.究其原因,就是没完全理解一些基本读写函数的机制.这次做Uva227就把I/O上的问题全暴露出来了.想来还是应该记录一些经验教训. 记 ...
- Qt QCheckBox设置复选框的大小
文章目录 Qt设计QCheckBox样式表 QCheckBox的各部分代表的样式表 Qt QCheckBox设置复选框的大小 Qt设计QCheckBox样式表 QCheckBox的各部分代表的样式表 ...
- [tldr]github仓库添加release
作为一个开源项目开发者,并且把自己的代码仓库托管到了github上面,所以,可以在github上提供自己的程序的release 这通常是通过二进制可执行文件的方式提供 新建草稿 点击create a ...
- docker 超出共享内存限制 RuntimeError: DataLoader
前言 docker 运行时报错: RuntimeError: DataLoader worker (pid 86) is killed by signal: Bus error. It is poss ...
- 理解Python中的元类(metaclass)
类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...
- go 遍历修改切片数据
package main import "fmt" type good struct { id int64 sum int64 } func main() { good1 := g ...
- Oracle AI应用的LLM模型典型配置
最近在做一些基于Oracle的一些AI应用测试工作,AI肯定离不开配置LLM相关,虽然是简单配置类,但实际还是遇到一些卡点,记录下来供今后参考. 1.配置Embedding模型 2.特殊语法传参JSO ...
- FastAPI中实现动态条件必填字段的实践
title: FastAPI中实现动态条件必填字段的实践 date: 2025/04/03 00:06:20 updated: 2025/04/03 00:06:20 author: cmdragon ...