Yanıtlar:
Dize olarak saklamayın. Bir int unsigned
sü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.
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.
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
İş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.
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 kullanabilirsiniz3232238130
.
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 kullanabilirsiniz192.168.10.50
.
MySQL v5.6.3'ten itibaren IPv4 ve IPv6 adresleriyle ilgilenecek INET6_ATON
ve destek INET6_NOTA
verecekler. Fakat artık bir tamsayı olarak saklamıyorlar. IPv6 a varbinary(16)
ve İvv4 a döndürür varbinary(4)
.
http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
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.
Ü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