MySQL

+ andere TechDocs
+ SQL
+ SQL mit Java
+ MySQL-Homepage
+


MySQL ist eine leistungsfähige relationale Datenbank für die Abfragesprache SQL (Structured Query Language). Sie zählt zu den verbreitetsten inklusive Source-Code frei erhältlichen Datenbanken.

MySQL wird besonders häufig zusammen mit Web-Servern eingesetzt. Zum Beispiel Online-Shops beinhalten oft große Datenmengen, aber kommen mit einfach strukturierten Tabellen aus. Beliebt ist die 'LAMP'-Kombination: Linux + Apache + MySQL + PHP.

Weitere Eigenschaften finden Sie im Vergleich zwischen MySQL, PostgreSQL und MaxDB.



Inhalt

  1. Kurzanleitung zur Installation von MySQL unter Linux
  2. Kurzanleitung zur Installation von MySQL unter Windows
  3. Kurzanleitung zur Anlage einer Database und einer Tabelle in MySQL
  4. Storage Engines
  5. Sortierung
  6. UTF-8 mit MySQL
  7. Benutzer anlegen und Passwörter ändern
  8. Root-Passwort zurücksetzen
  9. Weiterführende Informationen


Kurzanleitung zur Installation von MySQL unter Linux



Kurzanleitung zur Installation von MySQL unter Windows

Genauere Anleitungen gibt es unter http://dev.mysql.com/doc.

  1. Downloaden Sie den MySQL Community Server von http://dev.mysql.com/downloads/mysql (z.B. "Windows, MSI Installer", mysql-5.5.15-winx64.msi).
  2. Doppelklicken Sie auf die msi-Installationsdatei und führen Sie die Installation durch. Falls Sie das Installationszielverzeichnis bestimmen wollen, müssen Sie 'Custom' wählen und anschließend durch Klicken auf 'MySQL Server' und 'Browse...' das Programmverzeichnis (z.B. C:\MySQL\Server) und durch Klicken auf 'Server data files' und 'Browse...' das Datenverzeichnis (z.B. C:\MySQL\Data) wählen.
  3. Wenn Sie bei der 'Wizard Completed'-Meldung die Option 'Launch the MySQL Instance Configuration Wizard' wählen, können Sie u.a. auch wählen, ob MySQL als automatischer Dienst gestartet werden soll ('Install As Windows Service').
  4. Falls Sie MySQL nicht als Dienst installieren, erfolgen Start und Stopp folgendermaßen (im 'MySQL\Server\bin'-Verzeichnis und nach Vergabe eines Passworts, im Beispiel ist das Passwort mysqlpwd):
    Starten:mysqld
    Beenden:mysqladmin -uroot -pmysqlpwd shutdown
    Falls Sie MySQL als Dienst installieren, erfolgen Start und Stopp folgendermaßen (eventuell sind Admin-Rechte nötig):
    Starten:net start MySQL
    Beenden:net stop MySQL
  5. Starten Sie den MySQL-DB-Server.
  6. Falls Sie noch kein Root-Passwort vergeben haben: Wechseln Sie in Ihr 'MySQL\Server\bin'-Verzeichnis und setzen Sie als Erstes ein Kennwort für den Root-User (im Beispiel 'mysqlpwd'):

    cd \MySQL\Server\bin

    mysqladmin -u root password mysqlpwd

  7. Testen Sie folgende Kommandos (ersetzen Sie 'root' und 'mysqlpwd' durch Ihren Benutzernamen und Ihr Passwort):

    mysqladmin -uroot -pmysqlpwd version status proc

    mysqlshow -uroot -pmysqlpwd

    mysqlshow -uroot -pmysqlpwd mysql

    mysql -uroot -pmysqlpwd

      \h

      status;

      show databases;

      use mysql;

      show tables;

      describe host;

      select Host,User,Password from user;

      select help_category_id,name from help_category;

      \q

  8. Einige Voreinstellungen können in 'my.ini'- oder 'my.cnf'-Dateien zum Beispiel in den Verzeichnissen '/etc/mysql', 'C:\', 'C:\Windows', 'C:\MySQL\Server' oder 'C:\Programme\MySQL\MySQL Server 4.1' eingetragen sein/werden.
    Zum Beispiel kann mit 'bind-address=127.0.0.1' der Zugriff übers Netzwerk untersagt werden.
    Falls Sie Transaktionen und die InnoDB-Engine verwenden wollen, beachten Sie besonders die 'InnoDB Specific options', wie zum Beispiel 'skip-innodb' und 'innodb_data_file_path=ibdata:30M'.


Kurzanleitung zur Anlage einer Database und einer Tabelle in MySQL

  1. Werden mehrere SQL-Kommandos benötigt, empfiehlt es sich, diese in einer einfachen ASCII-Textdatei abzulegen. Dann können sie leicht editiert und (eventuell geändert) wiederholt eingelesen werden.
    Deshalb erstellen wir eine Datei 'MeineDb.sql' mit folgendem Inhalt:
    -- SQL-Datei für MySQL
    -- Beim ersten Laden muss die folgende Zeile auskommentiert sein,
    -- bei wiederholten Versuchen muss sie aktiviert sein ('--' entfernen):
    -- DROP DATABASE MeineDb;
    CREATE DATABASE MeineDb;
    SHOW databases;
    USE MeineDb;
    CREATE TABLE MeineTestTabelle ( i INT, c CHAR(3), s VARCHAR(8), dt DATE );
    CREATE TABLE MeineAdressen ( Name VARCHAR(16), Plz INT, Ort VARCHAR(16) );
    SHOW tables;
    INSERT INTO MeineTestTabelle VALUES ( 11, 'ABC', 'Blubb', '2000-01-01' );
    INSERT INTO MeineTestTabelle VALUES ( 12, 'ab', 'Blabla', '2000-12-31' );
    INSERT INTO MeineTestTabelle VALUES ( 42, 'xy', 'äöüߧ€', '2005-06-06' );
    SELECT * FROM MeineTestTabelle;
    INSERT INTO MeineAdressen VALUES ( 'Achim',     52078, 'Aachen' );
    INSERT INTO MeineAdressen VALUES ( 'Alexander', 52134, 'Herzogenrath' );
    INSERT INTO MeineAdressen VALUES ( 'Helmut',    52066, 'Aachen' );
    INSERT INTO MeineAdressen VALUES ( 'Josef',     52070, 'Aachen' );
    INSERT INTO MeineAdressen VALUES ( 'Manfred',   52146, 'Würselen' );
    INSERT INTO MeineAdressen VALUES ( 'Patrick',   52074, 'Aachen' );
    INSERT INTO MeineAdressen VALUES ( 'Roland',    52134, 'Herzogenrath' );
    INSERT INTO MeineAdressen VALUES ( 'Torsten',   52072, 'Aachen' );
    INSERT INTO MeineAdressen VALUES ( 'Werner',    52066, 'Aachen' );
    SELECT * FROM MeineAdressen;
    
  2. Ausführen:
    mysql -uroot -pmysqlpwd < MeineDb.sql
  3. Testen mit:

    mysql -uroot -pmysqlpwd MeineDb

      select * from MeineTestTabelle;

      \q

    ergibt:

    +------+------+--------+------------+
    | i    | c    | s      | dt         |
    +------+------+--------+------------+
    |   11 | ABC  | Blubb  | 2000-01-01 |
    |   12 | ab   | Blabla | 2000-12-31 |
    |   42 | xy   | äöüߧ€ | 2005-06-06 |
    +------+------+--------+------------+

    Der String 'äöüߧ€' wird unter Windows im Kommandozeilenfenster beim üblicherweise eingestellten Characterset CP850 falsch dargestellt, ist aber trotzdem korrekt gespeichert.



Storage Engines

MySQL bietet verschiedene 'Storage Engines':

Storage Engine Eigenschaften, Verwendung
MyISAM Optimiert für viele Lese- und wenige Schreibzugriffe
InnoDB Bietet Transaktionsunterstützung und unterstützt parallele Updates und Row-Level-Locking
BDB Berkley Database, Transaktionsunterstützung mit Page-Level-Locking
Memory Für volatile und temporäre Daten
Merge Für partitionierte Tabellen, physich aufgeteilte große Tabellen
NDB Cluster MySQL-Cluster für höhere Ausfallsicherheit
Federated Für Remote Database Access

Die Anlage einer Tabelle mit einer bestimmten Storage Engine kann zum Beispiel folgendermaßen erfolgen:

CREATE TABLE MeineTabelle ( s VARCHAR(12) ) TYPE=InnoDB;



Sortierung

Die Standard-Sortierung von MySQL ist für deutsche Umlaute nicht geeignet und sollte deshalb umgeschaltet werden auf eine der anderen folgenden Varianten:

Bezeichnung Bemerkung MySQL-Variante Sortierregeln
Standard (schwedisch) (default) ä/ö/ü nach z
General (englisch) latin1_general_ci
latin1_general_cs
ä/ö/ü/ß nach a/o/u/s
German1 DIN 1, Duden,
für Wörter
latin1_german1_ci
latin1_german1_cs
ä/ö/ü/ß wie a/o/u/s
German2 DIN 2, Telefonbuch,
für Namen
latin1_german2_ci
latin1_german2_cs
ä/ö/ü/ß wie ae/oe/ue/ss

