MySQL中用什么数据类型存IP地址

提到IP地址(IPv4),我们脑子里肯定立马浮现类似于192.168.0.1127.0.0.1这种常见的IP地址,然后结合这个问题MySQL中用什么数据类型存IP地址?,于是乎脱口而出用char字符串类型存储。

然后再仔细想想发现,这个IP地址的长度是变化的,最短可以是0.0.0.0只需要 7 位,最长可以是255.255.255.255需要15位,于是自信地回答使用varchar(15)来存储 IP 地址,并为自己能够想到这一层而暗自窃喜。

人们经常使用varchar(15)列来存储 IP 地址,但事实上这并不是最优解。

IP地址的本质是32位无符号整数,类似于192.168.0.1这种点分十进制的字符串写法只是为了帮助人们理解和记忆,192.168.0.1对应的十进制表示是无符号整数3232235521。

所以说用字符串类型存IP 地址的,其实是潜意识中以为IP地址是字符串。实际存的是点分十进制的字符串,但正确的应该是存32位的无符号整数。

所谓有符号数其实就是将最高位作为符号位,比如32位的有符号int类型,最高位是符号位,剩下 31位才是真实的数值,所以有符号int类型的取值区间为:

[-2^31,2^3-1]

无符号int类型的取值区间为:

[0,2^32]

下表列出了MySQL中各个整数类型有符号和无符号的的取值范围,在定义表时,可以在数据类型后面添加关键字 UNSIGNED 来定义无符号整数,否则默认为有符号整数: 

特别说明:ASCII码中,1个汉字字符存储需要2个字节,1个英文字符存储需要1个字节。

结合上表,可以看出32位的无符号 int类型正好可以容纳 IPv4 地址,下面是 INT UNSIGNED 和 VARCHAR(15) 两种数据类型的对比:

  • 存储空间: 4 字节的int类型比15字节的varchar(15)更加节省存储空间。另外varchar除了会保存需要的字符,还会另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节记录长度),所以varchar(15)其实要占用 16 个字节。
  • 检索速度如果我们要在 IP 地址上建立索引,那么对于字符串索引来说,整数索引的检索速度简直就是降纬打击了,因为字符串类型的比较是需要从第一位字符开始遍历依次进行的,速度较慢。

MySQL非常贴心地提供了IPv4地址点分十进制和无符号整数的相互转换函数,inet_atoninet_ntoa(底层是二进制移位操作,速度很快)。

点分十进制 -> 十进制

SELECT INET_ATON('192.168.0.1');

十进制 -> 点分十进制

SELECT INET_NTOA('3232235521');

 

当然我们更应该在业务中去执行这些转换,减轻 MySQL 的压力:

