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.
Genauere Anleitungen gibt es unter http://dev.mysql.com/doc.
Starten: | mysqld |
Beenden: | mysqladmin -uroot -pmysqlpwd shutdown |
Starten: | net start MySQL |
Beenden: | net stop MySQL |
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
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
-- 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;
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.
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;
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 ); |
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:
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;
Bei üblichen Systemkonfigurationen erhalten Sie:
vrchrLtn1 | vrchrUtf8 |
---|---|
äöüߧ?áàâ? | äöüߧ?áàâ? |
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.
Sehen Sie sich mit dem SQL-Kommando 'Show Variables;' die MySQL-Character-Einstellungen an. Das Ergebnis könnte zum Beispiel so aussehen:
Variable_name | Value |
---|---|
character_set_client | latin1 |
character_set_connection | latin1 |
character_set_database | latin1 |
character_set_results | NULL |
character_set_server | latin1 |
character_set_system | utf8 |
collation_connection | latin1_swedish_ci |
collation_database | latin1_swedish_ci |
collation_server | latin1_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.
Löschen Sie die Tabelle 'MeinUtf8Test' und führen Sie die oben genannten SQL-Kommandos erneut aus. Diesmal erhalten Sie:
vrchrLtn1 | vrchrUtf8 |
---|---|
äöüߧΠáàâΠ | äöüߧ€áà†|
Die Latin1-Spalte 'vrchrLtn1' kann das Euro-Zeichen nicht speichern, aber in der UTF-8-Spalte 'vrchrUtf8' funktioniert es.
'Show Variables;' zeigt diesmal korrekt an, dass die 'connection' auf 'utf8' umgeschaltet worden ist:
Variable_name | Value |
---|---|
character_set_connection | utf8 |
collation_connection | utf8_general_ci |
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;
Falls Sie das root-Passwort für Ihre MySQL-Datenbank nicht mehr wissen, können Sie wie im Folgenden beschrieben ein neues vergeben.
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.
Stoppen Sie die MySQL-Datenbank.
Öffnen Sie zwei Kommandozeilenfenster mit Admin-Rechten.
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.
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;
Schließen Sie beide Kommandozeilenfenster.
Starten Sie den PC neu.