"..._ci" bedeutet "Case Insensitive" und "..._cs" bedeutet "Case Sensitive", also ohne bzw. mit Berücksichtigung der Groß-/Kleinschreibung.

Eingestellt wird die Sortierung für die Datenbank mit:

CREATE DATABASE MeineDb CHARACTER SET latin1 COLLATE latin1_german1_ci;

und für eine einzelne Spalte mit:

USE MeineDb;
CREATE TABLE MeineTestTabelle2 ( words CHAR(30), names CHAR(30) COLLATE latin1_german2_ci );


UTF-8 mit MySQL

MySQL verwendet normalerweise den Latin1-Zeichensatz (entspricht ISO-8859-1). Dieser 8-bit-Zeichensatz enthält die deutschen Umlaute, aber nicht das Euro-Zeichen '€'.

Eine gern verwendete Alternative zu Latin1 ist UTF-8. Die ersten 128 Zeichen von UFT-8 entsprechen den ersten 128 Zeichen des ASCII-Zeichensatzes (7 bit) und werden in einem Byte kodiert. Alle anderen Zeichen benötigen zwei bis vier Bytes. Zum Beispiel die deutschen Umlaute und Sonderzeichen 'äöüߧ' belegen zwei Bytes und das Euro-Zeichen '€' drei Bytes.

Weiteres zu UTF-8 erfahren Sie unter: http://de.wikipedia.org/wiki/Utf-8.

Für einen ersten Versuch verfahren Sie folgendermaßen:

  1. MySQL unterstützt erst ab Version 4.1.1 Unicode. Die folgenden Beispiele sind mit Version 4.1.12 getestet worden.
  2. Falls noch nicht geschehen, installieren Sie MySQL zum Beispiel wie beschrieben unter: mysql.htm#InstallationUnterWindows.
  3. Starten Sie die Verbindung zu MySQL über die übliche zu Ihrer Installation passende DriverManager-Connection-URL, also zum Beispiel 'jdbc:mysql://localhost:3306/MeineDb'.
  4. Im Folgenden soll eine Tabellenspalte für Latin1 und eine weitere für UTF-8 definiert werden.
    Führen Sie folgende SQL-Kommandos aus (zum Beispiel per Java-Programm oder einfacher mit SQuirreL):

    drop table if exists MeinUtf8Test;

    create table MeinUtf8Test ( vrchrLtn1 varchar(10) CHARACTER SET Latin1, vrchrUtf8 varchar(10) CHARACTER SET Utf8 );

    insert into MeinUtf8Test ( vrchrLtn1, vrchrUtf8 ) values ( 'äöüߧ€áàâ€', 'äöüߧ€áàâ€' );

    select * from MeinUtf8Test;

  5. Bei üblichen Systemkonfigurationen erhalten Sie:

    vrchrLtn1vrchrUtf8
    äöüߧ?áàâ?äöüߧ?áàâ?

    Die deutschen Umlaute werden korrekt gespeichert, aber in beiden Spalten fehlen die Euro-Zeichen. Die UTF-8-Deklaration hat also nicht zum Erfolg geführt.

  6. Sehen Sie sich mit dem SQL-Kommando 'Show Variables;' die MySQL-Character-Einstellungen an. Das Ergebnis könnte zum Beispiel so aussehen:

    Variable_nameValue
    character_set_clientlatin1
    character_set_connectionlatin1
    character_set_databaselatin1
    character_set_resultsNULL
    character_set_serverlatin1
    character_set_systemutf8
    collation_connectionlatin1_swedish_ci
    collation_databaselatin1_swedish_ci
    collation_serverlatin1_swedish_ci

    Über SQL-Kommandos wie 'SET NAMES 'utf8';', 'set character_set_database=utf8;' und 'set character_set_server=utf8;' können Sie diese Einträge ändern, was aber leider zumindest mit MySQL 4.1.12 und dem JDBC-Treiber 'mysql-connector-java-3.1.11-bin.jar' nicht zum gewünschten Erfolg führt.

  7. Starten Sie die Verbindung zu MySQL neu, aber diesmal über eine erweiterte DriverManager-Connection-URL, nämlich:
    'jdbc:mysql://localhost:3306/MeineDb?useUnicode=true&characterEncoding=UTF-8'
    (passen Sie den Teil 'localhost:3306/MeineDb' an Ihre Installation an).
    Wichtig ist der angehängte Teil '?useUnicode=true&characterEncoding=UTF-8'.
    Wenn Sie die SQL-Kommandos per Java-Programm ausführen, tragen Sie diese URL beim 'DriverManager.getConnection()'-Aufruf ein.
    Wenn Sie SQuirreL verwenden, tragen Sie diese URL ein unter: rechte Maustaste auf die Verbindung im 'Aliases'-Fenster | 'Modify Alias...' | 'URL'.
  8. Löschen Sie die Tabelle 'MeinUtf8Test' und führen Sie die oben genannten SQL-Kommandos erneut aus. Diesmal erhalten Sie:

    vrchrLtn1vrchrUtf8
    äöüߧΠáàâΠäöüߧ€áàâ€

    Die Latin1-Spalte 'vrchrLtn1' kann das Euro-Zeichen nicht speichern, aber in der UTF-8-Spalte 'vrchrUtf8' funktioniert es.

  9. 'Show Variables;' zeigt diesmal korrekt an, dass die 'connection' auf 'utf8' umgeschaltet worden ist:

    Variable_nameValue
    character_set_connectionutf8
    collation_connectionutf8_general_ci
  10. Die 'collation_...'-Einträge wirken sich zum Beispiel auf die Sortierreihenfolge der Zeichen aus. Siehe hierzu: mysql.htm#Sortierung.
  11. Statt über den URL-Anhang können Sie die gewünschten Parameter natürlich auch in der 'mysql.ini'-Konfigurationsdatei vorgeben, zum Beispiel so:
    default-character-set=utf8
    Dies geht allerdings nicht immer: Zum Beispiel erlauben einige Webhoster keinen Zugriff auf die 'mysql.ini'.
  12. Sehen Sie sich das DB-Sonderzeichen-Testprogramm an.


