Jangan simpan sebagai string. Gunakan int unsigned
kolom dan simpan / ambil dengan INET_ATON()
dan INET_NTOA()
masing - masing. AFAIK mysql tidak mendukung INET_ * untuk ipv6.
Sunting sesuai komentar
Menggunakan fungsi bawaan untuk mengonversi IP ke / dari bilangan bulat (dan menyimpan bilangan bulat itu dalam basis data) memiliki efek samping secara otomatis memvalidasi IP tersebut. Katakanlah Anda menyimpan IP sebagai VARCHAR (16), Anda harus memastikan untuk tidak menyimpan IP yang tidak valid (seperti 999.999.999.999 sebagai contoh) dengan beberapa validasi khusus. INET_ * fungsi menangani hal itu.
Mungkin saatnya untuk mulai mempertimbangkan IPv6. MySQL tidak memiliki metode untuk mengubah alamat IPv6 ke format biner. String empat puluh karakter akan menangani alamat IPv6 normal. Ada format yang bisa melebihi 40 karakter, saya akan menganggap itu tidak mungkin terjadi latihan.
Anda dapat menghitung ukuran sejak saat itu informasi bahwa akan ada paling banyak 8 empat kelompok karakter dengan 7 karakter pemisah. Format abnormal menggantikan dua grup terakhir dengan alamat format IPv4. Tanpa kompresi alamat, ia menggantikan 9 karakter terakhir hingga 15 karakter.
Jika Anda menyimpan blok, indikasi ukuran blok dapat mengambil 4 karakter daripada 3 karakter yang diperlukan untuk IPv4.
Anda harus memastikan pemformatan yang Anda dapatkan konsisten, tetapi semua perangkat lunak yang saya lihat memberikan format yang konsisten untuk alamat.
sumber
Saya menyarankan migrasi ke PostgreSQL dan penggunaan tipe data INET atau CIDR .
sumber
Inilah jawaban terbaik yang dibuat di salah satu milis MySQL. Baca Terbaik Fieldtype untuk menyimpan alamat IP ... .
Secara singkat itu menyarankan, yang saya kedua, untuk menggunakan INT (10) TANDA TANGAN.
Jadi, menggunakan 192.168.10.50:
(192 * 2 ^ 24) + (168 * 2 ^ 16) + (10 * 2 ^ 8) + 50 = 3232238130 (hasil pada 192.168.10.50)
Atau
192 + (168 * 2 ^ 8) + (10 * 2 ^ 16) + (50 * 2 ^ 24) = 839559360 (Mundur, menghasilkan 50.10.168.192)
sumber
Pada MySQL v5.6.3 mereka menambahkan dukungan untuk
INET6_ATON
danINET6_NOTA
yang akan menangani alamat IPv4 dan IPv6. Tetapi mereka tidak lagi menyimpannya sebagai bilangan bulat. IPv6 mengembalikan avarbinary(16)
dan dan IPv4 mengembalikan avarbinary(4)
.http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
sumber
Anda dapat menyimpan hingga 15 karakter. Tolong jangan gunakan VARCHAR (15) karena itu adalah 16 byte (byte pertama mengelola panjang string dan dengan demikian pengambilan dan penyimpanan lebih lambat). Gunakan CHAR (15) selalu pada sesuatu seperti alamat IP.
sumber
Maaf, tidak dapat mengomentari jawaban. Ada pertanyaan tentang hal itu di stackoverflow. Dan saya sangat setuju dengan jawaban yang dipilih: menggunakan 2xBIGINT mungkin merupakan cara terbaik untuk ipv6 saat ini.
Dimungkinkan juga untuk menyimpan ipv4 pada bigints ini - baik dengan menandai salah satunya NULL atau dengan menggunakan format V4COMPAT
sumber