Anführungszeichen in MySQL: Einfache, doppelte und Backticks – vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Anführungszeichen in MySQL für Verwirrung sorgen

\n\n

Wenn du schon einmal SQL-Abfragen in PHP geschrieben hast, kennst du das Problem: Wann verwendet man einfache Anführungszeichen (' '), wann doppelte (" ") und wann diese mysteriösen Backticks (` `)? Ein einziger falscher Buchstabe – und statt Daten bekommst du einen Syntaxfehler in MySQL oder, noch schlimmer, ein Sicherheitsleck.

\n\n

Dieses Thema gehört zu den meistgestellten Fragen auf Stack Overflow (über 2 Millionen Aufrufe!). Und das zu Recht. Selbst erfahrene Entwickler sind manchmal unsicher. Heute bringen wir endlich Klarheit. Du erfährst:

\n\n
    \n
  • Wofür jeder Anführungszeichentyp in MySQL zuständig ist
  • \n
  • Wie du Daten in PHP korrekt escaped
  • \n
  • Warum doppelte Anführungszeichen (fast immer) eine schlechte Idee sind
  • \n
  • Wie du dich vor SQL-Injection schützt
  • \n
\n\n

Los geht's! 🚀

\n\n

Anatomie einer MySQL-Abfrage: Drei Arten von Anführungszeichen

\n\n

In MySQL gibt es drei verschiedene Zeichen, die wie Anführungszeichen aussehen, aber völlig unterschiedliche Aufgaben haben:

\n\n

1. Einfache Anführungszeichen (' ') – für Zeichenketten

\n\n

Wann verwenden: Immer, wenn du einen String übergibst (Text, Datum, E-Mail, Passwort).

\n\n
SELECT * FROM users WHERE name = 'Max';\nINSERT INTO articles (title) VALUES ('MySQL für Anfänger');
\n\n

MySQL behandelt alles innerhalb einfacher Anführungszeichen als String-Literal. Das bedeutet, du sagst der Datenbank: „Hier steht ein Wert, versuche nicht, ihn als Spaltennamen oder Befehl zu interpretieren.“

\n\n

2. Doppelte Anführungszeichen (" ") – fast dasselbe, aber mit einem Haken

\n\n

Im Standard-SQL werden doppelte Anführungszeichen für Bezeichner (Tabellen- und Spaltennamen) verwendet. MySQL arbeitet jedoch standardmäßig in einem Modus, in dem doppelte Anführungszeichen einfachen entsprechen. Das führt oft zu Verwirrung.

\n\n
-- Das funktioniert, aber besser nicht so machen\nSELECT * FROM users WHERE name = "Maria";
\n\n

Problem: Wenn du den strikten Modus ANSI_QUOTES aktivierst, verhalten sich doppelte Anführungszeichen wie Backticks. Dein Code würde dann brechen. Daher gilt:

\n\n

Regel Nr. 1: Verwende einfache Anführungszeichen für Strings. Immer. Doppelte nur, wenn du genau weißt, was du tust, oder aus Kompatibilitätsgründen mit anderen DBMS.

\n\n

3. Backticks (` `) – für Tabellen- und Spaltennamen

\n\n

Backticks (umgekehrte Anführungszeichen) sind Bezeichner. Sie werden benötigt, um:

\n\n
    \n
  • Reservierte Wörter als Namen zu verwenden (schlechte Praxis, kommt aber vor)
  • \n
  • Mit Namen zu arbeiten, die Leerzeichen oder Sonderzeichen enthalten
  • \n
  • Konflikte mit MySQL-Schlüsselwörtern zu vermeiden
  • \n
\n\n
-- Schlecht: 'select' ist ein reserviertes Wort\nSELECT * FROM select;\n\n-- Gut: mit Backticks escapen\nSELECT * FROM `select`;\n\n-- Notwendig: Name mit Leerzeichen\nSELECT `user name` FROM users;\n\n-- Empfohlen: Tabellen- und Spaltennamen immer escapen\nSELECT `id`, `name` FROM `users` WHERE `status` = 'active';
\n\n

Wichtig: Backticks dürfen NICHT für Werte verwendet werden. Das führt zu einem Fehler.

\n\n
-- FEHLER: MySQL denkt, 'Max' sei ein Spaltenname\nSELECT * FROM users WHERE name = `Max`;
\n\n

PHP + MySQL: So vermeidest du Verwirrung bei Anführungszeichen

\n\n

Jetzt kommt der spannende Teil – wie das Ganze in PHP funktioniert. PHP selbst verwendet einfache und doppelte Anführungszeichen für Strings, und hier kann man leicht Fehler machen.

\n\n

Fall Nr. 1: Direktes Einfügen einer Variable (gefährlich!)

\n\n
// SCHLECHT: anfällig für SQL-Injection\n$name = "Max'; DROP TABLE users; --";\n$query = "SELECT * FROM users WHERE name = '$name'";\n// Ergebnis: SELECT * FROM users WHERE name = 'Max'; DROP TABLE users; --'
\n\n

Das ist eine klassische SQL-Injection. Mach das niemals!

\n\n

Fall Nr. 2: Escaping mit mysqli_real_escape_string (besser, aber nicht ideal)

\n\n

Blogs

Buchempfehlungen