2012-01-03 16 views
5

MySQL, IP adreslerinin bir listesini sırayla almaya çalışıyorum.siparişi .... numaraları? IP adreslerini sıralamanıza yardım et

bu sorgu

select ip from sn_192_168_0 

bu

192.168.0.1 
192.168.0.10 
192.168.0.100 
192.168.0.101 

Biz

192.168.0.1 
192.168.0.2 
...snip.. 
192.168.0.10 
+0

ip maksimum uzunluğu olduğunu Şu an tam bir örnek, ama yaptığı gibi görünen şey sözlükbilimsel (yani karakter karakterini) sıralamaktır. Sayısal olarak sıralamak için bir SP (veya uygulama mantığı) oluşturmanız gerekir (yani IP adresini dört parçaya ayırın, ardından her bir parçaya göre sıralayın). Alternatif olarak, onu dört kısma ayırmak yerine, IP adresinden tek bir tam sayı yapın (adresin ilk sekizli sayısı = sayının ilk 8 biti, ikinci sekizli = ikinci 8 bit vb.) Ve buna göre sıralayın - IP adresleri aslında iyi gizlenmiş bir tam sayıdan başka bir şey değildir. –

+0

@SimonRigharts tam olarak ne yapıyor. Genel felsefe, her şeyi çok sayıdaki bir alana çevirmek (veya 3 karakterlik genişlikte dört yeni alan veya üç yeni bayt alanı kullanmak) ve sıralama için değil de bunu sorgulamak için daha hızlı (ama daha fazla alan pahalı) olacaktı. Bu alan görüntüleme amaçlıdır. Kendinizi ayrıştırmak istemiyorsanız, IP adresini sayısal alana dönüştürmek için kütüphaneler vardır. – jcolebrand

+0

Ancak, bu gerçekten sadece bir kod sorusu olduğundan, [SO] 'ya yeniden önyükleme yapıyor. – jcolebrand

cevap

15

INET_ATON fonksiyonunu deneyin istiyoruz verir

SELECT ip FROM sn_192_168_0 
ORDER BY INET_ATON(ip); 

Bunu bir deneyin!

CAVEAT: INET_ATON değerlerini depolamak en iyisidir. Bu işleve sahip bazı geçmiş tuhaflıklar var, noktalar arasında geçersiz sayılar var ve bunları tetikleyiciler olarak çağırıyorsunuz. http://bugs.mysql.com/bug.php?id=5448 Bu hataları şimdi temizlediğini

  • http://bugs.mysql.com/bug.php?id=39386
    • .

      Kısa IP adresleri doğru şekilde işleniyor. İşte 7

      mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); 
      +------------------------+--------------------+ 
      | INET_ATON('127.0.0.1') | INET_ATON('127.1') | 
      +------------------------+--------------------+ 
      |    2130706433 |   2130706433 | 
      +------------------------+--------------------+ 
      1 row in set (0.05 sec) 
      
    +0

    Neden bunu düşünmedim? Teşekkür ederim. –

    0

    Eğer

    SELECT ip FROM sn_192_168_0 ORDER BY LPAD( ip, 16, 0) 
    

    numarası 16 kullanabilirsiniz Windows MySQL 5.5.12 bir örnek ben inşa etmek zamanım yok

    İlgili konular