Mam bazę danych, w której jedna z tabel przechowuje blob (bytea
) wszystkich rodzajów danych ogólnych zebranych z innego systemu. Pole bytea
może zawierać dowolne elementy. Aby wiedzieć, jak interpretować dane, tabela ma również pole formatu. Napisałem aplikację Java do zapoznania się z boiska bytea
z bazy danych jako byte[]
a następnie można łatwo przekształcić go double[]
lub int[]
lub cokolwiek pole formatu mówi używając ByteBuffer
i różne widoki (DoubleBuffer
, IntBuffer
, etc.).Konwertuj bajt na podwójną precyzję w PostgreSQL
Teraz mam sytuację, w której muszę wykonać pewne manipulowanie danymi z samej bazy danych w ramach funkcji wyzwalacza, aby zachować integralność z inną tabelą. Mogę znaleźć konwersje dla dowolnego rodzaju danych, jakie można sobie wyobrazić, ale nie mogę znaleźć niczego, aby przejść od bytea
(lub nawet bit
) do double precision
iz powrotem. Plik bytea
można podzielić, przekonwertować na bity, a następnie przekonwertować na int
lub bigint
, ale nie na double precision
. Na przykład x'deadbeefdeadbeef'::bit(64)::bigint
zostanie przekonwertowany na -2401053088876216593
bez żadnych problemów, ale x'deadbeefdeadbeef'::bit(64)::double precision
zakończy się niepowodzeniem z "BŁĄD: nie można przesłać bitów typu do podwójnej precyzji" zamiast podać odpowiedź IEEE 754 na -1.1885959257070704E148
.
Znalazłem tę odpowiedź https://stackoverflow.com/a/11661849/5274457, która zasadniczo implementuje standard IEEE, aby konwertować bity na podwójne, ale czy naprawdę nie jest to podstawowa funkcja konwersji w PostgreSQL, aby to zrobić? Dodatkowo, muszę cofnąć się również od double precision
do bytea
po zakończeniu manipulowania danymi i konieczności aktualizacji tabel, których ta odpowiedź nie zapewnia.
Wszelkie pomysły?
Prawdopodobnie będziesz potrzebować prostego rozszerzenia C, aby dodać wymaganą obsadę. Pg mógłby naprawdę użyć więcej funkcji konwersji do/z surowych postaci binarnych. –
Zajrzę do pomysłu na rozszerzenie. Z tego co wiem, nie jest to tylko problem PostgreSQL. HSQL i SQLServer, z tego co wiem, mają ten sam problem. Każdy język programowania, który stosowałem, ma metody konwersji surowych bajtów na podwójne, ale bazy danych SQL nie mają tego. – Keith
Generalnie działają na wyższym poziomie abstrakcji. W PostgreSQL, jedną z praktycznych opcji jest prawdopodobnie użycie prostej procedury plperyth lub plpythonu, aby to zrobić, w ten sposób nie musisz pisać rozszerzenia C. –