關於IP在MySQL中的存儲


對於很多新手而言,他們總會糾結,怎樣才能更好的設計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嗎?對不對?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM