Tabela 8-4. Typy znaków
Nazwa | Opis |
---|---|
znak varying(n), varchar(n) | zmienna długość z limitem |
znak(n), char(n) | stała-długość, puste wypełnienie |
tekst | zmienna-nieograniczona długość |
Tabela8-4 przedstawia typy znaków dostępne w PostgreSQL.
SQL definiuje dwa podstawowe typy znaków: character varying(n) oraz character(n), gdzieen jest liczbą całkowitą dodatnią. Oba te typy mogą przechowywać ciągi znaków o długości do n znaków (nie bajtów). Próba zapisania dłuższego łańcucha w kolumnie tego typu spowoduje błąd, chyba że nadmiarowe znaki są spacjami, w którym to przypadku łańcuch zostanie obcięty do maksymalnej długości. (Ten nieco dziwaczny wyjątek jest wymagany przez standard SQL.) Jeśli łańcuch, który ma być przechowywany jest krótszy niż zadeklarowana długość, wartości typu character zostaną uzupełnione spacjami; wartości typucharacter varying będą po prostu przechowywać krótszy łańcuch.
Jeśli jawnie rzutuje się wartość na charactervarying(n) lub character(n), to wartość o nadmiernej długości zostanie obcięta do n znaków bez zgłaszania błędu. (Thistoo jest wymagane przez standard SQL.)
Zapisy varchar(n) i char(n) są aliasami dla odpowiednio character varying(n)i character(n). character bez specyfikatora długości jest równoważnecharacter(1). Jeśli użyty jest charactervarying bez specyfikatora długości, typ akceptuje ciągi o dowolnym rozmiarze. To ostatnie jest rozszerzeniem PostgreSQL.
Dodatkowo PostgreSQL udostępnia typ text, który przechowuje łańcuchy o dowolnej długości. Chociaż typ text nie jest zawarty w standardzie SQL, kilka innych systemów zarządzania bazami danych SQL również go posiada.
Wartości typu character są fizycznie wypełnione spacjami do określonej szerokości n i w ten sposób są przechowywane i wyświetlane.Jednakże spacje wypełniające są traktowane jako semantycznie nieistotne. Końcowe spacje są pomijane przy porównywaniu dwóch wartości typu znak i będą usuwane przy konwersji wartości znakowej na jeden z innych typów łańcuchów. Zwróć uwagę, że spacje końcowe są semantycznie znaczące w znakach zmiennych i wartościach tekstowych oraz podczas używania dopasowywania wzorców, np. LIKE, wyrażenia regularne.
Wymaganie pamięci dla krótkiego łańcucha (do 126 bajtów) wynosi 1 bajt plus rzeczywisty łańcuch, który zawiera wkładkę spacji w przypadku znaku. Dłuższe łańcuchy mają 4 bajty narzutu zamiast 1. Długie łańcuchy są automatycznie kompresowane przez system, więc fizyczne zapotrzebowanie na dysku może być mniejsze. Bardzo długie wartości są również przechowywane w tabelach tła, aby nie przeszkadzały w szybkim dostępie do krótszych wartości kolumn. W każdym razie, najdłuższy możliwy łańcuch znaków, który może być zapisany, ma około 1 GB. (Maksymalna wartość, która będzie dozwolona dlan w deklaracji typu danych, jest mniejsza niż to. Nie byłoby użyteczne zmienianie tego, ponieważ przy wielobajtowych kodowaniach znaków, liczba znaków i bajtów może być całkiem inna. Jeśli chcesz przechowywać długie ciągi znaków bez określonego górnego limitu, użyj tekstowych lub znakowych zmiennych bez specyfikatora długości, zamiast wymyślać arbitralny limit długości.)
Porada: Nie ma różnicy w wydajności pomiędzy tymi trzema typami, poza zwiększoną przestrzenią dyskową, gdy używasz typu wyściełanego pustką, oraz kilkoma dodatkowymi cyklami procesora do sprawdzenia długości, gdy przechowujesz w kolumnie o ograniczonej długości. Podczas gdy character(n) ma przewagę wydajnościową w niektórych innych systemach baz danych, w PostgreSQL nie ma takiej przewagi; w rzeczywistości character(n) jest zazwyczaj najwolniejszym z tych trzech typów z powodu dodatkowych kosztów przechowywania. W większości sytuacji należy stosować zamiast tego zmienną tekstową lub znakową.
Informacje na temat składni literałów łańcuchowych znajdują się w rozdziale 4.1.2.1, a informacje na temat dostępnych operatorów i funkcji w rozdziale 9. Zestaw znaków bazy danych określa zestaw znaków używany do przechowywania wartości tekstowych; więcej informacji na temat obsługi zestawów znaków znajduje się w rozdziale 22.3.
Przykład 8-1. Używanie typów znaków
CREATE TABLE test1 (a character(4));INSERT INTO test1 VALUES ('ok');SELECT a, char_length(a) FROM test1; -- (1) a | char_length------+------------- ok | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
char_length
jest omówiona w punkcie 9.4. W PostgreSQL występują jeszcze dwa inne typy znaków o stałej długości, które zostały przedstawione w tabeli 8-5. Typ name służy jedynie do przechowywania identyfikatorów w wewnętrznych katalogach systemowych i nie jest przeznaczony do użytku przez zwykłego użytkownika. Jego długość jest obecnie określona na 64 bajty (63 znaki plus terminator), ale w kodzie źródłowym C powinien być określany za pomocą stałej NAMEDATALEN. Długość jest ustawiana w czasie kompilacji (i dlatego jest regulowana dla specjalnych zastosowań); domyślna maksymalna długość może się zmienić w przyszłym wydaniu. Typ “char” (zwróć uwagę na cudzysłów) różni się od char(1) tym, że używa tylko jednego bajtu pamięci. Jest on wewnętrznie używany w katalogach systemowych jako uproszczony typ wyliczeniowy.
Tabela 8-5. Typy znaków specjalnych
Nazwa | Rozmiar pamięci | Opis |
---|---|---|
“char” | 1 bajt | single-.typ wewnętrzny bajt |
nazwa | 64 bajty | typ wewnętrzny dla nazw obiektów |