当前位置:网站首页>数据库存IP地址,用什么数据类型
数据库存IP地址,用什么数据类型
2022-07-15 16:45:00 【靈熙雲】
MySQL数据库
在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。
相对字符串存储,使用无符号整数来存储有如下的好处:
- 节省空间,不管是数据存储空间,还是索引存储空间
- 便于使用范围查询(BETWEEN…AND),且效率更高
- 通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用
VARCHAR(15)即可。 - MySQL在保存
变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节即可。 - 另外还可以使用4个字段分别存储IPv4中的各部分,但是通常这不管是存储空间和查询效率应该都不是很高(可能有的场景适合使用这种方式存储)。
使用无符号整数来存储也有缺点:
- 不便于阅读
- 需要手动转换
对于转换来说,MySQL提供了相应的函数来把字符串格式的IP转换成整数的INET_ATON,以及把整数格式的IP转换成字符串的INET_NTOA。
如下所示:
INET_ATON
mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
1 row in set (0.00 sec)
INET_NTOA
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。
ORACLE数据库
ORACLE模拟MySQL中inet_aton函数、inet_ntoa函数
INET_ATON
CREATE OR REPLACE FUNCTION inet_aton( f_address IN varchar2 ) RETURN number
AS
o_address_number number;
BEGIN
SELECT
to_number(regexp_replace(f_address, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\1')) * 16777216 +
to_number(regexp_replace(f_address, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\2')) * 65536 +
to_number(regexp_replace(f_address, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\3')) * 256 +
to_number(regexp_replace(f_address, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\4')) INTO o_address_number;
RETURN o_address_number;
END inet_aton;
INET_NTOA
CREATE OR REPLACE FUNCTION inet_ntoa( f_address_number IN number ) RETURN varchar2
AS
o_address varchar2;
BEGIN
SELECT trunc ( f_address_number / 16777216 ) || '.' || trunc ( MOD ( f_address_number, 16777216 ) / 65536 ) || '.' || trunc ( MOD ( f_address_number, 65536 ) / 256 ) || '.' || trunc ( MOD ( f_address_number, 256 ) ) INTO o_address;
RETURN o_address;
END inet_ntoa;
代码转换
对于转换字符串IPv4和数值类型,可以放在应用层,下面是使用java代码来对二者转换:
package com.mikan;
/** * @author Mikan */
public class IpLongUtils {
/** * 把字符串IP转换成long * * @param ipStr 字符串IP * @return IP对应的long值 */
public static long ip2Long(String ipStr) {
String[] ip = ipStr.split("\\.");
return (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
+ (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
}
/** * 把IP的long值转换成字符串 * * @param ipLong IP的long值 * @return long值对应的字符串 */
public static String long2Ip(long ipLong) {
StringBuilder ip = new StringBuilder();
ip.append(ipLong >>> 24).append(".");
ip.append((ipLong >>> 16) & 0xFF).append(".");
ip.append((ipLong >>> 8) & 0xFF).append(".");
ip.append(ipLong & 0xFF);
return ip.toString();
}
public static void main(String[] args) {
System.out.println(ip2Long("192.168.0.1"));
System.out.println(long2Ip(3232235521L));
System.out.println(ip2Long("10.0.0.1"));
}
}
输出结果为:
3232235521
192.168.0.1
167772161
原文:
https://blog.csdn.net/mhmyqn/article/details/48653157
https://blog.csdn.net/weixin_44158741/article/details/110469648
边栏推荐
猜你喜欢

1-初识FPGA

typec显示器解决方案大全LDR6290单C口桌面式显示器解决方案

Medical document OCR recognition + knowledge base verification, enabling insurance intelligent claim settlement

Empowering new industries and creating a new future | Tupo software was invited to participate in the Xiamen Industrial Expo

CDQ分治与整体二分 学习笔记

Ldr9201 audio digital decoding DAC plus ldr6023c digital plus PD fast charging scheme

Typec display solution Daquan ldr6290 single C-Port desktop display solution

DEBUG系统

免驱 USB 转串口 Billboard 芯片(LDR2001)
C 基本语法解读: 总结程序中的一些常用到的但是容易混乱的函数(i++与++i) (位域)
随机推荐
C语言 第十章 指针
LDR9201音频数字解码DAC加LDR6023C数字加PD快充方案
PD-QC-AFC多协议诱骗芯片《LDR6328S》
FFmpeg sample 分析:muxing.c
room android sqlite
scala for循环 (循环守卫、 循环步长、循环嵌套 、引入变量、循环返回值、循环中断 Breaks)
C语言 第六章 函数
The meaning of sprint in Agile Development
Faster Planner——Kinodynamic Astar详解
(一)MATLAB基础知识
Domestic light! High score spatiotemporal representation learning model uniformer
生命游戏,25号宇宙与奋斗者
抖音带火的这种无线领夹麦克风,央视主持人都在用
Unet在电池分割项目上应用
如何使用OpenCV保存.mp4格式文件
Domain Driven Design Fundamentals
WM8960声卡相关问题
Swin transformer, the best paper model of iccv 2021, finally started video
centernet(objects as points)的尝试[基于tf.slim]
Exploration of yolact model structure