Skip to content

Kapitel 17: Häufige Fehler und Lösungen ⭐⭐

In diesem Kapitel lernst du, wie man häufige MySQL-Fehler vermeidet und behebt!

17.1 Häufiger Fehler 1: Anmeldung fehlgeschlagen

Fehler: "Access denied for user"

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Ursachen und Lösungen:

1. Passwort falsch

bash
# ✅ Lösung 1: Passwort überprüfen (Groß-/Kleinschreibung!)
mysql -u root -p
# Dann Passwort eingeben

# ✅ Lösung 2: Passwort zurücksetzen (Windows)
# 1. MySQL Service stoppen
net stop mysql80

# 2. MySQL mit --skip-grant-tables starten
mysqld --skip-grant-tables --shared-memory

# 3. In einem neuen Terminal:
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'neues_passwort';

# 4. MySQL neu starten

2. MySQL-Service läuft nicht

bash
# Windows: Service prüfen
services.msc
# → Nach "MySQL" suchen → Rechtsklick → "Starten"

# Linux:
sudo systemctl status mysql
sudo systemctl start mysql

# Mac:
sudo launchctl load -F /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist

3. Berechtigungen fehlen

sql
-- Berechtigungen überprüfen
SHOW GRANTS FOR 'root'@'localhost';

-- Wenn nötig: Berechtigungen gewähren
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
FLUSH PRIVILEGES;

17.2 Häufiger Fehler 2: SQL-Anweisungen fehlgeschlagen

Fehler: "You have an error in your SQL syntax"

ERROR 1064 (42000): You have an error in your SQL syntax...

Ursachen und Lösungen:

1. Syntaxfehler (Rechtschreibung)

sql
-- ❌ Falsch: "SELET" statt "SELECT"
SELET * FROM users;

-- ✅ Richtig:
SELECT * FROM users;

2. Feldname / Tabellenname falsch

sql
-- ❌ Falsch: Tabellenname falsch geschrieben
SELECT * FROM user;  -- Tabelle heißt "users"!

-- ✅ Richtig: Tabellennamen überprüfen
SHOW TABLES;
SELECT * FROM users;

3. Constraints verletzt

ERROR 1062 (23000): Duplicate entry 'max' for key 'username'
sql
-- ❌ Falsch: UNIQUE Constraint verletzt
INSERT INTO users (username) VALUES ('max');  -- 'max' existiert bereits!

-- ✅ Richtig: Eindeutigen Wert verwenden
INSERT INTO users (username) VALUES ('max2');

17.3 Häufiger Fehler 3: Chinesische/Deutsche Zeichen sind fehlerhaft (乱码)

Fehler: "???" oder "åäö" wird angezeigt

Ursache: Encoding nicht auf UTF-8 gesetzt!

Lösungen:

1. Datenbank-Encoding überprüfen

sql
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

-- Erwartete Ausgabe (richtig):
/*
character_set_client    | utf8mb4
character_set_connection| utf8mb4
character_set_database  | utf8mb4
character_set_results   | utf8mb4
character_set_server    | utf8mb4
*/

2. Datenbank/Tablele mit UTF-8 erstellen

sql
-- ✅ Richtig: UTF-8 beim Erstellen angeben
CREATE DATABASE meine_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

