2011-06-21 73 views
53

loại trường thích hợp cho địa chỉ IP trong mysql là gì? và đúng cách để lưu trữ nó bằng cách sử dụng PHP là gì?Lưu trữ địa chỉ IP trong cơ sở dữ liệu MySQL bằng cách sử dụng PHP

+0

Phụ thuộc vào những gì bạn muốn làm với nó và phiên bản IP nào bạn quan tâm. –

+0

Tùy thuộc vào cách bạn sẽ sử dụng nó, nhưng nói chung, hãy nghĩ rằng varchar sẽ tốt hơn – Balanivash

+1

Điều này có thể giúp bạn: http://stackoverflow.com/questions/1038950/what-is-be-the-most-appropriate-data- loại-cho-lưu-an-ip-địa-chỉ-trong-sql-server? – Alfred

Trả lời

14

Thông thường bạn có thể đi với VARCHAR (45) vì nó sẽ đủ dài để lưu trữ IPv6.

+7

IPv6 có thể là 45 ký tự nếu bạn có địa chỉ đường hầm. Cấp nó là một trường hợp cạnh, nhưng tại sao không bằng chứng trong tương lai. – Robert

+0

Ồ vâng, quên đi điều đó :) – Sander

+4

vì vậy, về cơ bản bạn sử dụng tối đa 45 byte cho các địa chỉ sử dụng tối đa 16 byte? có vẻ khá lãng phí với tôi ... (với địa chỉ ipv4 nó tồi tệ hơn: 4 byte địa chỉ và 15 byte chuỗi repr.) – knittl

46

bạn có thể lưu trữ chúng trong trường nhị phân có độ dài 128 bit (16 byte, BINARY(16) hoặc VARBINARY(16)). để chuyển đổi bất kỳ địa chỉ IP nào thành biểu diễn nhị phân của nó, bạn có thể sử dụng hàm php inet_pton. phương pháp này sẽ hoạt động cho cả địa chỉ IPv4 và IPv6. inet_ntop có thể được sử dụng để lấy lại biểu diễn chuỗi của địa chỉ ip được lưu trữ (bất kể phiên bản)

+0

Tôi có thể sử dụng nó cho cả IPv6 và IPv4 – user552828

+2

@ user552828: có, bạn có thể sử dụng nó cho cả ipv4 và ipv6 – knittl

+0

nhưng họ nói rằng IPv6 có thể dài 45 ký tự trong trường hợp ip đường hầm, độ dài 128bit là ok? Tôi hỏi vì Im không giỏi mã hóa, Im a newbie – user552828

59

This tutorial có thể giúp bạn.

Cách hiệu quả nhất để lưu địa chỉ IPv4 là với trường INT (không phải VARCHAR như bạn mong đợi). Bạn chuyển đổi chúng bằng cách sử dụng ip2long của PHP và quay lại bằng chức năng INET_NTOA của MySQL hoặc hàm long2ip của PHP.

Nếu bạn cần lưu trữ IPv6, bạn sẽ muốn sử dụng trường BINARY thay thế và hàm inet_pton của PHP.

+0

không có hàm nội trang có tên 'ip2bin'. bạn có thể dễ dàng viết một mình mặc dù: 'function ip2bin ($ ip) {return inet_pton ($ ip); } ' – knittl

+0

@knittl - Tôi đã thêm hàm tôi đang đề cập đến. Xấu của tôi vì không bao gồm nó. –

+4

@francois: tại sao không đơn giản sử dụng 'inet_pton'? nó đã làm việc với hầu như tất cả các biểu diễn chuỗi các địa chỉ ip, không cần phải biến đổi phức tạp – knittl

Các vấn đề liên quan