Typy PostgreSQL bytea
i bit varying
brzmią podobnie:PostgreSQL: Różnica między "bytea" i "bit różnych" typów
bytea
sklepy binary strings.bit varying
sklepy strings of 1's and 0's.
W dokumentacji nie podano maksymalnego rozmiaru. Czy to 1GB jak character varying
?
Mam dwa oddzielne przypadki użycia, zarówno nad stołem z milionami wierszy:
Przechowywanie MD5
to byłby bytea
o długości 16 bajtów lub bit(128)
. Byłby używany do:
- Deduplikacja: Ciężkie użycie
GROUP BY
, z indeksem, który przypuszczam. - Zapytanie z
WHERE md5 =
tylko w przypadku ścisłych dopasowań. - Wyświetlanie jako ciąg szesnastkowy do użytku przez człowieka.
Przechowywanie arbitralne dane binarne
ciągi danych binarnych o różnej długości do 4kB dla:
- operacje bitowe znaleźć ciągi pasujące pewną maskę. Przykład na końcu tego postu.
- Wyodrębnianie niektórych bajtów, na przykład uzyskać wartość całkowitą bajt 14 w moim ciągu.
- Niektóre deduplikacji.
Przykład pracy dla operacji bitowej przy użyciu bit varying
. Maska to X'00FF00 'i zwraca tylko wiersz X'AAAAAA'. Skróciłem ciągi dla przykładu, ale byłoby to na całej ich długości, do 4kB. Czy można zrobić coś podobnego z bytea
?
CREATE TABLE test1 (mystring bit varying);
INSERT INTO test1 VALUES (X'AAAAAA'), (X'ABCABC');
SELECT * FROM test1 WHERE mystring & X'00FF00' = X'00AA00';
Które bytea
i bit varying
jest bardziej odpowiedni?
Widziałem, że typ UUID
jest przeznaczony do przechowywania dokładnie 16 bajtów, czy to byłaby korzyść z przechowywania MD5?
nie jestem oddanie to jako odpowiedź, ponieważ jestem tu ekspertem, ale czytając ten temat , wydaje się, że bytea jest bardziej odpowiednim wyborem, szczególnie przy użyciu formatu HEX. W swoich własnych słowach PostgreSQL "Format szesnastkowy jest kompatybilny z szeroką gamą zewnętrznych aplikacji i protokołów, a jego konwersja jest szybsza niż w formacie ucieczki, dlatego preferowane jest jego użycie http://www.postgresql.org/docs /9.1/static/datatype-binary.html (konkretnie sekcja 8.4.1) i płynna odpowiedź tutaj: http://stackoverflow.com/questions/15982737/postgresql-data-type-for-md5-message-digest – JNevill
I zrozumiał, że "hex" i "escape" to tylko [zewnętrzne formaty wejściowe i wyjściowe] (http://www.postgresql.org/docs/9.3/static/datatype-binary.html#DATATYPE-BINARY-TABLE). wartości wewnętrzne są binarne, więc nie zmieni nic w moim przypadku, chyba że importuję lub eksportuję ogromną liczbę wartości binarnych – Victor
Cóż ... wewnętrznie to wszystko jest binarne i wydaje się, że sprowadza się do wsparcia w twoim RDBMS i jakiekolwiek narzędzia, których używasz do interakcji z nim, co popychało mnie do "bytea". Teoretycznie Char (16) i bit (128) ta ke taką samą liczbę bajtów do zapisania, więc jest to rodzaj prania z wewnętrznej perspektywy (ignorując, że istnieją oktety, których CHAR() nie może przechowywać). Jestem zaskoczony, że nie stileverflow.com super geniusze odpowiedział na to jeszcze. To dobre pytanie. – JNevill