MySQL içerisinde IP adresleri nasıl barındırmalıyız?
Öncelikle şurada ki güzel yazıyı okumanızı tavsiye ederim. Ciddi bir benchmark testi uygulanmış.
MySQL kendi içerisinde IP adresi barındırmak için kullanabileceğimiz iki güzel fonksiyonla gelir. Bunlar;
INET_ATON() ve INET_NTOA() fonksiyonlarıdır. INET_ATON() fonksiyonu string olan IP adresini, 32bitlik UNSIGNED INTEGER biçimine çevirir. INET_NTOA() ise bu işlemin tem tersini yapar.
Hemen test edelim;
mysql> SELECT INET_ATON("88.254.195.158");
+-----------------------------+
| INET_ATON("88.254.195.158") |
+-----------------------------+
| 1493091230 |
+-----------------------------+
1 row in set (0.02 sec)
mysql> SELECT INET_NTOA("1493091230");
+-------------------------+
| INET_NTOA("1493091230") |
+-------------------------+
| 88.254.195.158 |
+-------------------------+
1 row in set (0.05 sec)
mysql>
3 kısımdan oluÅŸan, günlük olarak kullandığımız IP adresleri aslında bu iÅŸleme tabi tutulmuÅŸ adreslerdir. Yani normalde “88.254.195.158″ olarak andığımız bir IP adresinin bilgisayar dilinde ki ifadesi “1493091230″dır.
varchar(15) olarak bu barındırma iÅŸlemini yaptığımızda, 4 byte’lık INT_UNSIGNED türüne göre her adres için ciddi anlamda kardayız.
Yazı başında paylaştığım bağlantıya göre performansta ki fark %9 ila %12 arasında.
Peki veritabanında bu ÅŸekilde barınan 4 BYTE’lık veriyi PHP ile çağırmak istesem ve yine biz normal insanların okuyabileceÄŸi formata çevirmek istesem ne yaparım?
Çok kolay ;
echo long2ip("1493091230");
veya işlemi tam tersten uygulamak için ;
echo ip2long("88.254.195.158");
Test ettiğinizde MySQL fonksiyonları ile bu fonksiyonların aynı sonuçları verdiğini göreceksiniz.
var_dump() fonksiyonu da ekleyebilirsiniz – tür ve uzunluk bilgisini de basarsınız böylece;
echo var_dump(ip2long("88.254.195.158"));
echo var_dump(long2ip("1493091230"));
## string ’88.254.195.158′ (length=14)
EÄŸer IP adresi geçerli bir adres deÄŸil ise, ip2long() fonksiyonu “NULL” döndürecektir. IP adreslerinin geçerliliÄŸini sınamak için kolay bir yol olabilir.
Ben her detayı öğrenmek istiyorum diyorsanız şu yazıyı okuyunuz.
HoÅŸgeldin IPv6
Bu yazının tamamı IpV4 standartlarına göre yazılmıştır. Ve burada ki yöntemler yalnızca Ipv4 için geçerlidir. Peki ya IpV6 standartları ne olacak? Onları çeviremez miyiz? Çeviririz tabi ki. Bu konu hakkında kaynak yok denebilecek kadar az, bu yüzden şuan okuduğunuz satırlar çok değerli ((:
IpV6;’nın hayatımıza girmesiyle birlikte, PHP5′te sonra bu teknolojiye yönelik geliÅŸtirmeleri de kendisine dahil etti.
Aslında demin bahsettiğim konu içinde hayati bir önem taşıyor Ipv6 durumu. IP adreslerinin 32bit olmasından ve bundan tasarruf etmekten bahsetmiştim. Düşünsenize Ipv6 adresler ise 128 bit ! Yani tam 4 kat daha fazla veri demek veritabanlarınız için.
Dikkat ! Bu fonksiyonlar Linux üzerinde PHP’nin 5.1.0′sürümünden, Windows üzerinde ise 5.3.0 sürümünden önce çalışmayacaktır !
PHP’ye yeni eklenen inet_ntop() ve inet_pton() fonksiyonları bu iÅŸi yapmakta. Örnekleri Php manual sayfalarında bulabilirsiniz. Zaten 2 tane örnek var, bütün internette onlar dolaşıyor, daha tam net bilgiler yok bu konu hakkında.
Burada n => network, p => presentation veya printable kelimelerini temsil ediyor. Yani ntop => network to printable, pton => printable to network anlamına gelmekte.
Peki MySQL kanadında işler nasıl? MySQL şuan resmi olarak INET_ATON ve INET_NTOA gibi bir fonksiyon geliştirmedi. Bu işi yapmak için 3.parti bileşenlere ihtiyacımız var.
3.parti bileÅŸen => http://bitbucket.org/watchmouse/mysql-udf-ipv6/get/tip.tar.gz
Åžimdilik bu kadar. Daha sonra MySQL üzerinde Ipv6′ya daha detaylı deÄŸineceÄŸim.