Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:m290_guko:learningunits:lu05:theorie:a_ddl [2026/08/13 16:06] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1de:modul:m290_guko:learningunits:lu05:theorie:a_ddl [2026/09/14 09:31] (aktuell) – gkoch
Zeile 1: Zeile 1:
 +====== LU05a - Datentypen in MySQL ======
 +
 +===== Lernziele =====
 +  * Ich kann erklären, warum jede Spalte einen Datentyp braucht.
 +  * Ich kenne die wichtigsten MySQL-Datentypen und weiss, wofür sie eingesetzt werden.
 +  * Ich kann für eine gegebene Information den passenden Datentyp auswählen und meine Wahl begründen.
 +
 +
 +===== Warum Datentypen? =====
 +In LU04 haben wir geplant, **welche** Tabellen und Spalten es geben soll. Bevor wir die Tabellen anlegen, müssen wir für jede Spalte festlegen, **welche Art von Werten** dort hineindarf.
 +
 +Erinnern Sie sich an LU02: Beim Import von //imdb_top_1000// hat WebStorm **alle** Spalten als Text angelegt. Das hat Folgen:
 +
 +<WRAP center box round 80%>
 +<code sql>
 +SELECT Series_Title, Meta_score
 +FROM imdb_top_1000
 +ORDER BY Meta_score DESC;
 +</code>
 +</WRAP>
 +
 +Diese Abfrage zeigt ganz oben Filme mit dem Wert **99** – obwohl es Filme mit **100** gibt. Der Grund: Text wird **alphabetisch** sortiert. Wie //Anna// vor //Berta// kommt, kommt //100// vor //99//, weil die 1 vor der 9 steht. Wäre die Spalte als Zahl angelegt, würde korrekt sortiert.
 +
 +Der richtige Datentyp sorgt also dafür, dass
 +
 +  * **richtig sortiert und gerechnet** wird,
 +  * **falsche Eingaben abgewiesen** werden (ein Geburtsdatum kann kein Text sein),
 +  * **Speicherplatz sinnvoll** genutzt wird und Abfragen schnell bleiben.
 +
 +
 +===== Die wichtigsten Datentypen =====
 +
 +Wir gehen nicht die ganze MySQL-Dokumentation durch, sondern die Typen, die Sie in diesem Modul tatsächlich brauchen. Als durchgehendes Beispiel dient eine **Bibliothek** mit einer Tabelle //buch//.
 +
 +==== Zahlen ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:number.png?nolink&80 }}
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Beispiel in der Tabelle buch ^
 +| **INT** | Ganze Zahlen ohne Nachkommastellen | //seiten// (350), //buch_id// (1, 2, 3 …) |
 +| **DECIMAL(M,D)** | Kommazahlen mit **exakter** Genauigkeit. M = Stellen gesamt, D = Nachkommastellen | //preis// als DECIMAL(6,2) → bis 9999.99 |
 +| **FLOAT** / **DOUBLE** | Kommazahlen mit **ungefährer** Genauigkeit | Messwerte, Sensordaten – bei uns selten |
 +</WRAP>
 +
 +<WRAP center round important 80%>
 +**Geldbeträge immer DECIMAL, nie FLOAT.**\\
 +FLOAT speichert Zahlen nur näherungsweise. Bei Preisen führt das zu Rundungsfehlern, die sich über viele Datensätze aufsummieren – in einer Rechnung fehlen dann plötzlich ein paar Rappen.
 +</WRAP>
 +
 +==== Text ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:string.png?nolink&80 }}
 +
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Beispiel in der Tabelle buch ^
 +| **VARCHAR(n)** | Text mit **variabler** Länge, bis n Zeichen. Der Normalfall für Text. | //titel// als VARCHAR(100) |
 +| **CHAR(n)** | Text mit **immer gleicher** Länge | //isbn// als CHAR(13), Ländercodes wie CH oder FR |
 +| **TEXT** | Sehr lange Texte ohne feste Obergrenze | Inhaltsangabe, Rezension |
 +</WRAP>
 +
 +Faustregel: **VARCHAR ist die Standardwahl.** CHAR nur, wenn die Länge wirklich immer gleich ist. TEXT nur für lange Fliesstexte.
 +
 +==== Datum und Zeit ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:date_time.png?nolink&80 }}
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Format ^
 +| **DATE** | Nur ein Datum | 2026-09-07 (YYYY-MM-DD) |
 +| **TIME** | Nur eine Zeit | 14:30:00 (hh:mm:ss) |
 +| **DATETIME** | Datum **und** Uhrzeit | 2026-09-07 14:30:00 |
 +| **TIMESTAMP** | Wie DATETIME, kann sich beim Ändern eines Datensatzes automatisch aktualisieren | 2026-09-07 14:30:00 |
 +| **YEAR** | Ein Jahr | 1965 |
 +</WRAP>
 +Die Frage lautet immer: **Brauche ich die Uhrzeit?** Bei einem Erscheinungsdatum nicht (DATE), bei einer Ausleihe schon (DATETIME).
 +
 +==== Ja oder Nein ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:boolean.png?nolink&80 }}
 +
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Werte ^
 +| **BOOLEAN** | Genau zwei Zustände | true/false bzw. 1/0 |
 +</WRAP>
 +
 +
 +Beispiel: //ausgeliehen// – ein Buch ist ausgeliehen oder nicht. MySQL speichert BOOLEAN intern als TINYINT, deshalb sehen Sie in der Tabelle 0 und 1.
 +
 +
 +===== Beispiel Buch =====
 +
 +{{:de:modul:m290_guko:learningunits:lu05:theorie:datentypen_book_small.png?direct&700|Buch mit Datentypen}}
 +
 +<WRAP center box round 80%>
 +^ Spalte ^ Datentyp ^ Warum? ^
 +| buch_id | INT | Fortlaufende ganze Zahl |
 +| titel | VARCHAR(100) | Titel sind unterschiedlich lang |
 +| isbn | CHAR(13) | Eine ISBN hat immer genau 13 Stellen |
 +| seiten | INT | Ganze Zahl, keine halben Seiten |
 +| preis | DECIMAL(6,2) | Geldbetrag, exakt auf zwei Nachkommastellen |
 +| erschienen | DATE | Datum ohne Uhrzeit |
 +| ausgeliehen | BOOLEAN | Ja oder nein |
 +</WRAP>
 +
 +
 +===== Häufige Fehler =====
 +
 +<WRAP center round tip 80%>
 +  * **Preis als FLOAT** → Rundungsfehler. Nehmen Sie DECIMAL.
 +  * **Telefonnummer als INT** → führende Nullen verschwinden (aus 0791234567 wird 791234567). Telefonnummern sind Text, nicht Zahlen – man rechnet nie damit.
 +  * **Datum als VARCHAR** → man kann weder sortieren noch Zeiträume berechnen.
 +</WRAP>
 +
 +Merken Sie sich die Faustregel: **Rechnet man damit, ist es eine Zahl. Sortiert man danach zeitlich, ist es ein Datum. Alles andere ist Text.**
 +
 +
 +===== Hinweis =====
 +Jedes DBMS (MySQL, PostgreSQL, Oracle …) bietet leicht unterschiedliche Datentypen. In diesem Modul arbeiten wir mit **MySQL** und beschränken uns auf die hier vorgestellten Typen.
 +Eine detaillierte Übersicht über alle MySQL-Datentypen finden Sie auf der offiziellen Dokumentation: [[https://dev.mysql.com/doc/refman/9.7/en/data-types.html|MySQL Docs Datentypen]]
 +
 +----
 +{{tag>M290-LU05}}
 +[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Guido Koch