Trong Oracle, kiểu hoặc kỹ thuật chiếm đoạt dữ liệu để trình bày địa chỉ mạng là gì, địa chỉ trắng có thể là IPv4 hoặc IPv6
Có hai cách tiếp cận:
- chỉ lưu trữ.
- lưu trữ biểu diễn thông thường
Chỉ để lưu trữ. Địa chỉ IPV4 phải là một số nguyên (32bit là đủ). Đối với IP V6, 128 bit, INTEGER (tương tự như Số (38)) sẽ làm được. Tất nhiên, đó là lưu trữ. Cách tiếp cận đó có quan điểm rằng việc trình bày là một vấn đề đối với ứng dụng.
Nếu thực hiện chiến lược ngược lại, lưu trữ biểu diễn thông thường, người ta cần đảm bảo rằng địa chỉ IP V4 và IPV6 chỉ có một biểu diễn (chuỗi) thông thường. Nó nổi tiếng với ipV4. Đối với IPV6, cũng có một định dạng tiêu chuẩn.
Sở thích của tôi chuyển sang chiến lược đầu tiên. Trong trường hợp xấu nhất, bạn có thể áp dụng phương pháp kết hợp (mặc dù không phải axit) và lưu trữ cả nhị phân và biểu diễn ascii cạnh nhau với "mức độ ưu tiên" đối với giá trị nhị phân.
Tuy nhiên, không có hàng nào chứa cả địa chỉ v4 và v6.
Biểu diễn tiêu chuẩn của địa chỉ IPV4 ở định dạng IPV6 là:::ffff:192.0.2.128
.
Tôi không biết ngữ cảnh nhưng tôi sẽ dành 2 cột, một cho IPV4 và cột kia cho một địa chỉ ipV6 riêng biệt.
Cập nhật
Sau một nhận xét hay của @ SleepMonad's, tôi muốn chỉ ra rằng thay vì Số kiểu dữ liệu tốt hơn nên sử dụng kiểu dữ liệu INTEGER, kiểu dữ liệu này sẽ phù hợp với giá trị cao nhất có thể có thể được biểu thị bằng số nguyên 128 bit 'ff ... ff' (sẽ cần 39 chữ số thập phân). 38 là lũy thừa cao nhất trong mười từ 0 đến 9 có thể được mã hóa trên 128 bit nhưng người ta vẫn có thể chèn giá trị không dấu tối đa cho 2 ** 128 - 1 (số thập phân 340282366920938463463374607431768211455). Đây là một thử nghiệm nhỏ để minh họa khả năng này.
create table test (
id integer primary key,
ipv6_address_bin INTEGER );
-- Let's enter 2**128 - 1 in the nueric field
insert into test (id, ipv6_address_bin) values ( 1, to_number ( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') ) ;
-- retrieve it to make sure it's not "truncated".
select to_char ( ipv6_address_bin, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ) from test where id = 1 ;
-- yields 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
select to_char ( ipv6_address_bin ) from test where id = 1 ;
-- yields 340282366920938463463374607431768211455
select LOG(2, ipv6_address_bin) from test where id = 1 ;
-- yields 128
select LOG(10, ipv6_address_bin) from test where id = 1 ;
-- yields > 38