為什麼要問如何儲存ip
首先就來闡明一下部分人得反問:為什麼要問ip得怎樣存,直接varchar型別不就得了嗎?
其實做任何程式設計都要在功能實現的基礎上最大限度的優化效能。而資料庫設計是程式設計中不可忽略的乙個重要部分,所以巧存ip位址可以一定程度獲得很大提公升。
利用函式演算法處理
在mysql中沒有直接提供ip型別字段,但如果有兩個函式可以把ip與最大長度為10位數字型別互轉,所以使用int型別儲存ip比varchar型別儲存ip位址效能要提公升很多,減少不少空間。因為varchar是可變長形,需要多餘的乙個位元組儲存長度。另外int型在邏輯運算上要比varchar速度快。
ip轉數字函式inet_aton()
我們轉換下幾個常用的ip位址
mysql>select inet_aton('255.255.255.255');
| inet_aton('255.255.255.255') |
| 4294967295 |
1 rowin set (0.00 sec)
mysql>select inet_aton('192.168.1.1');
| inet_aton('192.168.1.1') |
| 3232235777 |
1 rowin set (0.00 sec)
mysql>select inet_aton('10.10.10.10');
| inet_aton('10.10.10.10') |
| 168430090 |
1 rowin set (0.00 sec)
所以ip的表字段可以設定為int(10)就好,如果ip獲取不到可以直接存0代表獲取不到ip的意思
數字轉ip函式inet_ntoa()
mysql>select inet_ntoa(4294967295);
| inet_ntoa(4294967295) |
| 255.255.255.255 |
1 rowin set (0.00 sec)
mysql>select inet_ntoa(3232235777);
| inet_ntoa(3232235777) |
| 192.168.1.1 |
1 rowin set (0.00 sec)
mysql>select inet_ntoa(168430090);
| inet_ntoa(168430090) |
| 10.10.10.10 |
1 rowin set (0.00 sec)
mysql>select inet_ntoa(0);
| inet_ntoa(0) |
| 0.0.0.0 |
1 rowin set (0.00 sec)
注意,0轉換為 0.0.0.0
整型欄位的比較比字串效率高很多,這也符合一項優化原則:字段型別定義使用最合適(最小),最簡單的資料型別。
inet_aton()演算法,其實借用了國際上對各國ip位址的區分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。
Mysql儲存IP位址
使用mysql函式 create table testip ip bigint 10 null insert into testip ip values inet aton 255.255.255.255 ip 4294967295 select inet ntoa ip ip from testi...
IP位址在mysql的儲存
因為int比varchar 15 更高效,且php和mysql都有ip和int互轉的函式,所以在ip位址在mysql中用int儲存最優。mysql儲存這個值是字段需要用int unsigned。不用unsigned的話,128以上的ip段就儲存不了了。echo ip2long 192.168.1.3...
MySQL儲存IP位址的方法
為什麼要問如何儲存ip?首先就來闡明一下部分人得反問 為什麼要問ip得怎樣存,直接varchar型別不就得了嗎?其實做任何程式程式設計客棧設計都要在功能實現的基礎上最大限度的優化效能。而資料庫設計是程式設計中不可忽略的乙個重要部分,所以巧存ip位址可以一定程度獲得很大提公升。利用函式演算法處理 在m...