在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用字符串和無符號整數來存儲IP的具體性能分析

Android編程精選 ? 來源:CSDN技術社區 ? 作者:MikanMu ? 2022-06-20 16:35 ? 次閱讀

在看高性能MySQL第3版(4.1.7節)時,作者建議當存儲IPv4地址時,應該使用32位的無符號整數(UNSIGNED INT)來存儲IP地址,而不是使用字符串。但是沒有給出具體原因。為了搞清楚這個原因,查了一些資料,記錄下來。

相對字符串存儲,使用無符號整數來存儲有如下的好處:

  • 節省空間,不管是數據存儲空間,還是索引存儲空間

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

通常,在保存IPv4地址時,一個IPv4最小需要7個字符,最大需要15個字符,所以,使用VARCHAR(15)即可。MySQL在保存變長的字符串時,還需要額外的一個字節來保存此字符串的長度。而如果使用無符號整數來存儲,只需要4個字節即可。

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

使用字符串和無符號整數來存儲IP的具體性能分析及benchmark,可以看這篇文章。

使用無符號整數來存儲也有缺點:

  • 不便于閱讀

  • 需要手動轉換

對于轉換來說,MySQL提供了相應的函數來把字符串格式的IP轉換成整數INET_ATON,以及把整數格式的IP轉換成字符串的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)

對于IPv6來說,使用VARBINARY同樣可獲得相同的好處,同時MySQL也提供了相應的轉換函數,即INET6_ATONINET6_NTOA

對于轉換字符串IPv4和數值類型,可以放在應用層,下面是使用java代碼來對二者轉換:

packagecom.mikan;

/**
*@authorMikan
*/
publicclassIpLongUtils{
/**
*把字符串IP轉換成long
*
*@paramipStr字符串IP
*@returnIP對應的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值轉換成字符串
*
*@paramipLongIP的long值
*@returnlong值對應的字符串
*/
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"));
}

}

輸出結果為:

3232235521
192.168.0.1
167772161

原文標題:如果要存 IP 地址,用什么數據類型比較好?99%人都會答錯!

文章出處:【微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4337

    瀏覽量

    85994
  • IP
    IP
    +關注

    關注

    5

    文章

    1715

    瀏覽量

    149713
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20561
  • MySQL
    +關注

    關注

    1

    文章

    819

    瀏覽量

    26651

