Appearance
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 starten2. 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.plist3. 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 Warnungen2. Datenbank-Logs ansehen
bash
# Windows (XAMPP):
# C:\xampp\mysql\data\*.err
# Linux:
# /var/log/mysql/error.log
# Mac:
# /usr/local/var/mysql/*.err3. 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
- Praxis: Simuliere einen Anmeldefehler und behebe ihn
- Praxis: Erstelle absichtlich einen SQL-Syntaxfehler und behebe ihn
- Praxis: Erstelle eine Tabelle ohne UTF-8 und behebe den Encoding-Fehler
- Praxis: Simuliere eine gefährliche
UPDATE-Abfrage (ohneWHERE) und verwendeROLLBACK
Nächstes Kapitel
Im nächsten Kapitel lernen wir MySQL-Fortgeschrittene Themen und Normen - Code-Normen, Versionsunterschiede, erweiterte Funktionen!
