Tôi có một cơ sở dữ liệu trong đó một trong các bảng lưu trữ một blob (bytea
) của tất cả các loại dữ liệu chung được thu thập từ một hệ thống khác. Trường bytea
có thể có bất kỳ thứ gì trong đó. Để biết cách diễn giải dữ liệu, bảng cũng có một trường định dạng. Tôi đã viết một ứng dụng Java để đọc trường bytea
từ cơ sở dữ liệu dưới dạng byte[]
và sau đó tôi có thể dễ dàng chuyển đổi nó thành double[]
hoặc int[]
hoặc bất kỳ trường định dạng nào bằng cách sử dụng ByteBuffer
và các chế độ xem khác nhau (, v.v.).Chuyển đổi bytea thành độ chính xác gấp đôi trong PostgreSQL
Bây giờ tôi có tình huống mà tôi cần thực hiện một số thao tác của dữ liệu trên cơ sở dữ liệu trong một hàm kích hoạt để duy trì tính toàn vẹn với một bảng khác. Tôi có thể tìm thấy chuyển đổi cho bất kỳ loại dữ liệu nào có thể tưởng tượng được nhưng tôi không thể tìm thấy bất kỳ thứ gì để chuyển từ bytea
(hoặc thậm chí bit
) thành double precision
và ngược lại. Một bytea
có thể được chia nhỏ, chuyển đổi thành bit, và sau đó chuyển đổi thành một số int
hoặc bigint
, nhưng không phải là double precision
. Ví dụ: x'deadbeefdeadbeef'::bit(64)::bigint
sẽ chuyển đổi thành -2401053088876216593
mà không có sự cố, nhưng x'deadbeefdeadbeef'::bit(64)::double precision
không thành công với "L ERI: không thể truyền bit loại tới độ chính xác gấp đôi" thay vì đưa ra câu trả lời IEEE 754 của -1.1885959257070704E148
.
Tôi tìm thấy câu trả lời này https://stackoverflow.com/a/11661849/5274457, về cơ bản thực hiện tiêu chuẩn IEEE để chuyển đổi các bit thành gấp đôi, nhưng thực sự không có chức năng chuyển đổi cơ bản trong PostgreSQL để làm điều này? Ngoài ra, tôi cũng cần quay ngược lại từ double precision
đến bytea
khi tôi hoàn tất thao tác dữ liệu và cần cập nhật các bảng mà câu trả lời này không cung cấp.
Bất kỳ ý tưởng nào?
Có thể bạn sẽ cần một tiện ích C đơn giản để thêm dàn diễn viên được yêu cầu. Pg thực sự có thể sử dụng một số chức năng chuyển đổi khác đến/từ các dạng nhị phân thô. –
Tôi sẽ xem xét ý tưởng tiện ích. Từ những gì tôi có thể nói, đây không chỉ là một vấn đề PostgreSQL. HSQL và SQLServer, từ những gì tôi có thể nói, có cùng một vấn đề. Mỗi ngôn ngữ lập trình tôi đã sử dụng đều có các phương thức để chuyển đổi các byte thô thành gấp đôi, nhưng cơ sở dữ liệu SQL dường như không có. – Keith
Chúng thường hoạt động ở mức trừu tượng cao hơn. Với PostgreSQL, một tùy chọn thực tế có lẽ là sử dụng một thủ tục plperlu hoặc plpythonu đơn giản để làm điều đó, theo cách đó bạn không phải viết một phần mở rộng C. –