0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用字符串和無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ)IP的具體性能分析

Android編程精選 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:MikanMu ? 2022-06-20 16:35 ? 次閱讀

在看高性能MySQL第3版(4.1.7節(jié))時(shí),作者建議當(dāng)存儲(chǔ)IPv4地址時(shí),應(yīng)該使用32位的無(wú)符號(hào)整數(shù)(UNSIGNED INT)來(lái)存儲(chǔ)IP地址,而不是使用字符串。但是沒(méi)有給出具體原因。為了搞清楚這個(gè)原因,查了一些資料,記錄下來(lái)。

相對(duì)字符串存儲(chǔ),使用無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ)有如下的好處:

  • 節(jié)省空間,不管是數(shù)據(jù)存儲(chǔ)空間,還是索引存儲(chǔ)空間

  • 便于使用范圍查詢(BETWEEN...AND),且效率更高

通常,在保存IPv4地址時(shí),一個(gè)IPv4最小需要7個(gè)字符,最大需要15個(gè)字符,所以,使用VARCHAR(15)即可。MySQL在保存變長(zhǎng)的字符串時(shí),還需要額外的一個(gè)字節(jié)來(lái)保存此字符串的長(zhǎng)度。而如果使用無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ),只需要4個(gè)字節(jié)即可。

另外還可以使用4個(gè)字段分別存儲(chǔ)IPv4中的各部分,但是通常這不管是存儲(chǔ)空間和查詢效率應(yīng)該都不是很高(可能有的場(chǎng)景適合使用這種方式存儲(chǔ))。

使用字符串和無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ)IP的具體性能分析及benchmark,可以看這篇文章。

使用無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ)也有缺點(diǎn):

  • 不便于閱讀

  • 需要手動(dòng)轉(zhuǎn)換

對(duì)于轉(zhuǎn)換來(lái)說(shuō),MySQL提供了相應(yīng)的函數(shù)來(lái)把字符串格式的IP轉(zhuǎn)換成整數(shù)INET_ATON,以及把整數(shù)格式的IP轉(zhuǎn)換成字符串的INET_NTOA。如下所示:

mysql>selectinet_aton('192.168.0.1');
+--------------------------+
|inet_aton('192.168.0.1')|
+--------------------------+
|3232235521|
+--------------------------+
1rowinset(0.00sec)

mysql>selectinet_ntoa(3232235521);
+-----------------------+
|inet_ntoa(3232235521)|
+-----------------------+
|192.168.0.1|
+-----------------------+
1rowinset(0.00sec)

對(duì)于IPv6來(lái)說(shuō),使用VARBINARY同樣可獲得相同的好處,同時(shí)MySQL也提供了相應(yīng)的轉(zhuǎn)換函數(shù),即INET6_ATONINET6_NTOA。

對(duì)于轉(zhuǎn)換字符串IPv4和數(shù)值類型,可以放在應(yīng)用層,下面是使用java代碼來(lái)對(duì)二者轉(zhuǎn)換:

packagecom.mikan;

