2010-08-24 29 views
10

Tôi có nên sử dụng binary(16) hoặc varbinary(16) không?Làm thế nào để lưu trữ cả IPv4 hoặc IPv6 trong cột đơn trong SQL Server?

Tôi biết tôi có thể sử dụng getAddress() trong java.net.InetAddress (Java) hoặc System.Net.IPAddress (C#) để có được một đại diện byte[] của cả hai IPv4IPv6, nhưng nếu tôi cần phải chèn IPv4 tức binary(4) vào một lĩnh vực binary(16) trong SQL Server, tôi cần lo lắng về padding hoặc bất cứ điều gì?

Trả lời

15

Nếu bạn lưu trữ binary(4) trong cột binary(16) bạn sẽ quay lại, khi bạn đọc nó, giá trị đệm có chiều dài 16. Nếu bạn muốn có độ dài động, bạn phải sử dụng varbinary(16). Loại này giữ nguyên độ dài của dữ liệu được chèn vào, với chi phí thêm 2 byte trên đĩa (chiều dài thực tế).

+0

Vì tôi hy vọng phần lớn IP sẽ vẫn ở trong IPv4, nên tôi đoán phương sai (16) có ý nghĩa. – Henry

+0

Và chi phí tạo trường có độ dài thay đổi – NullUserException

+1

Để biết chi tiết chính xác chi phí, hãy xem http://msdn.microsoft.com/en-us/library/ms178085.aspx và/hoặc http://sqlskills.com/blogs/paul /post/Inside-the-Storage-Engine-Anatomy-of-a-record.aspx –

7

Sử dụng v4-in-v6 address embedding để chuyển đổi địa chỉ ipv4 thành định dạng ipv6; sau đó bạn có thể đối xử với họ tất cả giống hệt nhau.

+0

nó sẽ không được giống như nhị phân (4) với 12x zero byte padding ở phía trước? – Henry

+3

Có lẽ bạn mong đợi một số mục trong cột cơ sở dữ liệu này là địa chỉ ipv6 thực. Điểm nhúng của v4-in-v6 là nhiều mã ứng dụng của bạn sẽ không phải quan tâm đến sự khác biệt (nó chỉ có thể giả vờ là không có gì ngoài các địa chỉ v6). – zwol

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