IP處理函數inet_aton()和inet_ntoa()使用說明_Mysql

來源:互聯網
上載者:User
MYSql的IP對int的轉換函式
select inet_aton(ip) from table_name;

網路地址:
192.168.33.123
每一個值最大不會越過255,也就是十六進位的FF,兩個Byte剛好表示的最大值是255,
這樣子,就可以用一個32位的整形來儲存這個地址
192 168 33 123
1100 0000 1010 1000 0010 0001 0111 1011
把這些二進位合在一起就是32位的數了
11000000101010000010000101111011
十進位為
3232244091
* INET_ATON(expr)
給出一個作為字串的網路地址的"點地址"(如127.0.0.1)表示,返回一個代表該地址數值的整數。地址可以是4或8位元地址。
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
產生的數字總是按照網路位元組順序。如上面的例子,數字按照 209×2^24 + 207×2^16 + 224×2^8 + 40 進行計算。
INET_ATON() 也能理解短格式 IP 位址:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注釋: 在儲存由INET_ATON() 產生的值時,推薦你使用 INT UNSIGNED 列。假如你使用 (帶符號) INT列, 則相應的第一個八位組大於127的IP 位址值會被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。請參見11.2節,“數實值型別”。
* INET_NTOA(expr)
給定一個數字網路地址 (4 或 8 位元),返回作為字串的該地址的電地址表示。
mysql> SELECT INET_NTOA(3520061480);

-> '209.207.224.40'


在做項目時,並不知道這兩個函數,所以對IP的處理都是自己寫的函數,但是使用時效率卻是十分的差,下面函數是把IP轉化成整數:
複製代碼 代碼如下:

CREATE FUNCTION `transIPtoInt`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(10);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=value1<<24;
set value2=value2<<16;
set value3=value3<<8;
return value1+value2+value3+value4;
end;

為了IP地址比較的方便,我還寫了一個把IP地址中每一段都補足三位的函數,如下:
複製代碼 代碼如下:

CREATE FUNCTION `fillIp`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(31);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=LPAD(value1,3,'0');
set value2=LPAD(value2,3,'0');
set value3=LPAD(value3,3,'0');
set value4=LPAD(value4,3,'0');
return CONCAT(value1,'.',value2,'.',value3,'.',value4);
end;

以下是一些補充
* INET_ATON(expr)
給出一個作為字串的網路地址的"點地址"(如127.0.0.1)表示,返回一個代表該地址數值的整數。地址可以是4或8位元地址。
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
產生的數字總是按照網路位元組順序。如上面的例子,數字按照 209×2563 + 207×2562 + 224×256 + 40 進行計算。
INET_ATON() 也能理解短格式 IP 位址:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注釋: 在儲存由INET_ATON() 產生的值時,推薦你使用 INT UNSIGNED 列。假如你使用 (帶符號) INT列, 則相應的第一個八位組大於127的IP 位址值會被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。請參見MySQL文檔中的“數實值型別”。
* INET_NTOA(expr)
給定一個數字網路地址 (4 或 8 位元),返回作為字串的該地址的電地址表示。
*
mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'

--------------------------------------------------------------------------------------------------

整型欄位的比較比字串效率高很多,這也符合一項最佳化原則:欄位類型定義使用最合適(最小),最簡單的資料類型。
inet_aton()演算法,其實借用了國際上對各國IP地址的區分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

--------------------------------------------------------------------------------------------------

利用mysql的內建函數處理時間戳記問題
eg : select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');
結果: 2004 3rd August 03:35:48 2004

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.