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