3 月 9 2008
在 MySQL 中處理網路 IP 位址型的資料..
一、兩年以前,我會直接在 MySQL 中,以 varchar 型態,直接把 IP address 存入。
直到我在某次進行系統開發時,翻過 MySQL 的 Operator and Function Reference ,才發現這兩個好用的 functions :
透過這兩個 functions ,我開始用 unsigned int 型態來存 IP address。
跟以往的 varchar 比較,使用 unsigned int ,搭配這兩個 functions 有著以下這兩項優勢:
- 資料型態設定成 unsigned int ,實體儲存空間僅需要 4 bytes 。
- 進行 IP range 的比對與判斷更方便。
尤其是第二項,以往使用 varchar 型態儲存 IP address 時,我必須先取出資料,再使用字串處理函式,甚至是正規表示式對字串進行切割。
而今,運用 INET_ATON() ,把原本的 IP address 轉成數字存成 unsigned int 之後,我只要把區段的頭、尾 IP address 用 INET_ATON() 轉換成數字,就可以利用大於、小於,甚至是 MySQL 的 between 來作比對或判斷了。
如果遇到的是以 CIDR 表示的區段,使用 PHP 開發程式或系統的人也可以選用 Pear 的 Net_IPv4 套件,呼叫 parseAddress() ,取得該區段的頭、尾 IP 等資訊,再運用 INET_ATON() ,一樣可以利用大於、小於、MySQL 的 between 來作比對或判斷。
3 月 19 2008
用 MySQL 處理時間資料所應該注意的事
我在 之前的文章 提過 MySQL 裡面,協助我們處理時間資料的 functions,現在來講一下該注意的事。
可能很多人還沒發現到 Year 2038 Problem 。
2007 年 12 月,我在開發某個網頁系統時碰上了這個問題。
在 PHP5 裡面,
mktime(11, 14, 7, 1, 19, 2038)
傳回 2147483647,mktime(11, 14, 8, 1, 19, 2038)
卻丟出空白值,而 2147483647 正好是 C 語言中,signed long int 的最大值。而且,MySQL 的 UNIX timestamp 也有這種問題,以下這串語法傳回來的數值是 0 。
目前,就我測試過的部份,PHP4 與 JAVA 都沒有這種問題。
可是,我們不知道 PHP4 開發出來的系統,會不會被拿到 PHP5 上面跑。
所以,在 MySQL 裡面使用 datetime 或 timestamp 來紀錄時間資料,並搭配處理時間資料的 functions 來處理時間型資料,不僅方便我們辨識時間,也可以省去不必要的麻煩。
有些人可能會覺得,使用 datetime 或 timestamp 來紀錄時間資料,取出來的資料型態是字串,如果只需要年、月、日,就得作字串分割。
其實,MySQL 的 DATE_FORMAT 就足以應付這種狀況了。
最後,用 MySQL 處理 datetime 或 timestamp 型態的資料,請多注意一件事:
其結果為 2008-02-29 00:00:00。
其結果則是 2008-03-01 00:00:00。
以上,我的報告完畢,謝謝收看。
分享此文:
By Joe Horn • Database 0 • Tags: MySQL