SQLite
SQLite ist eine in sich geschlossene SQL-Datenbank-Engine
kein Server erforderlich (im Gegensatz zu MySQL, PostgreSQL, MongoDB, ...)
portabel (eine einzige .db oder .sqlite Datei)
leichtgewichtig, ressourcenschonend, schnell ideal für kleine Anwendungen, Prototypen, Mobile Apps, ...
PHP PDO CRUD Beispiel
PDO muss mit sqlite3 Erweiterung kompiliert sein bzw. PHP muss PDO sqlite3 Erweiterung aktiviert haben (in Konfigurationsdatei: php.ini)
<?php
// Datenbankverbindung herstellen
$pdo = new PDO('sqlite:datenbank.db');
//$pdo = new PDO('sqlite:./datenbank.db');
//$pdo = new PDO('sqlite:' . __DIR__ . '/datenbank.db');
// Fehlermodus aktivieren (fuer Debugging)
$pdo->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
// Tabelle erstellen (falls nicht vorhanden)
$pdo->exec(
"CREATE TABLE IF NOT EXISTS benutzer (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL
)"
);
// CREATE
$statement = $pdo->prepare("INSERT INTO benutzer (name, email) VALUES (:name, :email)");
$statement->execute([':name' => 'Max Mustermann', ':email' => 'max@example.com']);
echo "Datensatz eingefügt. ID: " . $pdo->lastInsertId() . "\n";
// READ
$statement = $pdo->query("SELECT * FROM benutzer");
while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}\n";
}
// UPDATE
$statement = $pdo->prepare("UPDATE benutzer SET email = :email WHERE name = :name");
$statement->execute([':email' => 'max.neu@example.com', ':name' => 'Max Mustermann']);
echo "Datensatz aktualisiert.\n";
// DELETE
$statement = $pdo->prepare("DELETE FROM benutzer WHERE id = :id");
$statement->execute([':id' => 1]);
echo "Datensatz gelöscht.\n";
?>
SQLite vs. MySQL: Datentypen Vergleich
SQLite ist flexibler, aber weniger streng bei Datentypen
MySQL erzwingt Typen SQLite speichert fast alles als TEXT oder INTEGER (erfordert mehr Validierung in der Anwendung)
Ganzzahlen (INTEGER)
SQLite ignoriert die Größenangabe - INT(10) wird wie INTEGER behandelt
-- MySQL
INT, BIGINT, TINYINT, SMALLINT
-- SQLite (alle werden als 64-Bit INTEGER gespeichert)
INTEGER
Kommazahlen
SQLite hat kein DECIMAL
-- MySQL
FLOAT, DOUBLE, DECIMAL(10,2)
-- SQLite
REAL, DOUBLE -- kein DECIMAL
Text
in SQLite kann man zwar Längenangaben schreiben (TEXT(100)), sie werden aber ignoriert
-- MySQL
VARCHAR(255) -- variable Länge, max. 255 Zeichen
CHAR(10) -- fixe Länge
TEXT -- unbegrenzt
-- SQLite
TEXT -- alle Texttypen werden als TEXT gespeichert
Datum und Zeit
-- MySQL (eigene Datentypen)
DATE -- '2024-01-15'
TIME -- '14:30:00'
DATETIME -- '2024-01-15 14:30:00'
TIMESTAMP -- automatisch mit Zeitzone
-- SQLite (keine echten Datentypen!)
-- mann muss TEXT oder INTEGER verwenden:
'2024-01-15' -- als TEXT speichern
strftime('%Y-%m-%d', 'now') -- SQLite-Funktion
1710000000 -- als UNIX-Timestamp (INTEGER)
Boolean
-- MySQL
BOOLEAN -- wird zu TINYINT(1)
-- SQLite
INTEGER -- 0 = false, 1 = true
BLOB
-- MySQL
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
-- SQLite
BLOB -- einheitlich, keine Größenunterschiede
Auto-Increment
-- MySQL
AUTO_INCREMENT
-- SQLite
AUTOINCREMENT -- zusammengeschrieben!
JSON
SQLite hat keinen echten JSON-Typ - als TEXT speichern
-- MySQL
JSON, JSONB
-- SQLite
TEXT -- '{"key": "value"}' als String
Enum
SQLite hat keinen ENUM-Typ - mit CHECK simulieren
-- MySQL
ENUM('neu', 'aktiv', 'inaktiv')
-- SQLite
TEXT CHECK(status IN ('neu', 'aktiv', 'inaktiv'))
Unsigned
SQLite unterstützt keine unsigned-Integer
-- MySQL
INT UNSIGNED
-- SQLite
nicht verfügbar -- alle INTEGER sind signed