原文標題:如果要存 IP 地址,用什么數據類型比較好?99%人都會答錯!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    字符串在數據庫中的存儲方式

    數據庫是現代信息技術中存儲和管理數據的核心組件。字符串作為最常見的數據類型之一,在數據庫中的存儲方式對其性能和可擴展性有著重要影響。 數據類型 固定長度
    的頭像 發表于 01-07 15:41 ?142次閱讀

    字符串在編程中的應用實例

    字符串在編程中有著廣泛的應用,它們被用于表示文本數據、處理用戶輸入、構建動態內容等。以下是一些字符串在編程中的應用實例: 1. 用戶輸入與輸出 用戶輸入 :程序通常需要從用戶那里獲取輸入,這些輸入通
    的頭像 發表于 01-07 15:33 ?110次閱讀

    字符串字符數組的區別

    在編程語言中,字符串字符數組是兩種基本的數據結構,它們都用于存儲和處理文本數據。盡管它們在功能上有一定的重疊,但在內部表示、操作方式和使用場景上存在顯著差異。 1. 內部表示 字符串
    的頭像 發表于 01-07 15:29 ?211次閱讀

    字符串反轉的實現方式

    在編程中,字符串反轉是一個基礎而重要的操作,它涉及到將一個字符串中的字符順序顛倒過來。這個操作在多種編程語言中都有不同的實現方式,本文將探討幾種常見的字符串反轉方法。 1. 遞歸方法
    的頭像 發表于 01-07 15:27 ?163次閱讀

    字符串處理方法 字符串轉數字的實現

    () 和 float() 函數將字符串轉換為整數和浮點數。 python復制代碼 # 轉換為整數str_num = "123"num = int(str_num)print(num) # 輸出: 123#
    的頭像 發表于 01-07 15:26 ?140次閱讀

    base64字符串轉換為二進制文件

    Base64是一種編碼方法,用于將二進制數據轉換為ASCII字符串。這種編碼通常用于在不支持二進制數據的系統中傳輸數據,例如電子郵件或網頁。將Base64字符串轉換為二進制文件的過程相對簡單,但需要
    的頭像 發表于 11-10 10:55 ?1471次閱讀

    labview字符串數組轉化為數值數組

    常重要的。LabVIEW支持多種數據類型,包括數值、字符串、數組、簇等。在本例中,我們將關注字符串數組和數值數組。 字符串數組 :由一系列字符串組成的數組,每個元素都是一個
    的頭像 發表于 09-04 17:47 ?2623次閱讀

    labview字符串如何轉換為16進制字符串

    在LabVIEW中,將字符串轉換為16進制字符串是一個常見的需求,尤其是在處理數據通信和硬件接口時。LabVIEW提供了多種方法來實現這一轉換,包括使用內置函數、編寫VI(Virtual
    的頭像 發表于 09-04 15:54 ?2793次閱讀

    labview中如何實現字符串換行

    2.1 使用內置函數 LabVIEW提供了多種內置函數來處理字符串,包括換行。以下是一些常用的方法: 使用 Build Array 函數 :通過循環構建字符串數組,每個元素代表一行
    的頭像 發表于 09-04 15:47 ?1890次閱讀

    labview中常用的字符串函數有哪些?

    在LabVIEW中,常用的字符串函數廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串函數及其簡要說明: 字符串長度(String
    的頭像 發表于 09-04 15:43 ?864次閱讀

    labview字符串的四種表示各有什么特點

    。在LabVIEW中,字符串是一種基本的數據類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應用場景和特點。以下是對LabVIEW中四種字符串表示方式的分析
    的頭像 發表于 09-04 15:40 ?640次閱讀

    如何向ESP8266發送字符串

    我們正在開發一個應用程序,其中需要通過 Internet 將字符串字符(例如“1x,7juyss”)從移動設備發送到ESP8266。我們已經閱讀了 Cloud API 文檔,但沒有提到傳遞字符串參數。此外,Data Stream
    發表于 07-15 06:58

    銳評Ruby 3.4.0 默認啟用字符串字面量凍結功能

    據悉,Ruby自2.3版起引入了“凍結”機制,通過使用frozen_string_literal: true魔法注釋,可令文件內所有字符串字面量默認為凍結狀態,防止開發過程中無意修改字符串,提高代碼穩定性與性能,降低內存占用。
    的頭像 發表于 05-17 15:44 ?405次閱讀

    鴻蒙TypeScript學習第10天:【String(字符串)】

    String 對象用于處理文本(字符串)。
    的頭像 發表于 04-08 14:32 ?859次閱讀
    鴻蒙TypeScript學習第10天:【String(<b class='flag-5'>字符串</b>)】

    C語言字符串編譯函數介紹

    在C語言中,字符串實際上是使用null字符O'終止的一維字符數組。因此,一個以null結尾的字符串,包含了組成字符串
    的頭像 發表于 03-07 16:18 ?527次閱讀
    C語言<b class='flag-5'>字符串</b>編譯函數介紹
    主站蜘蛛池模板: 中文天堂| 中文字幕在线看视频一区二区三区| 污污的网站免费阅读| 一级视频在线| 黄色有码视频| 秋霞特色大片18入口私人高清| 日美一级毛片| 欧美八区| 国产一级毛片午夜福| 偷拍福利视频| 成人精品久久| 黄色视屏在线免费观看| 国产精品热久久毛片| 久久婷婷国产综合精品| 人人舔| 日日噜噜夜夜狠狠va视频| 亚洲高清色图| 一级毛片看真人在线视频| 禁漫羞羞入口| 午夜a视频| 亚洲午夜久久久久久噜噜噜| 俄罗斯美女在线观看一区| 亚洲视频一区二区在线观看| 美国bj69| www天天操| 干干天天| aa在线视频| 九色视频在线播放| 色之综综| 天堂最新在线资源| 天天干网| 手机看片1024久久| 波多野结衣久久国产精品| 中文字幕一区在线播放| 在线 你懂的| 亚洲人的天堂男人爽爽爽| 色综合综合网| 日本电影在线观看黄| 黄色工厂在线播放| 国产精品嫩草影院一二三区入口 | 亚洲一区二区精品推荐|