ip的mysql欄位 關於IP在MySQL中的儲存

2021-10-17 13:17:39 字數 1078 閱讀 4213

對於很多新手而言,他們總會糾結,怎樣才能更好的設計mysql資料庫呢;作為乙個從菜鳥走過來的人,深有體會,剛開始我也不知道什麼是外來鍵、什麼是事務處理、怎樣合理的定義乙個字段,說到字段,今天我就帶領大家一起來學習php中的函式ip2long()的用法;

php手冊中關於ip2long()函式的介紹:將乙個ipv4的字串網際網路協議轉換成數字格式,這裡指的是ipv4,而不是ipv6!

很多程式設計師設計資料庫表時都喜歡建立乙個varchar(15)欄位來儲存ip的值, 一些高階工程師給出的建議是使用int型別,只需要4個位元組,這樣不僅能夠節省空間,最重要的是查詢比較快,對於少量資料是體現不出來的,如果將來有一天我們的資料越來越多時,這點小小的優化將會表現的非常重要了,作為一名php工程師要有乙個良好的程式設計習慣,不要覺得專案小就不在乎;

那麼ip2long函式就起到作用了,當你儲存ip之前,使用ip2long('ip')轉成int型別儲存,讀取的時候使用long2ip()就可以了;

下面一點是我在除錯中做的總結,希望給讀者朋友們帶來便利

ipv4大家都知道是從0.0.0.0到255.255.255.255;然而使用ip2long函式轉換後並不是我們想象中的0到4294967295,而是0.0.0.0-127.255.255.255轉換後為0到2147483647;128.0.0.0-255.255.255.255轉換後為-2147483647到-1;

咦,你是不是發現乙個很神奇的問題ip位址轉換成int型別正好是int的有符號取整範圍,為什麼呢?大家知道mysql中int型別佔4個位元組,每個位元組佔8位,總大小為28*28*28*28=255*255*255*255,是不是和ip位址的範圍很類似;實際開發中其實我們並不需要關心ip轉換成int型別的值,存的時候ip2long,讀的時候long2ip就可以了;

我們來思考乙個問題:這是我在網上看到的一篇博文

ip2long('10.52.1.129');// 171180417

ip2long('10.052.1.129');//170525057

ip中有前導零導致的轉換結果不一致,他說是bug,請問同學們,這是bug嗎?如果這真是bug,php經歷這麼多版本,居然沒有解決?聰明的同學立馬會看懂,有前導零還是標準的ip嗎?對不對?

IP位址在mysql的儲存

因為int比varchar 15 更高效,且php和mysql都有ip和int互轉的函式,所以在ip位址在mysql中用int儲存最優。mysql儲存這個值是字段需要用int unsigned。不用unsigned的話,128以上的ip段就儲存不了了。echo ip2long 192.168.1.3...

ip包頭字段詳解

version 版本號 長度4位元。標識目前採用的ip協議的版本號。一般的值為0100 ipv4 0110 ipv6 header length ip包頭長度 4位元。這個欄位的作用是為了描述ip包頭的長度,因為在ip包頭中有變長的可選部分。該部分佔4個bit位,單位為32bit 4個位元組 即本區...

關於IP資料報首部校驗欄位的理解

關於ip資料報首部校驗欄位的理解 ip資料報格式及首部個字段 www.2cto.com 對上表的各個資料項就不一一解釋了,這裡具體關注以下幾個資料項 1 4位首部長度 這裡的長度指的是4bytes單元的個數,例如上圖在 選項 欄位不存在的情況下,ip包的首部是20bytes,那麼首部長度字段應該為5...