SQL: Datentypen für Zeichenketten

Bei dem Begriff Datentyp handelt es sich um den Wertebereich, den die Daten einer Spalte annehmen können. Jede Spalte kann nur Werte eines bestimmten Datentyps speichern. Die richtige Erfassung von Datentypen kann zu signifikanten Speichereinsparungen und folglich zu einer besseren Datenbankleistung führen.

Kategorien von Datentypen:

    1. Datentypen für Zeichenketten
    2. Numerische Datentypen
    3. Datentypen für Datums- und Uhrzeitwerte

In diesem Artikel konzentriere ich mich auf die wichtigsten Datentypen für Zeichenketten. Man unterscheidet Datentypen mit fester und variabler Länge:

      1. CHAR (feste Länge)
      2. VARCHAR (variable Länge)

1. CHAR (CHARACTER):
Datentyp für Strings fester Länge. In MySQL kann dieser Datentyp 255 Zeichen aufnehmen.

Syntax: CHAR(M)
Wertebereich: M liegt zwischen 0 und 255. Wird M nicht angegeben, ist die Länge standardmäßig 1.
Benötigter Speicherplatz: M Byte
Nutzung: für Datensätze mit konstanter Länge (z.B. Postleitzahlen mit CHAR(5))

Beachtet werden muss hier, dass der Server immer die angegebene Länge verwendet, d. h. kürzere Inhalte werden bei Bedarf rechts mit Leerzeichen aufgefüllt und es wird für jeden Datensatz dieselbe Menge an Speicherplatz belegt. Somit wird dieser Datentyp hauptsächlich für Felder genutzt, deren Länge konstant ist, da man seine Datenbank nicht mit Leerzeichen „zumüllen“ möchte.

2. VARCHAR (CHARACTER VARYING):
Datentyp für Strings variabler Länge. In MySQL bietet dieser Datentyp Platz für 65.535 Byte. Beachtet werden muss hier, dass MySQL für Werte bis 255 Bytes ein Längenbyte zum Speichern nutzt und für Werte mit mehr als 255 Bytes 2 Längenbytes benötigt. Zusätzlich verbrauchen alle VARCHAR-Spalten nur den für die Zeichenkette tatsächlich benötigten Platz.

Syntax: VARCHAR(M)
Wertebereich: M liegt zwischen 0 und 65.535.
Benötigter Speicherplatz: 1 + M Byte (für M ≤ 255) oder 2 + M Byte (für 256 ≤ M ≤ 65535)
Nutzung: für Datensätze variabler Länge (z.B. Name und Vorname mit VARCHAR(45))

In unserer Testdatenbank sakila haben wir z. B. die beiden Spalten „first_name“ und „last_name“, die mit den Datentyp VARCHAR definiert sind, hier jeweils mit einer maximalen Länge von 45 Zeichen. Sobald versucht wird einen Datensatz mit einem Vor- oder Nachnamen mit mehr als 45 Zeichen hinzuzufügen werden alle Zeichen > 45 abgeschnitten.

Beachte, wenn der Strict SQL Modus* standardmäßig aktiviert ist, werden keine ungültigen Werte in Insert- oder Updateanweisungen akzeptiert und es erfolgt eine Fehlermeldung bei dem Versuch Datensätze mit einer Länge > M zu laden:

CHAR vs VARCHAR:

Nun stellt sich die Frage: Wann nutze ich die Datentypen und hat das eine Auswirkung auf meine Datenbank?
Wie wir gelernt haben sind die Datentypen CHAR und VARCHAR ähnlich, werden aber auf unterschiedliche Weise gespeichert.
Bei CHAR-Feldern, also einem Datentyp mit fester Breite, wird immer dieselbe Menge an Speicherplatz unabhängig vom Wert belegt. Man erhält genau das, was man zugewiesen hat. Beispielsweise weist CHAR(15) 15 Byte zu und speichert sie, sogar wenn der Wert NULL ist.

Bei VARCHAR-Feldern, also einen Datentyp mit variabler Länge, werden zusätzliche Bytes benötigt, um die Länge der Daten zu speichern. VARCHAR(15) weist beispielsweise dynamisch bis zu 16 Bytes zu, bis zu 15 für Daten und mindestens 1 zusätzliches Byte (bis M≤255), um die Länge der Daten zu speichern.

Auf der MySQL-Seite findet ihr diese Tabelle**, die den Unterschied zwischen CHAR und VARCHAR veranschaulicht, indem sie das Ergebnis der Speicherung verschiedener Zeichenfolgenwerte in den Spalten CHAR(4) und VARCHAR(4) aufzeigt:

Somit macht es Sinn bei Datensätzen mit fester Länge leistungsmäßig CHAR zunutzen, da weniger Speicherplatz benötigt wird.

*Ab MySQL 5.6.11 erzeugt der Strict SQL Modus einen Fehler bei Versuchen einen Datensatz zu erstellen, der die maximale Länge des definierten Datentyps überschreitet. Zuvor führte dies zu einer Warnung und zu einer Kürzung des Datenwertes auf die maximal definierte Datenlänge (genauso wie wenn der strikte Modus nicht aktiviert ist). Siehe: https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict

Der Strict SQL Modus kann mit folgenden SQL-Befehl deaktiviert werden:
SET SESSION sql_mode = „NO_ENGINE_SUBSTITUTION“;

** https://dev.mysql.com/doc/refman/5.7/en/char.html

(Visited 4.483 times, 12 visits today)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert