IP使用整数存储到数据库

"还有使用整型存储IP地址,也不要使用字符型。"

IP的格式是A.B.C.D,其中A,B,C,D均为0~255内的整数,
例如127.0.0.1,192.168.53.65。

0~255就是一个8位的2进制的数,00000000(0) - 11111111(255)

整个ip就是一个32位的2进制数,范围是
    00000000 00000000 00000000 00000000   0
-   11111111 11111111 11111111 11111111   4294967295
可以转化为一个整数存到数据库里面。

java里面的数据类型
Long.MAX_VALUE = 0x7fffffffffffffffL = 9223372036854775807
Integer.MAX_VALUE = 0x7fffffff = 2147483647 < 4294967295
所以java里面计算ip转成整型需要使用Long类型

mysql里面的数据类型
TINYINT           -128到127

SMALLINT        -32768到32767

MEDIUMINT      -8388608到8388607

INT                  -2147483648到2147483647

BIGINT             -9223372036854775808到9223372036854775807

所以mysql里面要存储ip的话,字段的类型要设置成BIGINT

接下来就是如何把一个ip转化成一个整型从而存储到mysql中,以及如何从mysql取到一个整型,转化成一个字符串类型。

 1 public class IPUtils {
 2     public static Long getIPNum(final String IP) {
 3         Long IPNum = 0l;
 4         final String IPStr = IP.trim();
 5         if (IP != null && IPStr.length() != 0) {
 6             final String[] subips = IPStr.split("\\.");
 7             for (final String str : subips) {
 8                 // 向左移8位
 9                 IPNum = IPNum << 8;
10                 IPNum += Integer.parseInt(str);
11             }
12         }
13         return IPNum;
14     }
15
16     public static String getIPString(final Long IPNum) {
17         final Long andNumbers[] = { 0xff000000L, 0x00ff0000L, 0x0000ff00L, 0x000000ffL };
18         final StringBuilder IPStrSb = new StringBuilder();
19         for (int i = 0; i < 4; i++) {
20             IPStrSb.append(String.valueOf((IPNum & andNumbers[i]) >> 8 * (3 - i)));
21             if (i != 3) {
22                 IPStrSb.append(".");
23             }
24         }
25         return IPStrSb.toString();
26     }
27
28     public static void main(final String[] args) {
29         final String IPStr = "192.185.11.11";
30         System.out.println(getIPNum(IPStr));
31
32         final Long IPNum = 3233352459L;
33         System.out.println(getIPString(IPNum));
34     }
35
36 }
时间: 2024-10-03 03:02:16

IP使用整数存储到数据库的相关文章

如何将类序列化并直接存储入数据库

参考代码1 可以使用.net提供的序列化和反序列化方法来实现,你可将对象序列化成XML字符串,然后存入数据库中,当你要使用对象的时候,再把数据库中保存字符串反序列化成对象就可以使用了,以下为示例代码: public class Cat { public string Color { get; set; } public int Speed { get; set; } public string Name{ get; set; } } //序列化 var cat1=new Cat{Color="W

如何使用 JDBC 调用存储在数据库中的函数或存储过程

JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例.在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<a

Laravel5.1 将控制权限存储到数据库

上一篇文章记录了如何使用policy,一般要做一个完整的网站我们需要把一系列的管理权限存储到数据库中,这样就可以更加灵活的使用用户控制权限,首先我们来创建两个模型 permission(权限)和role(角色): php artisan make:model Permission php artisan make:model Role 逻辑关系 上面我们创建了权限和角色模型,现在我们来生成对应的数据表,但是要先想清楚它们之间的关系,一个权限可以被很多个用户使用,一个用户又可以有很多的权限,很明显

Python爬虫:爬取小说并存储到数据库

爬取小说网站的小说,并保存到数据库 第一步:先获取小说内容 #!/usr/bin/python # -*- coding: UTF-8 -*- import urllib2,re domain = 'http://www.quanshu.net' headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom

问卷过程_将编辑好的问卷(存储在数据库中)显示在浏览器中

首先要了解数据的设计,也就是数据室怎么存储在数据库中的. 先来看一个最简单的问卷的构成吧 可以看到大概的结构是:『标题:标题内容标题说明.题目:题目编号,题目内容.选项:选项类型,选项编号,选项内容』.提交:提交按钮.其中『』内的元素就是需要存储到数据库中的. 可以想一下:一张表示是否可以存储一张问卷呢?这应该是可以的但是一个表不应该只能存储一张问卷吧,要不然太浪费资源了. 数据库的设计应该是怎样的呢: 首先:整体的问卷基本信息要有:问卷的编号(我们通过链接把我们的问卷发给别人来填写的话,要唯一

ASP.NET中让图片以二进制的形式存储在数据库中

今早有个网友问到我这问题,以前我都是直接在数据库中存文件名的,还没有试过存储整张图片到数据库中,上网搜索了一下,自己又测试了一番,代码如下:建立保存图片的表的SQL语句: Sql代码   USE [niunantest] GO /****** 对象:  Table [dbo].[picdata]    脚本日期: 03/30/2010 14:51:58 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [d

js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; if(window.ActiveXObject) { var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '&qu

ip代理池-基于mongodb数据库

代码用的python2.7,抓取xici免费代理,检测放入数据库中,为以后爬虫做准备.下面直接上代码 1 #-*-encoding=utf-8-*- 2 3 import requests 4 from lxml import etree 5 import time 6 import pymongo 7 from multiprocessing import Pool 8 9 10 class Getproxy(object): 11 def __init__(self): 12 self.he

安卓数据持久化:文件存储、SharedPreferences存储以及数据库存储

Android系统中主要提供了三种方式用于简单的实现数据持久化功能: 文件存储(手机自带的内存).SharedPreferences存储以及数据库存储 当然还可以用sd卡存储 读入写出 下面是疯狂java讲义中的关于IO流的一些补充,回忆一下 1,文件存储 手机自带的内存,只能供当前应用程序访问,其他应用程序访问不了,程序卸载这些数据也会随着消失 原理: 基本是先获取一个文件的输出流,然后把信息write进去,最后关闭流 a,通过上下文类context的openFileOutput()方法获得一