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

MySQL存儲IP地址的方法

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

為什么要問如何存儲IP?

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

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

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

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

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

我們轉(zhuǎn)換下幾個常用的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

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

mysql 存儲ip地址

mysql提供了兩個方法來處理ip地址:

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

插入數(shù)據(jù)前,先用inet_aton把ip地址轉(zhuǎn)為整型,可以節(jié)省空間。
顯示數(shù)據(jù)時,使用inet_ntoa把整型的ip地址轉(zhuǎn)為電地址顯示即可。為社么這樣存?,性能上的提示比直接存儲字符串的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`;

如果需要找出在某個網(wǎng)段的用戶(例如:192.168.1.1 ~ 192.168.1.100),可以利用php的ip2long方法,把ip地址轉(zhuǎ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ù)庫,使用unsigned int格式,插入時使用inet_aton方法把ip先轉(zhuǎn)為無符號整型,可以節(jié)省存儲空間。
2.顯示時使用inet_ntoa把整型ip地址轉(zhuǎn)為電地址。
3.php 使用 ip2long轉(zhuǎn)ip為整型時,需要注意出現(xiàn)負數(shù)的問題(如果出現(xiàn)負數(shù):參照之前我寫的這篇)

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

相關(guān)文章

  • mysql下怎樣運行腳本以運行niuzi.sql為例

    mysql下怎樣運行腳本以運行niuzi.sql為例

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

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

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

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

    本文介紹了在MySQL環(huán)境下對數(shù)據(jù)進行增刪改查的基本操作,包括插入數(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分別表示什么含義?本文就此問題作了簡單論述,并創(chuàng)建相關(guān)表進行驗證,需要的朋友可以了解下。
    2017-10-10
  • MySQL多表鏈接查詢核心優(yōu)化

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

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

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

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

    Navicat如何通過ssh連接mysql

    文章介紹了通過SSH連接MySQL數(shù)據(jù)庫的方法,強調(diào)了確保MySQL默認端口3306沒有被防火墻阻攔,以及在Ubuntu系統(tǒng)中默認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以及查閱配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • mysql建立自定義函數(shù)的問題

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

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

最新評論

收藏| 海兴县| 潮安县| 集贤县| 米易县| 西贡区| 萍乡市| 常山县| 肇源县| 宣武区| 平罗县| 汝城县| 聊城市| 尤溪县| 石门县| 天长市| 辽阳市| 平邑县| 于都县| 赞皇县| 图木舒克市| 鞍山市| 庆元县| 澎湖县| 西乌| 芦山县| 岢岚县| 囊谦县| 连州市| 洛南县| 江西省| 且末县| 抚宁县| 万宁市| 富锦市| 尤溪县| 进贤县| 永平县| 昭苏县| 洮南市| 呼伦贝尔市|