最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL存儲(chǔ)IP地址的方法

 更新時(shí)間:2021年03月17日 00:50:55   作者:Surjur  
本文介紹了MySQL存儲(chǔ)IP地址的方法其目的就是最大限度的優(yōu)化性能,需要的朋友可以參考下

為什么要問如何存儲(chǔ)IP?

首先就來闡明一下部分人得反問:為什么要問IP得怎樣存,直接varchar類型不就得了嗎?

其實(shí)做任何程序設(shè)計(jì)都要在功能實(shí)現(xiàn)的基礎(chǔ)上最大限度的優(yōu)化性能。而數(shù)據(jù)庫(kù)設(shè)計(jì)是程序設(shè)計(jì)中不可忽略的一個(gè)重要部分,所以巧存IP地址可以一定程度獲得很大提升。

利用函數(shù)算法處理

在MySQL中沒有直接提供IP類型字段,但如果有兩個(gè)函數(shù)可以把IP與最大長(zhǎng)度為10位數(shù)字類型互轉(zhuǎn),所以使用int類型存儲(chǔ)IP比varchar類型存儲(chǔ)IP地址性能要提升很多,減少不少空間。因?yàn)関archar是可變長(zhǎng)形,需要多余的一個(gè)字節(jié)存儲(chǔ)長(zhǎng)度。另外int型在邏輯運(yùn)算上要比varchar速度快。

IP轉(zhuǎn)數(shù)字函數(shù)inet_aton()

我們轉(zhuǎn)換下幾個(gè)常用的IP地址

 mysql> select inet_aton('255.255.255.255');
 +------------------------------+
 | inet_aton('255.255.255.255') |
 +------------------------------+
 |     4294967295 |
 +------------------------------+
 1 row in set (0.00 sec)
 
 mysql> select inet_aton('192.168.1.1'); 
 +--------------------------+
 | inet_aton('192.168.1.1') |
 +--------------------------+
 |    3232235777 |
 +--------------------------+
 1 row in set (0.00 sec)
 
 mysql> select inet_aton('10.10.10.10');
 +--------------------------+
 | inet_aton('10.10.10.10') |
 +--------------------------+
 |    168430090 |
 +--------------------------+
 1 row in set (0.00 sec)

所以IP的表字段可以設(shè)置為INT(10)就好,如果IP獲取不到可以直接存0代表獲取不到IP的意思 

數(shù)字轉(zhuǎn)IP函數(shù)inet_ntoa()

 mysql> select inet_ntoa(4294967295);
 +-----------------------+
 | inet_ntoa(4294967295) |
 +-----------------------+
 | 255.255.255.255  |
 +-----------------------+
 1 row in set (0.00 sec)
 
 mysql> select inet_ntoa(3232235777);
 +-----------------------+
 | inet_ntoa(3232235777) |
 +-----------------------+
 | 192.168.1.1   |
 +-----------------------+
 1 row in set (0.00 sec)
 
 mysql> select inet_ntoa(168430090);
 +----------------------+
 | inet_ntoa(168430090) |
 +----------------------+
 | 10.10.10.10   |
 +----------------------+
 1 row in set (0.00 sec)
 
 mysql> select inet_ntoa(0);  
 +--------------+
 | inet_ntoa(0) |
 +--------------+
 | 0.0.0.0  |
 +--------------+
 1 row in set (0.00 sec)

