In diesem Artikel geht es um viele verschiedene SQL-Datentypen, die wir bei der Arbeit mit SQL Server verwenden. Wir beginnen mit einem schnellen Überblick und gehen einige Dinge durch, wie Kategorien von Datentypen, mit welchen Objekten wir arbeiten können und wie wir unsere eigenen benutzerdefinierten Datentypen erstellen.
Übersicht über SQL-Datentypen
Lassen Sie uns zum Auftakt darüber sprechen, was ein Datentyp ist. Wenn ich es definieren müsste, würde ich sagen, dass der Datentyp die Art, Größe und den Bereich der Daten bestimmt, die in einem Objekt gespeichert werden können., Dies bringt uns also zu einer Frage von Objekten mit Datentypen:
- Spalten
- Variablen
- Ausdrücke
- Parameter
Diese vier SQL-Datentypen von Objekten sind von höchster Bedeutung. Spalten sind offensichtlich für Tabellen. Jedes Mal, wenn wir eine Variable erstellen, müssen wir ihr auch einen Datentyp zuweisen. Zusätzlich zu diesen haben wir Ausdrücke und Parameter, um die Liste der Objekte abzuschließen, die Daten enthalten, und daher müssen wir angeben, welche Art von Daten sie enthalten.,
Sehen wir uns die drei Kategorien von Datentypen an:
- Integrierte Datentypen
- Benutzerdefinierte Alias-Datentypen
- Benutzerdefinierte CLR-Datentypen (Common Language Runtime)
Über die erste Kategorie gibt es nicht viel zu sagen. Dies sind Datentypen, an die wir alle gewöhnt sind. Nachfolgend finden Sie eine Tabelle mit bekannten integrierten Datentypen und deren Bereichen:
- Hinweis: Der SQL-Datentyp Text, Ntext und Image wird in einer zukünftigen Version von SQL Server entfernt. Es ist ratsam, die Verwendung dieser Datentypen in neuen Entwicklungsarbeiten zu vermeiden., Verwenden Sie stattdessen die Datentypen varchar(max), nvarchar(max) und varbinary(max).
Als nächstes haben wir das, was wir am Anfang erwähnt haben, und dies sind benutzerdefinierte Alias-Datentypen, mit denen wir basierend auf der obigen integrierten Liste eigene Datentypen erstellen können.
Die letzte Kategorie sind benutzerdefinierte Common Language Runtime (CLR) – Datentypen, mit denen wir mithilfe des.NET-Frameworks eigene Datentypen erstellen können., Dies ist etwas komplizierter als das Obige und erfordert Programmierkenntnisse, um eine Assembly zu erstellen, diese Assembly im SQL Server zu registrieren, einen neuen SQL-Datentyp basierend auf dieser Assembly zu erstellen und dann den neu erstellten Datentyp in SQL Server zu verwenden.
Überlegungen zu SQL-Datentypen
Fahren wir mit dem nächsten Abschnitt fort, der im Grunde nur Theorie ist, aber definitiv etwas, worüber Sie nachdenken sollten, wenn Sie Daten entweder dauerhaft oder vorübergehend speichern.,
Konvertierung
Als Datenbankentwickler ist eine der häufigsten Routinen beim Schreiben von Code die Konvertierung. Die Konvertierung erfolgt, wenn Daten aus einem Objekt verschoben, verglichen oder mit Daten aus einem anderen Objekt kombiniert werden. Diese Konvertierungen können automatisch erfolgen, was wir implizite Konvertierung in SQL Server oder manuell nennen, die als explizite Konvertierung bezeichnet wird, was im Grunde bedeutet, Code speziell zu schreiben, um etwas zu tun. Eine nützliche Faustregel ist, dass die explizite Konvertierung immer besser ist als die implizite Konvertierung, da sie Code lesbarer macht., Jetzt, da wir über Konvertierungen sprechen, ist auch erwähnenswert, was uns bei der expliziten Konvertierung helfen kann, wie CAST-und CONVERT-Funktionen, die zum Konvertieren eines Ausdrucks eines SQL-Datentyps in einen anderen verwendet werden.
GUID
GUID ist eine Abkürzung für Global Unique Identifier. Es ist eine Möglichkeit, Einzigartigkeit zu gewährleisten, und es ist einer der größten SQL-Datentypen. Der einzige Nachteil von GUID ist die Größe von 16 Bytes. Vermeiden Sie daher Indizes für GUIDs so weit wie möglich.
NULL vs., NOT NULL
Wenn Sie bei den SQL Server-Standardeinstellungen bleiben, kann dies zu Problemen mit der Datenintegrität führen. Sie sollten immer versuchen, die nullability-Eigenschaft anzugeben, wenn Sie Spalten in Tabellen definieren. Zurück zu den Grundlagen bedeutet null unbekannt oder fehlt, was im Grunde bedeutet, dass es sich nicht um 0 oder eine leere Zeichenfolge handelt, und wir können den Nullvergleich nicht durchführen. Wir können nicht null = null sagen. Dies ist ein Nein tun kann. Es gibt eine Eigenschaft namens ANSI_NULLS, die wir diesen Vergleich mit Nullwerten festlegen und steuern können.,
Spärliche Spalten
Dieser Spaltentyp ist nur eine reguläre Spalte in SQL Server, mit Ausnahme einer Eigenschaft, die auf on festgelegt ist, und weist SQL Server an, diese Spalte für den Nullspeicher zu optimieren.
SQL-Datentyprichtlinien
Verwenden Sie zunächst immer den richtigen Datentyp für den Job. Das ist viel größer als die meisten Leute denken. Dies kann erhebliche Auswirkungen auf Effizienz, Leistung, Speicher und weitere Datenbankentwicklung haben.
Wenn wir die ersten beiden verwenden, generiert der Abfrageoptimierer je nach verwendetem Datentyp einen Ausführungsplan., Ein sehr einfaches Beispiel könnte sein, wenn wir den Bigint – Datentyp verwenden, bei dem wir den smallint verwenden könnten-na dann verlangsamen wir höchstwahrscheinlich nur die Abfrage. Die Auswahl des richtigen SQL-Datentyps führt letztendlich dazu, dass der Abfrageoptimierer effizienter arbeitet.
Es ist eine gute Idee, sich und anderen mithilfe der Datenbank Dokumentation zu Datentypen bereitzustellen, die in die Objekte eingehen. Es versteht sich von selbst, aber vermeiden Sie veraltete Datentypen, überprüfen Sie immer die neueste Dokumentation von Microsoft für die Nachrichten und Updates., Wenn die Wahrscheinlichkeit gering ist, dass Sie mit nicht englischen Daten arbeiten, verwenden Sie immer Unicode-Datentypen. Verwenden Sie außerdem die Datentypen sysname für die Verwaltungsskripte über nvarchar.
Beispiele für SQL-Datentypen
Springen wir zu SSMS und sehen, wie wir mit einigen der in den vorherigen Abschnitten genannten Datentypen arbeiten können. Wir gehen Konvertierungen, spärliche Spalten und Alias-Datentypen durch.
Konvertierung
Cast -, Convert-und Parse-Funktionen konvertieren einen Ausdruck eines SQL-Datentyps in einen anderen., Nachfolgend finden Sie eine Beispielabfrage, die für eine Beispieldatenbank „AdventureWorks“ für die Tabelle „TransactionHistory“ verwendet werden kann. Es greift nach „ProductID“ und“TransactionDate“, ab denen wir dieses Datum der Transaktion verwenden können, um zu sehen, wie die Konvertierung funktioniert:
Hier ist die Ergebnismenge verschiedener SQL-Datentypen:
Wir haben die Cast-Funktion gegen TransactionDate verwendet, um Werte in einen nvarchar in eine Länge von 30 zu konvertieren. Als nächstes haben wir Convert verwendet, um dasselbe zu tun, aber dann haben wir auch das Format 110 angegeben, das uns einen bestimmten Datumsstil gibt., Zuletzt haben wir Parse verwendet, das im Wesentlichen gleich funktioniert, aber wir können Kultur darauf anwenden.,schauen Sie sich die Ergebnismenge an und sehen Sie, was wir bekommen haben:
- Hier haben wir das Datum und die Uhrzeit der Transaktion, da sie sich in der Datenbank befindet (Datetime-Datentyp)
- Hier sieht es aus, wenn wir sie als Textdarstellung umwandeln
- Die Konvertierung macht dasselbe, aber in diesem Fall geben wir an, wie die Konvertierungsfunktion den Ausdruck übersetzt (110 = MM-TT-JJJJ)
- Parsing In diesem Fall werden nur die angeforderten Daten mithilfe einer bestimmten Kultur (en-US)
Als nächstes sehen wir einige zusätzliche Dinge, die wir mit der Parse-Funktion tun können., Parse eignet sich hervorragend zum Konvertieren von Zeichenfolgen in Datumsangaben und Ganzzahlen. Wenn wir beispielsweise die folgende Select-Anweisung ausführen, wird die Zeichenfolge 100.000 abgerufen und in eine Ganzzahl umgewandelt:
1
|
SELECT PARSE(‚100.,000‘ ALS INT) ALS StringPoInt;
|
Hier ist die Ergebnismenge:
Nehmen wir an, wir möchten dasselbe noch einmal tun, aber aus irgendeinem Grund enthält die Ganzzahl ein Zeichen, das SQL Server nicht in eine Ganzzahl konvertieren kann:
1
|
SELECT PARSE(’10O.,000 ‚ALS INT) ALS StringToIntError;
|
Hier ist die Fehlermeldung, die es auslöst:
Msg 9819, Level 16, Zustand 1, Zeile 2
Fehler beim Konvertieren des Stringwerts ’10O. 000′ in den Datentyp int mit culture „.,
Also, was wir in diesem Fall tun können, ist, Try_Parse anstelle von regulärem Parse zu verwenden, denn wenn wir dasselbe von oben versuchen, wird es einen Nullwert anstelle des Fehlers zurückgeben:
1
|
SELECT TRY_PARSE(’10O.,(‚AS INT) AS StringToIntNull;
|
So sieht es aus:
Diese Methode kann als Bezeichner verwendet werden, wenn etwas im Voraus ALS defensive Codierung ausgegeben wird. Versuche können auch für die beiden anderen SQL-Datentypen angewendet werden.
Spärliche Spalten
Wie ich eingangs erwähnt habe, reduzieren spärliche Spalten den Platzbedarf für Null., 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;
|
Beachten Sie, dass in den Spalten ProductAssemblyID und EndDate viele Nullwerte vorhanden sind:
Daher können wir sagen, dass diese beiden gute Kandidaten für spärliche Spalten sind., Eine Möglichkeit, dies zu ändern, besteht darin, einfach die Eigenschaft im Designer zu ändern, oder wir können dies mithilfe des T-SQL-Codes von unten tun:
1
2
div> 3
4
|
Tabellenproduktion ÄNDERN.BillOfMaterials ÄNDERN SPALTE ProductAssemblyID HINZUFÜGEN SPÄRLICH;
GO
ÄNDERN SIE DIE Tabellenproduktion.,BillOfMaterials ALTER COLUMN „EndDate“ HINZUFÜGEN SPÄRLICH;
GO
|
die Befehle nicht erfolgreich abgeschlossen die erste Zeit, so habe ich zu verlieren hatte, den clustered-index (Zeile 7) und dann ging alles glatt:
Wenn wir gehen, zurück zum Objekt-Explorer aktualisieren die BillOfMaterials Tabelle, können wir sehen, dass diese zwei sind nun markiert als sparse-Spalten:
Schön, richtig. Eine weitere nette Sache über spärliche Spalten heißt Spaltensätze., Dies ist nützlich in einer Situation, in der wir eine Tabelle haben, die eine Reihe von Spezialspalten enthält, die selten verwendet werden, wie in unserem Beispiel ProductAssemblyID und EndDate Spalten oder AddressLine2, MiddleName usw. Die Idee mit dem Spaltensatz ist also, dass SQL Server alle diese Spalten nimmt und uns eine generierte XML-Spalte gibt, die aktualisierbar ist. Dies kann zu einer Leistungssteigerung der Anwendung führen, da SQL Server mit dem Spaltensatz und nicht mit jeder spärlichen Spalte einzeln arbeiten kann.,
So, let’s add a column set using those two examples from above using the following command:
1
2
3
|
ALTER TABLE Production.,BillOfMaterials
ADD SparseColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS;
GO
|
Also, wenn wir versuchen, einen Spaltensatz hinzuzufügen, aber unsere Tabelle hat bereits spärliche Spalten, es wird ein Fehler ausgegeben:
Msg 1734, Level 16, Zustand 1, Zeile 9
Kann den spärlichen Spaltensatz ‚SparseColumns‘ in der Tabelle ‚BillOfMaterials‘ nicht erstellen, da die Tabelle bereits eine oder mehrere spärliche Spalten enthält. Ein spärlicher Spaltensatz kann einer Tabelle nicht hinzugefügt werden, wenn die Tabelle eine spärliche Spalte enthält.,
Wenn Sie jemals darauf stoßen, besteht die einfachste Problemumgehung darin, spärliche Spalten rückgängig zu machen. Dies kann leicht im Designer erfolgen. Öffnen Sie es einfach über den Objekt – Explorer, wählen Sie die gewünschte Spalte aus und ändern Sie innerhalb der Spalteneigenschaften die Eigenschaft Is Parse in No wie unten gezeigt:
Wenn wir den Befehl noch einmal ausführen, ist er erfolgreich:
Fügen Sie hier keine spärlichen Spalten hinzu-Fügen Sie Spaltensätze hinzu, die zuerst und dann spärliche Spalten. Auf diese Weise müssen Sie es nicht auf die harte Tour machen., Was wirklich ordentlich ist, unsere DML-Anweisungen wie Select, Insert und Update können immer noch auf die alte Weise funktionieren, indem wir auf die Spalten einzeln verweisen, oder wir können es mit den Spaltensätzen tun.
Benutzerdefinierte SQL-Datentypen
Lassen Sie uns die Dinge mit der Erstellung eines benutzerdefinierten Datentyps abschließen. Wir werden einen Alias-Datentyp erstellen, der auf einem anderen Datentyp basiert. Angenommen, wir müssen URLs in unserer Tabelle speichern und möchten einen tatsächlichen URL-Datentyp erstellen., 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., Ich habe den Maximalwert auf 2048 gesetzt, weil dieser Thread, den ich online gefunden habe, besagt, dass Sie Ihre URLs unter 2048 Zeichen halten sollten:
Wir können diesen neuen SQL-Datentyp sehen, wenn wir über den Objekt-Explorer gehen, unter Programmierbarkeit, Typen, benutzerdefinierte Datentypen Ordner:
Von hier aus können wir beginnen Sie mit dem neu erstellten Datentyp., 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., Wir starteten mit einer Übersicht, nur um uns mit einigen der integrierten Datentypen vertraut zu machen. Dann haben wir über einige Dinge gesprochen, die bei der Arbeit mit Datentypen und der Konvertierung mit Cast -, Convert-und Parse-Funktionen zu beachten sind. Wir sind auch in SSMS gesprungen, wo wir gezeigt haben, wie man einen Ausdruck eines Datentyps in einen anderen konvertiert. Wir haben durchgesehen, wie man mit spärlichen Spalten arbeitet, und dann haben wir auch gesehen, wie man eigene benutzerdefinierte Datentypen erstellt.
Ich hoffe, dass dieser Artikel über SQL-Datentypen für Sie informativ war und ich danke Ihnen, dass Sie ihn gelesen haben.,
- Author
- Recent Posts
Er hat ausführlich sowohl über die SQL Shack und die ApexSQL Solution Center geschrieben, zu Themen von Client-Technologien wie 4K-Auflösung und Theming, Fehlerbehandlung zu Indexstrategien und Performance-Monitoring.
Bojan arbeitet bei ApexSQL in Nis, Serbien, als integraler Bestandteil des Teams, das sich auf das Entwerfen, Entwickeln und Testen der nächsten Generation von Datenbank-Tools wie MySQL und SQL Server sowie auf Stand-Alone-Tools und Integrationen in Visual Studio, SSMS und VSCode konzentriert.,
Mehr über Bojan auf LinkedIn
Alle Beiträge von Bojan Petrovic anzeigen
- Visual Studio Code for MySQL and MariaDB development – 13. li>
- ANSICHT ERSTELLEN SQL: Arbeiten mit indizierten Ansichten in SQL Server – 24. März 2020