Benutzer anlegen und Passwörter ändern

So richten Sie den Benutzer "MeinBenutzer" mit dem Passwort "MeinPasswort" für die MySQL-Datenbank "MeineDb" ein:

GRANT ALL PRIVILEGES ON MeineDb.* TO 'MeinBenutzer'@'localhost' IDENTIFIED BY 'MeinPasswort';

FLUSH PRIVILEGES;

Allerdings kann der so eingerichtete Benutzer nur von dem PC aus auf die MySQL-DB zugreifen, auf dem die MySQL-DB läuft. Falls er von anderen PCs aus zugreifen soll, muss localhost entweder durch die konkrete genaue IP-Adresse oder durch eine mit %-Joker versehene IP-Adresse ersetzt werden, z.B. innerhalb eines Firmennetzes, in welchem alle IPv4-Adressen mit 10. beginnen, so:

GRANT ALL PRIVILEGES ON MeineDb.* TO 'MeinBenutzer'@'10.%.%.%' IDENTIFIED BY 'MeinPasswort';

FLUSH PRIVILEGES;

In diesem Fall muss zusätzlich darauf geachtet werden, dass in der my.ini bind-address und skip-networking ausgeschaltet werden, z.B. indem diese Zeilen gelöscht werden oder ein # vor die Zeile gesetzt wird:

# bind-address=0.0.0.0

# skip-networking

Ändern können Sie Passwörter folgendermaßen:

UPDATE mysql.user SET Password=PASSWORD('MeinNeuesPasswort') WHERE User='MeinBenutzer';

FLUSH PRIVILEGES;



Root-Passwort zurücksetzen

Falls Sie das root-Passwort für Ihre MySQL-Datenbank nicht mehr wissen, können Sie wie im Folgenden beschrieben ein neues vergeben.

  1. Versuchen Sie zuerst den unter How to Reset the Root Password beschriebenen Weg. Wenden Sie die folgende Beschreibung nur dann an, wenn dies nicht funktioniert, und wenn Sie wissen, was Sie tun.

  2. Stoppen Sie die MySQL-Datenbank.

  3. Öffnen Sie zwei Kommandozeilenfenster mit Admin-Rechten.

  4. Wechseln Sie im ersten Kommandozeilenfenster in das MySQL-bin-Verzeichnis und führen Sie aus:

    cd \MySQL\Server\bin

    mysqld.exe -u root --skip-grant-tables

    Machen Sie vorläufig nichts weiter in diesem Kommandozeilenfenster.

  5. Wechseln Sie im zweiten Kommandozeilenfenster in das MySQL-bin-Verzeichnis und führen Sie aus:

    cd \MySQL\Server\bin

    mysql

    Jetzt können Sie MySQL-Befehle eingeben:

    use mysql;

    UPDATE user SET Password = PASSWORD('MeinNeuesRootPasswort') WHERE User = 'root';

    FLUSH PRIVILEGES;

    exit;

  6. Schließen Sie beide Kommandozeilenfenster.

  7. Starten Sie den PC neu.



Weiterführende Informationen





Weitere Themen: andere TechDocs | SQL | PostgreSQL | JSP
© 1998-2007 Torsten Horn, Aachen