den här artikeln handlar om många olika SQL-datatyper som vi använder när vi arbetar med SQL Server. Vi kommer att börja med en snabb överblick och gå igenom några saker som kategorier av datatyper, vilka objekt vi kan arbeta med, och hur man skapar våra egna datatyper.
översikt över SQL-datatyper
för att sparka saker av, låt oss prata om vad som är en datatyp. Om jag var tvungen att definiera det, skulle jag säga att datatypen bestämmer typ, storlek och intervall av data som kan lagras i ett objekt., Så, detta leder oss till en fråga om objekt som har datatyper:
- kolumner
- variabler
- uttryck
- parametrar
dessa fyra SQL-datatyper av objekt är av högsta vikt. Kolumner är uppenbarligen för tabeller. Varje gång vi skapar en variabel måste vi också tilldela en datatyp till den. Utöver dessa har vi uttryck och parametrar för att avsluta listan över objekt som kommer att hålla data och därför måste vi ange vilken typ av data de kommer att innehålla.,
gå vidare, Låt oss se de tre kategorierna av datatyper:
- inbyggda datatyper
- användardefinierade alias datatyper
- användardefinierade common language runtime (CLR) datatyper
det finns inte mycket att säga om den första kategorin. Det här är datatyper som vi alla är vana vid. Nedan finns ett diagram som listar välkända inbyggda datatyper och deras intervall:
- Obs: Text, ntext och bild SQL datatyp kommer att tas bort i en framtida version av SQL Server. Det är lämpligt att undvika att använda dessa datatyper i nytt utvecklingsarbete., Använd varchar(max), nvarchar(max) och varbinary (max) datatyper istället.
därefter har vi det vi nämnde i början, och det är användardefinierade aliasdatatyper som tillåter oss att skapa våra egna datatyper baserat på den inbyggda listan ovan.
den sista kategorin är användardefinierade datatyper för common language runtime (CLR) som tillåter oss att skapa våra egna datatyper med hjälp av.Net Framework., Det här är lite mer komplicerat än ovanstående och kräver programmeringsförmåga för att bygga en sammansättning, registrera den sammansättningen i SQL Server, skapa en ny SQL – datatyp baserat på den sammansättningen och sedan kan vi börja använda den nyskapade datatypen i SQL Server.
SQL datatyper överväganden
låt oss gå vidare till nästa avsnitt som är i princip bara teori, men definitivt något som du bör tänka på när du lagrar data antingen permanent eller tillfälligt.,
konvertering
som databasutvecklare konverterar en av de vanligaste rutinerna när man skriver kod. Konvertering sker när data från ett objekt flyttas, jämförs eller kombineras med data från ett annat objekt. Dessa omvandlingar kan hända automatiskt, vad vi kallar Implicit konvertering i SQL Server eller manuellt som kallas Explicit konvertering vilket i princip innebär att skriva kod specifikt att göra något. En användbar tumregel är att explicit konvertering alltid är bättre än implicit konvertering eftersom det gör koden mer läsbar., Nu när vi pratar om konverteringar är det också värt att nämna de saker som kan hjälpa oss med den uttryckliga konverteringen som CAST och CONVERT-funktioner som används för att konvertera ett uttryck för en SQL-datatyp till en annan.
GUID
GUID är en akronym för globalt unik identifierare. Det är ett sätt att garantera unikhet och det är en av de största SQL-datatyperna. Den enda nackdelen med GUID är 16 byte i storlek. Undvik därför index på guider så mycket som möjligt.
NULL vs., Inte NULL
om du håller fast vid SQL Server-Standard kan det leda till vissa dataintegritetsproblem. Du bör alltid försöka ange egenskapen ogiltighet när du definierar kolumner i tabeller. Tillbaka till grunderna betyder null okänt eller saknas vilket i princip betyder att det inte är 0 eller en tom sträng, och vi kan inte göra null-jämförelsen. Vi kan inte säga null = null. Detta är ett nej kan göra. Det finns en egenskap som heter ANSI_NULLS som vi kan ställa in och styra denna jämförelse med null-värden.,
glesa kolumner
denna typ av kolumn är bara en vanlig kolumn i SQL Server utom för en egenskap som är inställd på på och det talar SQL Server för att optimera den kolumnen för null Lagring.
riktlinjer för SQL-datatyp
använd först alltid rätt datatyp för jobbet. Det här är mycket större än de flesta tror. Det kan ha en betydande inverkan på effektivitet, prestanda, lagring och ytterligare databasutveckling.
om vi tar de två första kommer query optimizer att generera en exekveringsplan beroende på vilka datatyper som används., Ett mycket enkelt exempel kan vara om vi använder bigint-datatypen där vi kunde använda smallint-då är vi troligtvis bara att sakta ner frågan. Att välja rätt SQL datatyp kommer i slutändan att resultera i query optimizer arbetar mer effektivt.
det är en bra idé att tillhandahålla dokumentation för dig själv och andra som använder databasen om datatyper som går in i objekten. Det är självklart, men undvik föråldrade datatyper, Kontrollera alltid Microsofts senaste dokumentation för Nyheter och uppdateringar., Om det finns en liten chans att du ska arbeta med icke-engelska data, använd alltid Unicode-datatyper. Använd dessutom sysname-datatyperna för de administrativa skripten över nvarchar.
SQL data type examples
låt oss hoppa över till SSMS och se hur vi kan arbeta med några av de datatyper som nämns i föregående avsnitt. Vi går igenom konverteringar, glesa kolumner och aliasdatatyper.
konvertering
Casta, konvertera och tolka funktioner Konvertera ett uttryck för en SQL-datatyp till en annan., Nedan följer ett exempel fråga som kan användas på ett prov ”AdventureWorks” databas mot ”TransactionHistory” tabellen. Det griper ”ProductID” och ”TransactionDate” från vilket vi kan använda det datumet för transaktionen för att se hur konverteringen fungerar:
här är resultatuppsättningen av olika SQL-datatyper:
Vi använde Cast-funktionen mot TransactionDate för att konvertera värden till en nvarchar till en längd av 30. Därefter använde vi Konvertera för att göra samma sak men då angav vi också formatet 110 vilket ger oss en viss datumstil., Sist, vi använde Parse som i huvudsak fungerar på samma sätt, men vi kan tillämpa kultur på det.,titta på resultatuppsättningen och se vad vi fick:
- här har vi datum och tid för transaktionen som den sitter i databasen (datetime datatyp)
- här är hur det ser ut när vi kastar det som en textrepresentation
- konvertering gör samma sak men i det här fallet specificerar vi hur konverteringsfunktionen kommer att översätta uttryck (110 = mm-dd-dd). yyyy)
- tolkning i det här fallet översätter du bara begärda data med hjälp av specifik kultur (en-US)
nästa, låt oss se några extra saker som vi kan göra med parse-funktionen., Parse är bra med att konvertera strängar till datum och heltal. Om vi till exempel utför select-satsen nedan kommer den att ta tag i strängen 100.000 och göra den till ett heltal:
1
|
välj parse(’100.,/Div>
|
här är resultatuppsättningen:
låt oss nu säga att vi vill göra samma sak igen men av någon anledning har heltalet ett tecken i det att SQL Server inte kan konvertera till ett heltal:
1
|
välj parse (’10o.,Stringtointerror;
|
här är felmeddelandet som det kastar:
Msg 9819, nivå 16, stat 1, rad 2
Felkonvertering av strängvärde ’10O.000′ till datatyp int med kultur ”.,
Så, vad vi kan göra i det här fallet är att använda Try_Parse istället för vanlig Parse eftersom om vi försöker samma sak ovanifrån kommer det att returnera ett null-värde snarare än felet:
1
|
välj try_parse(’10O.,
|
Här är hur det ser ut:
den här metoden kan användas som en identifierare om något skulle fel i förväg AKA defensiv kodning. Försök kan tillämpas för de andra två SQL datatyper samt.
glesa kolumner
som jag nämnde i början minskar glesa kolumner null-utrymmeskraven., So, let’s jump to Object Explorer in our sample database, locate and query BillOfMaterials table to see how this works:
1
2
|
SELECT *
FROM Production.,BillOfMaterials bom;
|
Observera att det finns många null-värden inom kolumnerna ProductAssemblyID och EndDate:
därför kan vi säga att dessa två är bra kandidater för glesa kolumner., Så, ett sätt att ändra detta är att helt enkelt ändra egenskapen i formgivaren eller vi kan göra det med T-SQL-koden underifrån:
1
2
3
4
|
ändra tabellproduktion.BillOfMaterials ÄNDRA KOLUMN ProductAssemblyID LÄGGA till GLES;
ÖPPNA
ALTER TABLE Produktion.,BillOfMaterials ALTER COLUMN ENDDATE ADD SPARSE;
GO
|
kommandon slutförde inte framgångsrikt första gången, så jag var tvungen att förlora det klustrade indexet (linje 7) och sedan gick allt smidigt:
om vi går tillbaka till Object Explorer, uppdatera tabellen billofmaterials, kan vi se att dessa två är nu markerade som glesa kolumner:
trevligt, höger. En mer snygg sak om glesa kolumner kallas kolumnsatser., Detta är användbart i en situation när vi har en tabell som innehåller ett gäng speciella ändamål kolumner som sällan används, som i vårt exempel ProductAssemblyID och EndDate kolumner eller AddressLine2, MiddleName, etc. Så tanken med kolumnuppsättningen är att SQL Server tar alla dessa kolumner och ger oss en genererad XML-kolumn som är uppdaterbar. Detta kan leda till en prestandaökning av programmet eftersom SQL Server kan arbeta med kolumnuppsättningen snarare än med varje gles kolumn individuellt.,
So, let’s add a column set using those two examples from above using the following command:
1
2
3
|
ALTER TABLE Production.,BillOfMaterials
Lägg till SparseColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
gå
|
så, om vi försöker lägga till en kolumnuppsättning men vårt bord har redan glesa kolumner, kommer det att fela ut:
Msg 1734, nivå 16, nivå 16, nivå 16, Det går inte att skapa den glesa kolumnuppsättningen ”SparseColumns” i tabellen ”BILLOFMATERIALS” eftersom tabellen redan innehåller en eller flera glesa kolumner. En gles kolumnuppsättning kan inte läggas till i en tabell om tabellen innehåller en gles kolumn.,
om du någonsin stöter på detta, är det enklaste lösningen att ångra glesa kolumner. Detta kan enkelt göras i formgivaren. Bara öppna den från Object Explorer, välj den kolumn som du behöver, och inom kolumnegenskaperna ändra egenskapen Is Parse till nej som visas nedan:
Nu, om vi kör kommandot en gång till, kommer det att lyckas:
den nedersta raden här, lägg inte till glesa kolumner först – Lägg till kolumn anger först och sedan glesa kolumner. På så sätt behöver du inte göra det på det svåra sättet., Vad är riktigt snyggt med detta, våra DML-uttalanden som Välj, Infoga och uppdatera kan fortfarande fungera på det gamla sättet genom att referera kolumnerna individuellt eller vi kan göra det med kolumnuppsättningarna.
användardefinierade SQL-datatyper
låt oss avsluta saker med att skapa en egen datatyp. Vi kommer att skapa en alias datatyp som är baserad på en annan datatyp. Låt oss bara säga att vi har ett behov av att lagra webbadresser i vår tabell och vi vill skapa en verklig URL datatyp., All we need to do is execute the code from below:
1
2
3
|
CREATE TYPE url
FROM varchar(2048) NOT NULL
GO
|
URLs are just characters, so the varchar data type is perfect for this., Jag har ställt in max-värdet till 2048 på grund av den här tråden som jag har hittat online som säger att du ska hålla dina webbadresser under 2048 tecken:
Vi kan se den här nya SQL-datatypen om vi går över Object Explorer, under programmerbarhet, typer, användardefinierade datatyper mapp:
härifrån, vi kan börja använda den nyskapade datatypen., Just an example:
1
2
3
|
ALTER TABLE Purchasing.Vendor
ADD PurchasingWebServiceURL2 url NULL
GO
|
Conclusion
In this article, we learned how to implement SQL data types., Vi startade med en översikt bara för att bekanta oss med några av de inbyggda datatyperna. Sedan pratade vi om några saker att tänka på när man arbetar med datatyper och konvertering med Cast, konvertera och tolka funktioner. Vi hoppade också in i SSMS där vi visade hur man konverterar ett uttryck av en datatyp till en annan. Vi gick igenom hur man arbetar med glesa kolumner, och sedan såg vi också hur man skapar våra egna datatyper.
Jag hoppas att den här artikeln om SQL datatyper har varit informativ för dig och jag tackar dig för att du läste den.,
- författare
- Senaste inlägg
han har skrivit mycket om både SQL Shack och ApexSQL Solution Center, om ämnen som sträcker sig från klientteknik som 4K-upplösning och teman, felhantering till indexstrategier och prestandaövervakning.
Bojan fungerar på ApexSQL i Nis, Serbien som en integrerad del av det team som fokuserar på att designa, utveckla och testa nästa generation av databas verktyg, bland annat MySQL och SQL Server, och både fristående verktyg och integration i Visual Studio, SSMS, och VSCode.,
se mer om Bojan på LinkedIn
Visa alla inlägg av Bojan Petrovic
- Visual Studio Code for MySQL and MariaDB development – August 13, 2020
- SQL UPDATE syntax explained – July 10, 2020
- Skapa vy SQL: arbeta med indexerade vyer i SQL Server – Mars 24, 2020