Artykuł ten jest częścią serii Od 0 do TSQL którą znajdziesz tutaj.
SQL Server posiada szereg wbudowanych typów danych. Każda kolumna,parametr czy też zmienna posiada swój własny typ danych. Zrozumienie tej koncepcji jest niezmiernie ważne jeśli chcemy na poważnie pracować z bazami danych. Artykuł ten ma za zadanie pogłębić Waszą wiedzę z zakresu tej tematyki co będzie stanowiło wstęp do kolejnych epizodów niniejszej serii.
SQL Server dostarcza wielu typów danych “z pudełka”, dzięki czemu nie musimy definiować ich własnoręcznie. Oczywiście istnieje możliwość definiowania własnych typów danych ale jest to temat na inny artykuł – póki co przyjrzymy się tym, które mamy do dyspozycji od ręki.
Aby dowiedzieć się jakie typy mamy do dyspozycji warto odpytać widok systemowy sys.types z poziomu dowolnej bazy danych, pozwala on na zapoznanie się z podstawowymi typami i ich charakterystykami. Na tym etapie wyświetlimy sobie nazwę typu, maksymalną długość, precyzję oraz skalę:
SELECT name, max_length, precision, scale FROM sys.types
Jak widać typów danych jest całkiem sporo, część z nich ma charakter substytucyjny i to my powinniśmy wybrać odpowiedni. Każdy z wymienionych typów danych możemy pogrupować według przeznaczenia i właśnie po tych grupach będziemy je omawiać-pierwszą z nich są typy tekstowe.
Jeśli chodzi o wartości tekstowe to mamy do dyspozycji 3 typy:
- char(n)
- varchar(n)
- text
W typowych zastosowaniach bazodanowych stosujemy char (n) oraz varchar(n) gdzie n to ilość znaków. Jakie wartości możemy podstawić pod n? Możemy to sprawdzić w sys.types lub na powyższym zrzucie ekranowym w kolumnie max length, tak więc dla typów char oraz varchar możemy podstawić od 1 do 8000 znaków. Każdy znak zajmuje 1 bajt – co za tym idzie powinniśmy stosować jak najmniejsze typy aby zaoszczędzić miejsce w naszej bazie danych czy też zapytaniu. Warto również zapamiętać, że w momencie gdy tworzymy tabelę czy też zmienną i nie podamy N czyli długości typu to automatycznie podstawiana jest wartość 1, jeżeli natomiast konwertujemy dane i nie podamy długości N to automatycznie podstawiana jest wartość 30.
Jaka jest więc różnica pomiędzy char i varchar? Jeśli mamy wartość typu np. char(30) i wstawimy do niej krótszą wartość tekstową np.”KOT”, która jak widać ma 3 znaki to pozostałe 27 znaków zostanie uzupełnione spacjami. W takim samym przypadku ale dla kolumny typu varchar(30) wartość nie zostanie uzupełniona spacjami. W tym miejscu może pojawić pytanie w jakim celu stosować char(n)? Odpowiedź jest bardzo prosta – wtedy gdy wiemy, że wartości w danej kolumnie będą zawsze zajmować określoną liczbę znaków jak np. kod pocztowy. Gdy nie mamy pewności powinniśmy stosować typ varchar(n). Aby zobrazować ten fakt wykonamy poniższe pytanie
SELECT CAST('ABC' AS CHAR(8)) AS CharColumn, CAST('ABC' AS VARCHAR(8)) AS VarcharColumn
Póki co nie zajmujemy się funkcją CAST, przyjmijmy zapytanie jako czarną skrzynkę. Kolumna CharColumn zwraca wartość typu CHAR(8), a kolumna VarcharColumn zwraca wartość typu VARCHAR(8) w rezultacie otrzymamy:
- W kolumnie CharColumn wartość ‘ABC ‘
- W kolumnie VarcharColumn wartość ‘ABC’
Ale to jeszcze nie wszystko – powyższe typy posiadają również swoje odpowiedniki z poprzedzającą literą n tj. nchar(n) oraz nvarchar(n) – jaka jest między nimi różnica? Otóż typy z n mogą przechowywać znaki unicode, a więc w przypadku gdy posiadamy teksty unicode powinniśmy stosować typy z prefixem n. W tym miejscu może zachodzić pokusa stosowania typów unicode zawsze – jednak nie jest to dobra praktyka ponieważ zajmują one 2 raz więcej miejsca w porównaniu do typów nieunicodowych tj. 2 bajty na każdy znak.
Aby sprawdzić ile bajtów zajmuje określona wartość możemy użyć funkcji DATALENGTH(column), gdzie jako column podstawiamy konkretną wartość lub kolumnę. Aby zobaczyć różnicę w wielkości typów danych uruchomimy poniższe zapytanie:
SELECT DATALENGTH('AAA') AS NonUnicodeColumn, DATALENGTH(N'AAA') AS UnicodeColumn
Wraz z tym przykładem można zauważyć kolejny fakt związany z typami tekstowymi, a mianowicie gdy chcemy aby nasz tekst był automatycznie rozpoznany przez SQL Server jako typ unicode wartość w apostrofach należy poprzedzić literą N – dobrą praktyką jest trzymanie tej zasady w każdym przypadku. Jako rezultat powyższego zapytania otrzymaliśmy:
Tak więc widzimy, iż typy unicode zajmują dwa razy więcej miejsca niż typu nie-unicodowe.
Ostatnim typem tekstowym jaki sobie omówimy jest typ text. Jest to specjalny typ pozwalający na przechowywanie bardzo długich ciągów znaków tj. takich które nie mieszczą się w typach standardowych. Zgodnie z dokumentacją typ text może pomieścić do 2,147,483,647 znaków. Podobnie jak opisywane wcześniej typy tak również text posiada swój odpowiednik unicode czyli ntext, który również zajmuje 2 bajty na znak i może pomieścić do 1,073,741,823 znaków.
Typ ten jest jednak wycofywany z SQL Server i powinniśmy w naszych bazach używać typu nowszego tj. varchar(max), który może pomieścić do 2GB wartości tekstowych. Oczywiście w razie potrzeby mamy również do dyspozycji typ unicode nvarchar(max).
Typy tekstowe są nieodłączoną częścią każdego systemu bazodanowego, nie inaczej jest z SQL Server. Mam nadzieję, że niniejszy artykuł pozwoli Wam dogłębniej zrozumieć tekstowe typy danych. W następnym epizodzie poruszymy tematykę typów daty i czasu – ZAPRASZAM!
Spis dostępnych artykułów w ramach serii znajdziesz tutaj.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Przejrzyście. Dzięki.
Dziękuję za poświęcony czas na lekturę!
Świetny artykuł. Bardzo jasno wytłumaczone. Mam pytanie: co się stanie, gdy w wiersz w kolumnie określonej jako char (4) dodam wartość z liczbą znaków większą niż 4, np. 10?
Cześć! Dostaniemy błąd i operacja się niepowiedzie:)
Dziękuję za odpowiedź:)