CREATE TABLE users (
    ...
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. Client-Encoding einstellen

sql
-- Für aktuelle Sitzung
SET NAMES utf8mb4;

-- Oder in der Verbindung (PHP):
$pdo = new PDO('mysql:host=localhost;dbname=meine_db;charset=utf8mb4', ...);

17.4 Häufiger Fehler 4: Datenänderung/-löschung ohne WHERE (Gefährlich!)

Fehler: Alle Daten geändert/gelöscht!

sql
-- ❌ KATASTROPHE! Ändert ALLE Datensätze!
UPDATE users SET passwort = 'neu';

-- ❌ KATASTROPHE! Löscht ALLE Datensätze!
DELETE FROM users;

Lösungen:

1. IMMER WHERE verwenden!

sql
-- ✅ Sicher:
UPDATE users SET passwort = 'neu' WHERE user_id = 1;
DELETE FROM users WHERE user_id = 1;

2. SELECT zuerst testen!

sql
-- ✅ Sicher: Zuerst testen, welche Zeilen betroffen sind
SELECT * FROM users WHERE email = 'alt@email.de';

-- Dann erst ändern/löschen
UPDATE users SET email = 'neu@email.de' WHERE email = 'alt@email.de';
DELETE FROM users WHERE email = 'alt@email.de';

3. Transaktionen verwenden!

sql
-- ✅ Sicher: Mit Transaktion (kann rückgängig gemacht werden)
START TRANSACTION;
UPDATE users SET passwort = 'neu';  -- Oh, alle geändert!
ROLLBACK;  -- Macht alles rückgängig!

-- Richtig:
START TRANSACTION;
UPDATE users SET passwort = 'neu' WHERE user_id = 1;
COMMIT;  -- Erst wenn sicher, dann speichern!

17.5 Häufiger Fehler 5: Tabellenverbindung gibt keine Ergebnisse

Fehler: JOIN gibt leere Ergebnisse zurück

Ursache: Verbindungsbedingung falsch!

sql
-- ❌ Falsch: Falsche Felder in ON-Klausel
SELECT * 
FROM users
INNER JOIN orders ON users.user_id = orders.bestell_id;  -- Falsch!

-- ✅ Richtig: Richtige Felder verwenden
SELECT * 
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;

Tipp: Felder überprüfen!

sql
-- Tabellenstruktur anzeigen
DESC users;
DESC orders;

-- Primärschlüssel und Fremdschlüssel überprüfen
SHOW CREATE TABLE users;
SHOW CREATE TABLE orders;

17.6 Häufiger Fehler 6: Index wirkt nicht

Fehler: Abfrage bleibt langsam trotz Index

Ursachen und Lösungen:

1. Funktion auf Feld angewendet

sql
-- ❌ Falsch: Index wird nicht verwendet (YEAR() auf Feld)
SELECT * FROM users WHERE YEAR(erstellt_am) = 2024;

-- ✅ Richtig: Bereichsabfrage verwenden
SELECT * FROM users 
WHERE erstellt_am >= '2024-01-01' 
  AND erstellt_am < '2025-01-01';

2. % am Anfang der LIKE-Suche

sql
-- ❌ Falsch: Index wird nicht verwendet (% am Anfang)
SELECT * FROM users WHERE username LIKE '%müller';

-- ✅ Richtig: % am Ende
SELECT * FROM users WHERE username LIKE 'Müller%';

3. Index wird nicht verwendet (mit EXPLAIN prüfen)

sql
-- Prüfen, ob Index verwendet wird
EXPLAIN SELECT * FROM users WHERE username = 'max';

-- Wenn "key" = NULL → Index wird nicht verwendet!
-- → Index erstellen
CREATE INDEX idx_username ON users(username);

17.7 Debugging-Tipps: Fehler schnell beheben

1. SHOW ERRORS / SHOW WARNINGS verwenden

sql
-- Nach einem Fehler:
SHOW ERRORS;      -- Zeigt detaillierte Fehlermeldungen
SHOW WARNINGS;    -- Zeigt Warnungen

2. Datenbank-Logs ansehen

bash
# Windows (XAMPP):
# C:\xampp\mysql\data\*.err

# Linux:
# /var/log/mysql/error.log

# Mac:
# /usr/local/var/mysql/*.err

3. EXPLAIN für langsame Abfragen verwenden

sql
-- Langsame Abfrage analysieren
EXPLAIN SELECT * FROM users WHERE stadt = 'Berlin';

-- "type = ALL" bedeutet: Volle Tabellensuche (langsam!)
-- → Index erstellen
CREATE INDEX idx_stadt ON users(stadt);

4. SELECT vor UPDATE/DELETE ausführen

sql
-- ✅ Sicher:
SELECT * FROM users WHERE alter > 100;  -- Zuerst prüfen!
-- Dann erst:
DELETE FROM users WHERE alter > 100;

Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Anmeldefehler zu beheben (Passwort, Service, Berechtigungen)
  • ✅ SQL-Syntaxfehler zu finden und zu beheben
  • ✅ Chinesische/Deutsche Zeichenfehler (Encoding) zu beheben
  • ✅ Gefährliche Fehler (UPDATE/DELETE ohne WHERE) zu vermeiden
  • ✅ Tabellenverbindungsfehler zu beheben
  • ✅ Index-Probleme zu diagnostizieren
  • ✅ Debugging-Tipps anzuwenden

Übungen

  1. Praxis: Simuliere einen Anmeldefehler und behebe ihn
  2. Praxis: Erstelle absichtlich einen SQL-Syntaxfehler und behebe ihn
  3. Praxis: Erstelle eine Tabelle ohne UTF-8 und behebe den Encoding-Fehler
  4. Praxis: Simuliere eine gefährliche UPDATE-Abfrage (ohne WHERE) und verwende ROLLBACK

Nächstes Kapitel

Im nächsten Kapitel lernen wir MySQL-Fortgeschrittene Themen und Normen - Code-Normen, Versionsunterschiede, erweiterte Funktionen!

Frei für alle Anfänger