public class Demo {public static void main(String[] args) {String ipStr = "192.168.0.1";long ip =ip2int(ipStr);System.out.println(ip);}public static long ip2int(String ip) {String[] items = ip.split("\\.");return Long.valueOf(items[0]) << 24 | Long.valueOf(items[1]) << 16 | Long.valueOf(items[2]) << 8 | Long.valueOf(items[3]);}public static String int2ip(long ipInt) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append((ipInt >> 24) & 0xFF).append(".");stringBuilder.append((ipInt >> 16) & 0xFF).append(".");stringBuilder.append((ipInt >> 8) & 0xFF).append(".");stringBuilder.append(ipInt & 0xFF);return stringBuilder.toString();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/88895.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云标准型CVM云服务器详细介绍

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…

页面切换后,滚动栏问题

项目场景&#xff1a; 提示&#xff1a;react项目antd后台管理系统 问题描述 后台管理系统从a页面进入b页面&#xff0c;a页面有数据&#xff08;有滚动条&#xff0c;且scollTop大于0&#xff09;&#xff0c;进入b页面后&#xff0c;滚动条不是位于初始位置&#xff08;scol…

Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

效果图◕‿◕✌✌✌&#xff1a;opencv人脸识别效果图(请叫我真爱粉) 先看一下效果图勾起你的兴趣&#xff01; 文章目录&#xff1a; 一&#xff1a;环境配置搭建 二&#xff1a;图像 1.图像读取与显示 main.cpp 运行结果 2.图像色彩空间转换 2.1 换色彩 test.h …

自动化安装系统—PXE(一)

系统安装过程 加载boot loader加载启动安装菜单加载内核和initrd文件加载根系统运行anaconda的安装向导 安装光盘中与安装相关的文件 安装autofs启动后会自动出现/misc目录。 在虚拟机设置中添加CD/DVD&#xff0c;使用系统ISO文件&#xff0c;登录系统后mount /dev/cdrom …

Kettle系列(二)smart-kettle本地离线部署

Kettle系列&#xff08;二&#xff09;smart-kettle本地离线部署 说明一、概述二、代码下载&#xff08;1&#xff09;后端代码依赖下载&#xff08;2&#xff09;前端代码依赖下载 三、创建数据库&#xff08;mysql8&#xff09;四、修改配置文件五、mysql8数据库配置六、其他…

网络:路由

1. 路由器 路由器工作在三层&#xff0c;每个接口都处于不用的网段中&#xff0c;即不同的广播域。但大多情况下&#xff0c;两台路由器直接相连的接口是同一个广播域&#xff0c;即一个网段。 路由器具有判断网络地址和选择路径的功能&#xff0c;能在多网络互联的环境中&…

Mybatis一级缓存与二级缓存

Mybatis一级缓存与二级缓存 缓存就是内存中的数据&#xff0c;常常来自对数据库查询结果的保存&#xff0c;使用缓存可以避免频繁与数据库进行交互&#xff0c;从而提高查询响应速度。 mybaits提供内存支持&#xff1b; 一级缓存 一级缓存&#xff0c;sqlSession级别的缓存…

NZ系列工具NZ02:VBA读取PDF使用说明

【分享成果&#xff0c;随喜正能量】时光绽放并蒂莲&#xff0c;更是一份殷殷嘱托&#xff0c;更是一份诚挚祝福&#xff0c;是一份时光馈赠&#xff0c;又是一份时光陪伴。。 我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解…

多线程事务怎么回滚?

项目中用到了多线程去批量处理一些数据&#xff0c;当时想当然认为只要方法上加上Transactional注解就好了&#xff0c;实际并未达到想要的处理效果。特此去学习了下关于多线程事务回滚相关方案&#xff0c;参考了网上其他资料&#xff0c;这里整理并记录下学习历程。 站在巨人…

VR全景智慧文旅,用科技助力旅游业振兴

引言&#xff1a; 近年来&#xff0c;科技的迅猛发展将我们带入一个全新的数字化时代&#xff0c;而虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术则以其令人惊叹的全新方式&#xff0c;影响着各个领域。其中&#xff0c;旅游业作为人们探索世界、体…

微服务03-RabbitMQ

1、简介 MQ,中文是消息中间件(队列)(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。 几种常见MQ的对比: RabbitMQActiveMQRocketMQKafka公司…

云安全攻防(十)之 资源耗尽型攻击

资源耗尽型攻击 同为虚拟化技术&#xff0c;容器与虚拟机既存在相似之处&#xff0c;也有显著不同。在资源限制方面&#xff0c;无论使用 VMware、Virtual Box 还是 QEMU&#xff0c;我们都需要为即将创建的虚拟机设定明确的CPU、内存及硬盘资源阈值。在虚拟机内部进程看来&am…

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…

【Node.js】低代码平台源码

一、低代码简介 低代码管理系统是一种通过可视化界面和简化的开发工具&#xff0c;使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块&#xff0c;使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作…

STM32自带的DSP库的滤波初体验(一)

最近在弄STM32自带的DSP库里的滤波&#xff0c;记录一下&#xff1a; arm_fir_instance_q15 instance_q15_S; #define NUM_TAPS 16 //滤波系数的个数 #define BLOCK_SIZE 32 q15_t firStateF32[BLOCK_SIZE NUM_TAPS]; q15_t Fir_Coeff[NUM_TAPS] {-79, -136, 312, 6…

基于 SIFT 和 RANSAC 算法对高分辨率图像进行图像伪造检测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

二叉树的存储结构(顺序存储)—— 数据结构与算法

&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️ &#x1f4a5;个人主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王&#x1f525;&#x1f525;&#x1f525; &#x1f4a5;代码仓库&#xff1a;&#x1f525;&#x1f525;魔…

从零开始学习 Java:简单易懂的入门指南之抽象类接口内部类(十一)

面向对象进阶&#xff08;抽象类&接口&内部类&#xff09; 第一章 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 第二章 接口2.1 概述2.2 定义格式2.3 接…

机器学习 | Python实现KNN(K近邻)模型实践

机器学习 | Python实现KNN(K近邻)模型实践 目录 机器学习 | Python实现KNN(K近邻)模型实践基本介绍模型原理源码设计学习小结参考资料基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训…

第二十一章 重要HL7操作场景 - HL7批量消息

文章目录 第二十一章 重要HL7操作场景 - HL7批量消息支持的批处理格式处理传入的批次文档批处理模式自定义出库批量处理 第二十一章 重要HL7操作场景 - HL7批量消息 Production品支持 HL7 中的嵌套子文档&#xff08;批处理格式&#xff09;。每个子文档本身就是一个虚拟文档。…