/**
*@authorMikan
*/
publicclassIpLongUtils{
/**
*把字符串IP轉(zhuǎn)換成long
*
*@paramipStr字符串IP
*@returnIP對(duì)應(yīng)的long值
*/
publicstaticlongip2Long(StringipStr){
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值轉(zhuǎn)換成字符串
*
*@paramipLongIP的long值
*@returnlong值對(duì)應(yīng)的字符串
*/
publicstaticStringlong2Ip(longipLong){
StringBuilderip=newStringBuilder();
ip.append(ipLong>>>24).append(".");
ip.append((ipLong>>>16)&0xFF).append(".");
ip.append((ipLong>>>8)&0xFF).append(".");
ip.append(ipLong&0xFF);
returnip.toString();
}

publicstaticvoidmain(String[]args){
System.out.println(ip2Long("192.168.0.1"));
System.out.println(long2Ip(3232235521L));
System.out.println(ip2Long("10.0.0.1"));
}

}

輸出結(jié)果為:

3232235521
192.168.0.1
167772161

原文標(biāo)題:如果要存 IP 地址,用什么數(shù)據(jù)類型比較好?99%人都會(huì)答錯(cuò)!

文章出處:【微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4180

    瀏覽量

    85498
  • IP
    IP
    +關(guān)注

    關(guān)注

    5

    文章

    1585

    瀏覽量

    149158
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    567

    瀏覽量

    20443
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    794

    瀏覽量

    26359

原文標(biāo)題:如果要存 IP 地址,用什么數(shù)據(jù)類型比較好?99%人都會(huì)答錯(cuò)!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進(jìn)制字符串是一個(gè)常見(jiàn)的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時(shí)。LabVIEW提供了多種方法來(lái)實(shí)現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫(xiě)VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?1156次閱讀

    labview字符串的四種表示各有什么特點(diǎn)

    。在LabVIEW中,字符串是一種基本的數(shù)據(jù)類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應(yīng)用場(chǎng)景和特點(diǎn)。以下是對(duì)LabVIEW中四種字符串表示方式的分析
    的頭像 發(fā)表于 09-04 15:40 ?271次閱讀

    銳評(píng)Ruby 3.4.0 默認(rèn)啟用字符串字面量?jī)鼋Y(jié)功能

    據(jù)悉,Ruby自2.3版起引入了“凍結(jié)”機(jī)制,通過(guò)使用frozen_string_literal: true魔法注釋,可令文件內(nèi)所有字符串字面量默認(rèn)為凍結(jié)狀態(tài),防止開(kāi)發(fā)過(guò)程中無(wú)意修改字符串,提高代碼穩(wěn)定性與性能,降低內(nèi)存占用。
    的頭像 發(fā)表于 05-17 15:44 ?283次閱讀

    labview掃描字符串怎么用

    介紹如何在 LabVIEW 中使用掃描字符串以及相關(guān)的技巧和注意事項(xiàng)。 字符串是 LabVIEW 中的一種基本數(shù)據(jù)類型,表示一系列字符的序列。掃描字符串是指從一個(gè)給定的
    的頭像 發(fā)表于 12-29 10:12 ?1715次閱讀

    labview掃描字符串怎么用

    LabVIEW是一種圖形化編程語(yǔ)言,用于開(kāi)發(fā)控制、測(cè)量和監(jiān)控系統(tǒng)。雖然它主要用于工程和科學(xué)領(lǐng)域,但也可以用于處理文本和字符串。 在LabVIEW中,可以使用字符串處理函數(shù)來(lái)掃描字符串
    的頭像 發(fā)表于 12-26 16:58 ?1708次閱讀

    labview中怎么對(duì)字符串中的進(jìn)行實(shí)時(shí)處理

    。 字符串操作函數(shù): LabVIEW提供了許多函數(shù)來(lái)對(duì)字符串進(jìn)行操作。這些函數(shù)包括查找、替換、插入、刪除和連接等。使用這些函數(shù),您可以實(shí)時(shí)修改字符串的內(nèi)容。例如,您可以使用"
    的頭像 發(fā)表于 12-26 14:12 ?1548次閱讀

    oracle中拼接字符串函數(shù)

    在Oracle中,我們可以使用 CONCAT 函數(shù)來(lái)拼接字符串。CONCAT 函數(shù)接受兩個(gè)參數(shù),它將這兩個(gè)參數(shù)連接起來(lái)并返回相應(yīng)的字符串結(jié)果。 語(yǔ)法示例: CONCAT(string1
    的頭像 發(fā)表于 12-06 09:49 ?2656次閱讀

    java switch case 能不能用字符串

    Java的switch語(yǔ)句在處理字符串方面有一些限制。在Java 7之前,switch語(yǔ)句只能處理整數(shù)類型的表達(dá)式,如int或char。但從Java 7開(kāi)始,Java引入了對(duì)字符串的支持。然而,這種
    的頭像 發(fā)表于 11-30 14:46 ?1850次閱讀

    MySQL替換字符串函數(shù)REPLACE

    MySQL是目前非常流行的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)之一,它具有強(qiáng)大的功能和性能。其中之一的字符串函數(shù)REPLACE,可以用于替換字符串中的指定字符字符串
    的頭像 發(fā)表于 11-30 10:44 ?1372次閱讀

    c語(yǔ)言怎么用scanf輸入字符串

    " , name); return 0 ;} 在上面的代碼中,我們定義了一個(gè)大小為20的字符數(shù)組來(lái)存儲(chǔ)輸入的字符串。然后,我們使用scanf函數(shù)來(lái)接收用戶輸入的
    的頭像 發(fā)表于 11-24 10:03 ?2262次閱讀

    c語(yǔ)言字符串定義

    字符串的定義、初始化、操作和常見(jiàn)問(wèn)題。 字符串的定義和初始化 在C語(yǔ)言中,字符串被定義為一個(gè)字符數(shù)組??梢酝ㄟ^(guò)兩種方式來(lái)定義和初始化字符串
    的頭像 發(fā)表于 11-24 10:02 ?1672次閱讀

    python輸出固定長(zhǎng)度的字符串

    Python 是一種強(qiáng)大而靈活的編程語(yǔ)言,具有許多用于處理字符串的功能。在 Python 中,有多種方法可以輸出固定長(zhǎng)度的字符串。下面將詳細(xì)介紹這些方法。 方法一:使用字符串拼接 在 Python
    的頭像 發(fā)表于 11-22 10:41 ?2877次閱讀

    oracle怎么把clob字段轉(zhuǎn)換為字符串

    將CLOB字段轉(zhuǎn)換為字符串,可以使用PL/SQL中的DBMS_LOB包提供的函數(shù)來(lái)實(shí)現(xiàn)。 在Oracle數(shù)據(jù)庫(kù)中,CLOB(Character Large Object)是用于存儲(chǔ)大量字符
    的頭像 發(fā)表于 11-21 10:32 ?7279次閱讀

    字符串如何轉(zhuǎn)換成日期型

    同編程語(yǔ)言將字符串轉(zhuǎn)換為日期類型。 正文: 一、Python中的字符串轉(zhuǎn)日期轉(zhuǎn)換 在Python中,使用datetime模塊可以方便地將字符串轉(zhuǎn)換為日期類型。具體的方法是首先導(dǎo)入dat
    的頭像 發(fā)表于 11-17 16:27 ?9569次閱讀

    mysql字符串包含某個(gè)字符串

    MySQL是一種開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),被廣泛用于構(gòu)建Web應(yīng)用程序和其他大型數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用。在進(jìn)行MySQL數(shù)據(jù)庫(kù)查詢時(shí),經(jīng)常需要使用字符串包含操作,即判斷一個(gè)字符串是否包含另一個(gè)字符串。本文
    的頭像 發(fā)表于 11-16 14:52 ?3380次閱讀