注意,0轉(zhuǎn)換為 0.0.0.0

 整型字段的比較比字符串效率高很多,這也符合一項(xiàng)優(yōu)化原則:字段類型定義使用最合適(最?。?,最簡(jiǎn)單的數(shù)據(jù)類型。
inet_aton()算法,其實(shí)借用了國(guó)際上對(duì)各國(guó)IP地址的區(qū)分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

mysql 存儲(chǔ)ip地址

mysql提供了兩個(gè)方法來處理ip地址:

inet_aton 把ip轉(zhuǎn)為無符號(hào)整型(4-8位)
inet_ntoa 把整型的ip轉(zhuǎn)為電地址

插入數(shù)據(jù)前,先用inet_aton把ip地址轉(zhuǎn)為整型,可以節(jié)省空間。
顯示數(shù)據(jù)時(shí),使用inet_ntoa把整型的ip地址轉(zhuǎn)為電地址顯示即可。為社么這樣存?,性能上的提示比直接存儲(chǔ)字符串的IP要高出很多。

示例:

CREATE TABLE `t_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(15) DEFAULT NULL COMMENT '用戶名',
 `ip` bigint(20) DEFAULT NULL COMMENT 'IP地址',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入幾條數(shù)據(jù):

INSERT INTO `t_user` ( `id`, `name`, `ip` )
VALUES
  ( 2, 'babala', inet_aton( '127.0.0.1' ) ),
  ( 3, 'maly', inet_aton( '192.168.1.1' ) ),
  ( 4, 'kaven', inet_aton( '111.175.7.143' ) );

查詢顯示地址:

select id,name,inet_ntoa(ip) as ip from `t_user`;

如果需要找出在某個(gè)網(wǎng)段的用戶(例如:192.168.1.1 ~ 192.168.1.100),可以利用php的ip2long方法,把ip地址轉(zhuǎn)為整型,再進(jìn)行比較。

$ip_start = '192.168.1.1';
$ip_end = '192.168.1.100';
echo sprintf('%u',ip2long($ip_start)).PHP_EOL; // 3232235777
echo sprintf('%u',ip2long($ip_end)).PHP_EOL;   // 3232235876

總結(jié)

1.保存ip地址到數(shù)據(jù)庫(kù),使用unsigned int格式,插入時(shí)使用inet_aton方法把ip先轉(zhuǎn)為無符號(hào)整型,可以節(jié)省存儲(chǔ)空間。
2.顯示時(shí)使用inet_ntoa把整型ip地址轉(zhuǎn)為電地址。
3.php 使用 ip2long轉(zhuǎn)ip為整型時(shí),需要注意出現(xiàn)負(fù)數(shù)的問題(如果出現(xiàn)負(fù)數(shù):參照之前我寫的這篇)

以上講解的就是MySQL存儲(chǔ)IP地址的方法,希望能夠?qū)Υ蠹业膶W(xué)習(xí)有所幫助。

相關(guān)文章

  • mysql下怎樣運(yùn)行腳本以運(yùn)行niuzi.sql為例

    mysql下怎樣運(yùn)行腳本以運(yùn)行niuzi.sql為例

    mysql下運(yùn)行腳本,有兩種方法,都是在命令行下進(jìn)行的,需要的朋友可以記錄下
    2014-07-07
  • mysql中使用replace替換某字段的部分內(nèi)容

    mysql中使用replace替換某字段的部分內(nèi)容

    這篇文章主要介紹了mysql中使用replace替換某字段的部分內(nèi)容的方法,需要的朋友可以參考下
    2014-11-11
  • 在Mysql環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的操作方法

    在Mysql環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的操作方法

    本文介紹了在MySQL環(huán)境下對(duì)數(shù)據(jù)進(jìn)行增刪改查的基本操作,包括插入數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)、數(shù)據(jù)查詢(基本查詢、連接查詢、聚合函數(shù)查詢、子查詢)等,并舉例說明了每種操作的具體用法,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • 詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    關(guān)于MySQL數(shù)據(jù)類型decimal中n和m分別表示什么含義?本文就此問題作了簡(jiǎn)單論述,并創(chuàng)建相關(guān)表進(jìn)行驗(yàn)證,需要的朋友可以了解下。
    2017-10-10
  • MySQL多表鏈接查詢核心優(yōu)化

    MySQL多表鏈接查詢核心優(yōu)化

    本篇文章主要介紹了MySQL多表鏈接查詢核心優(yōu)化,數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)表的多表查詢是必不可少的,所以涉及到性能優(yōu)化,有需要的可以了解一下。
    2016-11-11
  • mysql數(shù)據(jù)插入效率比較

    mysql數(shù)據(jù)插入效率比較

    今天小編就為大家分享一篇關(guān)于mysql數(shù)據(jù)插入效率比較,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Navicat如何通過ssh連接mysql

    Navicat如何通過ssh連接mysql

    文章介紹了通過SSH連接MySQL數(shù)據(jù)庫(kù)的方法,強(qiáng)調(diào)了確保MySQL默認(rèn)端口3306沒有被防火墻阻攔,以及在Ubuntu系統(tǒng)中默認(rèn)root的SSH是禁止的,應(yīng)使用其他賬戶登錄
    2025-02-02
  • mysql proxy問題的解決方法

    mysql proxy問題的解決方法

    最近試用mysql proxy,遇到若干問題,好在一一找到了解決方案,列出來備忘。這次使用的版本是0.6.x,也許新版本就沒有這些問題了。
    2009-02-02
  • 幾種在Linux中找到MySQL的安裝目錄方法

    幾種在Linux中找到MySQL的安裝目錄方法

    這篇文章主要介紹了幾種在Linux中找到MySQL的安裝目錄方法,包括使用which命令、whereis命令、檢查服務(wù)狀態(tài)、直接查詢MySQL以及查閱配置文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • mysql建立自定義函數(shù)的問題

    mysql建立自定義函數(shù)的問題

    由于這幾天在寫mysql存儲(chǔ)過程且發(fā)現(xiàn)程序體積越來越龐大,于是嘗試使用mysql的函數(shù)
    2011-04-04

最新評(píng)論

墨竹工卡县| 徐闻县| 稻城县| 靖州| 临沧市| 望谟县| 增城市| 寿宁县| 启东市| 蓝田县| 宜丰县| 武乡县| 东乡县| 宁明县| 白银市| 巨野县| 得荣县| 平顺县| 盐城市| 黎川县| 永顺县| 兖州市| 威远县| 万山特区| 亚东县| 米泉市| 襄垣县| 恩施市| 陵川县| 卢氏县| 东宁县| 元朗区| 商水县| 白河县| 桦甸市| 台前县| 盐山县| 旬阳县| 缙云县| 盱眙县| 安溪县|