IP adresini saklamak


25

Kayıtlı tüm kullanıcıların IP adresini veri tabanında saklamak zorundayım. Merak ediyorum, böyle bir sütun için kaç karakter beyan etmeliyim?

IPv6'yı da desteklemeli miyim? Öyleyse, maksimum IP adres uzunluğu nedir?

Yanıtlar:


27

Dize olarak saklamayın. Bir int unsignedsütun kullanın INET_ATON()ve INET_NTOA()sırasıyla ve ile saklayın / alın . AFAIK mysql, ipv6 için INET_ * özelliğini desteklemez.

DÜZENLEME açıklama gereği

IP'leri tamsayılara / tamsayılara dönüştürmek için yerleşik bir işlev kullanmak (ve bu tamsayıları veritabanında saklamak), bu IP'leri otomatik olarak doğrulamanın yan etkisine sahiptir. Bir IP'yi VARCHAR (16) olarak sakladığınızı, bazı özel doğrulamalarla geçersiz IP'leri (örneğin 999.999.999.999 gibi) saklamadığınızdan emin olmalısınız. INET_ * işlevleri bununla ilgilenir.


1
-1, IP adresleri 128 bit'tir ve MySQL tarafından desteklenen en büyük tamsayı türü 64 bit'tir.
Hendrik Brummermann

3
IPv4 32-bit. 128-bit, IPET6 içindir, ki bahsettiği gibi, INET_ * maddeleri desteklemiyor.
Richard,

1
IPv6 adresi için INET6_ATON () ve INET6_NTOA () işlevlerini kullanın, örneğe bakın - rathishkumar.in/2017/08/how-to-store-ip-address-in-mysql.html
rathishDBA

6

IPv6'yı düşünmeye başlamanın zamanı gelmiştir. MySQL'in IPv6 adreslerini ikili formata dönüştürme yöntemleri yoktur. Kırk karakterli bir dize, normal IPv6 adreslerini işler. 40 karakteri aşabilecek bir format var, ben pratikte oluşması muhtemel olmayanları düşünürdüm.

Boyutu, bundan sonra 7 ayırıcı karakter içeren en fazla 8 dört karakter grubu olacağı bilgisinden hesaplayabilirsiniz. Anormal format, son iki grubu IPv4 format adresi ile değiştirir. Adres sıkıştırması olmadan, son 9 karakteri 15 karaktere kadar değiştirir.

Blokları saklıyorsanız, blok boyutu göstergesi IPv4 için gereken 3 karakter yerine 4 karakter alabilir.

Aldığınız formatın tutarlı olmasını sağlamalısınız, ancak gördüğüm tüm yazılımlar adresler için tutarlı formatlar veriyor.


2
Tamamen katılıyorum, IPv6 geliyor ve buna hazır olmak, onu beklemekten daha iyidir, Y2K: D
Jeff

Sadece gelmekle kalmayıp, zaten sistemimde.
BillThor

6

PostgreSQL'e geçişi ve INET veya CIDR veri tiplerinin kullanılmasını öneririm .

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

Hangi IP'lerin ağda olduğunu bulmak için SELECT * FROM testinden NEREDE adres << '1.2.3.0/24'::inet;
jkj

4

İşte MySQL posta listelerinden birinde verilen en iyi cevap. Okuma En İyi FIELDTYPE IP adresini saklamak için ... .

Kısaca, ikinci olarak INT (10) UNSIGNED kullanmasını önerir.

  1. Daha az bellek kullanır (yalnızca 4 bayt)
  2. Özellikle, ziyaretçilerinizin menşe ülkesini arıyorsanız, IP aralıklarını sıralamak ve aramak için en iyisi.

Yani, 192.168.10.50 kullanarak:

(192 * 2 ^ 24) + (168 * 2 ^ 16) + (10 * 2 ^ 8) + 50 = 3232238130 (192.168.10.50 ile sonuçlanır)

MySQL'de doğrudan SELECT INET_ATON('192.168.10.50'); almak için kullanabilirsiniz 3232238130.

Veya

192 + (168 * 2 ^ 8) + (10 * 2 ^ 16) + (50 * 2 ^ 24) = 839559360 (Geriye doğru, 50.10.168.192 ile sonuçlanır)

MySQL'de geri SELECT INET_NTOA(3232238130); almak için doğrudan kullanabilirsiniz 192.168.10.50.


Etkileyici, Sizin için +1 !!! İmzasız 4 bayt kullanarak emin her gün dize manipülasyonu yener.
RolandoMySQLDBA 14:11

-1, IP adresleri 128 bit'tir ve MySQL tarafından desteklenen en büyük tamsayı türü 64 bit'tir.
Hendrik Brummermann

3
nhnb IPv6 128 bit, ancak konuşma IPv4 hakkındadır IS 32 bit. Bilginiz üzerinde ısrar eden her yorum / cevap için yorum yapmaya gerek yok.
Göz

Cevabınız sadece eski internet protokolüyle ilgilendiğini söylemez, oysa soru sonunda açıkça IPv6'dan bahseder. Son belediye başkanı internet sağlayıcısının (en azından ülkemde) bu yılın sonundan önce IPv6'yı destekleyeceği göz önüne alındığında, bununla başa çıkamayacak bir veritabanı yapısı tasarlamak son derece kötü bir fikirdir.
Hendrik Brummermann


1

15 karaktere kadar saklayabilirsiniz. Lütfen VARCHAR'ı (15) kullanmayın, çünkü bu 16 bayttır (ilk bayt string uzunluğunu yönetir ve böylece daha yavaş geri alma ve saklama). Her zaman bir IP adresi gibi bir şey üzerinde CHAR (15) kullanın.


Bir IP adresinin maksimum uzunluğu 45 karakterdir.
Hendrik Brummermann, 13.03.

CHAR boşluklarla doldurmaz mı?
Gaius

0

Üzgünüz, cevaplar hakkında yorum yapamam. Stackoverflow'ta bununla ilgili bir soru var . Ve seçilen cevaba tamamen katılıyorum: 2xBIGINT kullanmak şu anda ipv6 için muhtemelen en iyi yoldur.

2 * BIGINT'e gitmeyi önerebilirim, ancak AÇILMAYI olduklarından emin olun. IPv6'da / 64 adres sınırında (a / 64 en küçük netblock boyutu olduğundan) bununla iyi uyum sağlayacak bir tür doğal bölünme vardır.

İpv4'ü bu uçlarda depolamak da mümkündür - bunlardan birini NULL olarak veya V4COMPAT formatını kullanarak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.