欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解MySQL如何有效的存儲(chǔ)IP地址及字符串IP和數(shù)值之間如何轉(zhuǎn)換

 更新時(shí)間:2022年01月05日 14:56:19   作者:MikanMu  
本文主要介紹了MySQL如何有效的存儲(chǔ)IP地址及字符串IP和數(shù)值之間如何轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

相對字符串存儲(chǔ),使用無符號整數(shù)來存儲(chǔ)有如下的好處:

  • 節(jié)省空間,不管是數(shù)據(jù)存儲(chǔ)空間,還是索引存儲(chǔ)空間
  • 便于使用范圍查詢(BETWEEN...AND),且效率更高

通常,在保存IPv4地址時(shí),一個(gè)IPv4最小需要7個(gè)字符,最大需要15個(gè)字符,所以,使用VARCHAR(15)即可。MySQL在保存變長的字符串時(shí),還需要額外的一個(gè)字節(jié)來保存此字符串的長度。而如果使用無符號整數(shù)來存儲(chǔ),只需要4個(gè)字節(jié)即可。另外還可以使用4個(gè)字段分別存儲(chǔ)IPv4中的各部分,但是通常這不管是存儲(chǔ)空間和查詢效率應(yīng)該都不是很高(可能有的場景適合使用這種方式存儲(chǔ))。

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

使用無符號整數(shù)來存儲(chǔ)也有缺點(diǎn):

  • 不便于閱讀
  • 需要手動(dòng)轉(zhuǎn)換

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

mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| ? ? ? ? ? ? ? 3232235521 |
+--------------------------+
1 row in set (0.00 sec)
?
mysql> select inet_ntoa(3232235521);
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1 ? ? ? ? ? |
+-----------------------+
1 row in set (0.00 sec)

對于IPv6來說,使用VARBINARY同樣可獲得相同的好處,同時(shí)MySQL也提供了相應(yīng)的轉(zhuǎn)換函數(shù),即INET6_ATON和INET6_NTOA。
對于轉(zhuǎn)換字符串IPv4和數(shù)值類型,可以放在應(yīng)用層,下面是使用java代碼來對二者轉(zhuǎn)換:

package com.mikan;
 
/**
 * @author Mikan
 * @date 2015-09-22 10:59
 */
public class IpLongUtils {
    /**
     * 把字符串IP轉(zhuǎn)換成long
     *
     * @param ipStr 字符串IP
     * @return IP對應(yīng)的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值轉(zhuǎn)換成字符串
     *
     * @param ipLong IP的long值
     * @return long值對應(yīng)的字符串
     */
    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"));
    }
    
}

輸出結(jié)果為:
3232235521
192.168.0.1
167772161

到此這篇關(guān)于詳解MySQL如何有效的存儲(chǔ)IP地址及字符串IP和數(shù)值之間如何轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)MySQL有效存儲(chǔ)IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 讀寫分離(基礎(chǔ)篇)

    mysql 讀寫分離(基礎(chǔ)篇)

    MySQL Proxy最強(qiáng)大的一項(xiàng)功能是實(shí)現(xiàn)“讀寫分離(Read/Write Splitting)”。
    2009-04-04
  • 解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on *.* to 'root'@'%' identified by '密碼' with grant optio報(bào)錯(cuò)

    解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on&n

    這篇文章主要介紹了解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on *.* to 'root'@'%' identified by '密碼' with grant optio報(bào)錯(cuò),通過本文給大家分享問題原因解析及解決方法,需要的朋友可以參考下
    2022-11-11
  • Mysql誤刪數(shù)據(jù)解決方案及kill語句原理

    Mysql誤刪數(shù)據(jù)解決方案及kill語句原理

    這篇文章主要介紹了Mysql誤刪數(shù)據(jù)解決方案及kill語句原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MySQL中UPDATE語句使用的實(shí)例教程

    MySQL中UPDATE語句使用的實(shí)例教程

    這篇文章主要介紹了MySQL中UPDATE語句使用的實(shí)例教程,包括UPDATE的使用中所容易引起的性能問題的分析,需要的朋友可以參考下
    2015-11-11
  • 快速解決mysql57服務(wù)突然不見了的問題

    快速解決mysql57服務(wù)突然不見了的問題

    下面小編就為大家?guī)硪黄焖俳鉀Qmysql57服務(wù)突然不見了的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 一文學(xué)習(xí)MySQL?意向共享鎖、意向排他鎖、死鎖

    一文學(xué)習(xí)MySQL?意向共享鎖、意向排他鎖、死鎖

    這篇文章主要介紹了MySQL?意向共享鎖、意向排他鎖、死鎖,包括InnoDB表級鎖,意向共享鎖和意向排他鎖及操作方法,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 將.sql文件導(dǎo)入到MySQL數(shù)據(jù)庫具體步驟

    將.sql文件導(dǎo)入到MySQL數(shù)據(jù)庫具體步驟

    MySQL有多種方法導(dǎo)入多個(gè).sql文件,下面這篇文章主要介紹了將.sql文件導(dǎo)入到MySQL數(shù)據(jù)庫的具體步驟,文中將實(shí)現(xiàn)步驟介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • mysql split函數(shù)用逗號分隔的實(shí)現(xiàn)

    mysql split函數(shù)用逗號分隔的實(shí)現(xiàn)

    這篇文章主要介紹了mysql split函數(shù)用逗號分隔的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • MySQL如何構(gòu)建數(shù)據(jù)表索引

    MySQL如何構(gòu)建數(shù)據(jù)表索引

    索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。本文將通過一個(gè)案例帶領(lǐng)你理解索引的概念
    2021-05-05
  • MySQL事務(wù)與鎖實(shí)例教程詳解

    MySQL事務(wù)與鎖實(shí)例教程詳解

    事務(wù)是指滿足ACID特性的的一組操作,可以通過Commit提交事務(wù),也可以也可以通過Rollback進(jìn)行回滾。會(huì)存在中間態(tài)和一致性狀態(tài),也是真正在數(shù)據(jù)庫表中存在的狀態(tài)
    2022-11-11

最新評論