ProgrammierungBackend-Entwickler

Erklären Sie die Unterschiede zwischen Datentypen in SQL. Welche Fallstricke können bei Typinkonsistenzen auftreten, und wie beeinflusst dies die Leistung und Korrektheit von Abfragen? Geben Sie Beispiele an.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In SQL gibt es mehrere grundlegende Datentypen – Zeichenfolgen (z. B. VARCHAR, CHAR, TEXT), numerische Typen (INT, DECIMAL, FLOAT), Datums- und Zeitangaben (DATE, TIMESTAMP). Es ist sehr wichtig, den kleinsten geeigneten Typ für spezifische Daten auszuwählen, um Speicherplatz zu sparen und die Indizierung zu optimieren. Ein häufiger Fehler ist die Wahl eines Typs mit übermäßiger Länge (z. B. VARCHAR(255) anstelle von VARCHAR(50)), was zu unnötigen Ressourcenaufwand führen kann.

Ein weiterer wichtiger Unterschied betrifft die numerischen Typen: FLOAT speichert angenäherte Werte, während DECIMAL exakte Werte speichert, was für finanzielle Operationen nützlich ist. Der Vergleich von Zeichenfolgen unterschiedlicher Kodierungen kann ebenfalls unerwartete Ergebnisse liefern, wenn COLLATE nicht beachtet wird.

Beispiel:

-- Beispiel für die Arbeit mit Inkompatibilität von Typen declare @price varchar(10) = '100.99'; select @price + 1; -- Fehler: Es ist nicht möglich, eine Zeichenfolge und eine Zahl zu addieren -- Ohne explizite Typumwandlung funktioniert es nicht

Trickfrage.

Frage: Was passiert, wenn man ein Feld vom Typ VARCHAR mit einer Zahl vergleicht? Zum Beispiel: WHERE code = 123? Wird der Index schnell funktionieren?

Antwort: SQL versucht, die Zahl in eine Zeichenfolge umzuwandeln und sie als Zeichenfolgen zu vergleichen. Wenn jedoch für dieses Feld ein numerischer Index erstellt wurde, wird dieser bei einem Zeichenfolgenvergleich nicht verwendet, und die Abfrage wird langsamer. Es wird empfohlen, immer den strengen Datentyp zu verwenden und eine explizite Umwandlung vorzunehmen, wenn nötig.

Beispiel:

SELECT * FROM products WHERE code = '123'; -- Der Index kann verwendet werden SELECT * FROM products WHERE code = 123; -- Der Index wird NICHT verwendet, ein Full Scan ist möglich

Geschichte

In einem Online-Shop wurde das Feld "Preis" als VARCHAR gespeichert, um verschiedene Währungsformate zu unterstützen. Nach ein paar Jahren war es notwendig, die Produkte nach Preis zu sortieren: Die Sortierungen funktionierten nicht korrekt, und die Indizierung war unmöglich. Eine komplexe Migration und Typumwandlung war erforderlich, was Wochen dauerte.

Geschichte

In einer Bank verwendete ein Entwickler den Typ FLOAT, um Beträge zu speichern. Bei Berichten traten Abweichungen aufgrund von Rundungen auf, was nach einem Jahr zu erheblichen Fehlern bei der Verteilung von Prämien führte.

Geschichte

In den Logs eines Startups wurden Datum und Uhrzeit als Text (VARCHAR) gespeichert. Als es notwendig wurde, Intervalle zu berechnen, stellte sich heraus, dass die Zeiten überall in unterschiedlichen Formaten vorlagen, und die Berechnungen erforderten mühsames normierendes Parsing, was sich negativ auf die Leistung auswirkte.