\input texinfo  @c -*-texinfo-*-
@c Copyright 1997-2002 TcX AB, Detron HB und MySQL Finland AB
@c
@c *********************************************************
@c Note that @node names are used on our Website.
@c So do not change node names without checking
@c Makefile.am und SitePages first.
@c *********************************************************
@c
@c %**start of header

@c there's a better way to do this.. i just don't know it yet
@c sed will remove the "@c ifnusphere " to make this valid
@c ifnusphere @set nusphere 1

@setfilename mysql.de.info

@c We want the types in the same index
@syncodeindex tp fn

@c Get version information. This file is generated by the Makefile!!
@include include.texi

@ifclear tex-debug
@c This removes the black squares in the right margin
@finalout
@end ifclear

@c Set background f�r HTML
@set _body_tags BGCOLOR=silver TEXT=#000000 LINK=#101090 VLINK=#7030B0
@c Set some style elements f�r the manual in HTML form. 'suggested'
@c natural language colors: aqua, black, blue, fuchsia, gray, green,
@c lime, maroon, navy, olive, purple, red, silver, teal, white, und
@c yellow. From Steeve Buehler <ahr@YogElements.com>
@set _extra_head <style> code {color:purple} tt {color:green} samp {color:navy} pre {color:maroon} </style>

@settitle MySQL-Referenzhandbuch f�r Version @value{mysql_version}

@c We want single-sided heading format, with chapters on new pages. To
@c get double-sided format change 'on' below to 'odd'
@ifclear nusphere
@setchapternewpage on
@end ifclear

@ifset nusphere
@setchapternewpage odd
@end ifset

@paragraphindent 0

@ifset nusphere
@smallbook
@end ifset

@c %**end of header

@ifinfo
@format
START-INFO-DIR-ENTRY
* mysql: (mysql).               MySQL documentation.
END-INFO-DIR-ENTRY
@end format
@end ifinfo

@titlepage
@sp 10
@center @titlefont{MySQL-Referenzhandbuch}
@sp 10
@center Copyright @copyright{} 1997-2002 MySQL AB
@c blank page after title page makes page 1 be a page front.
@c also makes the back of the title page blank.
@page
@end titlepage

@c Short contents, blank page, long contents.
@c until i can figure out the blank page, no short contents.
@c @shortcontents
@c @page
@c @page
@contents

@c This should be added. The HTML conversion also needs a MySQL version
@c Anzahl somewhere.

@iftex
@c change this to double if you want formatting f�r double-sided
@c printing
@headings single

@oddheading @thischapter @| @| @thispage
@evenheading @thispage @| @| MySQL - Technische Referenz f�r Version @value{mysql_version}

@end iftex


@node Top, Introduction, (dir), (dir)
@c German node Top

@c @ifhtml
@c <IMG SRC="Images/mysql-logo.gif">
@c <!--Image doesn't exist. Can't find suitable replacement. (Matt) -->
@c @end ifhtml

@ifinfo
Das ist das Handbuch f�r das MySQL-Datenbanksystem. Diese Version geh�rt
zur MySQL-Version @value{mysql_version}. Sie finden ein Handbuch zu jeder
�lteren Version von MySQL in der Bin�r- oder Quelldistribution der
entsprechenden Version.
@end ifinfo



@menu
* Introduction::                
* Deutsch::                     
* Installing::                  
* Tutorial::                    
* MySQL Database Administration::  
* MySQL Optimisation::          
* Reference::                   
* Table types::                 
* Clients::                     
* Extending MySQL::             
* Problems::                    
* Benutzer::                    
* MySQL-Benutzung durch Kunden::  
* Contrib::                     
* Credits::                     
* News::                        
* Porting::                     
* Environment variables::       
* Regexp::                      
* GPL license::                 
* LGPL license::                
* Function Index::              
* Concept Index::               
@end menu

@node Introduction, Deutsch, Top, Top
@c German node Einf�hrung
@chapter Allgemeine Informationen �ber MySQL

@cindex �berblick
@cindex Allgemeine Informationen

MySQL ist ein sehr schneller und robuster, Multi-Thread und Multi-User
SQL-Datenbank-Server (SQL = Structured Query Language, strukturierte
Abfrage-Sprache).
Die Einsatzgebiete des MySQL Server liegen in Hochleistungsapplikationen
und in der Einbindung in weit verbreitete Massen-Software.
@code{MySQL} ist eine Schutzmarke von @code{MySQL AB}.

Die MySQL Software steht unter einer @code{Doppellizenz}. Sie
k�nnen sie entweder frei im Sinne der @code{GNU GENERAL PUBLIC LICENSE}
(@uref{http://www.gnu.org/licenses/}) verwenden, oder Sie erwerben eine
komerzielle Lizenz, wenn Sie nicht durch die Restriktionen der GPL
gebunden sein wollen.
@xref{Lizenzpolitik}.

@uref{http://www.mysql.com/, die MySQL Homepage}
enth�lt die letzten Informationen �ber MySQL.

Die folgende Liste beschreibt n�tzliche Teile des Handbuchs.

@itemize @bullet
@item
Informationen zu dem Unternehmen hinter MySQL: @ref{What is MySQL AB}.

@item
Eine Diskussion der F�higkeiten von MySQL: @ref{Features}.

@item
Installationsanweisungen: @ref{Installing}.

@item
Tipps zur Portierung von MySQL auf neue Architekturen oder Betriebssysteme:
@ref{Porting}.

@item
Informationen zum Upgrade von einem Release der Version 3.23:
@ref{Upgrading-from-3.23}.

@item
Informationen zum Upgrade von einem Release der Version 3.22:
@ref{Upgrading-from-3.22}.

@item
Einf�hrungs-Tutorial zu MySQL: @ref{Tutorial}.

@item
SQL-Beispiele und Informationen zu Benchmarks befinden sich im
Benchmark-Verzeichnis (@file{sql-bench} in der Distribution).

@item
Die Geschichte neuer Features und Bugfixes: @ref{News}.

@item
@c German FIX was @nqs{Feature-Probleme}; no idea what @nqs is??
Eine Liste bekannter Bugs und Feature-Probleme: @ref{Bugs}.

@item
Zukunftspl�ne: @ref{TODO}.

@item
Eine Liste aller Beteiligten, die zu diesem Projekt beitrugen: @ref{Credits}.
@end itemize

@strong{WICHTIG:}

Berichte zu Fehlern (oft Bugs genannt) sowie Fragen und Bemerkungen sollten
an die Mailingliste geschickt werden: @email{mysql@@lists.mysql.com}.
@xref{Bug reports}.
Das @code{mysqlbug} Skript sollte benutzt werden, um Fehlerberichte zu
erzeugen.
@c FIX! RPMs are also binary
Bei Quelltext-Distributionen liegt das @code{mysqlbug} Skript im
@file{scripts} Verzeichnis. Bei Bin�rdistributionen liegt @code{mysqlbug}
im @file{bin} Verzeichnis. Wenn Sie einen empfindlichen Sicherheits-Bug in
MySQL gefunden haben, sollten Sie eine E-Mail an
@email{security@@mysql.com} schicken.

@cindex Fehler, berichten
@cindex Berichten, Fehler
@cindex Mailing-Listen-Adresse
@cindex @code{mysqlbug}-Skript, Speicherort




@node Deutsch, Installing, Introduction, Top
@c German node <no English equivalent>
@chapter Vorbemerkungen zum deutschen Handbuch

Die �bersetzung einer so umfangreichen technischen Dokumentation wie des
MySQL-Referenzhandbuchs ist schon eine besondere Herausforderung.
Zumindest f�r jemanden, der seine Zielsprache ernst nimmt:

@itemize @bullet
@item
In diesem Handbuch wird nicht geupdated, sondern aktualisiert.
@item
Eine MySQL-Distribution wird nicht gedownloaded, sondern herunter
geladen.
@item
Und Transaktionen werden nicht gerollbackt, sondern zur�ckgerollt.
@end itemize

Womit wir auch schon bei der besonderen Herausforderung w�ren: Jeder,
der sich mit Transaktionen auskennt, wei�, dass beim Fehlschlagen einer
solchen ein Rollback-Befehl ausgef�hrt wird. Dieses Hauptwort ins
Deutsche zu �bersetzen, w�rde zum Verst�ndnis wenig beitragen - im
Gegenteil.

Damit bleiben alle technischen Fachbegriffe, die sich so und nicht
anders etabliert haben, englisch:

@itemize @bullet
@item
Ein SQL-Statement wird nicht als "Erkl�rung in der Strukturierten
AbfrageSprache (SAS)" �bersetzt.
@item
Abk�rzungen wie TCP/IP werden nicht zu �SP/ZP
(�bertragungsSteuerungsProtokoll/ZwischennetzProtokoll).
@item
Ein Client bleibt ein Client, und ein Server ein Server.
@end itemize

Die Fallstricke einer �bersetzung stecken allerdings in den Details:

@itemize @bullet
@item
Jeder SQL-Kenner wei�, was eine "query" ist. In diesem Handbuch ist
das eine Anfrage.
@item
Gibt es Probleme bei der �bermittlung einer Anfrage, kann es sein,
dass eine Zeit�berschreitung eintritt. Der Profi h�tte wahrscheinlich
nach "Timeout" gesucht.
@item
Manche Dinge sind einfacher: Ein "string" ist eine Zeichenkette
(obwohl f�r Profis vielleicht ungewohnt), ein "hex value" ein
hexadezimaler Wert.
@end itemize

Richtig spannend wird die �bersetzung bei W�rtern, die in der deutschen
Fachsprache zumeist englisch verwendet werden, obwohl es passende
deutsche Entsprechungen gibt:

@itemize @bullet
@item
Im Hauptspeicher ("RAM") zwischengespeicherte Daten werden auf die
Festplatte zur�ckgeschrieben. Im Englischen hei�t das "flushed to
disk", und im Deutschen werden die Daten h�ufig "geflushed".
@item
Daten werden zwischengespeichert ("gecached").
@item
Speicher wird zugewiesen. Man kann auch "alloziert" sagen, was dem
englischen "allocated" n�her kommt.
@end itemize

Alle diese Entsprechungen, bei denen die deutsche Sprache eher in
Vergessenheit geraten ist, wurden zweisprachig aufgenommen. Beispiele:

@itemize @bullet
@item
Alle Daten werden zwischen Anfragen auf die Festplatte zur�ck
geschrieben (flush).
@item
Aktualisieren Sie (Update), wenn alles in Ordnung ist.
@item
Auf eine h�here Version von MySQL aktualisieren (Upgrade) ...
@end itemize

Gelegentlich wird auch in diesem Handbuch die "Performance getuned",
neue "Features" eines MySQL-"Release" werden beschrieben usw. Anregungen
f�r eine weiter gehende Eindeutschung nimmt der �bersetzer gern
entgegen. Insbesondere gilt das auch f�r Hinweise zur Verk�rzung
deutscher Ausdr�cke. Beispielsweise hei�t "case sensitive" (14
Buchstaben) im Handbuch "abh�ngig von der verwendeten
Gro�-/Kleinschreibung" (44 Buchstaben).

Letzter Punkt: Die �bersetzung erfolgte in �u�erst enger Anlehnung an
das englischsprachige Original. Nichts wurde hinzugef�gt (ausser diesem
Vorwort), ge�ndert oder weggelassen (Ausnahme: die Geschichte der
�nderungen (ChangeLog) vor Version 3.23). Es liegt in der Natur der
Dinge, dass weder Original noch �bersetzung frei von Fehlern sind
(obwohl wir das anstreben). Berichten Sie bitte �bersetzungsfehler,
stilistische "Bugs", die das Verst�ndnis beeintr�chtigen und sonstige
Anmerkungen zur �bersetzung direkt an:

@c German FIX added escape @@ in e-mail address.
Stefan Hinz, @email{handbuch@@mysql.com}

Berlin, im Februar 2002

Stefan Hinz, @uref{http://iConnect.de,iConnect GmbH Berlin}


@menu
* Manual-info::                 
* What-is::                     
* What is MySQL AB::            
* Licensing and Support::       
* MySQL 4.0 In A Nutshell::     
* MySQL Information Sources::   
* Compatibility::               
* TODO::                        
* Comparisons::                 
@end menu

@node Manual-info, What-is, Deutsch, Deutsch
@c German node Handbuch-Informationen
@section �ber dieses Handbuch

@cindex Speicherort des Online-Handbuchs
@cindex Handbuch, Online-Speicherort

Das ist ein Referenzhandbuch. Es enth�lt keine allgemeinen Anleitungen zu
SQL oder relationalen Datenbankkonzepten.
@c German FIX these references don't exist:
@c Wenn Sie allgemeine Informationen �ber SQL suchen,
@c finden Sie diese hier: @ref{SQL allgemein}.
@c B�cher, die sich speziell mit MySQL besch�ftigen,
@c finden Sie hier: @ref{MySQL-B�cher}.

Da die MySQL Datenbank Software eine laufende Weiterentwicklung erf�hrt, wird
das Handbuch regelm��ig aktualisiert.
Die jeweils aktuellste Version dieses Handbuchs befindet sich unter
@uref{http://www.mysql.com/documentation/}.
Dieses Handbuch ist gegenw�rtig verf�gbar in Texinfo, als Klartext
(plain text), Info, HTML, PostScript und PDF. Das Prim�rdokument ist die
Texinfo-Datei.
Die HTML-Version wird automatisch produziert, indem eine modifizierte
Version von @code{texi2html} benutzt wird. Die Klartext- und Info-
Versionen werden mit @code{makeinfo} hergestellt. Die PostScript-Version
wird mit @code{texi2dvi} und @code{dvips} produziert. Die PDF-Version
wird mit @code{pdftex} hergestellt.

Wenn Sie Schwierigkeiten haben, Informationen zu finden, beachten Sie bitte
auch die durchsuchbare PHP Version des Handbuchs unter
@uref{http://www.mysql.com/doc/}.

Wenn Sie Vorschl�ge f�r Hinzuf�gungen oder Korrekturen dieses Handbuchs
haben, schicken Sie sie bitte an das Handbuch-Team:
@email{docs@@mysql.com}.

@cindex Handbuch, verf�gbare Formate
@cindex Texinfo

Dieses Handbuch wurde geschrieben und wird gewartet von David Axmark,
Michael (Monty) Widenius, Jeremy Cole, und Paul DuBois. Andere
Kontributoren sind unter @ref{Credits} aufgelistet.
Die deutsche �bersetzung stammt von Stefan Hinz. F�r die
Aktualit�t ist Jan Lehnardt zust�ndig.

Das Copyright (2002) f�r dieses  liegt bei der schwedischen Firma
@code{MySQL AB}. @xref{Copyright}.


@menu
* Manual conventions::          
@end menu

@node Manual conventions,  , Manual-info, Manual-info
@c German node Handbuch-Konventionen
@subsection Konventionen in diesem Handbuch

Dieses Handbuch benutzt bestimmte typographische Konventionen:

@cindex Handbuch, typografische Konventionen
@cindex Typografische Konventionen
@cindex Konventionen, typografische

@table @asis
@item @code{constant}
Schriftart gleicher Breite (nicht-proportionale Schrift) wird f�r
Befehle und Optionen benutzt, f�r SQL-Statements, Datenbank-, Tabellen-
und Spaltennamen, f�r C- und PERL-Code und f�r Umgebungsvariablen.
Beispiel: ``Um festzustellen, wie @code{mysqladmin} funktioniert, rufen
Sie den Befehl mit der @code{--help} Option auf.''

@item @file{filename}
Schriftart gleicher Breite, die von Anf�hrungszeichen umgeben ist, wird
f�r Datei- und Pfadnamen benutzt. Beispiel: ``Die Distribution wird im
Verzeichnis @file{/usr/local/} installiert.''

@item @samp{c}
Schriftart gleicher Breite, die von Anf�hrungszeichen umgeben ist, wird
auch benutzt um Zeichenfolgen anzuzeigen. Beispiel: ``Um ein
Platzhalterzeichen einzugeben, benutzen Sie das @samp{%} Zeichen.''

@item @emph{italic}
Kursivschrift wird f�r Hervorhebungen verwendet, @emph{wie in diesem
Beispiel}.

@item @strong{boldface}
Fettschrift wird f�r Namen von Zugriffsrechten verwendet (zum Beispiel:
``Gew�hren Sie das @strong{process} Zugriffsrecht nicht leichtfertig'')
und gelegentlich, um @strong{besonders starke Hervorhebungen} zu kennzeichnen.
@end table

Wenn Befehle gezeigt werden, die durch ein bestimmtes Programm
ausgef�hrt werden sollen, wird dieses Programm durch einen Prompt
(Eingabeaufforderung) vor dem Befehl angezeigt. Der @code{shell>} Prompt
zum Beispiel zeigt an, dass Sie den Befehl von Ihrer Login-Shell aus
ausf�hren sollen. @code{mysql>} zeigt an, dass Sie den Befehl vom
@code{mysql} Client-Programm aus ausf�hren sollen:

@example
shell> geben sie hier ein shell-kommando ein
mysql> geben sie hier ein mysql-kommando ein
@end example

Shell-Befehle werden mit der Bourne-Shell-Syntax dargestellt. Wenn Sie
eine @code{csh}-Shell benutzen, m�ssen die Befehle evtl. etwas anders
eingegeben werden. Das folgende Beispiel zeigt, wie mit der Bourne-Shell eine
Umgebungsvariable gesetzt wird und anschlie�end ein Befehl abgesetzt
wird:

@example
shell> VARNAME=wert irgendein_befehl
@end example

@cindex Shell-Syntax
@cindex Befehlssyntax

Um @code{csh} auszuf�hren, w�rden Sie folgende Sequenz ausf�hren:

@example
shell> setenv VARNAME wert
shell> irgendein_befehl
@end example

Oft m�ssen Datenbank-, Tabellen- und Spaltennamen in konkreten Befehlen
ersetzt werden. Um anzuzeigen, dass eine solche Ersetzung notwendig ist,
benutzt dieses Handbuch @code{db_name}, @code{tbl_name} und
@code{col_name}. Sie k�nnten zum Beispiel folgendes Statement sehen:

@example
mysql> SELECT spalten_name FROM datenbank_name.tabellen_name;
@end example

Wenn Sie ein �hnliches Statement eingeben wollen, m�ssen Sie Ihre
eigenen Datenbank-, Tabellen- und Spaltennamen eingeben, zum Beispiel
wie folgt:

@example
mysql> SELECT autor_name FROM bibliothek.autorenliste;
@end example

SQL-Statements k�nnen in Gro�- und Kleinschreibung geschrieben werden.
Wenn dieses Handbuch SQL-Statements darstellt, wird Gro�schreibung
verwendet, um spezielle Schl�sselworte in diesem Kontext hervorzuheben.
Kleinschreibung wird f�r den Rest des Statements verwendet. Folgendes
k�nnten Sie im Kontext des @code{SELECT} Statements sehen:

@example
mysql> SELECT count(*) FROM tabellen_name;
@end example

Im Kontext der @code{COUNT()} Funktion hingegen k�nnte dasselbe
Statement wie folgt geschrieben werden:

@example
mysql> select COUNT(*) from tabellen_name;
@end example

Wenn keine besondere Hervorhebung beabsichtigt wird, werden alle
Schl�sselworte in Gro�schreibung dargestellt.

In Syntax-Beschreibungen werden eckige Klammern (@samp{[} und @samp{]})
benutzt, um wahlfrei (optionale) W�rter oder Klauseln anzuzeigen:

@example
DROP TABLE [IF EXISTS] tabellen_name
@end example

Wenn ein Syntaxelement aus einer Anzahl von Alternativen besteht, werden
die Alternativen durch gerade Striche (@samp{|}) voneinander getrennt.
Wenn genau ein Element aus einer Anzahl von M�glichkeiten ausgew�hlt
werden (@strong{kann}), werden die Alternativen mit eckigen Klammern
aufgelistet (@samp{[} und @samp{]}):

@example
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
@end example

Wenn genau ein Element aus einer Anzahl von M�glichkeiten ausgew�hlt
werden @strong{muss}, werden die Alternativen innerhalb geschweifter
Klammern aufgelistet (@samp{@{} und @samp{@}}):

@example
@{DESCRIBE | DESC@} tbl_name @{col_name | wild@}
@end example


@node What-is, What is MySQL AB, Manual-info, Deutsch
@c German node Was ist MySQL?
@section Was ist MySQL?

@cindex MySQL, Definition
@cindex MySQL, Einf�hrung


MySQL, die popul�rste Open Source SQL-Datenbank, wird von MySQL AB zur
Verf�gung gestellt. MySQL AB ist ein kommerzielles Unternehmen, dessen
Gesch�ft darin besteht, Serviceleistungen rund um die MySQL-Datenbank
zur Verf�gung zu stellen. @xref{What is MySQL AB}.

@table @asis

@item MySQL ist ein Datenbank-Managementsystem.

Eine Datenbank ist eine strukturierte Sammlung von Daten. Das kann alles
sein - von einer einfachen Einkaufsliste �ber eine Bildergalerie bis zu
riesigen Informationsmengen in einem Unternehmensnetzwerk. Um Daten zu
einer Computer-Datenbank hinzuzuf�gen, auf sie zuzugreifen und sie zu
verarbeiten, ben�tigen Sie ein Datenbank-Managementsystem wie MySQL. Weil
Computer sehr gut darin sind, gro�e Datenmengen zu handhaben, spielt
Datenbank-Management eine zentrale Rolle im Computer-Bereich, sowohl bei
Anwendungen, die allein laufen (Stand-Alone-Utilities) als auch als Teil
anderer Anwendungen.
@cindex Datenbanken, Definition

@item MySQL ist ein relationales Datenbank-Managementsystem.

Eine relationale Datenbank speichert Daten in separaten Tabellen,
anstatt sie alle in einem einzigen gro�en Speicherraum unterzubringen.
Hierdurch werden hohe Geschwindigkeit und Flexibilit�t erreicht. Die
Tabellen werden durch definierte Beziehungen verbunden (Relationen), was
es m�glich macht, Daten aus verschiedenen Tabellen auf Nachfrage zu
kombinieren. Der SQL-Teil von MySQL steht f�r "Structured Query
Language" (strukturierte Abfragesprache) - die verbreitetste
standardisierte Sprache f�r Datenbankzugriffe.

@cindex Relationale Datenbanken, Definition
@cindex SQL, Definition
@item MySQL ist Open-Source-Software.

Open Source bedeutet, dass es f�r jeden m�glich ist, solche Software zu
benutzen und zu ver�ndern. Jeder kann MySQL aus dem Internet herunter
laden und benutzen, ohne irgend etwas zu bezahlen. Jeder, der daran
interessiert ist, kann den Quelltext studieren und den eigenen
Bed�rfnissen entsprechend ver�ndern. MySQL benutzt die GPL (GNU
General Public License) @uref{http://www.gnu.org}, um festzulegen, was
Sie mit der Software tun d�rfen und was Sie nicht tun d�rfen, abh�ngig
von unterschiedlichen Situationen. Wenn Ihnen die GPL Probleme bereitet
oder wenn Sie MySQL in eine kommerzielle Anwendung einbetten m�ssen,
k�nnen Sie eine kommerziell lizensierte Version von uns erwerben.

@cindex Open Source, Definition
@cindex General Public License

@item Warum sollten Sie MySQL benutzen?

MySQL ist sehr schnell, zuverl�ssig und leicht zu benutzen. Wenn Sie
nach diesen Eigenschaften suchen, sollten Sie MySQL ausprobieren. MySQL
besitzt eine ganze Reihe praktischer Features, die in enger Kooperation
mit unseren Benutzern entwickelt wurden. Einen Performance-Vergleich
zwischen MySQL und einigen anderen Datenbank-Managementsystemen finden
Sie auf unserer Benchmark-Seite.
@xref{MySQL Benchmarks}.

MySQL wurde urspr�nglich entwickelt, um sehr gro�e Datenbanken
handhaben zu k�nnen, und zwar sehr viel schneller als existierende
L�sungen. Es wurde mehrere Jahre in h�chst anspruchsvollen
Produktionsumgebungen eingesetzt. Heutzutage bietet MySQL eine 
umfangreiche Reihe sehr n�tzlicher Funktionen. Connectivity,
Geschwindigkeit und Sicherheit machen MySQL �u�erst geeignet, um auf
Datenbanken �ber das Internet zuzugreifen.

@item Die technischen Features von MySQL

Weiter f�hrende technische Informationen finden Sie unter
@ref{Reference}.  MySQL ist ein Client-Server-System, das aus einem
multi-thread SQL-Server besteht, der unterschiedliche Backends,
verschiedene Client-Programme und -Bibliotheken, Verwaltungswerkzeuge
und etliche Programmschnittstellen unterst�tzt.

Wir stellen MySQL auch als multi-thread Bibliothek zur Verf�gung, die
Sie mit Ihren Anwendungen verkn�pfen k�nnen, um ein kleineres,
schnelleres und leichter zu bedienendes Produkt zu erhalten.

@item MySQL stellt beigesteuerte (contributed) Software in gro�er Menge
zur Verf�gung.

Es ist sehr wahrscheinlich, dass Ihre Lieblingsanwendung oder -sprache
bereits MySQL unterst�tzt.

@end table

@cindex Aussprache, MySQL
@cindex MySQL, Aussprache
@cindex Ziele von MySQL
Offiziell wird MySQL 'Mai Ess Ku Ell' ausgesprochen (nicht 'Mai
Siekwel'). Wir vermeiden allerdings, Leute zu korrigieren, die
Mai-Siekwel sagen.

@cindex MySQL-Geschichte
@cindex Geschichte von MySQL
@cindex MySQL, Name
@cindex My, Ursprung

Wir fingen urspr�nglich mit der Intention an, den @code{mSQL}-Code zu
benutzen, um unsere eigenen Tabellen anzusprechen, wobei wir unsere
eigenen schnellen Low-Level-Routinen (ISAM) benutzten. Nach einigem
Testen gelangten wir allerdings zur �berzeugung, dass @code{mSQL} weder
schnell noch flexibel genug w�re, um unsere Anforderungen abzudecken.
Dies resultierte in einer neuen SQL-Schnittstelle zu unserer Datenbank,
allerdings mit fast derselben API-Schnittstelle, wie sie @code{mSQL}
benutzt. Diese API wurde gew�hlt, weil sie es erlaubte, Code von
Drittanbietern einfach zu portieren. Die Entstehung des Namens MySQL ist
nicht v�llig gekl�rt. Unser Basis-Verzeichnis und eine gro�e Anzahl
unserer Bibliotheken und Werkzeuge hatten immer schon das Pr�fix ``my''
w�hrend mehr als 10 Jahren. Wie auch immer, auch Montys Tochter (einige
Jahre j�nger) hei�t My. Welcher der beiden Umst�nde MySQL den Namen
gab, ist immer noch ein R�tsel, sogar f�r uns.


@menu
* Features::                    
* Stability::                   
* Table size::                  
* Year 2000 compliance::        
@end menu

@node Features, Stability, What-is, What-is
@c German node Features
@subsection Die wichtigsten Features von MySQL

@cindex Haupt-Features von MySQL
@cindex Features von MySQL

Die folgende Liste beschreibt einige wichtige Charakteristika von MySQL:

@c This list is too technical und should be divided into one feature
@c list comparable to commercial competition und a very technical on
@c with max limits (from crash-me) und so on.
@itemize @bullet
@item
Voll multi-thread unter Benutzung von Kernel-Threads. Das bedeutet, dass
Sie sehr einfach mehrere Prozessoren benutzen k�nnen, falls verf�gbar.

@item
C-, C++-, Eiffel-, Java-, Perl-, PHP-, Python- und Tcl-APIs. @xref{Clients}.

@item
L�uft auf vielen verschiedenen Plattformen.  @xref{Which OS}.

@item
Viele Spaltentypen: vorzeichenbehaftete / vorzeichenlose Ganzzahlen
(Integer), die 1, 2, 3, 4 und 8 Byte lang sind, @code{FLOAT},
@code{DOUBLE}, @code{CHAR}, @code{VARCHAR}, @code{TEXT}, @code{BLOB},
@code{DATE}, @code{TIME}, @code{DATETIME}, @code{TIMESTAMP},
@code{YEAR}, @code{SET}, und @code{ENUM} Typen.
@xref{Column types}.

@item
Sehr schnelle Joins durch Benutzung eines optimierten Multi-Joins in
einem Durchgang (one-sweep multi-join).

@item
Volle Operator- und Funktionsunterst�tzung in @code{SELECT}- und
@code{WHERE}-Teilen von Anfragen. Beispiel:

@example
mysql> SELECT CONCAT(vorname, " ", nachname) FROM tabellen_name
           WHERE einkommen/dependents > 10000 AND age > 30;
@end example

@item
SQL-Funktionen sind durch eine hoch optimierte Klassenbibliothek
implementiert und sollten so schnell sein, wie es geht! �blicherweise
gibt es �berhaupt keine Speicherzuordnung (memory allocation) nach der
Initialisierung von Anfragen.

@item
Volle Unterst�tzung f�r SQL-@code{GROUP BY} und @code{ORDER BY}-
Klauseln. Unterst�tzung f�r Gruppierungsfunktionen (@code{COUNT()},
@code{COUNT(DISTINCT ...)}, @code{AVG()}, @code{STD()}, @code{SUM()},
@code{MAX()} und @code{MIN()}).

@item
Unterst�tzung f�r @code{LEFT OUTER JOIN} und @code{RIGHT OUTER JOIN} mit
ANSI-SQL und ODBC-Syntax.

@item
Sie k�nnen Tabellen aus unterschiedlichen Datenbanken in ein und
derselben SQL-Anfrage benutzen (ab Version 3.22).

@item
Ein System von Zugriffsberechtigungen und Passw�rtern, das sehr flexibel
und sicher ist, und das Host-basierende Verifizierung erlaubt.
Passw�rter sind sicher, weil jeder Passwort-Verkehr verschl�sselt wird,
wenn Sie sich mit einem Server verbinden.

@item
ODBC (Open-DataBase-Connectivity) Unterst�tzung f�r Win32 (mit
Quelltext). Alle ODBC 2.5 Funktionen und viele weitere. Sie k�nnen zum
Beispiel MS Access benutzen, um sich mit Ihrem MySQL-Server zu
verbinden. @xref{ODBC}.

@item
Sehr schnelle B-tree disk Tabellen mit Index-Kompression.

@item
Bis zu 32 Indexe pro Tabelle erlaubt. Jeder Index kann aus 1 bis 16
Spalten oder Teilen von Spalten bestehen. Die maximale Indexl�nge
betr�gt 500 Bytes (das �ndert sich evtl., wenn MySQL kompiliert wird).
Ein Index kann das Pr�fix eines @code{CHAR}- oder @code{VARCHAR}-Felds
benutzen.

@item
Datens�tze fester und variabler L�nge.

@item
Im Arbeitsspeicher gehaltene Hash-Tabellen, die als tempor�re Tabellen
benutzt werden.

@item
Kann gro�e Datenbanken handhaben. Wir selbst benutzen MySQL bei einigen
Datenbanken, die 50 Mio. Datens�tze haben und wir kennen Benutzer, die
MySQL mit 60.000 Tabellen und etwa 5 Milliarden Zeilen benutzen.

@item
Alle Spalten k�nnen Vorgabewerte (Defaults) haben. Sie k�nnen @code{INSERT}
benutzen, um eine Untermenge der Tabellenspalten mit Werten zu
best�cken. Diejenigen Spalten, die nicht explizit angesprochen werden,
werden auf ihre Vorgabewerte gesetzt.

@item
Benutzt GNU Automake, Autoconf und Libtool aus Portabilit�tsgr�nden.

@item
Geschrieben in C und C++. Getestet mit gro�en Anzahl verschiedener
Compiler.

@item
Ein sehr schnelles Thread-basierendes Speicherzuordnungs-System (memory
allocation system).

@item
Keine Speicherlecks (memory leaks).  MySQL wurde mit Purify getestet,
einem kommerziellen Werkzeug zur Entdeckung von Speicherlecks.

@item
Beinhaltet @code{myisamchk}, ein sehr schnelles Dienstprogramm zur �berpr�fung,
Optimierung und Reparatur von Tabellen. Die gesamte Funktionalit�t von
@code{myisamchk} steht auch �ber die SQL-Schnittstelle zur Verf�gung.
@xref{MySQL Database Administration}.

@item
Volle Unterst�tzung f�r mehrere unterschiedliche Zeichens�tze, incl. ISO-
8859-1 (Latin1), big5, ujis und weitere. So sind zum Beispiel die
skandinavischen Zeichen `@ringaccent{a}', `@"a' und `@"o' in Tabellen-
und Spaltennamen erlaubt.

@item
Alle Daten werden mit dem ausgew�hlten Zeichensatz gespeichert. Alle
Vergleiche f�r normale Zeichenkettenvergleiche sind unabh�ngig von
Gro�- und Kleinschreibung.

@item
Die Sortierung ist abh�ngig vom gew�hlten Zeichensatz (schwedisch als
Vorgabe). Das kann beim Start des MySQL-Servers ge�ndert werden. Um
beispielsweise eine sehr fortgeschrittene Sortierung zu sehen, sehen Sie
sich den tschechischen Sortier-Code an. MySQL unterst�tzt viele
unterschiedliche Zeichens�tze, die bei der Kompilierung und w�hrend der
Laufzeit festgelegt werden k�nnen. Der neue Zeichensatz 'latin_de' sorgt
f�r eine korrekte deutsche Sortierreihenfolge.

@item
Aliase auf Tabellen und Spalten sind erlaubt, wie im SQL92-Standard
festgelegt.

@item
@code{DELETE}, @code{INSERT}, @code{REPLACE} und @code{UPDATE} geben die
Anzahl der Zeilen zur�ck, die ge�ndert wurden (bzw. betroffen sind). Es
ist statt dessen auch m�glich, die Anzahl der �bereinstimmenden Zeilen
zur�ckzugeben, indem beim Verbindungsstart zum Server ein entsprechendes
Flag gesetzt wird.

@item
Funktionsnamen kollidieren nicht mit Tabellen- oder Spaltennamen.
@code{ABS} zum Beispiel ist ein g�ltiger Spaltenname. Die einzige
Einschr�nkung besteht drin, dass in einem Funktionsaufruf keine
Leerzeichen zwischen Funktionsname und der �ffnenden runden Klammer, die
diesem folgt @samp{(}, erlaubt ist. @xref{Reserved words}.

@item
Alle MySQL-Programme k�nnen mit der @code{--help} oder @code{-?} Option
aufgerufen werden, um Online-Hilfe zu erhalten.

@item
Der Server kann Clients Fehlermeldungen in verschiedenen Sprachen zur
Verf�gung stellen.
@xref{Languages}.

@item
Clients k�nnen sich mit dem MySQL-Server �ber TCP/IP Sockets,
Unix Sockets (Unix) oder Named Pipes (NT) verbinden.

@item
Der MySQL-spezifische @code{SHOW}-Befehl kann benutzt werden, um
Informationen �ber Datenbanken, Tabellen und Indexe zu erhalten. Der
@code{EXPLAIN}-Code kann benutzt werden um festzustellen, wie der
Optimierer eine Anfrage aufl�st.
@end itemize


@node Stability, Table size, Features, What-is
@c German node Stabilit�t
@subsection Wie stabil ist MySQL?

@cindex Stabilit�t

Dieser Abschnitt besch�ftigt sich mit den Fragen ``Wie stabil ist
MySQL?'' und ``Kann ich mich auf MySQL bei diesem Projekt verlassen?''
Wir werden versuchen, einige Dinge klar zu stellen und einige der
wichtigeren Fragen zu beantworten, die offensichtlich viele Leute
besch�ftigen. Dieser Abschnitt wurde aus Informationen zusammen
gestellt, die aus der Mailing-Liste gesammelt wurden (die sehr aktiv
beim Berichten von Bugs ist).

Bei TcX funktioniert MySQL ohne jegliche Probleme in unseren Projekten
seit Mitte 1996. Als MySQL einer breiteren �ffentlichkeit zug�nglich
gemacht wurde, fiel uns auf, dass es einige Teile von ``ungetestetem
Code'' gab, die schnell von neuen Benutzern gefunden wurden, die
Anfragen machten, die von unseren eigenen abwichen. Seitdem hat jedes
neue Release weniger Portabilit�tsprobleme als das vorhergehende (obwohl
jedes viele neue Features hat).

Jedes Release von MySQL war benutzbar. Probleme gab es nur, wenn
Benutzer anfingen, Code aus den ``Grauzonen'' zu benutzen. Nat�rlich
wissen Benutzer von ausserhalb nicht, was diese Grauzonen sind, daher
versucht dieser Abschnitt, die momentan bekannten aufzuzeigen. Die
Beschreibungen hier beziehen sich auf Version 3.23 von MySQL. Alle
bekannten und berichteten Bugs werden in der letzten Version behoben,
mit Ausnahme der Bugs, die im Bugs-Abschnitt aufgelistet sind, was Dinge
sind, die auf das Design zur�ckzuf�hren sind. @xref{Bugs}.

MySQL ist in mehrfachen Ebenen (Layers) und verschiedenen unabh�ngigen
Modulen geschrieben. Diese Module sind im Folgenden aufgef�hrt, wobei
angezeigt wird, wie gut getestet jedes von ihnen ist:

@cindex Module, Auflistung

@table @strong
@item Der ISAM Tabellen-Handler --- stabil
Dieser verwaltet Speicherung und Abfrage aller Daten in MySQL Version
3.22 und fr�her. In allen Releases von MySQL gab es nicht einen einzigen
(berichteten) Bug in diesem Code. Die einzige M�glichkeit, eine
zerst�rte (korrumpierte) Tabelle zu erhalten, besteht darin, den Server
mitten w�hrend eines Updates zu killen. Selbst dadurch ist es
unwahrscheinlich, dass Daten unwiederbringlich zerst�rt werden, denn
alle Daten werden zwischen Anfragen auf die Festplatte zur�ck
geschrieben (flush). Es hat nicht einen einzigen Bug-Bericht gegeben, in
dem von verlorenen Daten aufgrund von MySQL-Bugs berichtet wurde.

@cindex ISAM-Tabellen-Handler
@cindex Speicherung, Daten
@cindex Abfrage, Daten
@cindex Daten, ISAM-Tabellen-Handler

@item Der MyISAM Tabellen-Handler --- stabil
Dieser wurde in MySQL Version 3.23 hinzu gef�gt. Er basiert zum gro�en
Teil auf dem ISAM Tabellen-Code, hat aber eine Menge neuer und sehr
n�tzlicher Features.

@item Der Parser und lexikalische Analysator --- stabil
Es hat seit sehr langer Zeit keinen einzigen berichteten Bug in diesem
System gegeben.

@item Der C Client-Code --- stabil
Keine bekannten Probleme. Im fr�hen 3.20 Release gab es einige
Einschr�nkungen hinsichtlich der Gr��e des Sende- / Empfangs-Puffers
(buffer size). Ab Version 3.21 ist die Puffergr��e jetzt dynamisch, bis
zu einem Vorgabewert von 16 M.

@item Standard-Client-Programme --- stabil
Dies beinhaltet @code{mysql}, @code{mysqladmin}, @code{mysqlshow},
@code{mysqldump} und @code{mysqlimport}.

@item Basis-SQL --- stabil
Die grundlegenden SQL-Funktionen, Zeichenketten-Klassen und dynamisches
Speicher-Handling. Nicht ein einziger berichteter Bug in diesem System.

@item Anfragen-Optimierer (Query optimizer) --- stabil

@item Bereichs-Optimierer (Range optimizer) --- stabil

@item Join-Optimierer (Join optimizer) --- stabil

@item Sperren (Locking) --- Gamma
Dies ist sehr system-abh�ngig. Auf einigen Systemen gibt es gro�e
Probleme, wenn Standard-Betriebssystem-Sperren verwendet wird
(@code{fcntl()}). In solchen F�llen sollten Sie den MySQL-Daemon mit dem
Flag @code{--skip-locking} laufen lassen. Bekannt ist, dass solche
Probleme auf manchen Linux-Systemen vorkommen sowie auf SunOS, wenn NFS-
gemountete Dateisysteme verwendet werden.

@item Linux-Threads --- stabil
Das haupts�chliche Problem fand sich im @code{fcntl()}-Aufruf, der durch
Benutzung der @w{@code{--skip-locking}}-Option bei @code{mysqld} behoben
werden kann. Einige Leute haben Lockup-Probleme mit Version 0.5
berichtet. Linux-Threads m�ssen rekompiliert werden, wenn Sie mehr als
1000 gleichzeitige Verbindungen benutzen wollen. Obwohl es m�glich ist,
so viele Verbindungen mit den vorgabem��igen Linux-Threads laufen zu
lassen (obwohl man nie �ber 1021 kommen wird), macht das vorgabem��ige
Stack-Spacing von 2 MB die Applikation unstabil, und wir konnten einen
Coredump reproduzieren, nachdem 1021 Verbindungen im Leerlauf (idle
connections) hergestellt wurden. @xref{Linux}.

@item Solaris 2.5+ pthreads --- stabil
Wir benutzen dies f�r unsere gesamte Produktionsarbeit.

@item MIT-pthreads (andere Systeme) --- stabil
Seit Version 3.20.15 gab es keine berichteten Bugs mehr, und keine
bekannten Bugs seit Version 3.20.16. Auf einigen Systemen gibt es ein
``Misfeature'', das hei�t einige Operationen sind recht langsam (1/20
Sekunde Schlafzyklus zwischen jeder Anfrage). Nat�rlich k�nnen MIT-
Threads alles ein bisschen verlangsamen, aber Index-basierende
@code{SELECT}-Statements werden �blicherweise in einem Zeit-Frame
ausgef�hrt, also sollte es kein mutex locking/thread juggling geben.

@item Andere Thread-Implementierungen --- Beta - Gamma
Die Ports zu anderen Systemen sind noch sehr neu und k�nnen Bugs haben,
m�glicherweise auch in MySQL, aber in den meisten F�llen in der Thread-
Implementierung selbst.

@item @code{LOAD DATA ...}, @code{INSERT ... SELECT} --- stabil
Einige Leute dachten, hier Bugs gefunden zu haben, aber �blicherweise
haben sich diese als Missverst�ndnisse heraus gestellt. Bitte sehen Sie
zuerst im Handbuch nach, bevor Sie Bugs berichten!

@item @code{ALTER TABLE} --- stabil
Einige �nderungen in Version 3.22.12.

@item DBD --- stabil
Wird jetzt von Jochen Wiedmann gewartet
(@email{wiedmann@@neckar-alb.de}).  Danke!

@item @code{mysqlaccess} --- stabil
Geschrieben und gewartet von Yves Carlier 
(@email{Yves.Carlier@@rug.ac.be}). Danke!

@item @code{GRANT} --- stabil
gro�e �nderungen in MySQL Version 3.22.12.

@item @strong{MyODBC} (benutzt ODBC SDK 2.5) --- Gamma
Scheint mit einigen Programmen gut zu laufen.

@item Replikation -- Beta / Gamma
Wir arbeiten noch an der Replikation, also erwarten Sie nicht, dass
diese schon felsenfest steht. Auf der anderen Seite benutzen MySQL-
Benutzer diese bereits mit guten Resultaten.

@item BDB-Tabellen -- Beta
Der Berkeley-Datenbank-Code ist sehr stabil, aber wir verbessern immer
noch die Schnittstelle zwischen MySQL und BDB-Tabellen, also wird es
einige Zeit dauern, bevor dies so gut wie andere Tabellentypen getestet
ist.

@item InnoDB-Tabellen -- Beta
Diese wurden @code{MySQL} k�rzlich hinzu gef�gt. Sie scheinen gut zu
funktionieren und k�nnen nach einigen anf�nglichen Tests benutzt werden.

@item Automatische Wiederherstellung von MyISAM-Tabellen - Beta
Dies betrifft nur den neuen Code, der beim �ffnen einer Tabelle
nachsieht, ob diese korrekt geschlossen wurde und ein automatisches
�berpr�fen / Reparieren der Tabelle ausf�hrt, falls das nicht der Fall
war.

@item MERGE-Tabellen -- Beta / Gamma
Die Benutzung von Schl�sseln bei @code{MERGE}-Tabellen ist noch nicht
sehr ausgetestet. Der restliche Teile des @code{MERGE}-Codes ist recht
gut getestet.

@item FULLTEXT -- Beta
Textsuche scheint zu funktionieren, wird aber noch nicht viel
eingesetzt.

@end table

MySQL AB stellt E-Mail-Support f�r zahlende Kunden bereit, aber die
MySQL-Mailingliste bietet �blicher Weise Antworten f�r die meisten
Fragen. Bugs werden meist direkt mit einem Patch behoben; f�r
schwerwiegende Bugs gibt es fast immer ein neues Release.


@node Table size, Year 2000 compliance, Stability, What-is
@c German node Tabellengr��e
@subsection Wie gro� k�nnen MySQL-Tabellen sein?

@cindex Tabellen, maximale Gr��e
@cindex Gr��e von Tabellen
@cindex Betriebssysteme, Dateigr��en-Beschr�nkungen
@cindex Beschr�nkungen, Dateigr��e
@cindex Dateien, Dateigr��e

MySQL Version 3.22 hat eine Begrenzung auf 4G bei der Tabellengr��e.
Mit dem neuen @code{MyISAM} in MySQL Version 3.23 wurde die maximale
Tabellengr��e auf 8 Millionen Terabytes (2 ^ 63 bytes) hochgeschraubt.

Beachten Sie allerdings, dass Betriebssysteme ihre eigenen Dateigr��en-
Beschr�nkungen haben. Hier sind einige Beispiele:

@multitable @columnfractions .5 .5
@item @strong{Betriebssystem}   @tab @strong{Dateigr��en-Beschr�nkung}
@item Linux-Intel 32 bit        @tab 2G, 4G oder mehr, abh�ngig von der Linux-Version
@item Linux-Alpha               @tab 8T (?)
@item Solaris 2.5.1             @tab 2G (m�glich sind 4G mit Patch)
@item Solaris 2.6               @tab 4G
@item Solaris 2.7 Intel         @tab 4G
@item Solaris 2.7 ULTRA-SPARC   @tab 8T (?)
@end multitable

Auf Linux 2.2 kann man gr��ere Tabellen als 2G benutzen, wenn man den
LFS-Patch f�r das ext2 Dateisystem benutzt. Auf Linux 2.4 existiert
zus�tzlich ein Patch f�r das ReiserFS, um Unterst�tzung f�r gro�e
Dateien zu erhalten.

Letztlich wird die Tabellengr��e f�r MySQL normalerweise durch das
Betriebssystem begrenzt.

Vorgabem��ig haben MySQL-Tabellen eine maximale Gr��e von etwa 4G. Sie
k�nnen die maximale Tabellengr��e f�r eine Tabelle mit dem @code{SHOW
TABLE STATUS}-Befehl �berpr�fen oder mit @code{myisamchk -dv
tabellen_name}. @xref{SHOW}.

Wenn Sie gr��ere Tabellen als 4G ben�tigen (und Ihr Betriebssystem dies
unterst�tzt), sollten Sie die @code{AVG_ROW_LENGTH}- und
@code{MAX_ROWS}-Parameter benutzen, wenn Sie Ihre Tabelle anlegen.
@xref{CREATE TABLE}. Sie k�nnen diese auch sp�ter setzen, mit
@code{ALTER TABLE}. @xref{ALTER TABLE}.

Falls auf Ihre gro�e Tabelle nur mit Lesezugriff zugegriffen wird
(read-only), k�nnen Sie auch @code{myisampack} benutzen, um mehrere
Tabellen zu vereinen (merge) und sie zu einer zu komprimieren.
@code{myisampack} komprimiert eine Tabelle �blicherweise mindestens um
50%, also k�nnen Sie effektiv viel gr��ere Tabellen benutzen.
@xref{myisampack, ,@code{myisampack}}.

Sie k�nnen die Dateibegrenzung des Betriebssystems f�r @code{MyISAM}
Daten-Dateien umgehen, indem Sie die @code{RAID}-Option benutzen.
@xref{CREATE TABLE}.

Eine weitere L�sung kann die MERGE-Bibliothek darstellen, die Ihnen
erlaubt, eine Sammlung identischer Tabellen zugleich zu benutzen.
@xref{MERGE, MERGE tables}.


@node Year 2000 compliance,  , Table size, What-is
@c German node Jahr-2000-Konformit�t
@subsection Jahr-2000-Konformit�t

@cindex Jahr-2000-Konformit�t
@cindex Kompatibilit�t, Y2K, Jahr 2000
@cindex Datumsfunktionen, Y2K, Jahr-2000-Konformit�t

MySQL selbst hat keine Probleme mit der Jahr-2000-Konformit�t:

@itemize @bullet
@item
MySQL benutzt Unix-Zeitfunktionen und hat keine Probleme mit
Datumsangaben bis @code{2069}. Alle zweistelligen Jahresangaben werden
als Angaben zwischen @code{1970} und @code{2069}, betrachtet, was
bedeutet, dass, wenn Sie @code{01} in einer Spalte speichern, MySQL dies
als @code{2001} behandelt.

@item
Alle MySQL Datumsfunktionen sind in einer Datei @file{sql/time.cc}
gespeichert und sehr sorgf�ltig kodiert, um Jahr-2000-sicher zu sein.

@item
In MySQL Version 3.22 und sp�ter kann der neue Spaltentyp @code{YEAR}
Jahre @code{0} und von @code{1901} bis @code{2155} in 1 Byte speichern
und sie mit 2 oder 4 Ziffern anzeigen.
@end itemize

Probleme k�nnen Sie bekommen, wenn Sie MySQL mit Applikationen benutzen,
die MySQL auf eine Art benutzen, die nicht Jahr-2000-sicher ist. Zum
Beispiel speichern oder �ndern viele alte Applikationen Jahresangaben,
indem sie zweistellige Werte benutzen (was mehrdeutig ist), anstatt
vierstellige Werte zu nehmen. Dieses Problem kann durch Applikationen
verschlimmert werden, die Werte wie @code{00} oder @code{99} als Anzeiger
``fehlender'' Werte benutzen.

Leider sind diese Probleme m�glicherweise schwer zu beheben, weil
verschiedene Applikationen von unterschiedlichen Programmierern
geschrieben sein k�nnen, von denen jeder einen anderen Satz von
Konventionen und Funktionen benutzt haben kann, was die Handhabung von
Datumsangaben betrifft.

Hier ist eine einfache Demonstration, die zeigt, dass MySQL keine
Probleme mit Datumsangaben bis zum Jahr 2030 hat:

@example
mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO y2k VALUES 
    -> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
    -> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
    -> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
    -> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
    -> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
    -> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
    -> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
    -> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
    -> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
    -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
    -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
    -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
    -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

@end example

Das zeigt, dass die @code{DATE}- und @code{DATETIME}-Typen f�r zuk�nftige
Datumsangaben keine Probleme bereiten werden (sie handhaben Datumsangaben
bis zum Jahr 9999).

Der @code{TIMESTAMP}-Typ, der zur Speicherung der aktuellen Zeit benutzt
wird, hat nur einen Bereich bis zu @code{2030-01-01}.  @code{TIMESTAMP} hat
einen Bereich von @code{1970} bis @code{2030} auf 32-Bit-Maschinen
(vorzeichenbehafteter Wert). Auf 64-Bit-Maschinen handhabt dieser
Spaltentyp bis zu @code{2106} (vorzeichenloser Wert).

Obwohl MySQL Jahr-2000-kompatibel ist, sind Sie daf�r verantwortlich,
mehrdeutige Eingaben zu vermeiden. Siehe @ref{Year 2000 compliance} wegen
der Regeln, die MySQL anwendet, wenn mehrdeutige Datumsangaben gemacht
werden (Datumsangaben, die zweistellige Jahreswerte verwenden).



@node What is MySQL AB, Licensing and Support, What-is, Deutsch
@c German node Was ist MySQL AB?
@section Was ist MySQL AB?

@cindex MySQL AB, Definition

@code{MySQL AB} ist das Unternehmen der MySQL Gr�nder und Hauptentwickler.
MySQL AB wurde urspr�nglich in Schweden von David Axmark, Allan Larsson 
und Michael @code{Monty} Widenius gegr�ndet.

Alle Entwickler des MySQL Servers sind Angestellte dieses Unternehmens.
Wir sind eine virtuelle Firma mit Mitarbeitern, die �ber die ganze Welt
verstreut in aller Herren L�nder sitzen. Der Hauptteil unserer Kommunikation
untereinander, mit unseren Anwendern, Unterst�tzern und Partnern wird �ber
das Internet abgewickelt

Wir haben uns der Entwicklung und Verbreitung des MySQL Datenbankservers
verschrieben. MySQL h�lt das Copyright der MySQL Quelltexte, des MySQL Logos 
und dieses Handbuchs.. @xref{What-is}.


Die MySQL-Kernwerte zeigen unsere Verpflichtung gegen�ber MySQL und Open
Source.

Wir wollen, dass MySQL folgendes ist:

@itemize @bullet
@item
Die beste und meist benutzte Datenbank der Welt.
@item
Verf�gbar f�r alle. Alle sollen sich MySQL leisten k�nnen.
@item
Leicht zu benutzen.
@item
Kontinuierlich verbessert, trotzdem immer schnell und sicher bleibend.
@item
Es soll Spass machen, MySQL zu benutzen und zu verbessern.
@item
Frei von Bugs.
@end itemize


MySQL AB und die Leute von MySQL AB:

@itemize @bullet
@item
Verbreiten die Open-Source-Philosophie und unterst�tzen die
Open-Source-Community.
@item
Bem�hen sich, gute B�rger zu sein.
@item
Bevorzugen Partner, die unsere Werte und unsere Geisteshaltung teilen.
@item
Beantworten Mail und geben Support.
@item
Sind ein virtuelles Unternehmen, das mit anderen im Netzwerk
zusammenarbeitet (networking).
@item
Arbeiten gegen Software-Patente.
@end itemize

@menu
* MySQL AB business model and services::  
@end menu

@node MySQL AB business model and services,  , What is MySQL AB, What is MySQL AB
@c German node MySQL AB Gesch�ftsmodell und Services
@subsection Gesch�ftsmodell und Dienstleistungen von MySQL AB

Eine der uns h�ufig gestellten Fragen ist: Wie kann man von etwas leben,
das man kostenlos abgibt? Hier ist die Antwort:
MySQL AB verdient Geld mit Support, Dienstleistungen, kommerziellen
Lizenzen und Lizenzgeb�hren, das wir dazu verwenden, die
Produktentwicklung zu finanzieren und die MySQL-Gesch�ftsfelder
auszubauen.


Unser Unternehmen l�uft seit der Gr�ndung profitabel. Im Oktober 2001
akzeptierten wir eine Risikokapitalfinanzierung durch f�hrende
skandinavische Investoren und eine Handvoll Business-Angels. Die
Investitionen werden genutzt, um unser Gesch�ftsmodell auf solide F��e
zu stellen und eine Grundlage f�r nachhaltiges Wachstum zu schaffen.

@menu
* Business Services Support::   
* Business Services Training::  
* Business Services Consulting::  
* Business Services Commercial licenses::  
* Business Services Partnering::  
* Business Services Advertising::  
* Contact information::         
@end menu

@node Business Services Support, Business Services Training, MySQL AB business model and services, MySQL AB business model and services
@c German node Business Services Support
@subsubsection Support

MySQL AB geh�rt den Gr�ndern und Haupt-Entwicklern der MySQL-Datenbank
und wird von ihnen betrieben. Die Entwickler f�hlen sich verpflichtet,
Kunden und anderen Benutzern Support zu bieten, um mit deren
Bed�rfnissen und Problemen in Kontakt zu bleiben. Unser gesamter Support
wird durch qualifizierte Entwickler geleistet. Wirklich schwierige
Fragen werden von Michael @code{Monty} Widenius beantwortet, der der
erste Entwickler des MySQL-Servers ist. @xref{Support}.

Um Support unterschiedlicher Grade zu bestellen, besuchen Sie bitte die
Bestellseite unter @uref{https://order.mysql.com/}. Wenn Sie nur
beschr�nkten Zugriff auf das Internet haben, setzen Sie sich bitte mit
unserem Vertrieb unter @email{sales@@mysql.com} in Verbindung.

@node Business Services Training, Business Services Consulting, Business Services Support, MySQL AB business model and services
@c German node Business Services Training
@subsubsection Training und Zertifizierung

MySQL AB f�hrt Schulungen zu MySQL und verwandten Themen weltweit durch.
Wir bieten sowohl offene Kurse als auch In-house-Trainings an, die auf
die speziellen Bed�rfnisse Ihres Unternehmens zugeschnitten sind.
MySQL-Schulungen werden auch durch unsere Partner durchgef�hrt, die
Authorised MySQL Training Center.

Unsere Schulungsmaterialien benutzen dieselben Beispiel-Datenbanken wie
unsere Dokumentation und unsere Beispiel-Applikationen und werden
st�ndig aktualisiert, um den Entwicklungsstand der neusten MySQL-Version
widerzuspiegeln. Unsere Trainer erhalten R�ckhalt vom Entwicklungsteam,
um die Trainingsqualit�t und die kontinuierliche Entwicklung des
Schulungsmaterials sicherzustellen. Das stellt auch sicher, dass keine
w�hrend der Kurse aufgetretenen Fragen unbeantwortet bleiben.

Wenn Sie an unseren Schulungen teilnehmen, k�nnen Sie sicher sein, die
Ziele zu erreichen, die Sie mit Ihren MySQL-bezogenen Applikationen
anstreben. Ausserdem haben Sie folgende Vorteile:

@itemize @bullet
@item
Sie sparen Zeit.
@item
Sie verbessern die Performance Ihrer Applikation(en).
@item
Sie verringern die Notwendigkeit zus�tzlicher Hardware, was Kosten
spart.
@item
Sie verbessern Ihre Sicherheit.
@item
Sie erh�hen die Zufriedenheit Ihrer Kunden und Mitarbeiter.
@item
Sie bereiten sich auf die MySQL-Zertifizierung vor.
@end itemize

Wenn Sie an unseren Schulungen Interesse als m�glicher Teilnehmer oder
Trainingspartner haben, besuchen Sie bitte die Seite unter
@uref{http://www.mysql.com/training/}. Wenn Sie nur beschr�nkten Zugriff
auf das Internet haben, setzen Sie sich bitte mit unserem
Trainingspersonal unter @email{training@@mysql.com} in Verbindung.

Die Ver�ffentlichung des MySQL-Zertifizierungsprogramms ist f�r 2002
geplant. Details finden Sie unter
@uref{http://www.mysql.com/training/certification.html}. Wenn Sie stets
die neusten Informationen �ber das MySQL-Zertifizierungsprogramm haben
wollen, schicken Sie bitte eine E-Mail an
@email{certification@@mysql.com}.


@c German FIX this node entry was missing but the section was there...
@node Business Services Consulting, Business Services Commercial licenses, Business Services Training, MySQL AB business model and services
@c German node Business Services Consulting
@subsubsection Beratung
MySQL AB und seine authorisierten Partner bieten Benutzern des
MySQL-Servers und denen, die ihn in ihre Software einbetten wollen,
Beratungsleistungen, weltweit.

Unsere Berater k�nnen Ihnen helfen, Ihre Datenbanken zu entwerfen und zu
optimieren, effiziente Anfragen zu konstruieren, Ihre Plattform auf
optimale Performance zu tunen, Migrationsprobleme zu l�sen, Replikation
aufzusetzen, robuste transaktionale Applikationen zu bauen und vieles
mehr. Wir helfen auch Kunden dabei, den MySQL-Server f�r den
Gro�fl�chigen Einsatz in ihre Produkte und Applikationen einzubauen.

Unsere Berater arbeiten in enger Kooperation mit unserem
Entwicklungsteam, was die technische Qualit�t unserer Dienstleistungen
sicherstellt. Beratungsaufgaben erstrecken sich von zweit�gigen
Power-Start-Sessions bis zu Projekten, die Wochen und Monate dauern.
Unsere Kompetenz deckt nicht nur den MySQL-Server ab, sondern auch
Programmier- und Skripting-Sprachen wie PHP, Perl und andere.

Wenn Sie an unseren Beratungsleistungen interessiert sind oder ein
Consulting-Partner werden wollen, besuchen Sie bitte unsere Seite unter
@uref{http://www.mysql.com/consulting/}. Wenn Sie nur beschr�nkten
Zugriff auf das Internet haben, setzen Sie sich bitte mit unserem
Beratungspersonal unter @email{consulting@@mysql.com} in Verbindung.

@node Business Services Commercial licenses, Business Services Partnering, Business Services Consulting, MySQL AB business model and services
@c German node Business Services Commercial Licenses
@subsubsection Kommerzielle Lizenzen

Die MySQL-Datenbank wird unter der @code{GNU General Public License}
ver�ffentlicht (@code{GPL}). Das bedeutet, dass die MySQL-Software
kostenlos unter der GPL benutzt werden darf. Wenn Sie nicht an die
GPL-Bedingungen gebunden sein wollen (was in der Folge bedeutet, dass
auch Ihre eigenen Applikationen GPL werden), k�nnen Sie eine
kommerzielle Lizenz f�r dasselbe Produkt unter
@uref{https://order.mysql.com/} erwerben.

Weil MySQL AB das Copyright am MySQL-Server besitzt, k�nnen wir eine
@code{duale Lizensierung} einsetzen, was hei�t, dass dasselbe Produkt
sowohl unter der GPL als auch unter einer kommerziellen Lizenz
erh�ltlich ist. Das ber�hrt in keiner Weise die Verpflichtung von MySQL
AB gegen�ber @code{Open Source}. Wegen Details, wann eine kommerzielle
Lizenz erforderlich ist, sehen Sie bitte unter
@ref{Lizenzpolitik} nach.

Wir verkaufen auch kommerzielle Lizenzen von Open-Source-GPL-Software
Dritter. Ein gutes Beispiel hierf�r ist der
@code{InnoDB}-Tabellen-Handler, der ACID-Unterst�tzung, Sperren auf
Zeilenebene, Wiederherstellung nach Abst�rzen, Multiversionierung,
Fremdschl�sselunterst�tzung und vieles mehr bietet.

@node Business Services Partnering, Business Services Advertising, Business Services Commercial licenses, MySQL AB business model and services
@c German node Business Services Partnering
@subsubsection Partnerprogramme
@cindex Partnerschaft mit MySQL AB

MySQL AB hat ein weltweites Partnerprogramm, dass Schulungskurse,
Support, Beratung, L�sungen, Publikationen plus Weiterverkauf und
Vertrieb von MySQL und verwandten Produkten beinhaltet. Partner
erscheinen unter @uref{http://www.mysql.com/} auf der Website und
erhalten das Recht, spezielle Versionen der MySQL-Schutzmarken zu
benutzen, um ihre Produkte zu identifizieren und ihr Gesch�ft
voranzutreiben. Wenn Sie interessiert sind, ein MySQL-AB-Partner zu
werden, schicken Sie bitte eine E-Mail an @email{partner@@mysql.com}.

Das Wort @code{MySQL} und das MySQL-Delphin-Logo sind Schutzmarken von
MySQL AB. @xref{MySQL AB Logos and Trademarks}.

@node Business Services Advertising, Contact information, Business Services Partnering, MySQL AB business model and services
@c German node Business Services Advertising
@subsubsection Werbung

Die MySQL-Website (@uref{http://www.mysql.com/}) ist bei Entwicklern und
Benutzern beliebt. Im Oktober 2001 bedienten wir 10 Millionen
Seitenanfragen (PageViews). Unsere Besucher repr�sentieren eine Gruppe,
die Kaufentscheidungen und Empfehlungen sowohl f�r Software als auch f�r
Hardware trifft. 12% unserer Besucher genehmigen Kaufentscheidungen,
lediglich 9% sind �berhaupt nicht an Kaufentscheidungen beteiligt. Mehr
als 65% haben innerhalb des letzten halben Jahres online eingekauft, 70%
planen, in den n�chsten Monaten einzukaufen. Wenn Sie Interesse haben,
Werbebanner auf unserer Website @uref{http://www.mysql.com/} zu
schalten, setzen Sie sich bitte mit @email{advertising@@mysql.com} in
Kontakt.

@node Contact information,  , Business Services Advertising, MySQL AB business model and services
@c German node Kontaktinformationen
@subsubsection Kontaktinformationen

@cindex Kontaktinformationen
@cindex Lizensierung, Kontaktinformationen
@cindex Werbung, Kontaktinformationen
@cindex Anstellung, Kontaktinformationen
@cindex Partnerschaft mit MySQL
@cindex Anstellung bei MySQL
@cindex Jobs bei MySQL

Die MySQL Website (@uref{http://www.mysql.com/})
enth�lt die neusten Informationen �ber MySQL und MySQL AB.

F�r Presseservice und Anfragen aller Art, die in unseren
Ver�ffentlichungen (@uref{http://www.mysql.com/news/}) nicht
behandelt werden, wenden Sie sich bitte an 
@email{press@@mysql.com}.

Zeitnahe, pr�zise Antworten auf technische Fragen erhalten Sie, wenn Sie
unter @uref{https://order.mysql.com/, order} einen unserer
@uref{http://www.mysql.com/Support/arrangements/types.html,
Support-Vertr�ge} abschlie�en.
MySQL-Support wird von den MySQL-Entwicklern geleistet, weshalb der
Standard extrem hoch ist.

Informationen �ber MySQL Trainig erhalten Sie unter
@uref{http://www.mysql.com/training/}. Wenn Sie einen
eingeschr�nkten Internetzugang haben, kontaktieren Sie
bitte unser Trainingspersonal unter @email{training@@mysql.com}.
@xref{Business Services Training}.

F�r Informationen �ber das MySQL Zertifizierungsprogramm
erhalten Sie unter @uref{http://www.mysql.com/training/certification.html}.
Wenn Sie weiterhin �ber das MySQL Zertifizierungsprogramm informiert
werden wollen, schreiben Sie eine E-Mail an @email{certification@@mysql.com}.
@xref{Business Services Consulting}.

Kommerzielle Lizenzen k�nnen online unter @uref{https://order.mysql.com/}
abgewickelt werden. Dort finden Sie ausserdem Informationen dar�ber, 
wie Sie ihre Bestellung per Fax erledigen k�nnen. Wenn Sie Fragen bez�glich
der Lizensierung haben, oder Sie ein Angebot �ber eine gr��ere Lizenzerteilung
erhalten wollen, f�llen Sie bitte Das Kontaktformular auf unserer Website
(@uref{http://www.mysql.com/}) aus, oder schicken Sie eine E-Mail
an @email{licensing@@mysql.com} (f�r Lizenzfragen) oder an
@email{sales@@mysql.com} (f�r Verkaufsinformationen).
@xref{Lizenzpolitik}.

Wenn Sie daran interessiert sind, ein Werbebanner auf unserer Website
(@uref{http://www.mysql.com/}) zu schalten, schicken Sie bitte 
eine E-Mail an @email{advertising@@mysql.com}.
@xref{Business Services Advertising}.

Wenn Sie ein Unternehmen vertreten, dass an einer Partnerschaft mit MySQL
interessiert ist, schicken Sie bitte eine E-Mail an
@email{partner@@mysql.com}.

F�r weitere Informationen �ber die MySQL Schutzmarkenbestimmungen, beachten
Sie bitte @uref{http://www.mysql.com/company/trademark.html} oder kontaktieren
Sie @email{trademark@@mysql.com}.
@c German FIX changed 'and' to 'und' to make German xref work
@xref{MySQL AB Logos and Trademarks}.

Wenn Sie an einem der Jobs interessiert sind, die im
@uref{http://www.mysql.com/development/jobs/, jobs}-Abschnitt aufgef�hrt
sind, schicken Sie bitte eine E-Mail an @email{jobs@@mysql.com}. Bitte
senden Sie ihre CV nicht als Anhang an dieser mail mit, sondern
f�gen Sie sie lieber am Ende ihrer mail als Klartext (plain text) ein.

Allgemeine Diskussionen mit vielen unserer Benutzer k�nnen Sie auf den
entsprechenden @uref{http://www.mysql.com/documentation/lists.html,
Mailing-Listen} f�hren.

Fehlerberichte (Auch Bugreporte genannt), sowie Fragen und Kommentare, sollten 
an die Mailingliste @email{mysql@@lists.mysql.com} gehen. Wenn Sie
ein empfindliches Sicherheitsloch im MySQL Server gefunden haben, sollten 
@c German FIX added . after schreiben and after the xref.
Sie eine E-Mail an @email{security@@mysql.com} schreiben.
@xref{Bug reports}.

Wenn Sie Benchmarkergebnis haben, die wir ver�ffentlichen k�nnen, kontaktieren
Sie uns unter @email{benchmarks@@mysql.com}.

Wenn Sie Vorschl�ge f�r Hinzuf�gungen oder Korrekturen dieses Handbuchs
haben, schicken Sie sie bitte an das Handbuch-Team:
@email{docs@@mysql.com}.

Fragen zur Arbeitsweise oder zu Inhalten unserer Website(@uref{http://www.mysql.com/})
stellen Sie bitte an @email{webmaster@@mysql.com}.

Fragen �ber das MySQL Portal (@uref{http://www.mysql.com/portal/})
k�nnen an @email{portals@@mysql.com} geschickt werden.

Die Datenschutzbestimmungen von MySQL AB k�nnen Sie unter 
@uref{http://www.mysql.com/company/privacy.html} einsehen.
F�r irgendwelche Fragen dar�ber, wenden Sie sich bitte an
@email{privacy@@mysql.com}.

Allgemeine Informationsanfragen schicken Sie bitte an @email{info@@mysql.com}.


@node Licensing and Support, MySQL 4.0 In A Nutshell, What is MySQL AB, Deutsch
@c German node Lizensierung and Support
@section MySQL Support and Lizensierung

@cindex Lizensierungsbedingungen
@cindex Supportbedingungen

Dieser Abschnitt beschreibt die MySQL Support und Lizensierungsvereinbarungen


@menu
* Support::                     
* Copyright::                   
* MySQL AB Logos and Trademarks::  
* Lizenzpolitik::               
@end menu

@node Support, Copyright, Licensing and Support, Licensing and Support
@c German node Support
@subsection Support den MySQL AB anbietet

@cindex Support, Arten
@cindex Arten von Support
@cindex Kommerzieller Support, Arten
@cindex Kosten, Support
@cindex Lizensierungskosten
@cindex Supportkosten
@cindex Preise, Support

Wir versuchen, technischen Support in einem breiten und umfassenden
Blickwinkel zu sehen. Fast jedes Problem im Zusammenhang mit
MySQL-Software ist f�r uns wichtig, wenn es f�r Sie wichtig ist.
Typischerweise suchen Kunden Hilfe dabei, wie man unterschiedliche
Befehle und Dienstprogramme zum Funktionieren bringt, wie
Performance-Flaschenh�lse beseitigt werden k�nnen, wie man besch�digte
Systeme repariert, wie sich Betriebssysteme oder Netzwerkkonfigurationen
auf MySQL auswirken, wie man Datensicherung und Wiederherstellung
optimal konfiguriert, wie man APIs benutzt usw.
Unser Support deckt nur den MySQL-Server und unsere eigenen
Dienstprogramme ab, nicht Produkte Dritter, die auf den MySQL-Server
zugreifen, obwohl wir auch hierbei versuchen, zu helfen wo wir k�nnen.

Detaillierte Informationen �ber unsere unterschiedlichen
Support-Optionen finden Sie auf @uref{https://order.mysql.com/}, wo auch
Support-Vertr�ge online bestellt werden k�nnen. Wenn Sie nur
beschr�nkten Zugriff auf das Internet haben, setzen Sie sich mit unserem
Vertrieb unter @email{sales@@mysql.com} in Verbindung.

Technischer Support ist wie eine Lebensversicherung. Sie k�nnen
jahrelang ohne solches gl�cklich sein, doch wenn die Stunde schl�gt,
kann es zu sp�t sein, diese(n) zu kaufen!
Wenn Sie den MySQL-Server f�r wichtige Applikationen nutzen und
pl�tzlich Problemen begegnen, kann es m�glicherweise zu lange dauern,
alle Antworten selbst herauszufinden. Es kann daher sein, dass Sie
unmittelbaren Zugriff auf die erfahrensten MySQL-Probleml�ser ben�tigen,
und da

@node Copyright, MySQL AB Logos and Trademarks, Support, Licensing and Support
@c German node Copyright
@subsection Copyrights und Lizenzen, die von MySQL verwendet werden.

@cindex copyrights
@cindex licenses

@code{MySQL AB} besitzt das Copyright des MySQL Quellcodes,
der MySQL Logos and Schutzmarken und dieses Handbuch
@xref{What is MySQL AB}.
Es gibt einige verschiedene Lizenzen, die f�r die MySQL Distribution
relevant sind:

@enumerate
@item

Der MySQL-spezifische Quelltext, der ben�tigt wird, um die
@code{mysqlclient}-Bibliothek zu kompilieren, ist unter der @code{LGPL}
lizensiert. Programme im @file{client}-Verzeichnis sind GPL. Jede Datei hat
einen Header, aus dem ersichtlich ist, welches Copyright f�r diese Datei
gilt.

@item Die Client-Bibliothek und die (GNU @code{getopt})-Bibliothek werden
von der ``GNU LIBRARY GENERAL PUBLIC LICENSE'' abgedeckt.  @xref{LGPL license}.

@item
Der gesamte Quelltext des Servers und der (GNU @code{readline})-Bibliothek
werden von der ``GNU GENERAL PUBLIC LICENSE'' abgedeckt. @xref{GPL license}.
Diese findet sich unter anderem als Datei @file{COPYING} in den
Distributionen.

@item Einige Teile des Quelltextes (die @code{regexp}-Bibliothek) werden
von einem Copyright in Berkeley-Art abgedeckt.

@item
�ltere Versionen von (3.22 und fr�her) stehen unter einer
strikteren Lizenz
(@uref{http://www.mysql.com/support/arrangements/mypl.html}).
Bitte beachten sie die Dokumentation der speziellen Version f�r
weitere Informationen.


@item
Das Handbuch steht @emph{nicht} unter einer GPL-artigen Lizenz.
Die Benutzung des Handbuchs unterliegt den folgenden Bestimmungen.
@itemize @bullet
@item
Die Konvertierung in andere Formate ist erlaubt, der Inhalt jedoch
darf auf keinen Fall ge�ndert oder bearbeitet werden.
@item
Sie k�nnen eine gedruckte Version f�r den Privaten Gebrauch erstellen
@item
F�r alle anderen Zwecke, wie den Verkauf von gedruckten Kopien
oder die Verwendung (auch in Teilen) des Handbuchs in anderen
Ver�ffentlichungen, ist eine vorherige Vereinbarung mit MySQL AB 
erforderlich.
@end itemize
Bitte senden Sie eine E-Mail an @email{docs@@mysql.com} f�r weitere Informationen
oder wenn Sie daran interessiert sind, eine �bersetzung zu erstellen.
@end enumerate

F�r Informationen dar�ber, wie die MySQL Lizenzen in der Praxis arbeiten
beachten Sie bitte @ref{Lizenzpolitik}.
Siehe auch @ref{MySQL AB Logos and Trademarks}.



@menu
* Verwendung des MySQL Servers unter einer kommerziellen Lizenz::  
* Webserver::                   
@end menu

@node Verwendung des MySQL Servers unter einer kommerziellen Lizenz, Webserver, Copyright, Copyright
@c German node <no English equivalent>
@subsubsection Verwendung des MySQL Servers unter einer kommerziellen Lizenz

@c German FIX added . after schreiben and after the xref.
@cindex ISP-Services
@cindex Services, ISP
@cindex Services, Web
@cindex Internet Service Provider

Internet Service Provider (ISP) hosten oft MySQL-Server f�r ihre Kunden.
Aufgrund der GPL-Lizenz ist hierf�r keine Lizensierung erforderlich.

Auf der anderen Seite ermutigen wir Leute, ISPs zu benutzen, die
MySQL-Support haben, und das wird ihnen Vertrauen geben, dass ihr ISP im
Falle von Problemen mit ihrer MySQL-Installation helfen wird, das Problem
zu l�sen (in manchen F�llen mit der Hilfe des MySQL-Entwicklungsteams).

Alle ISPs, die auf dem neuesten Stand der Dinge bleiben wollen, sollten sich
in die @code{announce}-Mailing-Liste eintragen, um auf der Hut zu sein vor
schwerwiegenden Problemen, die f�r ihre MySQL-Installationen relevant sein
k�nnten.

Beachten Sie bitte, dass ein ISP ohne MySQL-Lizenz seinen Kunden zumindest
Lesezugriff auf den Quelltext der MySQL-Installation geben sollte, damit
die Kunden feststellen k�nnen, dass diese korrekt gepatcht ist.


@node Webserver,  , Verwendung des MySQL Servers unter einer kommerziellen Lizenz, Copyright
@c German node <no English equivalent>
@subsubsection Einen Webserver betreiben, der MySQL benutzt

@cindex Webserver, betreiben
@cindex Einen Webserver betreiben

Wenn Sie MySQL in Verbindung mit einem Webserver unter Unix betreiben,
brauchen Sie nicht f�r eine Lizenz zu bezahlen.

Das gilt selbst dann, wenn Sie einen kommerziellen Webserver betreiben, der
MySQL benutzt, weil Sie nicht selbst eine eingebettete MySQL-Version
verkaufen. Dennoch bitten wir Sie, in einem solchen Fall MySQL-Support zu
kaufen, weil MySQL Ihrem Unternehmen hilft.


@node MySQL AB Logos and Trademarks, Lizenzpolitik, Copyright, Licensing and Support
@c German node MySQL AB Logos und Schutzmarken
@subsection MySQL-AB-Logos und -Schutzmarken

@cindex Logos
@cindex Schutzmarken

Viele MySQL-Datenbankbenutzer wollen auf Ihren Websites, ihren B�chern
und Packungsprodukten das MySQL-AB-Delphin-Logo zeigen. Wir begr��en
das und ermuntern dazu, weisen aber darauf hin, dass das Wort
@code{MySQL} und das MySQL-Delphin-Logo Schutzmarken von MySQL AB sind
und nur so benutzt werden d�rfen, wie in unserer Schutzmarken-Richtlinie
unter @uref{http://www.mysql.com/company/trademark.html} festgelegt.




@menu
* The Original MySQL logo::     
* MySQL Logos that may be Used Without Written Permission::  
* When need MySQL logo permission::  
* MySQL AB Partnership Logos::  
@end menu

@node The Original MySQL logo, MySQL Logos that may be Used Without Written Permission, MySQL AB Logos and Trademarks, MySQL AB Logos and Trademarks
@c German node Das Original-MySQL-Logo
@subsubsection Das Original-MySQL-Logo

@c FIX: picture: MySQL logo

Das MySQL-Delphin-Logo wurde von der finnischen Werbeagentur Priority im
Jahr 2001 entworfen. Der Delphin wurde als passendes Symbol f�r die
MySQL-Datenbank gew�hlt, weil er schlau, schnell und schlank ist und
m�helos durch die Daten-Ozeane navigiert. Ausserdem m�gen wir Delphine.

Das Original-MySQL-Logo darf nur von Repr�sentanten von MySQL AB und von
Personen benutzt werden, die eine schriftliche Erlaubnis hierf�r haben.

@node MySQL Logos that may be Used Without Written Permission, When need MySQL logo permission, The Original MySQL logo, MySQL AB Logos and Trademarks
@c German node MySQL-Logos die ohne schriftliche Erlaubnis benutzt werden d�rfen
@subsubsection MySQL-Logos die ohne schriftliche Erlaubnis benutzt werden d�rfen

@c FIX: pictures: powered by, works with, included - logos

Wir haben einen Satz spezieller Logos f�r @emph{vorbehaltliche
Benutzung} angelegt, die von unserer Website unter
@uref{http://www.mysql.com/downloads/logos.html} herunter geladen werden
k�nnen und von Dritten auf ihren Websites ohne schriftliche Erlaubnis
von MySQL AB benutzt werden d�rfen. Der Gebrauch dieser Logos ist - wie
der Name anzeigt - nicht v�llig uneingeschr�nkt, sondern unterliegt
unseren Schutzmarken-Richtlinien, die Sie auf unserer Website finden.
Sie sollten diese Richtlinien lesen, wenn Sie planen, die Logos zu
benutzen. Die Anforderungen sind im Wesentlichen:

@itemize @bullet
@item
Benutzen Sie das gew�nschte Logo von der @uref{http://www.mysql.com/}-
Site. Sie d�rfen die Gr��e nach Ihren Bed�rfnissen anpassen, aber keine
Farben oder das Design �ndern noch die Grafik in sonstiger Form
ver�ndern.

@item
Heben Sie hervor, dass Sie - und nicht MySQL AB - der Betreiber und
Eigner der Site ist, auf der die MySQL-Schutzmarke gezeigt wird.

@item
Sie d�rfen die Schutzmarke nicht auf eine Weise benutzen, die MySQL AB
oder dem Wert der MySQL-AB-Schutzmarken schadet. Wir behalten uns das
Recht vor, das Recht zur Benutzung der MySQL-AB-Schutzmarke zu
widerrufen.

@item
Wenn Sie die Schutzmarke auf einer Website benutzen, machen Sie sie
anklickbar, wobei direkt nach @uref{http://www.mysql.com/} verlinkt
wird.

@item
Wenn Sie die MySQL-Datenbank unter GPL in einer Applikation benutzen,
muss Ihre Applikation (i) Open Source sein, (ii) in der Lage sein, sich
mit einem MySQL-Server zu verbinden.
@end itemize

Setzen Sie sich unter @email{trademark@@mysql.com} mit uns in
Verbindung, um wegen spezieller Arrangements anzufragen, die Ihren
Bed�rfnissen entsprechen.

@node When need MySQL logo permission, MySQL AB Partnership Logos, MySQL Logos that may be Used Without Written Permission, MySQL AB Logos and Trademarks
@c German node Wann Sie eine Erlaubnis f�r die Benutzung des MySQL-Logos ben�tigen
@subsubsection Wann Sie eine Erlaubnis f�r die Benutzung des MySQL-Logos ben�tigen

In folgenden F�llen ben�tigen Sie eine schriftliche Erlaubnis von MySQL
AB, bevor Sie die MySQL-Logos benutzen:

@itemize @bullet
@item
Wenn Sie irgend ein MySQL-AB-Logo irgendwo ausser auf Ihrer Website
zeigen.

@item
Wenn Sie irgend ein MySQL-AB-Logo ausser den oben erw�hnten Logos zur
@emph{vorbehaltlichen Benutzung} auf Websites oder anderswo anzeigen.
@end itemize

Aus rechtlichen und kommerziellen Gr�nden m�ssen wir die Benutzung der
MySQL-Schutzmarken auf Produkten, B�chern usw. beobachten. �blicherweise
verlangen wir eine Geb�hr f�r das Anzeigen von MySQL-AB-Logos auf
kommerziellen Produkten, weil wir der Meinung sind, das es vertretbar
ist, dass einige der Erl�se f�r die Weiterentwicklung der MySQL-
Datenbank zur�ckflie�en.

@node MySQL AB Partnership Logos,  , When need MySQL logo permission, MySQL AB Logos and Trademarks
@c German node MySQL-AB-Partnerschafts-Logos
@subsubsection MySQL-AB-Partnerschafts-Logos

@c FIX: pictures: partnership logos - Bertrand?

@c German FIX part of the this paragraph was at the end of Lizenzpolitik.
@c (i.e. that section was pasted into the middle of this one ;-)
MySQL-Partnerschafts-Logos d�rfen nur von Unternehmen und Personen
benutzt werden, die eine schriftliche Partnerschaftsvereinbarung mit
MySQL AB haben. Partnerschaften beinhalten eine Zertifizierung als
MySQL-Trainer oder -Berater. Sehen Sie bitte unter
@c German FIX change @xref into @ref 'cos it's not a separate sentence.
@ref{Business Services Partnering,,Partnerschaft} nach.

@node Lizenzpolitik,  , MySQL AB Logos and Trademarks, Licensing and Support
@c German node <no English equivalent>
@subsection MySQL-Lizenzpolitik

@cindex Lizenzpolitik
@cindex technischer Support, Lizensierung
@cindex Support, Lizensierung
@cindex General Public License, MySQL

Die formalen Bedingungen der GPL-Lizenz stehen unter @ref{GPL license}.
Im Wesentlichen ist unsere Lizenzpolitik und die Interpretation der
GPL wie folgt:

Beachten Sie bitte, dass �ltere Versionen von MySQL immer noch einer 
@uref{http://www.mysql.com/Support/arrangements/mypl.html, strengeren
Lizenz} unterliegen. Sehen Sie in der Dokumentation der betreffenden
Version wegen entsprechender Informationen nach. Wenn Sie eine kommerzielle
Lizenz ben�tigen, weil die GPL-Lizenz nicht zu den Anforderungen Ihrer
Applikation passt, k�nnen Sie eine Lizenz unter
@uref{https://order.mysql.com/} kaufen.

F�r normalen internen Gebrauch kostet MySQL nichts. Sie brauchen uns nichts
zu bezahlen, wenn Sie nicht wollen.

Eine Lizenz wird ben�tigt:

@itemize @minus
@item
Wenn Sie ein Programm, das nicht freie Software ist, mit Code des
MySQL-Servers oder der Client-Programme verbinden, die den GPL-Copyrights
unterliegen. Das ist zum Beispiel der Fall, wenn Sie MySQL als
eingebetteten Server (Embedded Server) in Ihren Applikationen benutzen,
oder wenn Sie dem MySQL-Server Erweiterungen hinzuf�gen, die nicht freie
Software sind. In diesen F�llen w�rden Ihre Applikation bzw. Ihr Code
ebenfalls GPL werden, weil die GPL in solchen F�llen wie ein Virus wirkt.
Sie k�nnen dieses Problem vermeiden, wenn Sie den MySQL-Server mit einer
kommerziellen Lizenz von MySQL AB erwerben.
Siehe @uref{http://www.gnu.org/copyleft/gpl-faq.html}.
@item
Wenn Sie eine kommerzielle Applikation haben, die NUR mit MySQL
funktioniert, und wenn Sie die Applikation zusammen mit dem MySQL-Server
ausliefern. Wir betrachten so etwas als Einbindung, selbst wenn es �ber das
Netzwerk geschieht.

@item
Wenn Sie eine Distribution von MySQL besitzen und nicht den Quelltext f�r
Ihre Kopie des MySQL-Servers zur Verf�gung stellen, so wie es in der
GPL-Lizenz festgelegt ist.
xxx You have a Distribution of MySQL und you xxx Arjen: What does this mean: ...don't provide the
source code for your copy of the MySQL server ... xxx Shouldn't it be: for your application ... ??? xxx
, as defined in the GPL license. xxx
@end itemize

Eine Lizenz wird @strong{NICHT} ben�tigt:

@itemize @minus

@item
Sie ben�tigen keine Lizenz, wenn Sie den Client-Code in kommerzielle
Programme einschliessen. Der Client-Teil von MySQL unterliegt der
LGPL @code{GNU Library General Public License}-Lizenz. Der
@code{mysql}-Kommandozeilen-Client beinhaltet Code der
@code{readline}-Bibliothek, die unter @code{GPL} steht.

@item
Wenn Sie f�r Ihre Art der Benutzung von MySQL keine Lizenz ben�tigen, aber
MySQL m�gen und die weitere Entwicklung f�rdern wollen, sind Sie herzlich
eingeladen, in jedem Fall eine Lizenz zu erwerben.

@item
Wenn Sie MySQL in einem kommerziellen Zusammenhang benutzen und davon
profitieren, bitten wir Sie, dass Sie die Weiterentwicklung von MySQL
f�rdern, indem Sie einen bestimmten Grad von Support kaufen. Wir meinen,
dass es vern�nftig ist, wenn wir Sie bitten, MySQL zu unterst�tzen, wenn
MySQL Ihren Gesch�ften hilft. (Ansonsten w�rde es bei Support-Anfragen
bedeuten, dass Sie nicht nur etwas f�r umsonst benutzen, in das wir eine
Menge Arbeit gesteckt haben, sondern dass Sie uns auch noch auffordern,
kostenlosen Support zu liefern.)
@end itemize

In Situationen, wo eine MySQL-Lizenz ben�tigt wird, brauchen Sie eine
Lizenz pro Maschine, auf der der MySQL-Server l�uft. Eine
Mehrprozessor-Maschine z�hlt jedoch als eine einzelne Maschine, und es gibt
keine Beschr�nkung hinsichtlich der Anzahl von MySQL-Servern, die auf einer
Maschine laufen, oder hinsichtlich der Anzahl von Clients, die zur gleichen
Zeit mit einem Server verbunden sind, der auf dieser Maschine l�uft!

Falls Sie nicht sicher sind, ob f�r Ihre spezielle Benutzung von MySQL eine
Lizenz erforderlich ist, lesen Sie diesen Abschnitt bitte nochmals, bevor
Sie uns kontaktieren. @xref{Contact information}.

Wenn Sie eine MySQL-Lizenz ben�tigen, ist die Bezahlung am einfachsten,
wenn Sie das Lizenzformular auf dem Secure-Server von MySQL unter
@uref{https://order.mysql.com/} benutzen.
@c German FIX this section no longer exists (no price info in manual)
@c Andere Zahlungsformen werden unter @ref{Zahlungsinformationen} besprochen.


@menu
* Using MySQL word in presentations::  
* Using MySQL word in company and product names::  
@end menu

@node Using MySQL word in presentations, Using MySQL word in company and product names, Lizenzpolitik, Lizenzpolitik
@c German node Benutzung des Worts MySQL in Pr�sentationen
@subsubsection Benutzung des Worts @code{MySQL} in Druckmaterialien oder
Pr�sentationen

MySQL AB begr��t Verweise auf die MySQL-Datenbank, aber das Wort
@code{MySQL} ist eine Schutzmarke von MySQL AB. Deshalb m�ssen Sie der
ersten oder deutlichsten Erw�hnung des Worts @code{MySQL} das
Schutzmarken-Symbol @code{TM} hinzuf�gen, und wo angebracht deutlich
machen, dass @code{MySQL} eine Schutzmarke von MySQL AB ist. Details
entnehmen Sie bitte unserer Schutzmarken-Richtlinie unter
@uref{http://www.mysql.com/company/trademark.html}.


@node Using MySQL word in company and product names,  , Using MySQL word in presentations, Lizenzpolitik
@c German node Benutzung des Worts MySQL in Unternehmens- und Produktnamen
@subsubsection Benutzung des Worts @code{MySQL} in Unternehmens- und
Produktnamen

Die Benutzung des Worts @code{MySQL} in Produkt- und Unternehmensnamen
oder in Internet-Dom�nen-Namen ist nur mit vorheriger schriftlicher
Erlaubnis durch MySQL AB gestattet.


@node MySQL 4.0 In A Nutshell, MySQL Information Sources, Licensing and Support, Deutsch
@c German node MySQL 4.0 kurz und b�ndig
@section MySQL 4.0 kurz und b�ndig

Dateline: 16. Oktober 2001, Uppsala, Schweden

Lange durch MySQL AB angek�ndigt und lange von unseren Benutzern
erwartet: Der MySQL-Server 4.0 ist jetzt in der Alpha-Version zum
Herunterladen von @uref{http://www.mysql.com/} und unseren Mirrors
verf�gbar.

Die neuen Haupt-Features des MySQL-Servers 4.0 sind eng mit unserem
bestehenden Gesch�ft und den Community-Nutzern verzahnt. Durch ihn wird
die MySQL-Datenbank-Software als L�sung f�r gesch�ftskritische
Schwerlast-Datenbanksysteme verbessert. Weitere neue Features zielen auf
die Benutzer eingebetteter Datenbanken.



@menu
* Nutshell Stepwise Rollout::   
* Nutshell Ready for Immediate Development Use::  
* Nutshell Embedded MySQL::     
* Nutshell Other features::     
* Nutshell Future features::    
* Nutshell 4.1 development release::  
@end menu

@node Nutshell Stepwise Rollout, Nutshell Ready for Immediate Development Use, MySQL 4.0 In A Nutshell, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - Schritt f�r Schritt
@subsection Schritt f�r Schritt

Das Erscheinen des MySQL-Servers 4.0 wird in mehreren Schritten
erfolgen, wobei die erste Version 4.0.0 genannt wird und bereits die
meisten neuen Features enth�lt. Zus�tzliche Features werden in die
Versionen 4.0.1, 4.0.2 usw. eingebaut, h�chstwahrscheinlich innerhalb
weniger Monate. MySQL 4.0 wird als Beta gekennzeichnet. In MySQL 4.1
werden dann weitere neue Features hinzugef�gt. Es wird angestrebt, das
Alpha-Release Anfang 2002 herauszubringen.


@node Nutshell Ready for Immediate Development Use, Nutshell Embedded MySQL, Nutshell Stepwise Rollout, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - f�r den sofortigen Entwicklungseinsatz
@subsection F�r den sofortigen Entwicklungseinsatz

Es wird nicht empfohlen, Produktionssysteme auf den MySQL-Server 4.0
umzustellen, bis dieser in der Beta-Version ver�ffentlicht wird. Selbst
das anf�ngliche Release hat unsere ausgiebigen Tests ohne jegliche
Fehler durchlaufen, auf allen Plattformen, auf denen wir testen. Wegen
der gro�en Zahl neuer Features empfehlen wir daher den MySQL-Server
selbst in der Alpha-Version f�r Entwicklungsarbeiten, wobei in Betracht
gezogen werden kann, dass der MySQL-Server 4.0 das Stadium "stabil"
erreichen wird, bevor Applikationen hiermit ver�ffentlicht werden, die
jetzt im Entwicklungsstadium sind.


@node Nutshell Embedded MySQL, Nutshell Other features, Nutshell Ready for Immediate Development Use, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - eingebettetes MySQL
@subsection Eingebettetes MySQL

@code{libmysqld} macht den MySQL-Server f�r einen erheblich ausgedehnten
Bereich von Applikationen geeignet. Wenn man die eingebettete MySQL-
Server-Bibliothek benutzt, kann man den MySQL-Server in
unterschiedlichste Applikationen und elektronische Ger�te einbetten, bei
denen der Endbenutzer keinerlei Ahnung davon hat, dass ihnen eine
Datenbank unterlegt ist. Der eingebettete MySQL-Server ist ideal f�r
Benutzung hinter den Kulissen in Internet-Ger�ten, �ffentlichen Kiosken,
schl�sselfertigen Hardware-/Software-Einheiten, Hochlast-Internet-
Servern oder Datenbanken, die auf CD-ROM vertrieben werden.

Viele Benutzer von eingebettetem MySQL k�nnen von der @emph{dualen
Lizensierung} der MySQL-Software profitieren. Neben der GPL-Lizenz sind
auch kommerzielle Lizenzen f�r diejenigen verf�gbar, die nicht an die
GPL gebunden sein wollen. Die eingebettete MySQL-Bibliothek benutzt
dieselbe Schnittstelle wie die normale Client-Bibliothek und ist daher
angenehm und leicht zu benutzen. @xref{libmysqld}.


@node Nutshell Other features, Nutshell Future features, Nutshell Embedded MySQL, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - weitere Features
@subsection Weitere ab MySQL 4.0.0 verf�gbare Features

@itemize @bullet
@item
Version 4.0 erh�ht die @emph{Geschwindigkeit des MySQL-Servers} in
einigen Bereichen noch weiter, zum Beispiel bei Massen-@code{INSERT}s,
beim Suchen auf komprimierten Indexen, der Erzeugung von
@code{FULLTEXT}-Indexen oder auch bei @code{COUNT(DISTINCT)}.

@item
Der Tabellen-Handler @code{InnoDB} wird jetzt als Feature des
standardm��igen MySQL-Servers angeboten und enth�lt vollst�ndige
Unterst�tzung f�r @code{Transaktionen} und @code{Sperren auf
Zeilenebene}.

@item
Der MySQL-Server 4.0 unterst�tzt sichere Kommunikation zwischen Client
und Server, wodurch die Sicherheit gegen b�swilliges Eindringen und
unbefugten Zugriff erheblich erh�ht wird. Bei Web-Applikationen, die ein
Grundpfeiler der MySQL-Benutzung sind, konnten Web-Entwickler immer
schon SSL verwenden, um den Verkehr zwischen Endbenutzer-Browser und der
Web-Applikation zu sichern, sei sie nun in PHP, Perl, ASP oder mit
irgend einem anderen Web-Entwicklungswerkzeug geschrieben. Der Verkehr
zwischen dem Entwicklungswerkzeug und dem mysqld-Serverprozess konnte
bislang aber nur dadurch gesichert werden, dass die Prozesse auf
Computern innerhalb derselben Firewall residierten. Ab MySQL-Server 4.0
kann der @emph{mysqld}-Server-Daemon-Prozess selbst @code{Secure Sockets
Layer} (@code{SSL}) benutzen, was ihn in die Lage versetzt, eine sichere
Daten�bertragung zwischen einer MySQL-Datenbank und beispielsweise einer
Windows-Applikation ausserhalb der Firewall aufzubauen.

@item
Unsere deutschen, �sterreichischen und schweizerischen Benutzer werden
bemerken, dass es einen neuen Zeichensatz latin_de gibt, der die
@emph{deutsche Sortierreihenfolge} beinhaltet, indem deutsche Umlaute in
derselben Sortierung erscheinen wie bei deutschen Telefonb�chern �blich.

@item
Zu den Features, die die @code{Migration} von anderen Datenbanksystemen
zum MySQL-Server erleichtern, geh�ren @code{TRUNCATE TABLE} (wie in
Oracle) und @code{IDENTITY} a1s Synonym f�r automatisch hochgez�hlte
Schl�ssel (wie in Sybase). viele Benutzer werden sich auch dar�ber
freuen, dass der MySQL-Server jetzt das @code{UNION}-Statement
unterst�tzt, ein lang erwartetes Standard-SQL-Feature.

@item
Bei der Erstellung neuer Features f�r neue Benutzer haben wir die
Gemeinschaft treuer Benutzer nicht vergessen. Es gibt jetzt Multi-
Tabellen-@code{DELETE}-Statements. Durch das Hinzuf�gen von
Unterst�tzung f�r @code{symbolisches Verkn�pfen} von @code{MyISAM} auf
Tabellenebene (und nicht nicht - wie bisher - auf Datenbankebene), sowie
durch das vorgabem��ige Anschalten der Verkn�pfungen unter Windows
hoffen wir zeigen zu k�nnen, dass wir Verbesserungsvorschl�ge ernst
nehmen. Funktionen wie @code{SQL_CALC_FOUND_ROWS} und
@code{FOUND_ROWS()} erm�glichen herauszufinden, wie viele Zeilen eine
Anfrage ohne eine @code{LIMIT}-Klausel zur�ckgegeben h�tte.
@end itemize


@node Nutshell Future features, Nutshell 4.1 development release, Nutshell Other features, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - zuk�nftige Features
@subsection Zuk�nftige Features in MySQL 4.0

F�r die kommenden Releases des MySQL-Servers 4.0 (4.0.1, 4.0.2 usw.)
k�nnen Sie folgende Features erwarten, die noch in der Entwicklung sind:

@itemize @bullet
@item
Benutzer des MySQL-Servers f�r gesch�ftskritische Hochlast-Anwendungen
werden die Erg�nzungen unseres Replikationssystems und unsere Online-
"Hot"-Datensicherung begr��en. Sp�tere Versionen von 4.0 werden
@code{absturzsichere Replikation} beinhalten, die es bereits in Version
4.0.0 gibt, sowie den @code{LOAD DATA FROM MASTER}-Befehl, der bald das
Aufsetzen von Slaves automatisieren wird. @code{online backup} wird das
Hinzuf�gen eines neuen Replikations-Slaves erleichtern, ohne dass man
den Master herunterfahren muss, und es gibt auf Systemen mit vielen
Aktualisierungen nur geringe Geschwindigkeitseinbussen.

@item
Als Bequemlichkeits-Feature f�r Datenbank-Administratoren wird
hinzugef�gt, dass mysqld-Parameter (Startoptionen) bald ohne das
Herunterfahren des Servers gesetzt werden k�nnen.

@item
Die neuen Eigenschaften des MySQL-Servers 4.0 f�r die Volltext-
(@code{FULLTEXT})-Suche erm�glichen die @code{FULLTEXT}-Indexierung
gro�er Texte sowohl mit bin�rer wie auch mit nat�rlichsprachiger
Suchlogik. Benutzer k�nnen minimale Wortl�ngen anpassen und ihre
eigenen Stopp-Wort-Listen in jeder menschlichen Sprache festlegen,
wodurch g�nzlich neue Applikationen erm�glicht werden, die auf dem
MySQL-Server aufbauen.

@item
Viele Applikationen mit starkem Lesezugriff werden durch die noch weiter
erh�hte Geschwindigkeit des neu geschriebenen @code{Schl�ssel-Caches}
profitieren.

@item
Viele Entwickler wird auch die @code{MySQL-Befehlshilfe} im Client
freuen.
@end itemize


@node Nutshell 4.1 development release,  , Nutshell Future features, MySQL 4.0 In A Nutshell
@c German node Kurz und b�ndig - Entwicklungs-Release
@subsection MySQL 4.1, das folgende Entwicklungs-Release

Intern wird durch das neue .frm-Dateiformat f�r Tabellendefinitionen in
MySQL-Server 4.0 die Grundlage f�r neue Features in MySQL-Server 4.1
gelegt, beispielsweise @code{verschachtelte Unterabfragen},
@code{gespeicherte Prozeduren} und @code{Fremdschl�ssel-
Integrit�tsregeln}, die ganz oben auf der Wunschliste vieler unserer
Kunden stehen. Daneben werden auch einfachere Erweiterungen wie Multi-
Tabellen-@code{UPDATE}-Statements hinzugef�gt.

Nach diesen Erg�nzungen werden Kritiker des MySQL-Datenbankservers es
noch schwerer haben, auf Schw�chen des MySQL-Datenbank-Managementsystems
hinzuweisen. MySQL, das seit langem f�r seine Stabilit�t,
Geschwindigkeit und Einfachheit der Benutzung bekannt ist, wird dann den
Anforderungen sehr anspruchsvoller K�ufer gen�gen.


@node MySQL Information Sources, Compatibility, MySQL 4.0 In A Nutshell, Deutsch
@c German node MySQL-Informationsquellen
@section MySQL-Informationsquellen



@menu
* Portals::                     
* Questions::                   
@end menu

@node Portals, Questions, MySQL Information Sources, MySQL Information Sources
@c German node Portale
@subsection MySQL-Portale

@cindex MySQL-Portale
@cindex Handb�cher, �ber MySQL
@cindex B�cher, �ber MySQL
@cindex MySQL-Testimonials
@cindex Benutzer, von MySQL
@cindex News-Sites
@cindex Suchmaschinen, Web
@cindex Web-Suchmaschinen
@cindex Online-Magazine
@cindex Magazine, online
@cindex Websites
@cindex Dienstleistungen
@cindex PHP, Websites
@cindex Berater, Liste
@cindex Web-Seiten, verschiedene
@cindex @code{Contrib}-Verzeichnis
@cindex URLs zu MySQL-Informationen
@cindex MySQL-bezogene Informations-URLs

Die MySQL-Portale (@uref{http://www.mysql.com/portal/}) auf unserer
Website bieten ein breites Spektrum MySQL-bezogener Informationen und
Links. Sie sind so aufgebaut, dass Sie leicht die Dinge finden, die Sie
interessieren.

Sie k�nnen sich als Benutzer registrieren. In diesem Fall k�nnen Sie
alle Dinge in den Portalen kommentieren und bewerten und auch selbst
Dinge beisteuern. Bei der Registrierung k�nnen Sie auch angeben, ob und
- wenn ja - welche Newsletter aus welchen Kategorien Sie beziehen
wollen.

Einige der momentanen MySQL-Portal-Kategorien:

@itemize @bullet
@item B�cher
Hier finden Sie alle m�glichen MySQL- oder Computer-bezogenen B�cher, die
Sie kommentieren, bewerten oder kaufen k�nnen. W�hrend dieses Handbuch
(insbesondere die Online-Version) immer noch der richtige Platz f�r
aktuellste technische Informationen ist, ist sein vorrangiges Ziel,
alles zu enthalten, was man �ber das MySQL-Datenbanksystem wissen kann.
Manchmal ist es nett, ein gebundenes Buch zu haben, dass man im Bett
oder auf Reisen lesen kann. Wenn Sie ein Buch �ber die angegebenen
Hyperlinks kaufen, tragen Sie zur Entwicklung der MySQL-Software bei.

@item Entwicklung
Dieses Portal hat Links auf Seiten, die den MySQL-Server f�r
unterschiedliche Zwecke benutzen, mit einer Beschreibung jeder Site.
Diese Informationen k�nnen Ihnen eine gute Vorstellung davon geben, wer
MySQL-Datenbank-Software benutzt und wie der MySQL-Server ihre
Anforderungen erf�llt.
Teile Sie uns auch @emph{Ihre} Site oder Erfolgsgeschichte mit!
 
@item Software 
Hier finden Sie eine Vielzahl von Applikationen und Wrappern, die den
MySQL-Server benutzen, die Sie auch herunter laden k�nnen.

@item Distributionen 
Hier finden Sie die verschiedenen Linux-Distributionen und weitere
Software-Pakete, die die MySQL-Software enthalten.

@item Berater 
Hier finden Sie Informationen �ber MySQL-Berater.

@item Partner 
Hier finden Sie alle MySQL-Partner.
@end itemize


@node Questions,  , Portals, MySQL Information Sources
@c German node Fragen
@subsection MySQL-Mailing-Listen

@cindex Berichten, Fehler
@cindex MySQL-Mailing-Listen


Dieser Abschnitt f�hrt Sie in die MySQL-Mailing-Listen ein und zeigt einige
Richtlinien und ihre Benutzung auf.


@menu
* Mailing-list::                
* Asking questions::            
* Bug reports::                 
* Answering questions::         
@end menu

@node Mailing-list, Asking questions, Questions, Questions
@c German node Mailing-Listen
@subsubsection Die MySQL-Mailing-Listen

@cindex Mailing-Listen
@cindex E-Mail-Listen

Um die MySQL-Haupt-Mailing-Liste zu abonnieren, schicken Sie eine Nachricht
an die E-Mail-Adresse @email{mysql-subscribe@@lists.mysql.com}.

Um sich aus der MySQL-Haupt-Mailing-Liste auszutragen, schicken Sie eine
Nachricht an die E-Mail-Adresse @email{mysql-unsubscribe@@lists.mysql.com}.

Von Bedeutung ist nur die Adresse, unter der Sie Ihre Nachrichten
abschicken. Betreffzeile und Text der Nachricht werden ignoriert.

@c the last two addresses in this paragraph are NOT @email because they
@c shouldn't be live links.
Wenn Ihre Antwortadresse nicht g�ltig ist, k�nnen Sie Ihre Adresse explizit
angeben. F�gen Sie einen Bindestrich zum Abonnement- oder
Abmelde-Kommando hinzu, gefolgt von Ihrer Adresse, wobei das
@samp{@@}-Zeichen in Ihrer Adresse durch @samp{=} ersetzt wird. Um sich zum
Beispiel mit @code{your_name@@host.domain} einzutragen, schicken Sie eine
Nachricht an @code{mysql-subscribe-your_name=host.domain@@lists.mysql.com}.

Mails an @email{mysql-subscribe@@lists.mysql.com} oder
@email{mysql-unsubscribe@@lists.mysql.com} werden automatisch vom ezmlm
Mailing-Listen-Prozessor bearbeitet. Informationen �ber ezmlm sind
auf @uref{http://www.ezmlm.org, The ezmlm Website} verf�gbar.

Um eine Nachricht an die Liste selbst zu schicken, schicken Sie eine Mail
an @code{mysql@@lists.mysql.com}. Schicken aber bitte @emph{keine} Mail an
@email{mysql@@lists.mysql.com}, die das Abonnieren oder Austragen betrifft,
denn Mails an diese Adresse werden automatisch an tausende anderer Benutzer
verteilt.

@c __review__jan_2001_11_13 
Wenn Ihre lokale Site viele Abonnenten f�r @email{mysql@@lists.mysql.com}
hat, sollten Sie evtl. eine lokale Mailing-Liste einrichten, so dass
Nachrichten, die von @code{lists.mysql.com} an Ihre Site gesandt werden, an
die lokale Liste verteilt werden. In solchen F�llen wenden Sie sich bitte
an Ihre Systemadministrator, um zur lokalen Mailing-Liste hinzugef�gt oder
aus ihr gel�scht zu werden.

Wenn Sie wollen, dass der Traffic einer Mailing-Liste in eine separate
Mailbox Ihres E-Mail-Programms geleitet wird, setzen Sie einen Filter,
der auf die E-Mail-Header (Kopfdaten) reagiert. Sie k�nnen dazu entweder
den @code{List-ID:}- oder den @code{Delivered-To:}-Header benutzen, um die
Listennachrichten zu erkennen.

Die folgenden MySQL-Mailing-Listen existieren:

@table @code
@item @email{announce-subscribe@@lists.mysql.com} announce
Diese Liste k�ndigt neue Versionen von MySQL und verwandter Programme an.
Sie hat geringen Traffic; alle MySQL-Benutzer sollten sie abonnieren.

@item @email{mysql-subscribe@@lists.mysql.com} mysql
Die Hauptliste f�r allgemeine MySQL-Diskussionen. Bitte beachten Sie, dass
bestimmte Themen besser in spezialisierteren Listen diskutiert werden. Wenn
Sie an die falsche Liste posten, erhalten Sie vielleicht keine Antwort!

@item @email{mysql-digest-subscribe@@lists.mysql.com} mysql-digest
Die @code{mysql}-Liste in Digest-Form (zusammengefasst). Anstelle
individueller Nachrichten wird einmal pro Tag eine gro�e Mail mit allen
Nachrichten dieses Tages geschickt.

@item @email{bugs-subscribe@@lists.mysql.com} bugs
An diese Liste sollte Sie ausschlie�lich komplette, wiederholbare
Bug-Berichte schicken, indem Sie das @code{mysqlbug}-Skript benutzen. (Wenn
Sie unter Windows arbeiten, sollten Sie eine Beschreibung des
Betriebssystems und der MySQL-Version hinzuf�gen.)
Vorzugsweise sollten Sie den Problemfall mit der letzten stabilen oder
Entwicklungs-Version von MySQL testen, bevor Sie den Bericht posten! Jeder
sollte in der Lage sein, den Bug zu wiederholen, indem einfach @code{mysql
test < Skript} auf den beigef�gten Testfall angewandt wird. Alle Bugs, die
auf dieser Liste gepostet werden, werden im n�chsten MySQL-Release behoben
oder dokumentiert! Wenn nur kleinere Code-�nderungen betroffen sind, werden
wir zus�tzlich ein Patch bereitstellen, das das Problem behebt.

@item @email{bugs-digest-subscribe@@lists.mysql.com} bugs-digest
Die Digest-Version (zusammengefasst) der @code{bugs}-Liste.

@item @email{internals-subscribe@@lists.mysql.com} internals
Eine Liste f�r Leute, die am MySQL-Code arbeiten. Auf dieser Liste kann man
auch die MySQL-Entwicklung diskutieren und Patches posten.

@item @email{internals-digest-subscribe@@lists.mysql.com} internals-digest
Die Digest-Version (zusammengefasst) der @code{internals}-Liste.

@item @email{java-subscribe@@lists.mysql.com} java
Diskussionen �ber MySQL und Java, haupts�chlich �ber JDBC-Treiber.

@item @email{java-digest-subscribe@@lists.mysql.com} java-digest
Eine @code{java}-Liste.

@item @email{win32-subscribe@@lists.mysql.com} win32
Alles betreffend MySQL auf Microsoft-Betriebssystemen wie Win95, Win98, NT, XP,
und Win2000.

@item @email{win32-digest-subscribe@@lists.mysql.com} win32-digest
Die Digest-Version (zusammengefasst) der @code{win32}-Liste.

@item @email{myodbc-subscribe@@lists.mysql.com} myodbc
Alles betreffend ODBC-Verbindungen zu MySQL.

@item @email{myodbc-digest-subscribe@@lists.mysql.com} myodbc-digest
Die Digest-Version (zusammengefasst) der @code{myodbc}-Liste.

@item @email{plusplus-subscribe@@lists.mysql.com} plusplus
Alles, was das Programmieren mit der C++-API von MySQL betrifft.

@item @email{plusplus-digest-subscribe@@lists.mysql.com} plusplus-digest
Die Digest-Version (zusammengefasst) der @code{plusplus}-Liste.

@c __review_jan_2001_11_13
@item @email{msql-mysql-modules-subscribe@@lists.mysql.com} msql-mysql-modules
Eine Liste zur Perl-Unterst�tzung in MySQL. msql-mysql-modules

@item @email{msql-mysql-modules-digest-subscribe@@lists.mysql.com} msql-mysql-modules-digest
Die Digest-Version (zusammengefasst) der @code{msql-mysql-modules}-Liste.
@end table

Alle Listen abonnieren Sie - und tragen sich wieder aus - auf dieselbe Art
wie oben beschrieben. Tragen Sie in Ihre Mail zum Abonnieren oder Austragen
die entsprechende Mailing-Liste ein anstelle von @code{mysql}. Um sich zum
Beispiel f�r die @code{myodbc}-Liste einzutragen, schicken Sie eine
Nachricht an @email{myodbc-subscribe@@lists.mysql.com} oder
@email{myodbc-unsubscribe@@lists.mysql.com}.

Wenn Sie keine Antwort auf Ihre Fragen von der Mailing-Liste erhalten, ist
eine Option, f�r den Support von MySQL AB zu bezahlen, was Sie in direkten
Kontakt mit den MySQL-Entwicklern bringt. @xref{Support}.

Die folgende Tabelle listet einige Mailing-Listen in anderen Sprachen als
englisch auf. Beachten Sie, dass diese nicht von MySQL AB unterhalten
werden. Daher k�nnen wir nicht f�r die Qualit�t dieser Listen garantieren.

@table @code
@item @email{mysql-france-subscribe@@yahoogroups.com} Eine franz�sische Mailing-Liste
@item @email{list@@tinc.net} Eine koreanische Mailing-Liste
Schicken Sie eine E-Mail mit dem Betreff @code{subscribe mysql
your@@email.address} an diese Liste.
@item @email{mysql-de-request@@lists.4t2.com} Eine deutsche Mailing-Liste
Schicken Sie eine E-Mail mit dem Betreff @code{subscribe mysql-de
your@@email.address} an diese Liste.
Informationen �ber diese Liste finden Sie unter
@uref{http://www.4t2.com/mysql}.
@item @email{mysql-br-request@@listas.linkway.com.br} Eine portugiesische Mailing-Liste.
Schicken Sie eine E-Mail mit dem Betreff @code{subscribe mysql-br
your@@email.address} an diese Liste.
@item @email{mysql-alta@@elistas.net} Eine spanische Mailing-Liste.
Schicken Sie eine E-Mail mit dem Betreff @code{subscribe mysql
your@@email.address} an diese Liste.
@end table


@node Asking questions, Bug reports, Mailing-list, Questions
@c German node Fragen stellen
@subsubsection Wie man Fragen stellt oder Bugs berichtet

@cindex Netz-Etikette
@cindex Mailing-Listen, Speicherort der Archive
@cindex Durchsuchen, MySQL-Webseiten

Bevor Sie einen Bug berichten oder eine Frage stellen, tun Sie bitte
folgendes:

@itemize @bullet
@item
Suchen Sie im MySQL-Online-Handbuch:
@*
@uref{http://www.mysql.com/documentation/manual.php}
@*
Wir bem�hen uns, das Handbuch aktuell zu halten, indem wir es h�ufig mit
L�sungen f�r neu bekannt gewordene Probleme aktualisieren!

@item
Durchsuchen Sie die MySQL-Mailing-Listen-Archive:
@*
@uref{http://www.mysql.com/documentation/}
@*
@item
Sie k�nnen ausserdem @uref{http://www.mysql.com/search.html} benutzen, um
alle Webseiten zu durchsuchen (inklusive des Handbuchs), die unter
@uref{http://www.mysql.com/} zu finden sind.
@end itemize

Wenn Sie weder im Handbuch noch in den Archiven eine Antwort finden k�nnen,
versuchen Sie es mit Ihrem lokalen MySQL-Experten. Wenn Sie immer noch
keine Antwort auf Ihre Frage finden, lesen Sie den n�chsten Abschnitt �ber
die Mailing-Listen unter @email{mysql@@lists.mysql.com}.


@node Bug reports, Answering questions, Asking questions, Questions
@c German node Bug-Berichte
@subsubsection Wie man Bugs oder Probleme berichtet

@cindex Bugs, berichten
@cindex Berichten, Bugs
@cindex Probleme, berichten
@cindex Fehler, berichten
@cindex @code{mysqlbug}-Skript
@cindex Erzeugen, Bug-Berichte
@cindex Skripts, @code{mysqlbug}

Einen guten Bug-Bericht zu schreiben braucht Geduld, aber es gleich beim
ersten Mal richtig zu machen spart Ihnen und uns Zeit. Ein guter
Bug-Bericht enth�lt einen kompletten Testfall f�r den Bug, der es sehr
wahrscheinlich macht, dass wir ihn im n�chsten Release beheben. Dieser
Abschnitt hilft Ihnen, Ihren Bericht korrekt zu schreiben, damit Sie Ihre
Zeit nicht damit verschwenden, etwas zu schreiben, was uns wenig oder gar
nicht weiterhilft.

Wir ermutigen jeden, das @code{mysqlbug}-Skript zu benutzen, um einen
Bug-Bericht anzufertigen (oder einen Bericht �ber irgendein anderes
Problem), falls das m�glich ist. Der @code{mysqlbug} findet sich im
@file{Skripts}-Verzeichnis der Quelldistribution, bzw. im
@file{bin}-Verzeichnis der Bin�rdistribution, im Verzeichnis unterhalb
Ihres MySQL-Installationsverzeichnisses. Falls es Ihnen nicht m�glich ist,
@code{mysqlbug} zu benutzen, sollten Sie trotzdem alle notwendigen
Informationen mitliefern, die in diesem Abschnitt aufgef�hrt sind.

Das @code{mysqlbug}-Skript hilft Ihnen, einen Bericht zu erstellen, der
viele der folgenden Informationen automatisch einschlie�t, aber falls
etwas Wichtiges fehlt, f�gen Sie es bitte Ihrer Nachricht hinzu! Bitte
lesen Sie diesen Abschnitt sorgf�ltig und stellen Sie sicher, dass alle
hier beschriebenen Informationen in Ihrem Bericht enthalten sind.

@cindex Bug-Berichte, E-Mail-Adresse
F�r gew�hnlich sollten Sie Ihren Bug-Bericht und Probleme an
@email{mysql@@lists.mysql.com} schicken. Wenn Sie einen Testfall erzeugen
k�nnen, der den Bug klar demonstriert, sollten Sie ihn an die
@email{bugs@@lists.mysql.com}-Liste schicken. Beachten Sie, dass Sie nur
einen kompletten, nachvollziehbaren Bug-Bericht an diese Liste schicken
sollten, indem Sie das @code{mysqlbug}-Skript benutzen. Falls Sie unter
Windows arbeiten, sollten Sie eine Beschreibung des Betriebssystems und der
MySQL-Version hinzuf�gen. Vorzugsweise sollten Sie den Problemfall mit der
letzten stabilen oder Entwicklungs-Version von MySQL testen, bevor Sie den
Bericht posten! Jeder sollte in der Lage sein, den Bug zu wiederholen,
indem einfach @code{mysqltest < Skript} auf den beigef�gten Testfall
angewandt wird. Alle Bugs, die auf dieser Liste gepostet werden, werden im
n�chsten MySQL-Release behoben oder dokumentiert! Wenn nur kleinere
Code-�nderungen betroffen sind, werden wir zus�tzlich ein Patch
bereitstellen, das das Problem behebt.

Denken Sie daran, dass es immer m�glich ist, auf eine Nachricht zu
antworten, die zu viele Informationen enth�lt, aber nicht immer auf eine,
die zu wenige Informationen enth�lt. Oft lassen Leute Fakten aus, weil sie
denken, die Ursache eines Probleme zu kennen und annehmen, dass einige
Details nicht von Wichtigkeit sind. Ein gutes Prinzip ist folgendes: Falls
Sie im Zweifel sind, ob Sie etwas Bestimmtes mitteilen sollten, teilen Sie
es mit! Es ist tausendmal schneller und weniger �rgerlich, ein paar Zeilen
mehr in Ihrem Bericht zu schreiben, als gezwungen zu sein, noch einmal zu
fragen und auf die Antwort zu warten, weil Sie beim ersten Mal nicht genug
Informationen geliefert haben.

Die h�ufigste Fehler besteht darin, dass Leute die Versionsnummer der
MySQL-Distribution, die sie benutzen nicht angeben, oder vergessen anzugeben, 
auf welcher Plattform sie MySQL installiert haben (inklusive der
Betriebssystem-Version). Diese Informationen sind �u�erst relevant, und in
99 von 100 F�llen ist der Bug-Bericht ohne sie nutzlos! Sehr oft erhalten
wir Fragen wie 'Warum funktioniert das bei mir nicht?', nur um
herauszufinden, dass das beschriebene Feature nicht in der benutzten
MySQL-Version implementiert war, oder dass der Bug, der im Bericht
beschrieben wurde, bereits in einer neueren MySQL-Version behoben wurde.
Manchmal ist der Fehler plattformabh�ngig; in solchen F�llen ist es
praktisch unm�glich, irgend etwas zu beheben, ohne das Betriebssystem und
die Versionsnummer des Betriebssystems zu kennen.

Denken Sie auch daran, Informationen �ber Ihren Compiler einzuschlie�en,
falls sie MySQL selbst kompilieren. Oft finden Leute Fehler in
Compilern und denken, dass das Problem MySQL-bezogen ist. Die meisten
Compiler werden permanent weiter entwickelt und werden von Version zu
Version besser. Um festzustellen, ob ein Problem von Ihrem Compiler abh�ngt
oder nicht, m�ssen wir wissen, welcher Compiler benutzt wird. Beachten Sie,
dass jedes Compiler-Problem als Bug-Bericht betrachtet und deshalb
entsprechend berichtet werden sollte.

Es ist �u�erst hilfreich, wenn eine gute Beschreibung des Probleme in
Ihrem Bug-Bericht eingeschlossen ist, das hei�t ein gutes Beispiel aller
Dinge, die Sie getan haben, die zu dem Problem f�hrten, sowie das Problem
selbst. Die besten Bug-Berichte sind diejenigen, die ein komplettes
Beispiel zeigen, wie man den Bug oder das Problem reproduzieren kann.
@xref{Reproduceable test case}.

Wenn ein Programm eine Fehlermeldung produziert, ist es sehr wichtig,
diese in Ihren Bericht einzuschlie�en! Wenn wir in den Archiven der
Programme suchen, ist es besser, wenn die Fehlernachricht exakt mit
derjenigen �bereinstimmt, die das Programm produziert. (Sogar
Gro�-/Kleinschreibung sollte ber�cksichtigt werden!) Sie sollten nie
versuchen, sich daran zu erinnern, was die Fehlernachricht war; stattdessen
sollten Sie die gesamte Nachricht per Kopieren und Einf�gen in Ihrem
Bericht unterbringen!

Wenn Sie ein Problem mit MyODBC haben, sollten Sie versuchen, eine
MyODBC-Trace-Datei zu erstellen. @xref{MyODBC bug report}.

Bitten denken Sie daran, dass viele Leute, die Ihren Bericht lesen, dabei
ein 80-Spalten-Anzeigeger�t benutzen. Wenn Sie Berichte oder Beispiele
erzeugen, indem Sie das @code{mysql}-Kommandozeilen-Werkzeug benutzen, sollten
Sie deshalb die @code{--vertical}-Option (oder den
@code{\G}-Statement-Begrenzer) f�r Ausgaben benutzen, die ansonsten die
verf�gbare Anzeigebreite �berschreiten w�rden (zum Beispiel beim
@code{EXPLAIN SELECT}-Statement; siehe dazu das Beispiel weiter unten).
@cindex Bug-Berichte, Kriterien f�r
Bitte schlie�en Sie folgende Informationen in Ihren Bug-Bericht ein:

@itemize @bullet
@item
Die Versionsnummer der MySQL-Distribution, die Sie benutzen (zum Beispiel
MySQL Version 3.23.22). Sie finden heraus, welche Version Sie benutzen,
indem Sie @code{mysqladmin version} eingeben. @code{mysqladmin} findet
sich im @file{bin}-Verzeichnis unterhalb Ihres
MySQL-Installationsverzeichnisses.

@item
Hersteller und Modell der Maschine, auf der Sie arbeiten.

@item
Name und Version des Betriebssystems. Bei den meisten Betriebssystemen
l��t sich diese Information herausfinden, indem man das Unix-Kommando
@code{uname -a} ausf�hrt.

@item
Manchmal ist die Gr��e des Arbeitsspeichers (real und virtuell) relevant.
Im Zweifelsfall schlie�en Sie diese Werte ein.

@item
Wenn Sie eine Quelldistribution von MySQL benutzen, werden Name und
Versionsnummer des Compilers ben�tigt. Wenn Sie eine Bin�rdistribution
haben, geben Sie den Namen der Distribution an.

@item
Wenn das Problem w�hrend der Kompilation auftritt, schlie�en Sie die
exakte Fehlermeldung (bzw. -meldungen) ein und zus�tzlich ein paar Zeilen
des Kontextes um den problembehafteten Code herum in der Datei, wo der
Fehler auftrat.

@item
Falls @code{mysqld} abst�rzt, sollten Sie auch die Anfrage (Query)
mitteilen, die @code{mysqld} zum Absturz brachte. Gew�hnlich k�nnen Sie das
herausfinden, indem Sie @code{mysqld} mit angeschaltetem Logging laufen
lassen. @xref{Using log files}.

@item
Falls irgend eine Datenbanktabelle mit dem Problem zu tun hat, schlie�en
Sie die Ausgabe von @code{mysqldump --no-data db_name tbl_name1 tbl_name2
...} ein. Das ist sehr leicht zu bewerkstelligen und eine sehr hilfreiche
M�glichkeit, Informationen �ber jegliche Tabelle in einer Datenbank zu
erhalten, die uns hilft, eine Situation herzustellen, die mit derjenigen
�bereinstimmt, die Sie haben.

@item
Bei Bugs, die sich auf Geschwindigkeitsprobleme beziehen, oder bei
Problemen mit @code{SELECT}-Statements, sollten Sie immer die Ausgabe von
@code{EXPLAIN SELECT ...} einschlie�en, und zumindest die Anzahl der
Zeilen, die das @code{SELECT}-Statement produziert. Je mehr Informationen
Sie uns �ber Ihre Situation geben, desto wahrscheinlicher ist es, dass
Ihnen jemand helfen kann! Das folgende Beispiel ist ein sehr gutes Beispiel
eines Bug-Berichts (es sollte nat�rlich mit dem @code{mysqlbug}-Skript
berichtet werden):

Beispiel unter Benutzung des @code{mysql}-Kommandozeilen-Werkzeugs (achten Sie
auf die Benutzung des @code{\G}-Statement-Begrenzers f�r Statements, deren
Ausgabebreite ansonsten die von 80-Zeilen-Ausgabeger�ten �berschreiten
w�rde):

@example
mysql> SHOW VARIABLES;
mysql> SHOW COLUMNS FROM ...\G
       <Ausgabe von SHOW COLUMNS>
mysql> EXPLAIN SELECT ...\G
       <Ausgabe von EXPLAIN>
mysql> FLUSH STATUS;
mysql> SELECT ...;
       <Eine Kurzfassung der Ausgabe von SELECT,
       inclusive der Zeit, die die Anfrage ben�tigte>
mysql> SHOW STATUS;
       <Ausgabe von SHOW STATUS>
@end example

@item
Wenn ein Problem auftritt, w�hrend @strong{mysqld} l�uft, legen Sie nach
M�glichkeit ein Eingabeskript bei, das die Anomalie reproduziert. Dieses
Skript sollte alle notwendigen Quelltextdateien beinhalten. Je exakter das
Skript Ihre Situation reproduzieren kann, desto besser. Wenn Sie einen
wiederholbaren Testfall erstellen k�nnen, sollten Sie ihn an
@email{bugs@@lists.mysql.com} schicken, damit er mit hoher Priorit�t
behandelt wird!

Falls Sie kein Skript zur Verf�gung stellen k�nnen, sollten Sie zumindest
die Ausgaben von @code{mysqladmin variables extended-status processlist} in
Ihrer Mail mitschicken, um einige Informationen dar�ber zu geben, wie Ihr
System arbeitet!

@item
Falls Sie keinen Testfall mit ein paar Zeilen produzieren k�nnen oder falls
Ihre Tabelle zu Gro� ist, um an die Mailing-Liste geschickt zu werden
(mehr als 10 Zeilen), sollten Sie mit @code{mysqldump} einen Dump Ihrer
Tabellen machen und eine @file{README}-Datei erzeugen, die Ihr Problem
beschreibt.

Erzeugen Sie ein komprimiertes Archiv Ihrer Dateien, indem Sie @code{tar}
und @code{gzip} oder @code{zip} benutzen, und benutzen Sie @code{ftp}, um
das Archiv nach @uref{ftp://Support.mysql.com/pub/mysql/secret/} zu
transferieren. Schicken Sie danach eine kurze Beschreibung des Probleme an
@email{bugs@@lists.mysql.com}.

@item
Wenn Sie glauben, dass MySQL auf eine Anfrage hin merkw�rdige Ergebnisse
liefert, f�gen Sie nicht nur das Ergebnis bei, sondern auch, wie das
Ergebnis Ihrer Meinung nach aussehen sollte, sowie eine Erkl�rung, wie Sie
zu dieser Meinung gelangt sind.

@item
Wenn Sie ein Beispiel Ihres Problems schildern, ist es besser, die
Variablen-, Tabellen- etc. Namen zu verwenden, die in Ihrer aktuellen
Situation existieren, anstatt sich neue Namen auszudenken. Das Problem
k�nnte n�mlich etwas mit dem Namen der Variablen oder Tabelle zu tun haben!
Diese F�lle sind zwar selten, aber hier sollte man lieber auf Nummer sicher
gehen. Letztlich sollte es f�r Sie auch leichter sein, ein Beispiel zur
Verf�gung zu stellen, das Ihre tats�chliche Situation schildert, und es ist
in jedem Fall besser f�r uns. Falls Sie mit Daten arbeiten, die Sie keinen
anderen zeigen wollen, k�nnen Sie @code{ftp} benutzen, um die Daten nach
@uref{ftp://Support.mysql.com/pub/mysql/secret/} zu transferieren. Falls
die Daten streng geheim sind und Sie sie nicht einmal uns zeigen wollen,
legen Sie bitte ein Beispiel mit anderen Namen an, betrachten Sie dies aber
bitte als allerletzte M�glichkeit.

@item
F�gen Sie alle Optionen ein, die den relevanten Programmen �bergeben
wurden, falls m�glich. Geben Sie zum Beispiel die Optionen an, die Sie
benutzt haben, als Sie den @code{mysqld}-Daemon gestartet haben, und die
Sie f�r Client-Programme wie @code{mysql} benutzen, sowie
diejenigen, die Sie f�r die Konfiguration des @code{configure}-Skripts
nehmen, denn diesen sind oft der Schl�ssel f�r Antworten und deshalb
�u�erst relevant!
Es ist immer eine gute Idee, sie in jedem Fall anzugeben! Wenn Sie Module
wie Perl oder PHP benutzen, f�gen Sie bitte die Versionszahl von diesen mit
ein.

@item
Wenn sich Ihre Frage auf das Berechtigungssystem (Zugriffsberechtigungen auf
den Datenbank-Server) bezieht, f�gen Sie bitte die Ausgabe von
@code{mysqlaccess}, die Ausgabe von @code{mysqladmin reload} und alle
Fehlermeldungen, die Sie erhalten, wenn Sie versuchen, sich zu verbinden,
bei! Wenn Sie Ihre Zugriffsberechtigungen testen, sollten Sie zun�chst
@code{mysqlaccess} ausf�hren. F�hren Sie danach @code{mysqladmin reload
version} aus und versuchen Sie dann, sich mit dem Programm zu verbinden,
das Probleme macht. @code{mysqlaccess} liegt im @file{bin}-Verzeichnis
unter Ihrem MySQL-Installationsverzeichnis.
MySQL-Installationsverzeichnis.

@item
Wenn Sie einen Patch f�r ein Bug haben, ist das gut, aber nehmen Sie bitte
nicht an, dass der Patch alles ist, was wir brauchen. Gehen Sie auch nicht
davon aus, dass wir den Patch benutzen werden, wenn Sie nicht auch einige
notwendige Informationen mitschicken, zum Beispiel Testf�lle, die den Bug
zeigen, der durch Ihren Patch behoben wird. M�glicherweise finden wir
Probleme, die Ihr Patch verursacht, oder wir verstehen ihn �berhaupt nicht.
Wenn das der Fall ist, k�nnen wir ihn nicht benutzen.

Wenn wir nicht genau feststellen k�nnen, wof�r der Patch gedacht ist,
werden wir ihn nicht benutzen. In diesen F�llen werden uns Testf�lle weiter
helfen. Zeigen Sie darin auf, dass der Patch all die Situationen bew�ltigt,
die eintreten k�nnen. Falls wir einen Grenzfall finden (sogar, wenn es ein
seltener ist), bei dem der Patch nicht funktioniert, ist er vielleicht
nutzlos.

@item
Vermutungen, worin der Bug besteht, warum er auftritt oder wovon er
abh�ngt, sind meist falsch. Selbst das MySQL-Team kann solche Dinge nicht
erraten, sondern muss einen Debugger benutzen, um den wahren Grund des Bugs
feststellen zu k�nnen.

@item
Geben Sie in Ihrer Mail zu erkennen, dass Sie das Referenzhandbuch gelesen
und die Mail-Archive durchgesehen haben, damit andere wissen, dass Sie
versucht haben, das Problem selbst zu l�sen.

@item
Wenn Sie einen @code{parse error} erhalten, �berpr�fen Sie bitte genau Ihre
Syntax! Wenn Sie nichts Falsches darin finden k�nnen, ist es sehr
wahrscheinlich, dass Ihre aktuelle Version von MySQL die Anfrage, die Sie
formuliert haben, nicht unterst�tzt. Wenn Sie die aktuelle Version benutzen
und das Handbuch unter @uref{http://www.mysql.com/documentation/manual.php}
die Syntax, die Sie benutzen, nicht beschreibt, unterst�tzt MySQL Ihre
Anfrage nicht. In diesem Fall bleibt Ihnen nur, die Syntax entweder selbst
zu implementieren oder per E-Mail an @email{mysql-licensing@@mysql.com}
nach einem Angebot f�r die Implementation anzufragen!

Wenn das Handbuch die Syntax, die Sie benutzen, beschreibt, Sie aber eine
�ltere Version von MySQL benutzen, sollten Sie in der
MySQL-�nderungsgeschichte (Change History) nachsehen, wann die Syntax
implementiert wurde. In diesem Fall haben Sie die M�glichkeit, ein Upgrade
auf eine neuere Version von MySQL vorzunehmen.
@xref{News}.

@item
Wenn Sie ein Problem in der Art haben, dass Ihre Daten anscheinend
besch�digt sind oder Sie Fehlermeldungen bekommen, wenn Sie auf eine
bestimmte Tabelle zugreifen, sollten Sie zun�chst Ihre Tabellen �berpr�fen
und anschlie�end reparieren, indem Sie @code{myisamchk} oder @code{CHECK
TABLE} und @code{REPAIR TABLE} benutzen.
@xref{MySQL Database Administration}.

@item
Wenn Sie oft besch�digte Tabellen erhalten, sollten Sie versuchen
herauszufinden, wann und warum das geschieht! In diesem Fall kann die
@file{mysql-data-directory/'hostname'.err}-Datei einige Informationen
dar�ber enthalten, was geschehen ist. @xref{Error log}. Bitte f�gen Sie
jede relevante Information aus dieser Datei in Ihren Bug-Bericht ein!
Normalerweise sollte @code{mysqld} @strong{NIE} eine Tabelle zerst�ren,
ausser wenn der Server mitten w�hrend eines Updates gekillt wurde! Wenn Sie
den Grund f�r den Absturz von @code{mysqld} herausfinden k�nnen, ist es
sehr viel einfacher f�r uns, Ihnen eine L�sung des Problems an die Hand zu
geben!
@xref{What is crashing}.

@item
Falls m�glich, sollten Sie die aktuellste Version von MySQL herunter laden,
installieren und �berpr�fen, ob das Ihr Problem l�st. Alle Versionen
von MySQL werden gr�ndlich getestet und sollten ohne Probleme
funktionieren! Wir halten uns daran, alles so abw�rtskompatibel wie
m�glich zu machen. Daher sollte es Ihnen m�glich sein, innerhalb von
Minuten die MySQL-Version auszutauschen!
@xref{Which version}.
@end itemize

@cindex Technischer Support, E-Mail-Adresse
@cindex Support, E-Mail-Adresse
@cindex Kunden-Support, E-Mail-Adresse
@cindex E-Mail-Adresse, f�r Kunden-Support
Wenn Sie ein Support-Kunde sind, schicken Sie bitte den Bug-Bericht an
@email{mysql-Support@@mysql.com}, damit dieser eine h�here Priorit�t in der
Bearbeitung erf�hrt. Schicken Sie ihn gleichzeitig an die entsprechende
Mailing-Liste, um zu sehen, ob schon jemand anderes das selbe Problem hatte
(und vielleicht gel�st hat).

Informationen zu Bug-Berichten siehe @strong{MyODBC} und @ref{ODBC Problems}.

L�sungen f�r h�ufig auftretende Probleme siehe @xref{Problems}.

Wenn Ihnen Antworten individuell zugesandt werden und nicht an die
Mailing-Liste, wird es als gute Etikette betrachtet, die Antworten
zusammenzufassen und die Zusammenfassung an die Mailing-Liste zu schicken,
damit andere von den Antworten profitieren k�nnen, die Ihnen geholfen
haben, Ihr Problem zu l�sen!


@node Answering questions,  , Bug reports, Questions
@c German node Fragen beantworten
@subsubsection Richtlinien f�r die Beantwortung von Fragen auf der Mailing-Liste

@cindex Netz-Etikette
@cindex Fragen, Antworten
@cindex Fragen beantworten, Etikette
@cindex Mailing-Listen, Richtlinien

Wenn Sie davon ausgehen, dass Ihre Antwort auf breites Interesse st��t,
sollten Sie an die Mailing-Liste posten, statt direkt der Person zu
antworten, die die Frage stellte. Versuchen Sie, Ihre Antwort so allgemein
zu halten, dass auch andere als der urspr�nglich Fragende von Ihrer Antwort
profitieren k�nnen. Wenn Sie an die Liste posten, stellen Sie bitte sicher,
dass Ihre Antwort kein Duplikat einer vorhergehenden Antwort ist.

Versuchen Sie, den wesentlichen Teil der Frage in Ihrer Antwort
zusammenzufassen. F�hlen Sie sich nicht verpflichtet, die gesamte
urspr�ngliche Nachricht zu zitieren.

Bitte schicken Sie Ihre Mailnachrichten nicht im HTML-Format! Viele
Benutzer lesen Nachrichten mit nicht HTML-f�higen Anwendungen!



@node Compatibility, TODO, MySQL Information Sources, Deutsch
@c German node Kompatibilit�t
@section Wie Standard-kompatibel ist MySQL?

@cindex Kompatibilit�t mit ANSI SQL
@cindex Standard-Kompatibilit�t
@cindex Erweiterungen von ANSI SQL
@cindex ANSI SQL92, Erweiterungen


Dieser Abschnitt beschreibt, wie sich MySQL zum ANSI SQL-Standard verh�lt.
MySQL hat viele Erweiterungen zum ANSI SQL-Standard, und hier steht, welche
das sind und wie man sie benutzt. Hier finden Sie auch Informationen �ber
Funktionalit�t, die MySQL fehlt, und wie man mit diesen Unterschieden
umgeht.


@menu
* Standards::                   
* ANSI mode::                   
* Extensions to ANSI::          
* Differences from ANSI::       
* Bugs::                        
@end menu

@node Standards, ANSI mode, Compatibility, Compatibility
@c German node Standards
@subsection An welche Standards h�lt sich MySQL?

Entry-Level-SQL92. ODBC-Levels 0-2.

Wir beabsichtigen ANSI SQL99 vollst�ndig zu unterst�tzen. Dies 
wollen wir jedoch keinesfalls auf Kosten von Geschwindigkeit 
oder Codequalit�t erreichen.

@node ANSI mode, Extensions to ANSI, Standards, Compatibility
@c German node ANSI-Modus
@subsection MySQL im ANSI-Modus laufen lassen

@cindex Laufen lassen, ANSI-Modus
@cindex ANSI-Modus, laufen lassen

Wenn Sie @code{mysqld} mit der @code{--ansi}-Option starten, �ndert sich
folgendes Verhalten von MySQL:

@itemize @bullet
@item
@code{||} ist Zeichenketten-Verkettung (Konkatenation) anstelle von
@code{OR}.

@item
Sie k�nnen eine beliebige Anzahl von Leerzeichen zwischen Funktionnamen und
@samp{(} eingeben. Das f�hrt zwangsl�ufig dazu, dass alle Funktionsnamen
als reservierte W�rter behandelt werden.

@item
@samp{"} ist dann ein Quotierungsbezeichner (wie das MySQL-
@samp{`}-Anf�hrungszeichen) und kein Zeichen, dass einen String einschlie�t.

@item
@code{REAL} wird zu einem Synonym f�r @code{FLOAT} anstelle eines Synonyms
f�r @code{DOUBLE}.

@item
Der Standard-Isolationslevel f�r Transaktionen ist @code{SERIALIZABLE}.
@xref{SET TRANSACTION}.
@end itemize

Das ist dasselbe, als w�rde man
@code{--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY}
benutzen.

@node Extensions to ANSI, Differences from ANSI, ANSI mode, Compatibility
@c German node Erweiterungen zu ANSI
@subsection MySQL-Erweiterungen zu ANSI SQL92

@cindex Hinweise
MySQL beinhaltet einige Erweiterungen, die Sie in anderen SQL-Datenbanken
wahrscheinlich nicht finden werden. Passen Sie auf, wenn Sie diese
benutzen, denn Ihr Code ist dann nicht mehr kompatibel mit anderen
SQL-Servern. In einigen F�llen k�nnen Sie Code schreiben, der
MySQL-Erweiterungen enth�lt und dennoch portabel ist, indem Sie Kommentare
in der Form @code{/*! ... */} benutzen. In diesem Fall wird MySQL den Code
innerhalb des Kommentars parsen und ausf�hren wie jedes andere
MySQL-Statement, aber andere SQL-Server werden die Erweiterungen
ignorieren. Zum Beispiel:

@example
SELECT /*! STRAIGHT_JOIN */ col_name FROM tabelle1, tabelle2 WHERE ...
@end example

Wenn Sie hinter @code{'!'} die Versionsnummer angeben, wird die Syntax nur
ausgef�hrt, wenn die MySQL-Version gleich oder neuer als die benutzte
Versionsnummer ist:

@example
CREATE /*!32302 TEMPORARY */ TABLE (a int);
@end example

Je h�her bedeutet, wenn Sie Version 3.23.02 oder neuer haben, wird MySQL
das @code{TEMPORARY}-Schl�sselwort benutzen.

MySQL-Erweiterungen sind:

@itemize @bullet
@item
Die Feldtypen @code{MEDIUMINT}, @code{SET}, @code{ENUM} und die
unterschiedlichen @code{BLOB}- und @code{TEXT}-Typen.

@item
Die Feldattribute @code{AUTO_INCREMENT}, @code{BINARY}, @code{NULL},
@code{UNSIGNED} und @code{ZEROFILL}.

@item
Alle Zeichenkettenvergleiche achten vorgabem��ig nicht auf
Gro�-/Kleinschreibung, wobei die Sortierreihenfolge vom aktuell
verwendeten Zeichensatz abh�ngig ist (ISO-8859-1 Latin1 als Vorgabe). Wenn
Sie das nicht wollen, sollten Sie Ihre Spalten mit dem
@code{BINARY}-Attribut deklarieren oder den @code{BINARY}-Cast
benutzen, der daf�r sorgt, dass Vergleiche mit der ASCII-Sortierung
durchgef�hrt werden, die der MySQL-Server-Host benutzt.

@item
MySQL legt jede Datenbank als Verzeichnis unterhalb des MySQL-data-
Verzeichnisses an und Tabellen innerhalb einer Datenbank als Dateien in dem
Datenbank-Verzeichnis.

Das hat ein paar Auswirkungen:

@cindex Datenbanknamen, Gro�-/Kleinschreibung
@cindex Tabellennamen, Gro�-/Kleinschreibung
@cindex Gro�-/Kleinschreibung von Datenbanknamen
@cindex Gro�-/Kleinschreibung von Tabellennamen

@itemize @minus

@item
Bei Datenbanknamen und Tabellennamen wird auf Unterschiede in der
Gro�-/Kleinschreibung geachtet, wenn das Betriebssystem auf
Gro�-/Kleinschreibung achtet (wie auf den meisten Unix-Systemen).
@xref{Case sensitivity}.

@item
Datenbank-, Tabellen-, Index-, Spalten- oder Alias-Namen d�rfen mit einer
Ziffer beginnen (aber nicht ausschlie�lich aus Ziffern bestehen).

@item
Sie k�nnen Standard-Kommandos des Betriebssystems benutzen, um Tabellen zu
sichern (Datensicherung), umzubenennen, zu verschieben, zu l�schen und zu kopieren.
Um zum Beispiel eine Tabelle umzubennen, benennen Sie die Dateien
@file{.MYD}, @file{.MYI} und @file{.frm} um, die der Tabelle entsprechen.
@end itemize

@item
In SQL-Statements k�nnen Sie Tabellen aus verschiedenen Datenbanken mit der
@code{db_name.tbl_name}-Syntax ansprechen. Einige SQL-Syntax stellen
dieselbe Funktionalit�t zur Verf�gung, nennen dies aber @code{User space}.
MySQL unterst�tzt keine Tablespaces wie in folgendem Beispiel:
@code{create tabelle ralph.meine_tabelle...IN mein_tablespace}.

@item
@code{LIKE} ist f�r numerische Spalten erlaubt.

@item
Die Benutzung von @code{INTO OUTFILE} und @code{STRAIGHT_JOIN} in einem
@code{SELECT}-Statement. @xref{SELECT, , @code{SELECT}}.

@item
Die Option @code{SQL_SMALL_RESULT} in einem @code{SELECT}-Statement.

@item
@code{EXPLAIN SELECT}, um eine Beschreibung zu erhalten, wie Tabellen
verkn�pft werden (Join).

@item
Die Benutzung von Index-Namen, Indexen auf ein Prefix eines Feldes, und die
Benutzung von @code{INDEX} oder @code{KEY} in einem @code{CREATE TABLE}-
Statement. @xref{CREATE TABLE, , @code{CREATE TABLE}}.

@item
Die Benutzung von @code{TEMPORARY} oder @code{IF NOT EXISTS} mit @code{CREATE TABLE}.

@item
Die Benutzung von @code{COUNT(DISTINCT list)}, wobei 'list' mehr als ein
Element ist.

@item
Die Benutzung von @code{CHANGE spalten_name}, @code{DROP spalten_name}, oder
@code{DROP INDEX}, @code{IGNORE} oder @code{RENAME} in einem @code{ALTER
TABLE}-Statement. @xref{ALTER TABLE, , @code{ALTER TABLE}}.

@item
Die Benutzung von @code{RENAME TABLE}. @xref{RENAME TABLE, , @code{RENAME TABLE}}.

@item
Die Benutzung mehrfacher @code{ADD}-, @code{ALTER}-, @code{DROP}-, oder
@code{CHANGE}-Klauseln in einem @code{ALTER TABLE} Statement.

@item
Die Benutzung von @code{DROP TABLE} mit the keywords @code{IF EXISTS}.

@item
Sie k�nnen mehrere Tabellen l�schen mit einem einzigen @code{DROP
TABLE}-Statement.

@item
Die @code{LIMIT}-Klausel des @code{DELETE}-Statements.

@item
Die @code{DELAYED}-Klausel der @code{INSERT}- und @code{REPLACE}-
Statements.

@item
Die @code{LOW_PRIORITY}-Klausel der @code{INSERT}-, @code{REPLACE}-,
@code{DELETE}- und @code{UPDATE}-Statements.

@cindex Oracle-Kompabilit�t
@cindex Kompatibilit�t, mit Oracle
@item
Die Benutzung von @code{LOAD DATA INFILE}. In vielen F�llen ist diese
Syntax kompatibel mit Oracles @code{LOAD DATA INFILE}. @xref{LOAD DATA, ,
@code{LOAD DATA}}.

@item
Die @code{ANALYZE TABLE}-, @code{CHECK TABLE}-, @code{OPTIMIZE TABLE}- und
@code{REPAIR TABLE}-Statements.

@item
Das @code{SHOW}-Statement.
@xref{SHOW, , @code{SHOW}}.

@item
Zeichenketten d�rfen sowohl durch @samp{"} als auch durch @samp{'}
eingeschlossen werden, nicht nur durch @samp{'}.

@item
Die Benutzung des Escape(@samp{\})Zeichens.

@item
Das @code{SET OPTION}-Statement. @xref{SET OPTION, , @code{SET OPTION}}.

@item
Sie m�ssen nicht alle ausgew�hlten Spalten im @code{GROUP BY}-Teil nennen.
Hierdurch ergibt sich eine bessere Performance f�r einige sehr spezifische,
aber recht gew�hnliche Anfragen.

@item
Man kann @code{ASC} und @code{DESC} bei @code{GROUP BY} spezifizieren.

@item
Um es Benutzern leichter zu machen, die von anderen SQL-Umgebungen kommen,
unterst�tzt MySQL Aliase f�r viele Funktionen. Zum Beispiel unterst�tzen
alle Zeichenketten-Funktionen sowohl die ANSI-SQL-Syntax als auch die
ODBC-Syntax.

@item
MySQL kennt die Operatoren @code{||} und @code{&&}, die logisches Oder und
logisches Und bedeuten, wie in der Programmiersprache C. In MySQL sind
@code{||} und @code{OR} Synonyme, wie auch @code{&&} und @code{AND}.
Aufgrund dieser freundlichen Syntax unterst�tzt MySQL nicht den
ANSI-SQL-@code{||}-Operator f�r Zeichenketten-Verkettung (Konkatenation);
benutzen Sie statt dessen @code{CONCAT()}. Weil @code{CONCAT()} eine
beliebige Anzahl von Argumenten entgegennimmt, ist es leicht, die Benutzung
des @code{||}-Operators zu MySQL zu konvertieren.

@item
@code{CREATE DATABASE} oder @code{DROP DATABASE}.
@xref{CREATE DATABASE, , @code{CREATE DATABASE}}.

@cindex PostgreSQL-Kompatibilit�t
@cindex Kompatibilit�t, mit PostgreSQL
@item
Der @code{%}-Operator ist ein Synonym f�r @code{MOD()}. Das hei�t @code{N
% M} ist �quivalent zu @code{MOD(N,M)}. @code{%} wird f�r C-Programmierer
und f�r Kompatibilit�t mit PostgreSQL unterst�tzt.

@item
Die @code{=}-, @code{<>}-, @code{<=}-, @code{<}-, @code{>=}-, @code{>}-,
@code{<<}-, @code{>>}-, @code{<=>}-, @code{AND}-, @code{OR}- oder
@code{LIKE}-Operatoren k�nnen in Spaltenvergleichen links von @code{FROM}
in @code{SELECT} Statements benutzt werden. Beispiel:

@example
mysql> SELECT spalte1=1 AND spalte2=2 FROM tabelle_name;
@end example

@item
Die @code{LAST_INSERT_ID()}-Funktion.
@xref{mysql_insert_id, , @code{mysql_insert_id()}}.

@item
Die @code{REGEXP}- und @code{NOT REGEXP}-Operatoren f�r erweiterte regul�re
Ausdr�cke.

@item
@code{CONCAT()} oder @code{CHAR()} mit einem Argument oder mehr als zwei
Argumenten. (In MySQL k�nnen diese Funktionen jede beliebige Anzahl von
Argumenten entgegennehmen.)

@item Die Funktionen @code{BIT_COUNT()}, @code{CASE}, @code{ELT()},
@code{FROM_DAYS()}, @code{FORMAT()}, @code{IF()}, @code{PASSWORD()},
@code{ENCRYPT()}, @code{md5()}, @code{ENCODE()}, @code{DECODE()},
@code{PERIOD_ADD()}, @code{PERIOD_DIFF()}, @code{TO_DAYS()} oder
@code{WEEKDAY()}.

@item
Die Benutzung von @code{TRIM()}, um Teile von Zeichenketten zu entfernen.
ANSI SQL unterst�tzt nur die Entfernung einzelner Zeichen.

@item
Die @code{GROUP BY}-Funktionen @code{STD()}, @code{BIT_OR()} und
@code{BIT_AND()}.

@item
Die Benutzung von @code{REPLACE} anstelle von @code{DELETE} + @code{INSERT}.
@xref{REPLACE, , @code{REPLACE}}.

@item
Das @code{FLUSH flush_option}-Statement.

@item
Die M�glichkeit, Variablen in einem Statement mit @code{:=} zu setzen:
@example
SELECT @@a:=SUM(total),@@b=COUNT(*),@@a/@@b AS avg FROM test_tabelle;
SELECT @@t1:=(@@t2:=1)+@@t3:=4,@@t1,@@t2,@@t3;
@end example

@end itemize


@node Differences from ANSI, Bugs, Extensions to ANSI, Compatibility
@c German node Unterschiede zu ANSI
@subsection MySQL-Unterschiede im Vergleich zu ANSI SQL92

Wir versuchen m�glichst, dass MySQL dem ANSI-SQL-Standard und dem
ODBC-SQL-Standard folgt, aber in einigen F�llen macht MySQL Dinge auf
andere Weise:

@itemize @bullet
@item
@code{--} ist nur dann ein Kommentar, wenn darauf Whitespace folgt.
@xref{ANSI diff comments}.

@item
Bei @code{VARCHAR}-Spalten werden Leerzeichen am Ende entfernt, wenn der
Wert gespeichert wird. @xref{Bugs}.

@item
In einigen F�llen �ndern sich @code{CHAR}-Spalten automatisch (silent) in
@code{VARCHAR}-Spalten. @xref{Silent column changes}.

@item
Zugriffsrechte f�r eine Tabelle werden nicht automatisch widerrufen, wenn
Sie eine Tabelle l�schen. Sie m�ssen explizit ein @code{REVOKE}-Statement
absetzen, um die Zugriffsrechte f�r eine Tabelle zu widerrufen.
@xref{GRANT, , @code{GRANT}}.

@item
@code{NULL AND FALSE} werden zu @code{NULL} ausgewertet und nicht zu
@code{FALSE}. Der Grund hierf�r liegt darin, dass wir meinen, dass es keine
gute Idee ist, eine Menge von Sonderkonditionen f�r diesen Fall auswerten
zu m�ssen.
@end itemize


@menu
* ANSI diff Sub-selects::       
* ANSI diff SELECT INTO TABLE::  
* ANSI diff Transactions::      
* ANSI diff Triggers::          
* ANSI diff Foreign Keys::      
* Besch�digte Fremdschl�ssel::  
* ANSI diff Views::             
* ANSI diff comments::          
@end menu

@node ANSI diff Sub-selects, ANSI diff SELECT INTO TABLE, Differences from ANSI, Differences from ANSI
@c German node Fehlende Sub-Selects
@subsubsection Sub-Selects

@cindex Sub-Selects

MySQL unterst�tzt momentan nur Sub-Selects der Form @code{INSERT
... SELECT ...} und @code{REPLACE ... SELECT ...}. In anderen
Zusammenh�ngen k�nnen Sie allerdings die Funktion @code{IN()} benutzen.

In vielen F�llen k�nnen Sie Ihre Anfragen ohne Sub-Selects schreiben:

@example
SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);
@end example

Das kann wie folgt umgeschrieben werden:

@example
SELECT tabelle1.* FROM tabelle1,tabelle2 WHERE tabelle1.id=tabelle2.id;
@end example

Die Anfragen:
@example
SELECT * FROM tabelle1 WHERE id NOT IN (SELECT id FROM tabelle2);
SELECT * FROM tabelle1 WHERE NOT EXISTS (SELECT id FROM tabelle2 where tabelle1.id=tabelle2.id);
@end example

K�nnen wie folgt umgeschrieben werden:

@example
SELECT tabelle1.* FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id where tabelle2.id IS NULL
@end example

F�r kompliziertere Unteranfragen (Subqueries) k�nnen Sie oft tempor�re
Tabelle anlegen, die die Unteranfrage enthalten. In einigen F�llen wird
diese Option allerdings nicht funktionieren. Am h�ufigsten treten diese
F�lle mit @code{DELETE}-Statements auf, wof�r Standard-SQL keine
Verkn�pfungen (Joins) unterst�tzt. F�r solche Situationen sind zwei
Optionen verf�gbar, solange MySQL noch keine Unteranfragen unterst�tzt.

Die erste Option besteht darin, eine prozedurale Programmiersprache (wie
PHP oder Perl) zu benutzen, um eine @code{SELECT}-Anfrage zu erhalten, die
die Prim�rschl�ssel enth�lt, die ben�tigt werden, um die entsprechenden
Datens�tze zu l�schen, und dann diese Werte zu benutzen, um das
@code{DELETE}-Statement zu formulieren (@code{DELETE FROM ... WHERE ... IN
(key1, key2, ...)}).

Die zweite Option besteht darin, interaktives SQL zu benutzen, um
automatisch eine Reihe von @code{DELETE}-Statements zu formulieren, indem
die MySQL-Erweiterung @code{CONCAT()} benutzt wird (anstelle des
Standard-Operators @code{||}).
Beispiel:

@example
SELECT CONCAT('DELETE FROM tabelle1 WHERE pkid = ', tabelle1.pkid, ';')
  FROM tabelle1, tabelle2
 WHERE tabelle1.spalte1 = tabelle2.spalte2;
@end example

Sie k�nnen diese Anfrage in eine Skriptdatei schreiben und deren Eingabe an
den Kommandozeilen-Interpreter @code{mysql} leiten und von dort die Ausgabe
zur�ck an eine zweite Instanz des Interpreters:

@example
prompt> mysql --skip-column-names meine_db < mein_skript.sql | mysql meine_db
@end example

MySQL 4.0 unterst�tzt das L�schen aus mehreren Tabellen (multi-table
deletes), was benutzt werden kann, um effizient Zeilen zu l�schen,
basierend auf den Informationen aus einer Tabelle oder sogar aus mehreren
Tabellen zur gleichen Zeit.

@node ANSI diff SELECT INTO TABLE, ANSI diff Transactions, ANSI diff Sub-selects, Differences from ANSI
@c German node Fehlendes SELECT INTO TABLE
@subsubsection @code{SELECT INTO TABLE}

@findex SELECT INTO TABLE

MySQL unterst�tzt noch nicht die Oracle-SQL-Erweiterung @code{SELECT ...
INTO TABLE ...}.  MySQL unterst�tzt statt dessen die ANSI-SQL-Syntax
@code{INSERT INTO ... SELECT ...}, die im Prinzip dasselbe ist.
@xref{INSERT SELECT}.

@example
INSERT INTO tabelle_temp2 (fldID) SELECT tabelle_temp1.fldOrder_ID FROM tabelle_temp1 WHERE
tabelle_temp1.fldOrder_ID > 100;
@end example

Alternativ k�nnen Sie @code{SELECT INTO OUTFILE...} oder @code{CREATE TABLE
... SELECT} benutzen, um Ihre Probleme zu l�sen.


@node ANSI diff Transactions, ANSI diff Triggers, ANSI diff SELECT INTO TABLE, Differences from ANSI
@c German node Fehlende Transaktionen
@subsubsection Transaktionen

@cindex Transaktionen, Support

Weil MySQL heutzutage Transaktionen unterst�tzt, gelten die folgenden
Er�rterungen nur, wenn Sie nur Tabellentypen benutzen, die nicht
transaktionssicher sind. @xref{COMMIT}.

Oft wird von neugierigen oder kritischen Leuten gefragt: ``Warum ist MySQL
keine transaktionale Datenbank?'' oder ``Warum unterst�tzt MySQL keine
Transaktionen?''

MySQL hat sich bewusst entschieden, andere Paradigmen f�r die
Datenintegrit�t zu unterst�tzen: ``atomische Operationen.'' Es entspricht
unserer Denkweise und unserer Erfahrung, dass atomische Operationen gleiche
oder bessere Integrit�t bei wesentlich besserer Performance gew�hrleisten.
Nichtsdestotrotz sch�tzen und verstehen wir das transaktionale
Datenbank-Paradigma und planen, im Verlauf der n�chsten Releases
transaktionssichere Tabellen einzuf�hren, auf der Basis der
Transaktionssicherheit pro einzelner Tabelle. Wir werden unseren Benutzern
die Entscheidung �berlassen, ob Sie in ihren Applikationen den
Geschwindigkeitsvorteil atomischer Operationen ben�tigen oder die
transaktionalen Features.

Wie benutzt man die Features von MySQL, um rigorose Integrit�t
beizubehalten, und wie sind diese Features im Vergleich mit dem
transaktionalen Paradigma zu bewerten?

Zun�chst ist es nach dem transaktionalen Paradigma bequemer, mit
Transaktionen zu arbeiten, wenn Ihre Applikationen auf eine Weise
geschrieben sind, dass sie in kritischen Situationen ``rollback'' anstelle
von ``commit'' aufrufen. Dar�ber hinaus stellen Transaktionen sicher, dass
unbeendete Updates oder zerst�rende Aktivit�ten nicht an die Datenbank
abgesetzt werden; der Server hat die Gelegenheit, ein automatisches
Rollback durchzuf�hren, wodurch Ihre Datenbank gerettet wird.

In fast allen F�llen erlaubt Ihnen MySQL, potentiellen Problemen
vorzubauen, indem einfache �berpr�fungen eingebaut und einfache Skripte
laufen gelassen werden, die die Datenbanken auf Inkonsistenzen pr�fen und
automatisch reparieren oder Warnmeldungen ausgeben, wenn so etwas passiert.
Beachten Sie auch, dass allein durch die Benutzung der MySQL-Logdatei oder
durch das Hinzuf�gen einer speziellen Logdatei Tabellen perfekt repariert
werden k�nnen, ohne dass ein Verlust an Datenintegrit�t eintritt.

Dar�ber hinaus k�nnen fatale transaktionale Updates so umgeschrieben
werden, dass sie atomisch sind. In der Tat gehen wir so weit zu sagen, dass
alle Integrit�tsprobleme, die Transaktionen l�sen, mit @code{LOCK TABLES}
oder atomischen Update durchgef�hrt werden k�nnen, was sicherstellt, dass
Sie nie einen automatischen Abbruch von der Datenbank bekommen, was ein
gew�hnliches Problem transaktionaler Datenbanken darstellt.

Nicht einmal Transaktionen k�nnen jeden Verlust verhindern, wenn der Server
abst�rzt. In solchen F�llen k�nnen sogar transaktionale Systeme Daten
verlieren. Der Unterschied zwischen unterschiedlichen Systemen besteht
einzig darin, wie kurz die Zeitverz�gerung ist, in der Daten verloren gehen
k�nnten. Kein System ist 100%-ig sicher, sondern lediglich ``sicher
genug''. Selbst von Oracle, ansonsten als das sicherste aller
transaktionalen Datenbanken ber�hmt, wird berichtet, dass es manchmal in
solchen Situationen Daten verliert.

Um mit MySQL auf der sicheren Seite zu sein, brauchen Sie lediglich
Datensicherungen und angeschaltetes Update-Logging. Damit k�nnen Sie in
jeder denkbaren Situation genau wie mit jeder beliebigen transaktionalen
Datenbank Daten wiederherstellen. Nat�rlich ist es immer eine gute Idee,
Datensicherungen zu haben, unabh�ngig von der verwendeten Datenbank.


Das transaktionale Paradigma hat seine Vor- und Nachteile. Viele
Benutzer und Applikationsentwickler verlassen sich auf die Einfachheit, mit
der sie um Probleme herum Code schreiben k�nnen, dort wo anscheinend ein
Abbruch erfolgt ist, oder wo es notwendig ist, haben sie wom�glich ein
bisschen mehr Arbeit mit MySQL, weil sie anders denken oder mehr schreiben
m�ssen. Wenn Ihnen atomische Operationen neu sind oder Sie vertrauter mit
Transaktionen sind (oder Sie sich damit besser f�hlen), kommen Sie nicht
gleich zur Schlussfolgerung, dass sich MySQL nicht mit diesen �berlegungen
besch�ftigt hat. Zuverl�ssigkeit und Integrit�t stehen f�r uns absolut im
Vordergrund. Aktuelle Sch�tzungen gehen davon aus, dass zur Zeit mehr als
eine Million @code{mysqld}-Server laufen, von denen viele in
Produktionsumgebungen eingesetzt werden. Wir h�ren sehr, sehr selten von
Benutzern, die irgendwelche Daten verloren haben, und in fast allen F�llen
sind Benutzerfehler im Spiel. Das ist unserer Meinung nach der beste Beweis
f�r die Stabilit�t und Zuverl�ssigkeit von MySQL.

Im �brigen lassen die aktuellen Features von MySQL Zuverl�ssigkeit und
Integrit�t auf Transaktionsebene oder besser zu, wenn in bestimmten
Situationen Integrit�t von h�chster Wichtigkeit ist. Wenn Sie Tabellen mit
@code{LOCK TABLES} sperren, werden alle Updates angehalten, bis jegliche
Integrit�tspr�fungen durchgef�hrt sind. Wenn Sie nur eine Lesesperre (Read
Lock) machen (im Gegensatz zu einer Schreibsperre - Write Lock), werden
Lese- und Einf�geoperationen noch zugelassen. Die neu eingef�gten
Datens�tze k�nnen von nicht Clients gesehen werden, die eine
@code{READ}-Sperre haben, bis sie ihre Lesesperre aufheben. Mit
@code{INSERT DELAYED} k�nnen Sie Einf�geoperationen in eine lokale
Warteschlange (Local Queue) stellen, solange, bis die Sperren aufgehoben
sind, ohne dass der Client warten muss, bis die Einf�geoperationen
abgeschlossen sind. @xref{INSERT DELAYED}.

``Atomisch'', so wie wir es meinen, ist nichts Magisches. Es bedeutet nur,
dass Sie sicher sein k�nnen, dass kein anderer Benutzer mit irgendeinem
laufenden Update in Konflikt kommen kann, und dass es nie ein automatisches
Rollback geben kann (was bei transaktionsbasierenden Systemen vorkommen
kann, wenn Sie nicht sehr vorsichtig sind). MySQL garantiert auch, dass es
keine schmutzigen Lesezugriffe (Dirty Reads) gibt. Sie finden einige
Beispiele, wie man atomische Updates schreibt, im Abschnitt �ber Commits
und Rollbacks.
@c German FIX This section no longer exists
@c @xref{Commit-Rollback}.

Wir haben reichlich �ber Integrit�t und Performance nachgedacht und
glauben, dass unser atomisches Paradigma sowohl Zuverl�ssigkeit als auch
extrem hohe Performance gew�hrleistet, und zwar drei- bis f�nfmal
schneller, als es die schnellste und optimal eingestellte transaktionale
Datenbank schafft. Wir haben Transaktionen nicht deshalb heraus gelassen,
weil sie schwer zu machen sind. Der Hauptgrund f�r die Entscheidung f�r
atomische Operationen gegen Transaktionen liegt darin, dass wir dadurch
viele Geschwindigkeitsoptimierungen machen konnten, die auf andere Art
nicht m�glich gewesen w�ren.

Viele unserer Benutzer, f�r die Geschwindigkeit das Wichtigste ist, haben
keinerlei Bedenken hinsichtlich Transaktionen. F�r sie sind Transaktionen
kein Thema. Diejenigen Benutzer, die Sorgen mit Transaktionen haben oder
sich dar�ber wundern, dass MySQL diese nicht unterst�tzt, gibt es eine
``MySQL-Art'', die wir weiter oben beschrieben haben. Denjenigen, denen
Sicherheit wichtiger als Geschwindigkeit ist, empfehlen wir die Benutzung
von @code{BDB}- oder @code{InnoDB}-Tabellen f�r alle kritischen Daten.
@xref{Table types}.

Ein letzter Hinweis: Wir arbeiten zur Zeit an einem sicheren
Replikationsschema, vom dem wir glauben, dass es besser als jedes
kommerzielle Replikationssystem ist, das wir kennen. Dieses System wird mit
dem atomischen, nicht-transaktionalen Paradigma mit h�chster
Zuverl�ssigkeit laufen. Bleiben Sie dran!


@node ANSI diff Triggers, ANSI diff Foreign Keys, ANSI diff Transactions, Differences from ANSI
@c German node Fehlende Trigger
@subsubsection Gespeicherte Prozeduren und Trigger

@cindex Fehlende Prozeduren und Trigger, Definition
@cindex Prozeduren, gespeicherte
@cindex Trigger, gespeicherte

Eine gespeicherte Prozedur ist ein Satz von SQL-Kommandos, die kompiliert
und auf dem Server gespeichert werden k�nnen. Wenn dies einmal geschehen
ist, m�ssen Clients nicht mehr die gesamte Anfrage absetzen, sondern k�nnen
sich auf die gespeicherte Prozedur beziehen. Hiermit wird bessere
Performance erreicht, den die Anfrage muss nur einmal geparst werden, und
es muss weniger Information zwischen Client und Server ausgetauscht werden.
Man kann sogar die konzeptionelle Ebene steigern, indem man Bibliotheken
von Funktionen auf dem Server bereit h�lt.

Ein Trigger ist eine gespeicherte Prozedur, die aufgerufen wird, wenn ein
bestimmtes Ereignis eintritt. Beispielsweise kann man eine gespeicherte
Prozedur installieren, die jedes Mal ausgef�hrt wird, wenn ein Datensatz
aus einer Transaktionstabelle gel�scht wird, und die automatisch den dazu
geh�rigen Kunden aus einer Kundentabelle l�scht, wenn alle seine
Transaktionen gel�scht wurden.

F�r ein sp�teres Release ist geplant, dass MySQL gespeicherte Prozeduren
handhaben kann, aber ohne Trigger. Trigger verlangsamen �blicherweise
alles, sogar Anfragen, f�r die sie nicht ben�tigt werden.

Um festzustellen, ab wann MySQL gespeicherte Prozeduren bekommen wird, siehe 
auch @ref{TODO}.


@node ANSI diff Foreign Keys, Besch�digte Fremdschl�ssel, ANSI diff Triggers, Differences from ANSI
@c German node Fehlende Fremdschl�ssel
@subsubsection Fremdschl�ssel

@cindex Fremdschl�ssel
@cindex Schl�ssel, Fremdschl�ssel

Beachten Sie, dass Fremdschl�ssel in SQL nicht dazu benutzt werden, um
Tabellen zu verkn�pfen, sondern haupts�chlich, um die referentielle
Integrit�t zu �berpr�fen (Fremdschl�ssel-Restriktionen). Wenn Sie durch ein
@code{SELECT}-Statement Ergebnisse aus mehreren Tabellen erhalten wollen,
tun Sie dies, indem Sie Tabellen verkn�pfen (Join):

@example
SELECT * von tabelle1,tabelle2 where tabelle1.id = tabelle2.id;
@end example

@xref{JOIN, , @code{JOIN}}. @xref{example-Foreign keys}.

Die @code{FOREIGN KEY}-Syntax in MySQL existiert nur aus
Kompatibilit�tsgr�nden mit den @code{CREATE TABLE}-Kommandos anderer
Hersteller; sie tut nichts. Die @code{FOREIGN KEY}-Syntax ohne @code{ON
DELETE ...} wird haupts�chlich f�r Dokumentationszwecke benutzt. Einige
ODBC-Applikationen benutzen dies vielleicht, um automatische
@code{WHERE}-Klauseln zu erzeugen, aber das l��t sich �blicherweise leicht
�berschreiben. @code{FOREIGN KEY} wird manchmal als Restriktionspr�fung
benutzt, aber eine solche �berpr�fung ist in der Praxis nicht notwendig,
wenn Zeilen in Tabellen in der richtigen Reihenfolge eingef�gt werden.
MySQL unterst�tzt diese Klauseln nur, weil manche Applikationen verlangen,
dass sie existieren (egal ob sie funktionieren oder nicht).

In MySQL k�nnen Sie das Problem, dass @code{ON DELETE...} nicht
implementiert ist, dadurch umgehen, dass Sie das entsprechende
@code{DELETE}-Statement einer Applikation hinzuf�gen, wenn Sie Datens�tze
aus einer Tabelle l�schen, die Fremdschl�ssel hat. In der Praxis ist das
genauso schnell (in einigen F�llen schneller) und wesentlich portabler, als
wenn Sie Fremdschl�ssel benutzen w�rden.

In naher Zukunft werden wir die @code{FOREIGN KEY}-Implementation
erweitern, so dass zumindest die Information in der Datei, die die Tabelle
spezifiziert, gespeichert wird und somit durch @code{mysqldump} und ODBC
abgefragt werden kann. Zu einem sp�teren Zeitpunkt werden wir
Fremdschl�ssel-Restriktionen f�r Applikationen implementieren, die nicht
leicht durch entsprechendes Programmieren umgangen werden k�nnen.



@node Besch�digte Fremdschl�ssel, ANSI diff Views, ANSI diff Foreign Keys, Differences from ANSI
@c German node <no English equivalent>
@subsubsection Warum wir Fremdschl�ssel nicht implementiert haben

@cindex Fremdschl�ssel, warum sie nicht implementiert sind

Viele Leute, die Datenbanken unterrichten und programmieren, sind der
festen Meinung, dass referentielle Integrit�t durch den Datenbank-Server
erzwungen werden sollte. In der Tat ist dieser Ansatz in vielen F�llen sehr
hilfreich. In vielen Gespr�chen mit Datenbankbenutzern haben wir jedoch
festgestellt, dass Fremdschl�ssel oft missbraucht werden, was schwer-
wiegende Probleme verursachen kann. Selbst wenn sie in korrekter Weise
benutzt werden, sind sie keine magische L�sung f�r das Problem
referentieller Integrit�t, obwohl sie die Dinge in einigen F�llen einfacher
gestalten.

Wegen der obigen Beobachtungen haben wir der Implementation von
Fremdschl�sseln keine hohe Priorit�t zugewiesen. Unsere Benutzerbasis
bestand bislang zumeist aus Entwicklern, denen es nichts ausmachte,
referentielle Integrit�t im Code der Applikation zu erzwingen, und die dies
sogar bevorzugten, weil es ihnen mehr Kontrolle gab.

In den letzten Jahren hat sich unsere Benutzerbasis jedoch um einiges
ausgeweitet. Mittlerweile haben wir viele Benutzer, die es sch�tzen w�rden,
wenn MySQL erzwungene referentielle Integrit�t implementiert h�tte. Aus
diesem Grund werden wir Fremdschl�ssel in naher Zukunft implementieren.
Allerdings k�nnen wir zur Zeit noch kein definitives Auslieferungsdatum
nennen.

Einige Vorteile der Erzwingung von Fremdschl�sseln:

@itemize @bullet
@item
Einen sauberen Entwurf der Beziehungen vorausgesetzt machen es
Fremdschl�ssel-Restriktionen schwieriger f�r einen Programmierer,
Inkonsistenzen in eine Datenbank einzuf�hren.

@item
Wenn kaskadierende Updates und Deletes benutzt werden k�nnen, kann dies den
Client-Code vereinfachen.

@item
Sauber entworfene Fremdschl�ssel-Regeln sind hilfreich, Beziehungen
zwischen Tabellen zu dokumentieren.
@end itemize

Nachteile:

@itemize @bullet
@item
MySQL unterst�tzt noch keine erzwungene referentielle Integrit�t. Wenn Ihre
Applikation also davon abh�ngt, k�nnen Sie sie solange nicht mit MySQL
benutzen, bis wir dieses Feature implementieren.

@item
Fehler, die beim Entwurf von Schl�sselbeziehungen leicht zu machen sind,
k�nnen schwer wiegende Probleme verursachen, zum Beispiel Zirkelbez�ge oder
eine falsche Kombination kaskadierender Deletes.

@item
Eine sauber geschriebene Applikation wird intern sicherstellen, dass sie
referentielle Integrit�ts-Restriktionen nicht verletzt, bevor sie mit einer
Anfrage fortf�hrt. Deshalb werden zus�tzliche �berpr�fungen auf
Datenbankebene solche Applikationen nur verlangsamen.

@item
Es ist nichts Ungew�hnliches, dass ein Datenbankadministrator eine so
komplexe Topologie von Beziehungen einf�hrt, dass es sehr schwierig, wenn
nicht gar unm�glich wird, einzelne Tabellen zu sichern oder
wiederherzustellen.
@end itemize


@node ANSI diff Views, ANSI diff comments, Besch�digte Fremdschl�ssel, Differences from ANSI
@c German node Fehlende Sichten
@subsubsection Sichten (Views)

@cindex Sichten (Views)

MySQL unterst�tzt noch keine Sichten, aber wir planen, diese in Version 4.1
zu implementieren.

Sichten sind �u�erst n�tzlich, um Benutzern Zugang zu einem Satz von
Beziehungen wie zu einer einzigen Tabelle zu gew�hren (Lesezugriff). Viele
SQL-Datenbanken lassen es nicht zu, dass irgend welche Zeilen in einer
Sicht aktualisiert werden (Update). Statt dessen m�ssen die einzelnen
Tabellen aktualisiert werden.

Weil MySQL meist in Applikationen und in Web-Systemen eingesetzt werden, wo
der Applikationsprogrammierer volle Kontrolle �ber die Datenbankbenutzung
hat, sehen die meisten unserer Benutzer Sichten als nicht sehr wichtig an.
(Zumindest war niemand interessiert genug, um die Implementation von
Sichten zu finanzieren.)

In MySQL werden Sichten nicht ben�tigt, um den Zugriff auf Spalten zu
beschr�nken, weil MySQL ein sehr ausgefeiltes System der
Zugriffsberechtigungen hat. @xref{Privilege system}.


@node ANSI diff comments,  , ANSI diff Views, Differences from ANSI
@c German node Fehlende Kommentare
@subsubsection @samp{--} als Beginn eines Kommentars

@cindex Kommentare, Beginn
@cindex Beginn, Kommentar

Einige andere SQL-Datenbanken benutzen @samp{--}, um Kommentare zu
beginnen. MySQL benutzt @samp{#} als Anfangszeichen, wenn auch das
@code{mysql}-Kommandozeilen-Werkzeug alle Zeilen entfernt, die mit @samp{--}
anfangen. Sie k�nnen in MySQL auch Kommentare im C-Stil verwenden @code{/*
Das ist ein Kommentar */}. @xref{Comments}.

MySQL ab Version 3.23.3 unterst�tzt Kommentare, die mit @samp{--} beginnen,
allerdings nur, wenn der Kommentarbeginn von einem Leerzeichen gefolgt
wird. Der Grund liegt darin, dass dieser degenerierte Kommentar-Stil eine
Menge Probleme mit automatisch generierten SQL-Anfragen verursacht, die
�hnliches wie den folgenden Code benutzen, wo automatisch der Wert einer
Zahlung f�r @code{!zahlung!} eingef�gt wird:

@example
UPDATE tabelle_name SET kredit=kredit-!zahlung!
@end example

Was, glauben Sie, passiert, wenn der Wert von @code{zahlung} negativ wird?

Weil @code{1--1} in SQL zul�ssig ist, sind wir der Meinung, dass es
furchtbar ist, dass @samp{--} den Anfang eines Kommentars bedeutet.

In MySQL ab Version 3.23 k�nnen Sie allerdings folgendes benutzen:
@code{1-- Das ist ein Kommentar}

Die folgenden Er�rterungen treffen nur zu, wenn Sie eine MySQL-Version vor
3.23 laufen lassen:

Wenn Sie ein SQL-Programm in einer Textdatei haben, das @samp{--}-Kommentare
enth�lt, sollten Sie folgendes benutzen:

@example
shell> replace " --" " #" < text-datei-mit-merkwuerigen-kommentaren.sql \
         | mysql datenbank
@end example

anstelle des �blichen:

@example
shell> mysql datenbank < text-datei-mit-merkwuerdigen-kommentaren.sql
@end example

Sie k�nnen auch die Kommandodatei ``direkt'' editieren, um die
@samp{--}-Kommentare zu @samp{#}-Kommentaren zu machen:

@example
shell> replace " --" " #" -- text-datei-mit-merkwuerdigen-kommentaren.sql
@end example

Machen Sie die �nderungen mit folgendem Befehl r�ckg�ngig:

@example
shell> replace " #" " --" -- text-datei-mit-merkwuerdigen-kommentaren.sql
@end example



@node Bugs,  , Differences from ANSI, Compatibility
@c German node Bugs
@subsection Bekannte Fehler und Design-Unzul�nglichkeiten in MySQL

@cindex Bugs, bekannte
@cindex Fehler, bekannte
@cindex Design, Probleme
@cindex Bekannte Fehler

Die folgenden Probleme sind bekannt. Ihre Behebung hat eine sehr hohe
Priorit�t:

@itemize @bullet
@item
@code{ANALYZE TABLE} kann eine BDB-Tabelle in manchen F�llen unbenutzbar
machen, bis @code{mysqld} neu gestartet wird. Wenn so etwas passiert,
stehen Fehlermeldungen wie die folgende in der MySQL-Fehler-Datei (Error
File):

@example
001207 22:07:56  bdb:  log_flush: LSN past current end-of-log
@end example

@item
F�hren Sie mit einer @code{BDB}-Tabelle nicht @code{ALTER TABLE} aus, wenn
Sie mit dieser noch nicht abgeschlossene Mehrfach-Statement-Transaktionen
durchf�hren. (Die Transaktion wird wahrscheinlich ignoriert.)

@item
@code{ANALYZE TABLE}, @code{OPTIMIZE TABLE} und @code{REPAIR TABLE} k�nnen
Probleme bei Tabellen verursachen, f�r die @code{INSERT DELAYED} benutzt
wird.

@item
Wenn Sie @code{LOCK TABLE ..} und @code{FLUSH TABLES ..} benutzen, k�nnen
Sie nicht sicher sein, dass bei der fraglichen Tabelle keine halb
abgeschlossenen Transaktionen im Gange sind.

@item
BDB-Tabellen lassen sich etwas langsam �ffnen. Wenn Sie viele BDB-Tabellen
in einer Datenbank haben, kann es sehr lange dauern, bis Sie den
@code{mysql}-Client f�r diese Datenbank benutzen k�nnen, wenn Sie die
@code{-A}-Option oder @code{rehash} benutzen. Das macht sich speziell dann
bemerkbar, wenn Sie einen gro�e Tabellen-Cache benutzen.

@item
Das momentane Replikationsprotokoll kann nicht mit @code{LOAD DATA INFILE}
und mit Zeilenbegrenzungszeichen (line terminator characters) umgehen, die
mehr als 1 Zeichen enthalten.
@end itemize

Folgende Probleme sind bekannt und werden zu gegebener Zeit behoben:
@itemize @bullet
@item
Momentan funktioniert @code{MATCH} nur bei @code{SELECT}-Statements.

@item
Wenn Sie @code{SET CHARACTER SET} benutzen, k�nnen Sie keine
landesspezifischen (nationalen) Zeichen f�r Datenbank-, Tabellen- und
Spaltennamen verwenden (also z. B. kein �, �, �).

@item
@code{DELETE FROM merge_table} ohne @code{WHERE} l�scht nur die Zuordnung
(das Mapping) f�r die Tabelle, nicht alles in der zugeordneten (gemappten)
Tabelle.

@item
Sie k�nnen den Server nicht in ein anderes Verzeichnis bauen, wenn Sie
MIT-Pthreads verwenden. Weil dies �nderungen an MIT-Pthreads bedingen
w�rde, werden wir dieses Problem wahrscheinlich nicht beheben.

@item
@code{BLOB}-Werte k�nnen nicht ``zuverl�ssig'' in @code{GROUP BY}-,
@code{ORDER BY} oder @code{DISTINCT}-Klauseln benutzt werden. In diesen
F�llen werden bei Vergleichen nur die ersten @code{max_sort_length}
Bytes (Vorgabewert 1024) von @code{BLOB}s benutzt. Die Voreinstellung kann
mit der @code{-O max_sort_length}-Option f�r @code{mysqld} ge�ndert werden.
In den meisten F�llen k�nnen Sie als Workaround eine Teilzeichenkette
(Substring) verwenden: @code{SELECT DISTINCT LEFT(blob,2048) FROM
tabelle}.

@item
Berechnungen werden mit @code{BIGINT} oder @code{DOUBLE} durchgef�hrt
(beide sind normalerweise 64 Bits lang). Es h�ngt von der verwendeten
Funktion ab, welche Genauigkeit man erh�lt. Als allgemeine Regel gilt, dass
Bit-Funktionen mit @code{BIGINT}-Genauigkeit, @code{IF} und @code{ELT()}
mit @code{BIGINT}- oder @code{DOUBLE}-Genauigkeit und der Rest mit
@code{DOUBLE}-Genauigkeit durchgef�hrt werden. Man sollte vermeiden,
vorzeichenlose Werte, die gr��er als 63 Bits sind (9223372036854775807),
zu verwenden, ausser f�r Bit-Felder!
MySQL 4.0 bietet eine bessere @code{BIGINT}-Handhabung als MySQL 3.23.

@item
Bei allen Zeichenketten-Spalten ausser bei @code{BLOB}- und
@code{TEXT}-Spalten werden Leerzeichen am Ende automatisch entfernt, wenn
sie abgerufen werden. Bei @code{CHAR}-Typen ist das okay und kann gem��
ANSI-SQL92 als ein Feature betrachtet werden. Der Bug besteht darin, dass
in MySQL auch @code{VARCHAR}-Spalten auf dieselbe Art behandelt werden.

@item
Pro Tabelle k�nnen h�chstens 255 @code{ENUM}- und @code{SET}-Spalten
verwendet werden.

@item
@code{safe_mysqld} leitet alle Nachrichten von @code{mysqld} in die
@code{mysqld}-Logdatei um. Ein Problem ergibt sich, wenn Sie
@code{mysqladmin refresh} benutzen, um die Logdatei zu schlie�en und
wieder zu �ffnen. In diesem Fall werden @code{stdout} und @code{stderr}
immer noch in die alte Logdatei geleitet.
Wenn Sie @code{--log} umfangreich benutzen, sollten Sie @code{safe_mysqld}
editieren, um in @file{'hostname'.err} anstelle von @file{'hostname'.log}
zu loggen, damit Sie den Speicherplatz f�r das alte Log leicht neu belegen
k�nnen, indem Sie das alte Log l�schen und @code{mysqladmin refresh}
ausf�hren.

@item
Im @code{UPDATE}-Statement, werden Spalten von links nach rechts
aktualisiert (Update). Wenn Sie sich auf eine aktualisierte Spalte
beziehen, erhalten Sie den aktualisierten Werte anstelle des urspr�nglichen
Werts. Beispiel:

@example
mysql> UPDATE tabelle SET KEY=KEY+1,KEY=KEY+1;
@end example

Dieses Statement aktualisiert @code{KEY} mit @code{2} anstelle von
@code{1}.

@item
Sie k�nnen tempor�re Tabellen nicht �fter als einmal innerhalb derselbe
Anfrage benutzen. Das Folgende zum Beispiel funktioniert nicht:

@example
select * from temporaere_tabelle, temporaere_tabelle as t2;
@end example

@item
@code{RENAME} funktioniert nicht bei @code{TEMPORARY}-Tabellen.

@item
Unter Umst�nden behandelt der Optimierer (Optimizer) @code{DISTINCT}
unterschiedlich, je nachdem, ob Sie 'versteckte' Spalten in einem Join
benutzen oder nicht. In einem Join werden versteckte Spalten als Teil des 
Ergebnisses gez�hlt (selbst wenn sie nicht angezeigt werden), w�hrend 
versteckte Spalten in normalen Anfragen nicht an einem @code{DISTINCT}-Vergleich 
teilnehmen. Zuk�nftig werden wir dieses Verhalten wahrscheinlich �ndern, so 
dass versteckte Spalten nie verglichen werden, wenn @code{DISTINCT} ausgef�hrt 
wird.

Hierf�r ein Beispiel:

@example
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id
DESC;
@end example

und

@example
SELECT DISTINCT band_downloads.mp3id, FROM band_downloads,band_mp3
WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id
ORDER BY band_downloads.id DESC;
@end example

Im zweiten Fall bekommen Sie in MySQL 3.23.x m�glicherweise zwei identische
Zeilen in der Ergebnismenge (weil die versteckten 'id'-Spalten
unterschiedlich sein k�nnen).

Beachten Sie, dass dies nur f�r Anfragen zutrifft, bei denen die ORDER
BY-Spalten nicht im Ergebnis enthalten sind. ANSI-SQL erlaubt dies nicht

@item
Weil MySQL es zul��t, mit Tabellentypen zu arbeiten, die keine
Transaktionen unterst�tzen (und folglich Daten nicht per @code{rollback} in
den vorherigen Zustand bringen k�nnen), verhalten sich einige Dinge in
MySQL etwas anderes als in anderen SQL-Servern. Das kann manchmal etwas
ung�nstig sein, weil Spaltenwerte in der Applikation �berpr�ft werden
m�ssen. Auf der anderen Seite erhalten Sie dadurch eine nette
Geschwindigkeitssteigerung, weil es MySQL gestattet, einige Optimierungen
vorzunehmen, die ansonsten sehr schwer durchzuf�hren sein w�rden.

Wenn Sie eine Spalte auf einen nicht zul�ssigen Wert setzen, speichert
MySQL, statt ein Rollback durchzuf�hren, den @code{besten m�glichen Wert}
in der Spalte:

@itemize @minus
@item
Wenn Sie versuchen, in einer numerischen Spalte einen Wert ausserhalb des
Wertebereichs zu speichern, speichert MySQL statt dessen den kleinsten oder
gr��ten m�glichen Wert.

@item
Wenn Sie versuchen, eine Zeichenkette, die nicht mit einer Zahl beginnt, in
einer numerischen Spalte zu speichern, speichert MySQL 0.

@item
Wenn Sie versuchen, @code{NULL} in einer Spalte zu speichern, die keine
@code{NULL}-Werte zul��t, speichert MySQL 0 oder @code{''} (leere
Zeichenkette). (Man kann dieses Verhalten jedoch mit der
-DDONT_USE_DEFAULT_FIELDS-Kompilierungs-Option �ndern.)

@item
MySQL l��t zu, dass einige falsche Datumswerte in @code{DATE}- und
@code{DATETIME}-Spalten gespeichert werden (wie 2000-02-31 oder
2000-02-00). Wenn das Datum v�llig falsch ist, speichert MySQL den
speziellen Datumswert 0000-00-00 in der Spalte.

@item
Wenn Sie @code{enum} auf einen nicht unterst�tzten Wert setzen, wird es auf
den Fehlerwert 'leere Zeichenkette' oder (bei numerischen Werten) auf 0
gesetzt.
@end itemize

@item
Wenn Sie @code{PROCEDURE} auf eine Anfrage ausf�hren, die eine leere
Ergebnismenge liefert, kann es in einigen F�llen vorkommen, dass
@code{PROCEDURE} die Spalten nicht umwandelt.

@item
Wenn Sie eine Tabelle vom Typ @code{MERGE} anlegen, wird nicht �berpr�ft,
ob die zugrunde liegenden Tabellen von einem kompatiblen Typ sind.

@item
MySQL kann bislang nicht mit @code{NaN}-, @code{-Inf}- und
@code{Inf}-Werten in Doubles umgehen. Wenn Sie diese benutzen, gibt es
Probleme, wenn Daten importiert oder exportiert werden. Als Zwischenl�sung
sollten Sie @code{NaN} in @code{NULL} umwandeln (falls m�glich) und
@code{-Inf} und @code{Inf} in den kleinsten bzw. gr��ten m�glichen Wert.

@item
Negative Zahlen in der @code{LIMIT}-Klausel werden als gro�e positive
Zahlen behandelt.

@item
Wenn Sie @code{ALTER TABLE} benutzen, um einen @code{UNIQUE}-Index zu einer
Tabelle hinzuzuf�gen, die in einer @code{MERGE}-Tabelle benutzt wird, und
dann @code{ALTER TABLE} benutzen, um der @code{MERGE}-Tabelle einen
normalen Index hinzuzuf�gen, weicht die Reihenfolge der Schl�ssel f�r die
Tabellen ab. Das liegt daran, dass @code{ALTER TABLE}
@code{UNIQUE}-Schl�ssel vor normalen Schl�sseln einf�gt, um doppelte
Schl�ssel so fr�h wie m�glich erkennen zu k�nnen.
@end itemize

Folgende bekannte Bugs gibt es in fr�heren Versionen von MySQL:

@itemize @bullet
@item
Man kann einen h�ngenden Thread erhalten, wenn man @code{DROP TABLE} auf
eine Tabelle ausf�hrt, die zu vielen Tabellen geh�rt, die mit @code{LOCK
TABLES} gesperrt sind.

@item
In folgenden F�llen k�nnen Sie einen Core Dump erhalten:

@itemize @minus
@item
Die Routine f�r verz�gertes Einf�gen (Delayed Insert Handler) hat noch nie
ausgef�hrte Einf�geoperationen (Pending Inserts) auf eine Tabelle.

@item
@code{LOCK tabelle} mit @code{WRITE}

@item
@code{FLUSH TABLES}
@end itemize

@item
Vor MySQL-Version 3.23.2 kann ein @code{UPDATE} fehlschlagen, dass einen
Schl�ssel mit einer @code{WHERE}-Klausel auf denselben Schl�ssel
aktualisiert, weil der Schl�ssel benutzt wurde, um nach Datens�tzen zu
suchen, und dieselbe Zeile mehrfach gefunden wurde:

@example
UPDATE tabelle SET KEY=KEY+1 WHERE KEY > 100;
@end example

Ein Workaround besteht in der Benutzung von:

@example
mysql> UPDATE tabelle SET KEY=KEY+1 WHERE KEY+0 > 100;
@end example

Das funktioniert, weil MySQL auf Ausdr�cke (Expressions) in der
@code{WHERE}-Klausel keine Indizes benutzt.

@item
Vor MySQL-Version 3.23 wurden alle numerischen Typen als Festkomma-Felder
behandelt. Das bedeutet, dass Sie festlegen m�ssen, wie viele
Dezimalstellen ein Flie�komma-Feld haben soll. Alle Werte wurden mit der
korrekten Anzahl von Dezimalstellen zur�ckgegeben.
@end itemize

Was Plattform-spezifische Bugs angeht, sehen Sie bitte im Abschnitt �ber
Kompilieren und Portieren nach.


@node TODO, Comparisons, Compatibility, Deutsch
@c German node TODO
@section MySQL und die Zukunft (das TODO)

@cindex TODO-Liste f�r MySQL


Dieser Anhang listet die Features auf, f�r die wir eine Implementierung in
MySQL geplant haben.

Alles auf dieser Liste gibt nur ungef�hr die Reihenfolge wieder, in der es
gemacht werden wird. Wenn Sie die Priorit�ten beeinflussen wollen,
registrieren Sie bitte eine Lizenz oder unterst�tzen Sie uns und teilen uns
mit, was Sie schneller gemacht haben wollen. @xref{Lizenzpolitik}.

Geplant ist, dass wir in Zukunft den kompletten ANSI-SQL99-Standard
unterst�tzen, aber mit einer Menge n�tzlicher Erweiterungen. Die
Herausforderung liegt darin, dass durchzuf�hren, ohne
Geschwindigkeitsvorteile zu opfern oder den Code zu kompromittieren.


@menu
* TODO MySQL 4.0::              
* TODO future::                 
* TODO sometime::               
* TODO unplanned::              
@end menu

@node TODO MySQL 4.0, TODO future, TODO, TODO
@c German node TODO MySQL 4.0
@subsection Dinge, die in Version 4.0 enthalten sein sollten

Wir haben uns der Entwicklung von MySQL Version 4.0 zugewandt. Die meisten
grunds�tzlichen Dinge, die wir in Version 4.0 haben wollen, sind bereits
gemacht. Das Ziel ist, den Rest der folgenden Features schnell einzubauen
und dann zur Entwicklung von MySQL 4.1 �berzugehen.
@c German FIX Added . after @xref.
@xref{MySQL 4.0 In A Nutshell}.

Der News-Abschnitt f�r 4.0 beinhaltet eine Liste der Features, die wir
bereits im 4.0-Baum implementiert haben. @xref{News-4.0.x}.

@itemize @bullet
@item
Benutzern erlauben, die Startoptionen zu �ndern, ohne den Server herunter
fahren zu m�ssen.
@item
St�rsichere Replikation.
@item
Mehr Funktionen f�r die Volltextsuche.
@xref{Volltext-Features in MySQL 4.0}.
@item
Neuer Schl�ssel-Cache
@item
Neues Dateiformat f�r die Tabellendefinition (@code{.frm}-Dateien). Das
versetzt uns in die Lage, nicht irgendwann keine Bits mehr zu haben, wenn
wir weitere Tabellenoptionen hinzuf�gen. Es wird nach wie vor m�glich sein,
in 4.0 das alte @code{.frm}-Dateiformat zu benutzen. Alle neu erzeugten
Tabellen werden jedoch das neue Format benutzen.

Das neue Dateiformat versetzt uns in die Lage, neue Spaltentypen, mehr
Optionen f�r Schl�ssel und @code{FOREIGN KEY}-Support hinzuzuf�gen.
@item
Die Replikation sollte mit @code{RAND()} und Benutzer-Variablen
@code{@@var} funktionieren.
@item
Online-Datensicherung mit sehr geringen Performance-Einbussen. Das Online-Backup
wird das Hinzuf�gen eines neuen Replikations-Slaves erleichtern, ohne dass
man den Master herunter fahren muss.
@item
Es zulassen, dass @code{DELETE} auf @code{MyISAM}-Tabellen den
Datensatz-Cache benutzt. Um das zu tun, m�ssen wir den Thread-Cache f�r
Datens�tze aktualisieren, wenn wir die @code{.MYD}-Datei aktualisieren.
@item
Zeichensatz-Festlegungen (Casts) und Syntax f�r die Handhabung mehrerer
Zeichens�tze.
@item
Hilfe f�r alle Befehle des Clients.
@item
Sichere Verbindungen (mit SSL).
@item
@code{SHOW COLUMNS FROM tabelle} (der vom @code{mysql}-Client benutzt f�r
die Erweiterung von Spaltennamen benutzt wird) sollte nicht die Tabelle
�ffnen, sondern nur die Definitionsdatei. Das wird weniger Speicher
beanspruchen und sehr viel schneller sein.
@item
Bei der Benutzung von @code{SET CHARACTER SET} sollten wir die gesamte
Anfrage �bersetzen und nicht nur Zeichenketten. Das w�rde Benutzern
erm�glichen, landesspezifische Zeichen auch in Datenbank-, Tabellen- und
Spaltenamen zu benutzen.
@item
Hinzuf�gen einer portablen Schnittstelle zu @code{gethostbyaddr_r()},
damit wir @code{ip_to_hostname()} davon abhalten k�nnen, andere Threads zu
blockieren, w�hrend es DNS-Lookups durchf�hrt.
@item
Hinzuf�gen der @code{record_in_range()}-Methode zu @code{MERGE}-Tabellen,
um den richtigen Index ausw�hlen zu k�nnen, wenn es viele gibt, aus denen
ausgew�hlt werden kann. Wir sollten auch die info-Schnittstelle erweitern,
um die Schl�sselverteilung f�r jeden Index zu erhalten, wenn @code{analyze}
�ber alle Unter-Tabellen l�uft.
@item
@code{SET SQL_DEFAULT_TABLE_TYPE=[MyISAM | INNODB | BDB | HEAP]}.
@end itemize


@node TODO future, TODO sometime, TODO MySQL 4.0, TODO
@c German node TODO zuk�nftig
@subsection Dinge, die in naher Zukunft erledigt werden m�ssen

@itemize @bullet
@item
Unteranfragen (Subqueries).
@code{select id from t where grp in (select grp from g where u > 100)}
@item
Atomische Multi-Tabellen-Updates, zum Beispiel @code{update items,month set
items.price=month.price where items.id=month.id;};
@item
Abgeleitete Tabellen (Derived Tables).
@example
select a.col1, b.col2 from (select max(col1) as col1 from root_table ) a,
other_table b where a.col1=b.col1
@end example

Das k�nnte erreicht werden, indem f�r die Dauer der Anfrage automatisch
tempor�re Tabellen f�r die abgeleiteten Tabellen erzeugt werden.
@item
Hinzuf�gen eines @code{PREPARE} von Statements und Senden von Parametern an
@code{mysqld}.
@item
Erweiterung des Client-Server-Protokolls, um Warnungen (Warnings) zu
unterst�tzen.
@item
Hinzuf�gen von Optionen zum Client-Server-Protokoll, um
Fortschrittsanzeigen f�r lange laufende Kommandos zu erhalten.
@item
Hinzuf�gen von Datenbank und echtem Tabellennamen (im Falle von Alias) zur
MYSQL_FIELD-Struktur.
@item
Nicht mehr als die festgelegte Anzahl von Threads zulassen, um MyISAM
recover zeitgleich laufen zu lassen.
@item
@code{INSERT ... SELECT} �ndern, um optional konkurrierende Inserts zu
benutzen.
@item
@code{RENAME DATABASE} implementieren. Damit das sicher f�r alle
Tabellen-Handler funktioniert, sollte es wie folgt laufen:
@itemize @bullet
@item
Neue Datenbank anlegen.
@item
F�r jede Tabelle ein Umbenennen der Tabelle zu einer anderen Datenbank
durchf�hren, wie wir es schon mit dem @code{RENAME}-Befehl machen.
@item
Alte Datenbank l�schen.
@end itemize
@item
Die Original-Feldtypen zur�ckgeben, wenn @code{SELECT MIN(column)... GROUP
BY} ausgef�hrt wird.
@item
Mehrfache Ergebnismengen (Multiple Result Sets).
@item
�nderung des Protokolls, um Bin�r�bertragung von Werten zu erm�glichen. Um
das effizient zu machen, m�ssen wir eine API hinzuf�gen, die Bindung
(Binding) von Variablen erlaubt.


@code{mysqld}.
@item
Es soll m�glich sein, @code{long_query_time} mit einer Aufl�sung in
Mikrosekunden festzulegen.
@item
Hinzuf�gen eines konfigurierbaren Prompts zum
@code{mysql}-Kommandozeilen-Werkzeug, mit Optionen wie Datenbank in Benutzung,
Zeit und Datum ...
@item
Hinzuf�gen von Bereichs�berpr�fung (Range Checking) zu
@code{MERGE}-Tabellen.
@item
@code{myisampack}-Code in den Server einlinken.
@item
Portierung von MySQL auf BeOS.
@item
Portierung von MySQL-Clients auf LynxOS.
@item
Hinzuf�gen eines tempor�ren Schl�ssel-Puffer-Caches w�hrend
@code{INSERT/DELETE/UPDATE}, um den vorherigen Zustand elegant
wiederherstellen zu k�nnen, wenn der Index voll wird.
@item
Wenn ein @code{ALTER TABLE} auf eine Tabelle durchgef�hrt wird, die per
Symlink auf einer anderen Festplatte ist, tempor�re Tabellen auf dieser
Festplatte erzeugen.
@item
Implementierung eines @code{DATE/DATETIME}-Typs, der
Zeitzonen-Informationen sauber handhabt, damit der Umgang mit Datumswerten
in verschiedenen Zeitzonen leichter wird.
@item
FreeBSD- und MIT-pThreads; nehmen schlafende Threads CPU in Anspruch?
@item
Pr�fen, ob gesperrte Threads CPU beanspruchen.
@item
Configure reparieren, so dass man alle Bibliotheken (wie @code{MyISAM})
ohne Threads kompilieren kann.
@item
Hinzuf�gen einer Option, um regelm��ig die Schl�sselseiten (Key Pages) f�r
Tabellen mit verz�gerten Schl�sseln (Delayed Keys) zu l�schen (flush), wenn
Sie eine Weile nicht in Gebrauch waren.
@item
Verkn�pfungen (Join) auf Teile des Schl�ssels zulassen (Optimierungsthema).
@item
@code{INSERT SQL_CONCURRENT} und @code{mysqld --concurrent-insert} sollen
ein konkurrierendes Insert am Ende der Datei machen, falls die Datei
lese-gesperrt ist.
@item
@code{FOREIGN}-Key-Festlegungen in der @file{.frm}-Datei speichern.
@item
Kaskadierendes L�schen (@code{DELETE})
@item
Serverseitige Cursor.
@item
Pr�fen, ob @code{lockd} mit modernen Linux-Kernels funktioniert; wenn
nicht, m�ssen wir @code{lockd} �berarbeiten! Um das zu testen, startet man
@code{mysqld} mit @code{--enable-locking} und l��t die verschiedenen fork*
test suits laufen. Sie sollten keine Fehler produzieren, wenn @code{lockd}
funktioniert.
@item
SQL-Variablen in @code{LIMIT} zulassen, wie @code{LIMIT @@a,@@b}.
@item
Aktualisierung von Variablen in @code{UPDATE}-Statements zulassen, zum
Beispiel: @code{UPDATE TABLE foo SET @@a=a+b,a=@@a, b=@@a+c}
@item
Wenn Benutzervariablen aktualisiert werden, so �ndern, dass man sie mit
@code{GROUP BY} benutzen kann wie in folgendem Beispiel:
@code{SELECT id, @@a:=count(*), sum(sum_col)/@@a FROM tabelle GROUP BY id}.
@item
Keine automatischen @code{DEFAULT}-Werte zu Spalten hinzuf�gen. Fehler
ausgeben, wenn ein @code{INSERT} benutzt wird, dass keine Spalte enth�lt,
die keinen @code{DEFAULT}-Wert hat.
@item
Caching von Anfragen und Ergebnissen. Das sollte als separates Modul
gemacht werden, das jede Anfrage pr�ft. Falls diese Anfrage im Cache ist,
soll das Cache-Ergebnis zur�ckgegeben werden. Wenn man eine Tabelle
aktualisiert, sollte man so wenige Anfragen wie m�glich aus dem Cache
entfernen. Das sollte eine gro�e Geschwindigkeitssteigerung auf Maschinen
geben, die viel RAM haben und wo Anfragen of wiederholt werden (wie
WWW-Applikationen). Eine Idee w�re, nur Anfrage des Typs
@code{SELECT CACHED ...}
zu cachen.
@item
@file{libmysql.c} �berarbeiten, damit zwei @code{mysql_query()}-Befehle in
einer Zeile stehen k�nnen, ohne dass Ergebnisse gelesen werden oder man
eine nette Fehlermeldung erh�lt, wenn man das tut.
@item
Optimierung des @code{BIT}-Typs, so dass er 1 Bit aufnimmt (momentan nimmt
@code{BIT} 1 Zeichen auf).
@item
Pr�fen, warum MIT-pThreads @code{ctime()} auf einigen FreeBSD-Systemen
nicht funktioniert.
@item
Hinzuf�gen einer @code{IMAGE}-Option zu @code{LOAD DATA INFILE}, damit
@code{TIMESTAMP}- und @code{AUTO_INCREMENT}-Felder nicht aktualisiert
werden.
@item
@code{LOAD DATE INFILE.. UPDATE}-Syntax hinzuf�gen.
@itemize @bullet
@item
Wenn Daten bei Tabellen mit Prim�rschl�ssel den Prim�rschl�ssel enthalten,
werden Eintr�ge, die zu diesem Prim�rschl�ssel passen, vom Rest der Spalten
aktualisert. Spalten, die im herein kommenden Datenstrom NICHT enthalten
sind, werden jedoch nicht ber�hrt.
@item
Bei Tabellen mit Prim�rschl�sseln, wo im herein kommenden Datenstrom ein
Teil des Schl�ssels fehlt, oder wenn kein Prim�rschl�ssel eingegeben wird,
wird die Eingabe so behandelt wie jetzt schon @code{LOAD DATA INFILE ...
REPLACE INTO}.
@end itemize
@item
@code{LOAD DATA INFILE} soll auch folgende Syntax verstehen:
@example
LOAD DATA INFILE 'datei.txt' INTO TABLE tabelle
TEXT_FIELDS (text_feld1, text_feld2, text_feld3)
SET tabelle_feld1=concatenate(text_feld1, text_feld2), tabelle_feld3=23
IGNORE text_feld3

Das kann benutzt werden, um zus�tzliche Spalten in der Textdatei zu
�berspringen oder um Spalten basierend auf Ausdr�cken in den gelesenen
Daten zu aktualisieren ...
@end example
@item
@code{LOAD DATA INFILE 'datei' INTO TABLE 'tabelle' ERRORS TO err_tabelle}
Das w�rde bewirken, dass alle Fehler und Warnungen in der err_tabelle
mitgeschrieben werden. Diese Tabelle h�tte etwa folgende Struktur:

@example
zeile_nummer     - Zeilennummer in der Datendatei
fehler_nachricht - die Fehler-/Warnungs-Nachricht
und vielleicht
@c German FIX changed all "@cQuestion ..." lines to "@c Question ..." (space).
@c Question: ??? This is already logged in zeile_nummer (line_number)!
daten_zeile      - die Zeilennummer der Datendatei
@end example
@item
Hinzuf�gen von echter @code{VARCHAR}-Unterst�tzung (gibt es schon in
MyISAM).
@item
Automatische Ausgabe von @code{mysql} an Netscape.
@item
@code{LOCK DATABASES}. (mit vielerlei Optionen)
@item


�ndern wie Sortierung Speicher alloziert, um bessere
Speicherausnutzung zu erhalten.
@item
@code{DECIMAL}- und @code{NUMERIC}-Typen k�nnen keine exponentiellen Zahlen
lesen; @code{Field_decimal::store(const char *from,uint len)} muss neu
kodiert werden, um das zu beheben.
@item
@code{mysql.cc} �berarbeiten, damit weniger @code{malloc()}-Aufrufe
durchgef�hrt werden, wenn Feldnamen gehasht werden.
@item
Funktionen:
ADD_TO_SET(wert,set) und REMOVE_FROM_SET(wert,set)
@item
Benutzung von @code{t1 JOIN t2 ON ...} und @code{t1 JOIN t2 USING ...}
hinzuf�gen. Momentan kann man diese Syntax nur mit @code{LEFT JOIN}
benutzen.
@item
Volle Unterst�tzung f�r @code{unsigned long long}-Typen hinzuf�gen.
@item
Viele weitere Variablen f�r @code{show status}. Z�hler f�r:
@code{INSERT}-/@code{DELETE}-/@code{UPDATE}-Statements. Gelesene und
aktualisierte Datens�tze. Select auf 1 Tabelle und Selects mit Joins.
Durchschnittliche Anzahl von Tabellen in Selects. Anzahl von @code{ORDER
BY}- und @code{GROUP BY}-Anfragen.
@item
Wenn man @code{mysql} mitten in einer Anfrage abbricht, sollte man eine
neue Verbindung herstellen und die alte, laufende Anfrage killen.
Alternativ k�nnte man den Versuch unternehmen, so etwas im Server zu
entdecken.
@item
Eine Handler-Schnittstelle f�r Tabelleninformation hinzuf�gen, damit man
sie als Systemtabelle benutzen kann. Das w�re ein bisschen langsam, wenn
man Informationen �ber alle Tabellen abfragt, aber sehr flexibel.
@code{SHOW INFO FROM tabelle} f�r Basisinformationen �ber Tabellen sollte
implementiert werden.
@item
Unterst�tzung f�r UNICODE hinzuf�gen.
@item
@code{NATURAL JOIN} und @code{UNION JOIN}.
@item
Anfragen wie @code{select a from crash_me left join crash_me2 using (a)}
zulassen; in diesem Fall wird angenommen, dass a aus der crash_me-Tabelle
kommt.
@item
�berarbeitung, damit @code{ON} und @code{USING} mit dem
@code{JOIN}-Verkn�pfungstyp funktioniert.
@item
Oracle-m��iges @code{CONNECT BY PRIOR ...}, um hierarchische Strukturen zu
durchsuchen.


@item
@code{mysqladmin copy datenbank neue_datenbank}. -- Erfordert, dass
@code{mysqld} der COPY-Befehl hinzugef�gt wird.
@item
Prozessliste sollte die Anzahl von Anfragen pro Thread zeigen.
@item


@code{SHOW HOSTS} zur Informationsausgaben �ber den Hostnamen-Cache.
@item



@item
Format von @code{DATETIME} �ndern, um Bruchteile von Sekunden zu speichern.
@item
Alle fehlenden ANSI92- und ODBC 3.0-Typen hinzuf�gen.
@item
F�r berechnete Spalten Tabellennamen von leerer Zeichenkette zu @code{NULL}
�ndern.
@item
'Item_copy_string' nicht auf numerische Werte anwenden, um
Zahl->Zeichenkette->Zahl-Umwandlung zu vermeiden, im Falle von:
@code{SELECT COUNT(*)*(id+0) FROM tabelle GROUP BY id}
@item
Benutzung der neuen GNU-regexp-Bibliothek anstelle der aktuellen
erm�glichen (die GNU-Bibliothek sollte viel schneller sein als die alte).
@item
@code{ALTER TABLE} sollte nicht mehr Clients abbrechen, die @code{INSERT
DELAYED} ausf�hren.
@item
So �berarbeiten, dass, wenn Spalten, auf die in einer @code{UPDATE}-Klausel
verwiesen wird, die alten Werte enthalten, bevor das Update begonnen wird.
@item
@code{myisamchk}, @code{REPAIR} und @code{OPTIMIZE TABLE} sollten in der
Lage sein, mit F�llen umzugehen, wo die Daten und / oder Indexdateien
symbolische Links sind.
@item
Simulation von @code{pread()}/@code{pwrite()} auf Windows einarbeiten, um
konkurrierende Inserts zu erm�glichen.
@item
Ein Logdatei-Analyzer, aus dem Informationen herausgefiltert (geparst)
werden k�nnen, welche Tabellen am h�ufigsten angesprochen werden, wie oft
Verkn�pfungen (Joins) mit mehreren Tabellen ausgef�hrt werden usw. Es
sollte Benutzern helfen, Bereiche oder Dinge im Tabellenentwurf zu
erkennen, die optimiert werden k�nnen, um sehr viel effizientere Anfragen
auszuf�hren.
@item
Add @code{SUM(DISTINCT)}
@item
@code{ANY()}-,@code{EVERY()}- und @code{SOME()}-Gruppierungsfunktionen
hinzuf�gen. In ANSI-SQL funktionieren diese auf boolsche Spalten, aber wir
k�nnen sie so erweitern, dass sie mit beliebigen Spalten / Ausdr�cken
funktionieren, indem wir folgendes anwenden: wert == 0 -> FALSE und
wert <> 0 -> TRUE.
@item
So �berarbeiten, dass @code{MAX(column)} vom selben Typ ist wie der
Spaltentyp.
@example
create tabelle t1 (a DATE);
insert into t1 values (now());
create tabelle t2 select max(a) von t1;
show columns from t2;
@end example
@item
Eine nette Syntax f�r ein Statement entwickeln, dass auf eine Zeile ein
@code{UPDATE} ausf�hrt, wenn sie existiert, und eine neue Zeile einf�gt
(@code{INSERT}), wenn sie nicht existiert (so wie @code{REPLACE} bei
@code{INSERT} / @code{DELETE} funktioniert).
@end itemize


@node TODO sometime, TODO unplanned, TODO future, TODO
@c German node TODO irgendwann
@subsection Dinge die irgendwann gemacht werden m�ssen

@itemize @bullet
@item
Funktion implementieren: @code{get_changed_tables(timeout,table1,table2,...)}
@item
Lesen durch Tabellen so �ndern, das memmap benutzt wird, falls m�glich.
Momentan benutzen nur komprimierte Tabellen memmap.
@item
Ein neues Zugriffsrecht @strong{'Show_priv'} f�r @code{SHOW}-Befehle
hinzuf�gen.
@item
Den automatischen Zeitstempel-Code netter machen. Zeitstempel zum
Update-Log hinzuf�gen mit @code{SET TIMESTAMP=#;}
@item
An manchen Stellen read/write mutex benutzen, um mehr Geschwindigkeit zu
erhalten.
@item
Volle Unterst�tzung von Fremdschl�sseln. Wahrscheinlich wird man zuerst
einmal eine prozedurale Sprache implementieren wollen.
@item
Einfache Sichten (Views; zun�chst auf eine Tabelle, sp�ter auf jeden
beliebigen Ausdruck).
@item
Automatisches Schlie�en einiger Tabellen, wenn eine Tabelle, eine
tempor�re Tabelle oder eine tempor�re Datei einen Fehler 23 bekommt
(nicht genug offene Dateien).
@item
Wenn ein Feld=# gefunden wird, alle Vorkommen von Feld auf # setzen.
Momentan wird das nur in einigen einfachen F�llen gemacht.
@item
Alle konstanten Ausdr�cke mit berechneten Ausdr�cken austauschen, falls
m�glich.
@item
schl�ssel = ausdruck optimieren. Momentan wird nur schl�ssel = feld oder
schl�ssel = konstante optimiert.
@item
Einige der Copy-Funktionen verbinden, um netter Code zu erhalten.
@item
@file{sql_yacc.yy} in einen Inline-Parser um�ndern, um die Gr��e zu
reduzieren und bessere Fehlermeldungen zu erhalten (5 Tage).
@item
Den Parser so �ndern, dass er nur eine Regel pro unterschiedlicher Anzahl
von Argumenten in Funktionen benutzt.
@item
Die Benutzung von vollen Berechnungsnamen (full calculation names) im
ORDER-Teil (order part). (F�r ACCESS97)
@item
@code{UNION}, @code{MINUS}, @code{INTERSECT} und @code{FULL OUTER JOIN}.
(Momentan wird nur @code{LEFT OUTER JOIN} unterst�tzt.)
@item
@code{UNIQUE} bei Feldern zulassen, die @code{NULL} sein k�nnen.
@item
@code{SQL_OPTION MAX_SELECT_TIME=#} um einer Anfrage eine Zeitbeschr�nkung
zu setzen.
@item
@c Question: Check translation!
Make the update log to a Datenbank.
Update soll in eine Datenbank loggen.
@item
Negative @code{LIMIT}-Parameter, um Daten vom Ende abrufen zu k�nnen.
@item
@c Question: Alarm? Wake up?
Alarm around client connect/read/write Funktionen.
@item
Bitte beachten sie die �nderungen in @code{safe_mysqld}: Nach FSSTND (woran
sich Debian versucht zu halten) sollten PID-Dateien als
@file{/var/run/<progname>.pid} angelegt werden und Log-Datei in
@file{/var/log}. Es w�re nett, wenn man "DATADIR" in die erste Deklaration
von "pidfile" und "log" packen k�nnte, damit die Unterbringung dieser
Dateien mit einem einzigen Statement ge�ndert werden k�nnte.
@item
Einem Client erlauben, Mitloggen anzufordern.
@item
Benutzung von @code{zlib()} f�r @code{gzip}-te Dateien in @code{LOAD DATA
INFILE} zulassen.
@item
Sortieren und Gruppieren von @code{BLOB}-Spalten in Ordnung bringen
(teilweise bereits gel�st).
@item
Gespeicherte Prozeduren. Wird aktuell nicht als sehr wichtig erachtet, weil
gespeicherte Prozeduren noch nicht sehr standardisiert sind. Ein weiteres
Problem besteht darin, dass es echte gespeicherte Prozeduren dem Optimierer
viel schwerer machen und dass in vielen F�llen das Ergebnis langsamer sein
wird als vorher. Auf der anderen Seite werden wir versuchen, eine einfache
(atomische) Update-Sprache hinzuzuf�gen, die benutzt werden kann, um
Schleifen und �hnliches im MySQL-Server zu schreiben.
@item
So �ndern, dass Semaphore benutzt werden, wenn Threads gez�hlt werden. Man
sollte zuerst eine Semaphor-Bibliothek zu MIT-pThreads implementieren.
@item
Keinen neuen @code{AUTO_INCREMENT}-Wert zuweisen, wenn eine Spalte auf 0
gesetzt wird. Statt dessen @code{NULL} setzen.
@item
Volle Unterst�tzung von Verkn�pfungen (@code{JOIN}) mit Klammern.
@item
Als Alternative f�r einen Thread pro Verbindung einen Pool von Threads
verwalten, der die Anfragen handhabt.
@item
Einem gestatten, mehr als eine Sperre (Lock) mit @code{GET_LOCK} zu
erhalten. Wenn man das tut, muss man die m�glichen Deadlocks handhaben, die
diese �nderung einf�hren wird.
@end itemize

Zeitangaben stehen f�r den Umfang der Arbeit, nicht f�r echte Zeit.


@node TODO unplanned,  , TODO sometime, TODO
@c German node TODO ungeplant
@subsection Ein paar Dinge, f�r deren Umsetzung wir keine Pl�ne haben

@itemize @bullet
@item
Nichts; auf lange Sicht planen wir, voll ANSI-92- / ANSI-99-kompatibel zu
sein.
@end itemize


@node Comparisons,  , TODO, Deutsch
@c German node Vergleiche
@section MySQL im Vergleich mit anderen Datenbanken

@cindex Datenbanken, MySQL im Vergleich mit anderen
@cindex Vergleich, MySQL zu anderen


Dieser Abschnitt vergleicht MySQL mit anderen popul�ren Datenbanken.  

Dieser Abschnitt wurde von den MySQL-Entwicklern geschrieben. Das sollte
man beim Lesen im Hinterkopf behalten. In diesem Abschnitt sind - soweit
uns bekannt - keine sachlichen Fehler enthalten. Wenn Sie etwas finden, was
Sie als sachlichen Fehler erachten, kontaktieren Sie uns bitte unter
@email{docs@@mysql.com}.

Eine Liste aller unterst�tzten Limits, Funktionen und Typen finden Sie auf
der @code{crash-me}-Webseite auf
@uref{http://www.mysql.com/information/crash-me.php}.


@menu
* Compare mSQL::                
* Compare PostgreSQL::          
@end menu

@node Compare mSQL, Compare PostgreSQL, Comparisons, Comparisons
@c German node Vergleich mit mSQL
@subsection MySQL im Vergleich mit @code{mSQL}

@table @strong
@item Performance

Um einen echten Geschwindigkeitsvergleich zu sehen, schauen Sie bitte in
der wachsenden Liste der MySQL-Benchmarks nach. @xref{MySQL Benchmarks}.

Weil es keinen Overhead f�r die Erzeugung von Threads besitzt, einen
kleineren Parser, weniger Features und einfache Sicherheitsmechanismen,
sollte @code{mSQL} in folgenden Punkten schneller sein:

@itemize @bullet
@item
Tests, die wiederholten Verbindungsaufbau und -abbau durchf�hren, wobei
w�hrend jeder Verbindung eine sehr einfache Anfrage ausgef�hrt wird.

@item
@code{INSERT}-Operationen auf sehr einfache Tabellen mit wenigen Spalten
und Schl�sseln.

@item
@code{CREATE TABLE} und @code{DROP TABLE}.

@item
@code{SELECT} auf alles, was kein Index ist. (Ein Tabellen-Scan ist sehr
einfach.)
@end itemize

Weil diese Operationen so einfach sind, ist es schwer, hier besser zu sein,
wenn man beim Starten einen gr��eren Overhead hat. Nachdem die Verbindung
erst einmal aufgebaut ist, sollte MySQL wesentlich bessere Leistungsdaten
bringen.

Andererseits ist MySQL sehr viel schneller als @code{mSQL} (und den meisten
anderen SQL-Implementationen) bei Folgendem:

@itemize @bullet
@item
Komplexe @code{SELECT}-Operationen.

@item
Wenn gro�e Ergebnismengen abgefragt werden (MySQL hat ein besseres,
schnelleres und sichereres Protokoll).

@item
Tabellen mit Zeichenketten variabler L�nge, denn MySQL hat eine
effizientere Handhabung und kann Indizes auf @code{VARCHAR}-Spalten haben.

@item
Handhabung von Tabellen mit vielen Spalten.

@item
Handhabung von Tabellen mit gro�er Datensatzl�nge.

@item
@code{SELECT} mit vielen Ausdr�cken.

@item
@code{SELECT} auf gro�e Tabellen.

@item
Handhabung vieler gleichzeitiger Verbindungen. MySQL ist voll
Multi-Thread-f�hig. Jede Verbindung hat ihren eigenen Thread, was bedeutet,
dass kein Thread auf einen anderen warten muss (ausser wenn ein Thread eine
Tabelle ver�ndert, auf die ein anderer Thread zugreifen will). In
@code{mSQL} m�ssen nach dem Verbindungsaufbau alle anderen warten, bis die
erste Verbindung beendet wurde, egal, ob diese Verbindung eine Anfrage
ausf�hrt, die kurz oder lang ist. Wenn die erste Verbindung abgebaut wird,
kann die zweite bedient werden, w�hrend alle anderen noch warten, usw.

@item
Joins (Verkn�pfungen).
@code{mSQL} kann krankhaft langsam werden, wenn Sie die Reihenfolge von
Tabellen in einem @code{SELECT}-Statement �ndern. In einem Benchmark-Test
wurde beobachtet, dass es mehr als 15000-mal langsamer werden kann als
MySQL. Das liegt daran, dass @code{mSQL} keinen Verkn�pfungs-Optimierer
(Join Optimizer) besitzt, der die Tabellen in optimale Reihenfolge bringt.
Wenn Sie allerdings exakt die richtige Reihenfolge in @code{mSQL}2 benutzen
und wenn die @code{WHERE}-Klausel einfach ist und Spalten-Indexe benutzt,
wird die Verkn�pfung relativ schnell sein!
@xref{MySQL Benchmarks}.

@item
@code{ORDER BY} und @code{GROUP BY}.

@item
@code{DISTINCT}.

@item
Benutzung von @code{TEXT}- oder @code{BLOB}-Spalten.
@end itemize

@item SQL-Features

@itemize @bullet
@item @code{GROUP BY} und @code{HAVING}.
@code{mSQL} unterst�tzt @code{GROUP BY} �berhaupt nicht.
MySQL unterst�tzt @code{GROUP BY} vollst�ndig, sowohl mit @code{HAVING} als
auch mit den folgenden Funktionen: @code{COUNT()}, @code{AVG()}, @code{MIN()},
@code{MAX()}, @code{SUM()} und @code{STD()}.  @code{COUNT(*)} ist darauf
optimiert, sehr schnell Ergebnisse zu liefern, wenn @code{SELECT} aus einer
Tabelle abfragt, wenn keine andere Spalte abgerufen wird und wenn es keine
@code{WHERE}-Klausel gibt. @code{MIN()} und @code{MAX()} k�nnen
Zeichenketten-Argumente entgegennehmen.

@item @code{INSERT} und @code{UPDATE} mit Berechnungen.
MySQL kann Berechnungen in @code{INSERT}- oder @code{UPDATE}-Statements
ausf�hren. Beispiel:

@example
mysql> UPDATE SET x=x*10+y WHERE x<20;
@end example

@item Aliase.
MySQL hat Spalten-Aliase.

@item Qualifizierende Spaltenamen.
In MySQL muss man nicht den voll qualifizierenden Namen benutzen, wenn eine
Spalte in den benutzten Tabellen eindeutig ist.

@item @code{SELECT} mit Funktionen.
MySQL hat viele Funktionen (zu viele, um sie hier aufzulisten; siehe
@ref{Functions}).

@end itemize

@item Effiziente Ausnutzung von Speicherplatz
Das hei�t, wie klein k�nnen Sie Ihre Tabellen machen?

MySQL hat sehr pr�zise Typen, deshalb k�nnen Sie Tabellen erzeugen, die
sehr wenig Platz brauchen. Ein Beispiel f�r einen n�tzlichen MySQL-Datentyp
ist @code{MEDIUMINT}, der 3 Bytes lang ist. Wenn Sie 100 Millionen
Datens�tze haben, ist es schon von Wichtigkeit, auch nur ein Byte pro
Datensatz zu sparen.

@code{mSQL2} hat eine begrenztere Anzahl von Spaltentypen, daher ist es
schwieriger, kleine Tabellen zu erhalten.

@item Stabilit�t
Dieser Punkt ist schwieriger objektiv zu beurteilen. Eine Er�rterung der
Stabilit�t von MySQL finden Sie hier: @ref{Stability}.

Wir haben keine Erfahrungen mit der Stabilit�t von @code{mSQL}, daher
k�nnen wir nichts dar�ber sagen.

@item Preis
Ein weiterer wichtiger Punkt ist die Lizenz. MySQL hat eine flexiblere
Lizenz als @code{mSQL} und kostet auch weniger als @code{mSQL}. Welches
Produkt auch immer Sie verwenden, ziehen Sie bitte zumindestens in
Betracht, f�r eine Lizenz oder E-Mail-Support zu zahlen. (Sie m�ssen
nat�rlich notwendigerweise eine Lizenz erwerben, wenn Sie MySQL in ein
Produkt einbeziehen, das Sie verkaufen.)

@item Perl-Schnittstellen
MySQL hat prinzipiell dieselben Schnittstelle zu Perl wie @code{mSQL}, mit
einigen zus�tzlichen Features.

@item JDBC (Java)
MySQL hat aktuell eine gro�e Anzahl von JDBC-Treibern:

@itemize @bullet
@item
Die mm-Treiber: Ein Typ-4 JDBC-Treiber von Mark Matthews
@email{mmatthew@@ecn.purdue.edu}.  Er ist unter LGPL ver�ffentlicht.

@item
Der Resin-Treiber. Das ist ein kommerzieller JDBC-Treiber, der unter Open
Source ver�ffentlicht ist. @uref{http://www.caucho.com/Projekte/jdbc-mysql/index.xtp}

@item
Der gwe-Treiber: Eine Java-Schnittstelle von GWE technologies (wird nicht
mehr unterst�tzt).

@item
Der jms-Treiber: Ein verbesserter gwe-Treiber von Xiaokun Kelvin ZHU
@email{X.Zhu@@brad.ac.uk} (wird nicht mehr unterst�tzt).

@item
Der twz-Treiber: Ein Typ-4 JDBC-Treiber von Terrence W. Zellers
@email{zellert@@voicenet.com}.  Das ist ein kommerzieller Treiber, der f�r
Privatgebrauch und Schulungszwecke kostenlos ist (wird nicht mehr
unterst�tzt).
@end itemize

Der empfohlene Treiber ist der mm-Treiber. Der Resin-Treiber mag auch gut
sein (zumindest sehen die Benchmarks gut aus), aber wir haben �ber diesen
Treiber noch nicht allzu viele Informationen erhalten.

Wir wissen, dass @code{mSQL} einen JDBC-Treiber hat, aber wir haben zu
wenig Erfahrung damit, um ihn in einen Vergleich einzubeziehen.

@item Entwicklungsgeschwindigkeit
MySQL hat ein sehr kleines Entwicklerteam, aber wir arbeiten schon lange
mit C und C++ und sind daher sehr schnell. Weil Threads, Funktionen,
@code{GROUP BY} usw. noch nicht in @code{mSQL} implementiert sind, hat es
eine Menge aufzuholen. Um das in den richtigen Blickwinkel zu r�cken,
k�nnen Sie sich die @code{mSQL} @file{HISTORY}-Datei des letzten Jahres
ansehen und sie mit dem News-Abschnitt des MySQL Referenzhandbuchs
vergleichen (@pxref{News}). Es ist ziemlich offensichtlich, welches System
sich schneller entwickelt hat.

@item Utilities
Sowohl @code{mSQL} als auch MySQL haben viele interessante von Dritten
entwickelte Werkzeuge. Weil es sehr einfach ist, aufw�rts zu portieren (von
@code{mSQL} zu MySQL), sind fast alle interessanten Applikationen, die f�r
@code{mSQL} verf�gbar sind, auch f�r MySQL erh�ltlich.

MySQL liefert ein einfaches @code{msql2mysql}-Programm mit, das
Unterschiede in der Schreibweise zwischen @code{mSQL} und MySQL f�r die
meistbenutzten C-API-Funktionen bereinigt.
Es �ndert zum Beispiel Instanzen von @code{msqlConnect()} zu
@code{mysql_connect()}. Ein Client-Programm von @code{mSQL} zu MySQL zu
konvertieren, erfordert meist nur geringe Anstrengung.
@end table



@menu
* Using mSQL tools::            
* Protocol differences::        
* Syntax differences::          
@end menu

@node Using mSQL tools, Protocol differences, Compare mSQL, Compare mSQL
@c German node mSQL-Werkzeuge benutzen
@subsubsection Wie man @code{mSQL}-Werkzeuge f�r MySQL konvertiert

@cindex MySQL-Werkzeuge, Konvertierung
@cindex Konvertierung, Werkzeuge
@cindex Werkzeuge, Konvertierung

Nach unserer Erfahrung nimmt es wenig Zeit in Anspruch, Werkzeuge wie
@code{msql-tcl} und @code{msqljava} zu konvertieren, die die
@code{mSQL}-C-API benutzen, damit sie mit der MySQL-C-API funktionieren.

Die Konvertierungsprozedur l�uft wie folgt:

@enumerate
@item
Lassen Sie das Shell-Skript @code{msql2mysql} �ber den Quelltext laufen.
Das erfordert das @code{replace}-Programm, das mit MySQL ausgeliefert wird.

@item
Kompilieren.

@item
Alle Kompilierfehler beheben.
@end enumerate

Die Unterschiede zwischen der @code{mSQL}-C-API und der MySQL-C-API sind:

@itemize @bullet
@item
MySQL benutzt eine @code{MYSQL}-Struktur als Verbindungstyp, (@code{mSQL}
benutzt einen @code{int}).

@item
@code{mysql_connect()} nimmt einen Zeiger (Pointer) auf eine
@code{MYSQL}-Struktur als Parameter auf. Es ist einfach, einen global zu
definieren oder @code{malloc()} zu benutzen, um einen zu erhalten.
@code{mysql_connect()} nimmt zus�tzlich zwei Parameter auf, um Benutzer und
Passwort zu spezifizieren. Sie k�nnen diese als Vorgabewert der Benutzung
auf @code{NULL, NULL} setzen.

@item
@code{mysql_error()} nimmt die @code{MYSQL}-Struktur als Parameter auf.
F�gen Sie einfach den Parameter zu Ihrem alten @code{msql_error()}-Code
hinzu, wenn Sie alten Code portieren.

@item
MySQL gibt eine Fehlernummer und eine Textnachricht f�r alle Fehler zur�ck.
@code{mSQL} gibt nur eine Fehlernachricht zur�ck.

@item
Aufgrund der Tatsache, dass MySQL mehrfache Verbindungen zum Server von
demselben Prozess aus unterst�tzt, existieren einige Inkompatibilit�ten.
@end itemize


@node Protocol differences, Syntax differences, Using mSQL tools, Compare mSQL
@c German node Protokollunterschiede
@subsubsection Wie sich @code{mSQL}- und MySQL-Client/Server-Kommunikationsprotokolle unterscheiden

@cindex Kommunikationsprotokolle
@cindex mSQL, im Vergleich zu MySQL

Es gibt genug Unterschiede, so dass es unm�glich ist (oder zumindest nicht
leicht), beide zu unterst�tzen.

Die signifikantesten Protokollunterschiede zwischen MySQL und @code{mSQL}
sind folgende:

@itemize @bullet
@item
Ein Nachrichtenpuffer (Message Buffer) darf viele Ergebniszeilen enthalten.

@item
Die Nachrichtenpuffer werden dynamisch vergr��ert, wenn die Anfrage oder
das Ergebnis gr��er sind als der aktuelle Puffer, bis hin zu einer
konfigurierbaren Server- und Client-Grenze.

@item
Alle Pakete werden nummeriert, um duplizierte oder fehlende Pakete
abzufangen.

@item
Alle Spaltenwerte werden in ASCII gesendet. Die L�ngen von Spalten und
Zeilen werden als komprimierte Bin�rkodierung gesendet (1, 2 oder 3
Bytes).

@item
MySQL kann ungepuffert im Ergebnis lesen (ohne die volle Ergebnismenge im
Client speichern zu m�ssen).

@item
Wenn ein einzelner Lese- / Schreibvorgang mehr als 30 Sekunden in Anspruch
nimmt, schlie�t der Server die Verbindung.

@item
Wenn eine Verbindung l�nger als 8 Stunden im Leerlauf ist, schlie�t der
Server die Verbindung.
@end itemize


@c Question Steve: Check this node for the English original!
@node Syntax differences,  , Protocol differences, Compare mSQL
@c German node Syntaxunterschiede
@subsubsection Wie sich die @code{mSQL} 2.0 SQL-Syntax von MySQL unterscheidet

@noindent
@strong{Spaltentypen}

@table @code
@item
MySQL hat folgende zus�tzliche Typen (unter anderem;
@pxref{CREATE TABLE, , @code{CREATE TABLE}}):
@itemize @bullet
@item
@code{ENUM}-Typ f�r einen Satz von Zeichenketten.
@item
@code{SET}-Typ f�r viele S�tze von Zeichenketten.
@item
@code{BIGINT}-Typ f�r 64-Bit-Ganzzahlen (Integer).
@end itemize
@item
MySQL unterst�tzt folgende zus�tzliche Typ-Attribute:
@itemize @bullet
@item
@code{UNSIGNED}-Option f�r Ganzzahl-Spalten (Integer).
@item
@code{ZEROFILL}-Option f�r Ganzzahl-Spalten (Integer).
@item
@code{AUTO_INCREMENT}-Option f�r Ganzzahl-Spalten (Integer), die ein
@code{PRIMARY KEY} sind.
@xref{mysql_insert_id, , @code{mysql_insert_id()}}.
@item
@code{DEFAULT}-Wert f�r alle Spalten.
@end itemize
@item mSQL2
@code{mSQL}-Spaltentypen korrespondieren mit den unten dargestellten
MySQL-Typen:
@multitable @columnfractions .15 .85
@item @code{mSQL} @strong{Typ} @tab @strong{Korrespondierender MySQL-Typ}
@item @code{CHAR(len)} @tab @code{CHAR(len)}
@item @code{TEXT(len)} @tab @code{TEXT(len)}. @code{len} ist die maximale
L�nge.
Und @code{LIKE} funktioniert.
@item @code{INT} @tab @code{INT}. Mit vielen weiteren Optionen!
@item @code{REAL} @tab @code{REAL}. Or @code{FLOAT}. Beide 4- und
8-Byte-Versionen sind verf�gbar.
@item @code{UINT} @tab @code{INT UNSIGNED}
@item @code{DATE} @tab @code{DATE}. Benutzt ANSI-SQL-Format statt 
@code{mSQL}'s eigenem Format.
@item @code{TIME} @tab @code{TIME}
@item @code{MONEY} @tab @code{DECIMAL(12,2)}. Ein Festkomma-Wert mit zwei
Dezimalstellen.
@end multitable
@end table

@noindent
@strong{Index-Erzeugung}

@table @code
@item MySQL
Indizes k�nnen bei der Erzeugung der Tabelle mit dem @code{CREATE
TABLE}-Statement festgelegt werden.
@item mSQL
Indexe m�ssen erzeugt werden, nachdem die Tabelle erzeugt wurde, mit einem
separaten @code{CREATE INDEX}-Statements.
@end table

@noindent
@strong{Einf�gen eines eindeutigen Identifikators (Unique Identifier) in eine Tabelle}

@table @code
@item MySQL
Benutzen Sie @code{AUTO_INCREMENT} als Spaltentyp-Spezifizierer.
@xref{mysql_insert_id, , @code{mysql_insert_id()}}.
@item mSQL
Erzeugen Sie eine @code{SEQUENCE} auf eine Tabelle und w�hlen Sie die
@code{_seq}-Spalte.
@end table

@noindent
@strong{Wie man einen eindeutigen Identifikator (Unique Identifier) f�r eine Zeile erh�lt}

@table @code
@item MySQL
F�gen Sie der Tabelle einen @code{PRIMARY KEY} oder @code{UNIQUE}-Schl�ssel
hinzu und benutzen Sie diesen.
Neu ab Version 3.23.11: Wenn der @code{PRIMARY}- oder
@code{UNIQUE}-Schl�ssel nur aus einer Spalte besteht und diese vom Typ
Ganzzahl (Integer) ist, k�nnen Sie auf diese auch mit @code{_rowid}
verweisen.
@item mSQL
Benutzen Sie die @code{_rowid}-Spalte. Beachten Sie, dass sich
@code{_rowid} im Zeitverlauf m�glicherweise �ndert, abh�ngig von vielen
Faktoren.
@end table

@noindent
@strong{Wie man die Zeit erh�lt, zu der eine Spalte zuletzt ge�ndert wurde}

@table @code
@item MySQL
F�gen Sie der Tabelle eine @code{TIMESTAMP}-Spalte hinzu. Diese Spalte wird
automatisch auf das aktuelle Datum und die aktuelle Zeit gesetzt, und zwar
bei @code{INSERT}- und @code{UPDATE}-Statements, es sein denn, der Spalte
wird explizit ein Wert zugewiesen, auch der @code{NULL}-Wert.

@item mSQL
Benutzen Sie die @code{_timestamp}-Spalte .
@end table

@noindent
@strong{@code{NULL}-Wert-Vergleiche}

@table @code
@item MySQL
MySQL folgt ANSI-SQL, daher wird ein Vergleich mit @code{NULL} immer zu
@code{NULL} ausgewertet.
@item mSQL
In @code{mSQL} ist @code{NULL = NULL} TRUE. Sie m�ssen @code{=NULL} zu
@code{IS NULL} und @code{<>NULL} zu @code{IS NOT NULL}, wenn Sie alten Code
von @code{mSQL} zu MySQL portieren.
@end table

@noindent
@strong{Zeichenketten-Vergleich}

@table @code
@item MySQL
Normalerweise werden Zeichenketten-Vergleiche so durchgef�hrt, dass sie
unabh�ngig von der verwendeten Gro�-/Kleinschreibung laufen, wobei die
Sortierreihenfolge vom aktuell verwendeten Zeichensatz abh�ngt (ISO-8859-1
Latin1 als Vorgabewert). Wenn Sie das nicht wollen, deklarieren Sie Ihre
Spalten mit dem @code{BINARY}-Attribut, was bewirkt, dass Vergleiche nach
der ASCII-Reihenfolge durchgef�hrt werden, wobei der ASCII-Zeichensatz
gilt, den der MySQL-Server-Host verwendet.
@item mSQL
Alle Zeichenketten-Vergleiche werden so durchgef�hrt, dass sie abh�ngig von
der verwendeten Gro�-/Kleinschreibung laufen. Die Sortierung erfolgt in
ASCII-Reihenfolge.
@end table

@noindent
@strong{Suche, die unabh�ngig von Gro�-/Kleinschreibung l�uft}

@table @code
@item MySQL
@code{LIKE} ist ein Operator, der abh�ngig oder unabh�ngig von der
Gro�-/Kleinschreibung l�uft, was davon abh�ngt, welche Spalten verwendet
werden. Wenn m�glich, benutzt MySQL Indexe, wenn das @code{LIKE}-Argument
nicht mit einem Platzhalterzeichen (Wildcard) beginnt.
@item mSQL
Benutzt @code{CLIKE}.
@end table

@noindent
@strong{Handhabung von Leerzeichen am Ende}

@table @code
@item MySQL
Entfernt alle Leerzeichen am Ende von @code{CHAR}- und
@code{VARCHAR}-Spalten. Benutzen Sie eine @code{TEXT}-Spalte, wenn dieses
Verhalten unerw�nscht ist.
@item mSQL
Beh�lt Leerzeichen am Ende bei.
@end table

@noindent
@strong{@code{WHERE}-Klauseln}

@table @code
@item MySQL
MySQL priorisiert alles korrekt (@code{AND} wird vor @code{OR}
ausgewertet). Um @code{mSQL}-Verhalten in MySQL zu erreichen, benutzen
Sie Klammern (wie im unten stehenden Beispiel gezeigt).
@item mSQL
Wertet alles von links nach rechts aus. Das bedeutet, dass einige logische
Berechnungen mit mehr als drei Argumenten �berhaupt nicht ausgedr�ckt
werden k�nnen. Das hei�t auch, dass Sie einige Anfragen �ndern m�ssen,
wenn Sie auf MySQL umsteigen. Das einfachste ist, Klammern hinzuzuf�gen.
Nehmen wir an, Sie haben die folgende @code{mSQL}-Anfrage:
@example
mysql> SELECT * FROM tabelle WHERE a=1 AND b=2 OR a=3 AND b=4;
@end example
Damit MySQL dies auf dieselbe Art auswertet wie @code{mSQL}, m�ssen Sie
Klammern hinzuf�gen:
@example
mysql> SELECT * FROM tabelle WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
@end example
@end table

@noindent
@strong{Zugriffskontrolle}

@table @code
@item MySQL
Hat Tabellen, in denen Berechtigungsoptionen pro Benutzer, Host, und
Datenbank gespeichert werden. @xref{Privileges}.
@item mSQL
Hat eine Datei @file{mSQL.acl}, in der Sie Lese-/Schreibrechte f�r Benutzer
gew�hren k�nnen.
@item
@end table


@node Compare PostgreSQL,  , Compare mSQL, Comparisons
@c German node Vergleich mit PostgreSQL
@subsection MySQL im Vergleich mit PostgreSQL

@cindex PostgreSQL im Vergleich mit MySQL, �berblick

Wenn Sie das Folgende lesen, beachten Sie bitte, dass sich beide Produkte
stetig entwickeln. Wir bei MySQL AB und die PostgreSQL-Entwickler geben
sich alle M�he, unsere jeweilige Datenbank so gut wie m�glich zu machen.
Daher sind es beide Produkte wert bei der Wahl einer kommerziellen Datenbank
ernsthaft in Betracht gezogen zu werden.

Der folgende Vergleich wurde von uns bei MySQL AB durchgef�hrt. Wir haben
uns bem�ht, so akkurat und fair wie m�glich zu sein. Da wir aber keine
vollst�ndige Kenntnis aller PostgreSQL-Features haben, w�hrend wir MySQL
sehr genau kennen, haben wir vielleicht ein paar Dinge falsch verstanden.
Wir werden das jedenfalls korrigieren, wenn es uns zu Ohren kommt.

Zun�chst wollen wir feststellen, dass sowohl PostgreSQL als auch MySQL weit
verbreitete Produkte sind, die aber unterschiedliche Entwurfsziele haben,
auch wenn beide sich bem�hen, ANSI-SQL-kompatibel zu sein. Das bedeutet,
dass MySQL f�r einige Applikationen besser geeignet ist, PostgreSQL f�r
andere. Wenn Sie �berlegen, welche Datenbank Sie w�hlen sollen, sollten Sie
zun�chst pr�fen, ob die Features der Datenbank f�r Ihre Applikation
zufrieden stellend sind. Wenn Sie satte Geschwindigkeit brauchen, wird Ihre
Wahl wahrscheinlich auf MySQL fallen. Wenn Sie einige der speziellen
Merkmale brauchen, die nur PostgreSQL anbieten kann, sollten Sie
@code{PostgreSQL} benutzen.

@cindex PostgreSQL/MySQL, Strategien


@menu
* MySQL-PostgreSQL goals::      
* MySQL-PostgreSQL features::   
* MySQL-PostgreSQL benchmarks::  
@end menu

@node MySQL-PostgreSQL goals, MySQL-PostgreSQL features, Compare PostgreSQL, Compare PostgreSQL
@c German node MySQL-PostgreSQL-Ziele
@subsubsection Entwicklungsstragien von MySQL und PostgreSQL

Wenn wir MySQL Dinge hinzuf�gen, ist es f�r uns eine Sache der Ehre, eine
optimale, definitive L�sungen zu schaffen. Der Code sollte so gut sein,
dass wir keine Notwendigkeit erkennen, ihn in der absehbaren Zukunft zu
�ndern. Wir wollen auch nicht Geschwindigkeit f�r Features opfern, sondern
sind aufs �u�erste bestrebt, eine L�sung zu finden, die maximalen
Durchsatz bietet. Das bedeutet, dass die Entwicklung ein bisschen l�nger
dauert, aber die Endergebnisse sind es wert. Diese Art von Entwicklung ist
nur m�glich, weil der gesamte Server-Code nur von wenigen Leuten gepr�ft
wird (aktuell zwei), bevor er in den MySQL-Server aufgenommen wird.

Wir bei MySQL AB halten viel von h�ufigen Releases, um in der Lage zu sein,
neue Features schnell an unsere Benutzer heraus zu geben. Deshalb bringen
wir etwa alle drei Wochen ein kleines Release heraus und einen gr��eren
Zweig (Branch) einmal im Jahr. Alle Releases werden gr�ndlich mit unseren
Testwerkzeugen auf vielen verschiedenen Plattformen getestet.

PostgreSQL basiert auf einem Kern (Kernel), zu dem viele Leute etwas
beigesteuert haben. Bei diesem Vorgehen ist es sinnvoll, dem Hinzuf�gen
neuer Features Priorit�t einzur�umen, statt sie optimal zu implementieren,
denn man kann immer noch sp�ter Dinge optimieren, wenn sich die
Notwendigkeit hierf�r ergibt.

Ein weiterer gro�er Unterschied zwischen MySQL und PostgreSQL besteht
darin, dass praktisch der gesamte Code des MySQL-Servers von Entwicklern
kodiert wurde, die bei MySQL AB angestellt sind und die immer noch am
Server-Code arbeiten. Ausnahmen bilden die Transaktions-Engines und die
Regexp-Bibliothek.

Das steht in scharfem Kontrast zum PostgreSQL-Code, wo der gr��te Teil des
Codes von einer gro�en Gruppe von Leuten mit unterschiedlichem Hintergrund
kodiert wird. Erst k�rzlich gaben die PostgreSQL-Entwickler bekannt, dass
ihre aktuelle Entwicklergruppe endlich Zeit gefunden hat, einen Blick auf
all den Code der aktuellen PostgreSQL-Version zu werfen.

Beide der genannten Entwicklungsmethoden hat Ihre Vorz�ge und Nachteile.
Wir hier bei MySQL AB sind nat�rlich der Meinung, dass unser Modell besser
ist, weil unser Modell bessere Konsistenz gew�hrleistet sowie mehr
optimalen und damit wiederverwendbaren Code und deshalb nach unserer
Meinung weniger Bugs. Weil wir die Autoren des MySQL-Server-Codes sind,
sind wir besser im Stande, neue Features und Releases zu koordinieren.


@node MySQL-PostgreSQL features, MySQL-PostgreSQL benchmarks, MySQL-PostgreSQL goals, Compare PostgreSQL
@c German node MySQL-PostgreSQL-Features
@subsubsection Feature-Vergleich von MySQL und PostgreSQL

@cindex PostgreSQL/MySQL, Features

Auf der Seite @uref{http://www.mysql.com/information/crash-me.php,
crash-me} finden Sie eine Liste der Datenbank-Konstrukte und
-Beschr�nkungen, die man automatisch mit einem Programm entdecken kann.
Beachten Sie jedoch, dass sich etliche numerische Beschr�nkungen mit
Start-Optionen der jeweiligen Datenbank �ndern lassen. Die genannte Seite
ist jedoch �u�erst n�tzlich, wenn Sie sicher stellen wollen, dass Ihre
Applikationen mit vielen unterschiedlichen Datenbanken funktionieren, oder
wenn Sie Ihre Applikation von einer Datenbank zu einer anderen konvertieren
wollen.

MySQL bietet folgende Vorz�ge gegen�ber PostgreSQL:

@itemize @bullet
@item
@code{MySQL} ist generell viel schneller als PostgreSQL.
@xref{MySQL-PostgreSQL benchmarks}.

@item
MySQL hat eine viel gr��ere Benutzer-Basis als PostgreSQL, deshalb ist der
Code besser getestet und hat sich historisch als stabiler erwiesen als der
von PostgreSQL.  MySQL wird sehr viel mehr in Produktionsumgebungen
eingesetzt als PostgreSQL, haupts�chlich dank der Tatsache, dass MySQL AB,
fr�her TCX DataKonsult AB, kommerziellen Support von h�chster Qualit�t f�r
MySQL geleistet hat, von dem Tag an, wo MySQL ver�ffentlicht wurde,
wohingegen PostgreSQL bis vor kurzem nicht supported war.

@item
MySQL funktioniert unter Windows besser als PostgreSQL.  MySQL l�uft als
native Windows-Applikation (als Systemdienst unter NT/Win2000/WinXP),
w�hrend PostgreSQL unter der cygwin-Emulation l�uft. Uns ist zu Ohren
gekommen, dass PostgreSQL nicht unter Windows nicht sehr stabil l�uft, aber
wir konnten das selbst noch nicht �berpr�fen.

@item
MySQL hat mehr APIs zu anderen Sprachen und wird von mehr existierenden
Programmen unterst�tzt als PostgreSQL.  @xref{Contrib}.

@item
MySQL l�uft auf 24/7-Systemen unter hoher Last. In den meisten F�llen
braucht man nie irgend welche Cleanups auf MySQL laufen lassen. PostgreSQL
unterst�tzt noch keine 24/7-Systeme, weil man gelegentlich @code{VACUUM()}
laufen lassen muss, um durch @code{UPDATE}- und @code{DELETE}-Kommandos
beanspruchten Platz zur�ck zu gewinnen, sowie um statistische Analysen
durchzuf�hren, die entscheidend sind, um mit PostgreSQL gute Performance zu
erzielen. @code{VACUUM()} wird auch ben�tigt nach dem Hinzuf�gen vieler
Zeilen in eine Tabelle. Auf einem ausgelasteten System mit vielen
�nderungen muss @code{VACUUM()} sehr h�ufig laufen gelassen werden, im
schlimmsten Fall mehrmals t�glich. W�hrend @code{VACUUM()} l�uft, was
Stunden dauern kann, wenn die Datenbank Gro� ist, ist die Datenbank vom
Produktionsstandpunkt her gesehen praktisch tot. Das PostgreSQL-Team hat
die Behebung dessen auf seiner TODO-Liste, aber wir vermuten, dass es nicht
einfach sein wird, das dauerhaft zu beheben.

@item
Ein funktionierendes, getestetes Replikations-Feature, das unter anderem
von folgenden Sites benutzt wird:
@itemize @minus
@item Yahoo Finance (@uref{http://finance.yahoo.com})
@item Mobile.de (@uref{http://www.mobile.de/})
@item Slashdot (@uref{http://www.slashdot.org})
@end itemize

@item
In der MySQL-Distribution werden zwei unterschiedliche Test-Suites
mitgeliefert:
@file{mysql-test-run} und 
@uref{http://www.mysql.com/information/crash-me.php,crash-me}, sowie eine
Benchmark-Suite. Das Testsystem wird rege mit Code aktualisiert, um jedes
neue Feature und alle wiederholbaren Fehler, die uns zu Ohren kamen, zu
testen. Vor jedem Release testen wir MySQL auf vielen verschiedenen
Plattformen. Diese Tests sind technisch ausgereifter als alles, was wir von
PostgreSQL gesehen haben, und sie stellen sicher, dass MySQL auf einem
hohen Standard gehalten wird.

@item
Es gibt wesentlich mehr gedruckte B�cher �ber MySQL als �ber PostgreSQL.
Alle gro�en Verlage wie O'Reilly, Sams, Que und New Riders bieten B�cher
�ber MySQL an. Alle MySQL-Features werden ausserdem im
MySQL-Online-Handbuch dokumentiert, denn wenn ein neues Feature
implementiert wird, sind die MySQL-Entwickler gehalten, es zu
dokumentieren, bevor es in den Quelltext eingeschlossen wird.

@item
MySQL unterst�tzt mehr Standard-ODBC-Funktionen als @code{PostgreSQL}.

@item
MySQL hat ein technisch ausgereifteres @code{ALTER TABLE}.

@item
MySQL unterst�tzt Tabellen ohne Transaktionen f�r Applikationen, die so
viel Geschwindigkeit brauchen, wie sie bekommen k�nnen. Tabellen k�nnen
Arbeitsspeicher-basierend, @code{HEAP}-Tabellen oder Festplatten-basierend
@code{MyISAM} sein. @xref{Table types}.

@item
MySQL unterst�tzt zwei verschiedene Tabellen-Handler, die Transaktionen
unterst�tzen: @code{BerkeleyDB} und @code{InnoDB}. Weil jede
Transaktions-Engine unter unterschiedlichen Bedingungen unterschiedlich
leistungsf�hig ist, gibt das dem Applikationsschreiber mehr Optionen, die
optimale L�sung f�r seinen Bedarf zu finden. @xref{Table types}.

@item
@code{MERGE}-Tabellen geben Ihnen eine einzigartige M�glichkeit, eine
augenblickliche Sicht (View) �ber eine Reihe identischer Tabellen zu machen
und diese wie eine zu benutzen. Das ist perfekt f�r Systeme, auf denen Sie
Log-Dateien haben, die Sie zum Beispiel nach Monat sortieren. @xref{MERGE}.

@item
Die Option, Nur-Lese-Tabellen zu komprimieren, aber dennoch direkten
Zugriff auf die Zeilen der Tabelle zu haben, gibt Ihnen dadurch bessere
Performance, dass Festplattenzugriffe minimiert werden. Das ist sehr
n�tzlich, wenn Sie Dinge archivieren. @xref{myisampack}.

@item
MySQL hat internen Support f�r Volltextsuche. @xref{Fulltext Search}.

@item
Sie k�nnen von derselben Verbindung aus auf viele Datenbanken zugreifen
(was nat�rlich von Ihren Zugriffsrechten abh�ngt).

@item
MySQL wurde von Anfang an multi-threaded kodiert, w�hrend PostgreSQL
Prozesse benutzt. Umschalten zwischen unterschiedlichen Zusammenh�ngen
(Context Switching) und Zugriff auf allgemeine Speicherbereiche geht
zwischen Threads wesentlich schneller als zwischen separaten Prozessen. Das
bringt MySQL einen gro�en Geschwindigkeitsvorteil in
Mehrbenutzer-Applikationen und macht es obendrein f�r MySQL einfacher, den
vollen Nutzen aus symmetrischen Multiprozessor-Systemen (SMP) zu ziehen.

@item
MySQL hat ein technisch ausgereifteres System der Zugriffsberechtigungen
(Berechtigungssystem) als PostgreSQL.  
PostgreSQL unterst�tzt nur @code{INSERT}-, @code{SELECT}- und
@code{UPDATE/DELETE}-Rechtegew�hrung (Grants) pro Benutzer auf eine
Datenbank oder Tabelle. MySQL dagegen erlaubt es Ihnen, einen kompletten
Satz unterschiedlicher Zugriffsrechte auf Datenbank-, Tabellen- und 
Spaltenebene festzulegen.  MySQL gestattet es auch, Zugriffsrechte als
Host- und Benutzer-Kombinationen festzulegen. @xref{GRANT}.

@item
MySQL unterst�tzt ein komprimiertes Client/Server-Protokoll, was die
Performance �ber langsame Verbindungen verbessert.

@item
MySQL f�hrt ein ``Tabellen-Handler''-Konzept ein und ist die einzige
relationale Datenbank, die wir kennen, die um dieses Konzept herum
aufgebaut ist. Das sorgt daf�r, dass unterschiedliche
Low-Level-Tabellentypen an die SQL-Engine angeflanscht werden k�nnen, und
dass jeder Tabellentyp f�r unterschiedliche Performance-Charakteristiken
optimiert werden kann.

@item
Alle MySQL-Tabellentypen (ausser @strong{InnoDB}) sind als Dateien
implementiert (eine Tabelle pro Datei), wodurch Datensicherungen,
Verschieben, L�schen und sogar Symlinks auf Datenbanken und Tabellen
wirklich einfach werden, selbst wenn der Server herunter gefahren ist.

@item
Werkzeuge, um @strong{MyISAM}-Tabellen (der meistbenutzte MySQL-Tabellentyp) zu
reparieren und zu optimieren. Ein Reparaturwerkzeug wird nur dann ben�tigt,
wenn eine Datendatei physikalisch besch�digt wurde, was �blicherweise bei
Hardwareproblemen der Fall ist. Das Werkzeug kann meist den gr��ten Teil der
Daten retten.

@item
Auf eine h�here Version von MySQL aktualisieren (Upgrade) geht problemlos.
Wenn Sie MySQL aktualisieren, brauchen Sie Ihre Daten nicht zusichern (dump)
und zur�ckzusichern (restore), wie Sie es mit PostgreSQL tun m�ssen, wenn Sie
dieses aktualisieren.
@end itemize

Nachteile von MySQL im Vergleich zu PostgreSQL:

@itemize @bullet
@item
Die Transaktionsunterst�tzung in MySQL ist noch nicht so gut getestet wie
das System von PostgreSQL.

@item

Weil MySQL Threads benutzt, die auf vielen Betriebssystemen noch nicht ganz
tadellos funktionieren, muss man entweder die Bin�rdateien von
@uref{http://www.mysql.com/downloads} benutzen oder genau unsere
Anweisungen auf @uref{http://www.mysql.com/doc/I/n/installation_source.html}
befolgen, um eine optimale Bin�rdatei zu erhalten, die in jedem Fall
funktioniert.

@item
Tabellensperren (Locks), die von den nicht transaktionalen
@code{MyISAM}-Tabellen benutzt werden, sind in vielen F�llen schneller als
Seiten-Sperren (Page Locks), Zeilen-Sperren (Row Locks) oder Versionierung
(Versioning). Der Nachteil liegt jedoch darin, dass, wenn man nicht
ber�cksichtigt, wie Tabellensperren funktioniert, eine einzige lang
laufende Anfrage eine Tabelle lange Zeit f�r Updates blockieren kann. Das
kann gew�hnlich durch entsprechenden Entwurf der Applikation vermieden
werden. Falls nicht, kann man immer noch die Tabelle, die das Problem
verursacht, zu einem der transaktionalen Tabellentypen um�ndern.
@xref{Table locking}.

@item
Mit UDF (User Defined Functions, Benutzerdefinierten Funktionen) kann man
MySQL sowohl hinsichtlich SQL-Funktionen als auch Aggregaten erweitern,
aber das ist noch nicht so einfach und flexibel wie in PostgreSQL.
@xref{MySQL internals}.

@item
Updates, die �ber mehrere Tabellen laufen, sind in MySQL schwieriger
durchzuf�hren. Das wird jedoch in MySQL 4.0 mit dem
Multi-Table-@code{UPDATE} behoben sein und in MySQL 4.1 mit den Subselects.
In MySQL 4.0 kann man Multi-Table-Deletes nutzen, um zeitgleich in mehreren
Tabellen zu l�schen. @xref{DELETE}.
@end itemize

PostgreSQL hat momentan folgende Vorteile gegen�ber MySQL:

Weil wir die Pl�ne (Roadmap) von MySQL kennen, haben wir in der folgenden
Tabelle die Versionsnummern der jeweiligen MySQL-Version untergebracht, die
das entsprechende Feature unterst�tzen wird. Leider konnten wir das nicht
f�r fr�here Vergleiche machen, denn wir kennen nicht kennen nicht die Pl�ne
(Roadmap) von PostgreSQL.

@multitable @columnfractions .70 .30
@item @strong{Feature}                     @tab @strong{MySQL version}
@item Subselects                           @tab 4.1
@item Fremdschl�ssel                       @tab 4.0 und 4.1
@item Sichten (Views)                      @tab 4.2
@item Gespeicherte Prozeduren              @tab 4.1
@item Erweiterbares Typ-System             @tab Nicht geplant
@item Unions                               @tab 4.0
@item Full Join                            @tab 4.0 oder 4.1
@item Trigger                              @tab 4.1
@item Constrainst                          @tab 4.1
@item Cursor                               @tab 4.1 oder 4.2
@item Erweiterbare Indextypen wie R-Trees  @tab R-trees sind geplant f�r 4.2
@item Vererbte (Inherited) Tabellen        @tab Nicht geplant
@end multitable

Andere Gr�nde, PostgreSQL zu benutzen:

@itemize @bullet
@item
Im Standardgebrauch ist PostgreSQL in einigen F�llen n�her an ANSI-SQL
angelehnt.

@item
Man kann PostgreSQL beschleunigen, indem man Dinge als gespeicherte
Prozeduren kodiert.

@item
PostgreSQL hat ein gr��eres Entwicklerteam, das Code zum Server
beisteuert.
@end itemize

Nachteile von PostgreSQL im Vergleich zu MySQL:

@itemize @bullet
@item
@code{VACUUM()} macht es problematisch, PostgreSQL in 24/7-Umgebungen
einzusetzen.

@item
Nur Transaktionstabellen.

@item
Viel langsamere @code{INSERT}, @code{DELETE} und @code{UPDATE} Anweisungen.
@end itemize

Eine vollst�ndige Aufstellung der Nachteile finden Sie in der ersten
Tabelle dieses Abschnitts.



@node MySQL-PostgreSQL benchmarks,  , MySQL-PostgreSQL features, Compare PostgreSQL
@c German node MySQL-PostgreSQL-Benchmarks
@subsubsection Benchmark-Vergleiche von MySQL und PostgreSQL

@cindex PostgreSQL im Vergleich mit MySQL, Benchmarks

Der einzige Open-Source-Benchmark-Test, den wir kennen, der benutzt werden
kann, um MySQL und PostgreSQL (und andere Datenbanken) miteinander zu
vergleichen, ist unser eigener. Man findet ihn auf
@uref{http://www.mysql.com/information/benchmarks.html}.

Wir haben mehrfach bei den PostgreSQL-Entwicklern und bei einigen
PostgreSQL-Benutzer nachgefragt, ob sie bereit w�ren, uns zu helfen, diesen
Benchmark-Test zu erweitern, um ihn zu dem definitiven Benchmark-Test f�r
Datenbanken zu machen, haben aber leider keinerlei R�ckmeldung erhalten.

Wir, die MySQL-Entwickler, haben deshalb viele Stunden damit verbracht,
f�r den Benchmark-Test maximale Performance aus PostgreSQL heraus zu
bekommen, aber da wir mit PostgreSQL nicht sehr weitgehend vertraut sind,
sind wir sicher, dass wir einige Dinge vers�umt haben. Auf der
Benchmark-Seite haben wir genau dokumentiert, wie wir den Benchmark-Test
durchgef�hrt haben, deshalb sollte es f�r jeden einfach sein, ihn zu
wiederholen und unsere Ergebnisse zu best�tigen.

Die Benchmarks werden �blicherweise mit und ohne die @code{--fast}-Option
durchgef�hrt. Wenn wir sie mit @code{--fast} durchf�hren, versuchen wir,
jeden Trick zu nutzen, den der Server benutzt, um den Code so schnell wie
m�glich auszuf�hren. Die Idee dahinter ist, dass der Server zeigen sollte,
wie er mit Vorgabeeinstellungen l�uft und @code{--fast} sollte zeigen, wie
der Server l�uft, wenn der Applikationsentwickler Erweiterungen im Server
nutzt, um seine Applikation schneller laufen zu lassen.

Wenn wir PostgreSQL mit der @code{--fast}-Option laufen lassen, machen wir
ein @code{VACUUM()} nach jedem gr��eren Tabellen-@code{UPDATE} und
@code{DROP TABLE}, um die Datenbank in beste Verfassung f�r die folgenden
@code{SELECT}s zu bringen. Die Zeit f�r @code{VACUUM()} wird separat
gemessen.

PostgreSQL 7.1.1 konnten wir jedoch nicht mit der Option @code{--fast}
laufen lassen, weil der Postmaster (der PostgreSQL Daemon) w�hrend eines
@code{INSERT}-Tests starb und die Datenbank so besch�digt war, dass es
unm�glich war, den Postmaster neu zu starten. Nachdem dies zweimal
geschehen war, entschieden wir uns, den Test mit @code{--fast} bis zum
n�chsten PostgreSQL-Release zu verschieben. Die Details zur Maschine, die
wir f�r den Benchmark benutzten, stehen auf der Benchmark-Seite.

Bevor wir uns den anderen Benchmarks, die wir kennen, zuwenden, m�chten wir
ein paar Hintergrundinformationen zu Benchmarks geben:

Es ist sehr einfach, einen Test zu schreiben, der zeigt, dass JEDE
BELIEBIGE Datenbank die beste der Welt ist, indem man den Test einfach auf
etwas beschr�nkt, was diese Datenbank sehr gut kann und nichts anderes
testet, was die Datenbank nicht gut kann. Wenn man dann noch das Ergebnis
mittels einer einzigen Zahl ver�ffentlicht, macht das die Dinge sogar noch
einfacher.

Das w�re, als ob wir die Geschwindigkeit von MySQL gegen�ber PostgreSQL
anhand der Messzeit-Zusammenfassung der MySQL-Benchmarks auf unserer
Webseite vergleichen w�rden. Auf dieser Basis w�re MySQL mehr als 40 Mal
schneller als PostgreSQL, was nat�rlich nicht stimmt. Wir k�nnten die Sache
sogar noch verschlimmern, indem wir nur etwas testen, worin PostgreSQL die
schlechtesten Leistungsdaten bringt und geltend machen, dass MySQL mehr als
2000 Mal schneller ist als PostgreSQL.

Tatsache ist, dass MySQL eine Menge Optimierungen vornimmt, die PostgreSQL
nicht vornimmt. Das ist nat�rlich auch umgekehrt so. Ein SQL-Optimierer ist
eine sehr komplexe Sache, und ein Unternehmen k�nnte Jahre damit zubringen,
nur den Optimierer schneller und schneller zu machen.

Wenn Sie sich die Ergebnisse der Benchmarks ansehen, sollten Sie nach
Dingen Ausschau halten, die Sie in Ihrer Applikation durchf�hren, und dann
nur diese Ergebnisse benutzen, um zu entscheiden, welche Datenbank wohl am
besten f�r Ihre Applikation geeignet ist. Die Benchmark-Ergebnisse zeigen
ausserdem auf, worin eine bestimmte Datenbank nicht gut ist, was Ihnen eine
Ahnung davon geben sollte, welche Dinge Sie am besten vermeiden und was Sie
auf andere Weise machen sollten.

Wir kennen zwei Benchmark-Tests, die behaupten, dass PostgreSQL bessere
Leistungsdaten bringt als MySQL. Beide waren Mehrbenutzer-Tests, ein Test,
den zu schreiben wir bei MySQL AB nie die Zeit hatten, haupts�chlich, weil
es eine wirklich gro�e Aufgabe ist, wenn man will, dass der Test fair zu
allen Datenbanken ist.

Einer der Tests ist derjenige, f�r den Great Bridge bezahlt hat, und �ber
den Sie hier lesen k�nnen:
@uref{http://www.greatbridge.com/about/press.php?content_id=4}.

Es ist wahrscheinlich der schlechteste Benchmark-Test, den wir jemals
gesehen haben. Er war nicht nur so eingestellt, dass er das testete, was
PostgreSQL absolut am besten kann, er war auch v�llig unfair zu jeder
anderen Datenbank, die in diesen Test einbezogen wurde.

@strong{ACHTUNG}: Wir wissen, dass niemand der haupts�chlichen
PostgreSQL-Entwickler die Art mochte, wie Great Bridge den Test
durchgef�hrt hat, daher geben wir ihnen keinerlei Schuld daf�r.

Dieser Benchmark wurde in einer Menge Postings und Newsgroups verurteilt,
daher beschr�nken wir uns hier darauf, kurz einige Dinge zu wiederholen,
die dabei nicht stimmten.

@itemize @bullet
@item
Die Tests wurden mit einem teuren, kommerziellen Werkzeug durchgef�hrt, was es
f�r ein Open-Source-Unternehmen wie uns unm�glich macht, den Benchmark zu
verifizieren, selbst einfach nur zu �berpr�fen, wie der Benchmark
eigentlich durchgef�hrt wurde. Das Werkzeug ist nicht einmal ein echtes
Benchmark-Werkzeug, sondern vielmehr ein Applikations-/Setup-Test-Werkzeug. Darauf
als ``Standard''-Benchmark-Werkzeug Bezug zu nehmen hei�t, es mit der Wahrheit
nicht so genau zu nehmen.

@item
Great Bridge hat zugegeben, dass sie die PostgreSQL-Datenbank optimiert
haben (mit @code{VACUUM()} vor dem Test) und dass sie das Starten vor dem
Test getuned haben, etwas, das sie f�r keine der anderen getesteten
Datenbanken gemacht haben. Dazu hei�t es: ``Dieser Prozess optimiert
Indexe und gibt etwas Festplattenspeicher frei. Die optimierten Indexe
steigern die Performance um etliches.'' Unsere Benchmarks zeigen deutlich,
dass der Unterschied bei einer gro�en Menge von Selects auf eine Datenbank
mit und ohne @code{VACUUM()} leicht Faktor zehn betragen kann.

@item
Die Testergebnisse waren ebenfalls merkw�rdig. Die AS3AP-Test-Dokumentation
erw�hnt, dass der Test ``Auswahlen, einfache Verkn�pfungen, Projektionen, 
Aggregierungen, 1-Tupel-Updates und Massen-Updates'' durchf�hrt.

PostgreSQL ist gut bei der Durchf�hrung von @code{SELECT}s und @code{JOIN}s
(speziell nach einem @code{VACUUM()}), performt aber nicht so gut bei
@code{INSERT}s oder @code{UPDATE}s. Die Benchmarks scheinen anzuzeigen,
dass nur @code{SELECT}s durchgef�hrt wurden (oder sehr wenige Updates). Das
w�rde die guten Ergebnisse f�r PostgreSQL in diesem Test erkl�ren. Etwas
weiter unten wird erl�utert, wie es zu den schlechten Ergebnissen f�r MySQL
kam.

@item
Sie lie�en den so genannten Benchmark von einer Windows-Maschine zu einer
Linux-Maschine �ber ODBC laufen, was ein normaler Datenbankbenutzer nie
machen w�rde, wenn er eine unter hoher Last laufende
Mehrbenutzer-Applikation laufen lassen w�rde. Dadurch wurde eher der
ODBC-Treiber und das benutzte Windows-Protokoll zwischen den Clients
getestet als die Datenbank selbst.

@item
Als Sie die Datenbank mit Oracle und MS-SQL betrieben (Great Bridge hat
indirekt angedeutet, dass das die Datenbanken waren, die im Test benutzt
wurden), benutzten sie nicht das native Protokoll, sondern statt dessen
ODBC. Jeder, der jemals Oracle benutzt hat, wei�, dass alle echten
Applikationen die native Schnittstelle anstatt ODBC benutzen. Einen Test
mit ODBC fahren und erkl�ren, dass das irgend etwas mit Situationen des
echten Lebens zu tun hat, kann kaum als fair erachtet werden. Sie h�tten
zwei Tests fahren sollen: einen mit und einen ohne ODBC, um die korrekten
Fakten zu ermitteln (nat�rlich, nachdem sie Experten geholt h�tten, die
alle getesteten Datenbanken optimal eingestellt h�tten).

@item
Sie verweisen auf die TPC-C-Tests, erw�hnen aber an keiner Stelle, dass der
Test, den sie fuhren, kein echter TPC-C-Test war und dass es ihnen nicht
einmal erlaubt ist, das einen TPC-C-Test zu nennen. Ein TPC-C-Test darf nur
nach den Regeln durchgef�hrt werden, die vom TPC-Rat (TPC Council)
festgelegt wurden (@uref{http://www.tpc.org}). Great Bridge hat das nicht
getan. Damit haben sie sowohl das Markenzeichen TPC verletzt als auch ihre
eigenen Benchmarks in Misskredit gebracht. Die Regeln, die vom TPC-Rat
aufgestellt wurden, sind sehr streng, um sicherzustellen, dass niemand
falsche Ergebnisse produziert oder nicht beweisbare Erkl�rungen abgibt.
Offensichtlich hat das Great Bridge nicht interessiert.

@item
Nach dem ersten Test haben wir Kontakt mit Great Bridge aufgenommen und
ihnen gegen�ber einige der offensichtlichen Fehler erw�hnt, die sie bei
MySQL gemacht haben:

@itemize @minus
@item
Sie haben MySQL mit einer Debug-Version unseres ODBC-Treibers laufen
lassen.

@item
Sie haben MySQL auf einem Linux-System laufen lassen, das nicht f�r Threads
optimiert war.

@item
Sie haben eine alte MySQL-Version zu einem Zeitpunkt benutzt, als eine
empfohlene neuere bereits verf�gbar war.

@item
Sie haben MySQL nicht mit den richtigen Optionen f�r hohe Last und
Mehrbenutzerbetrieb gestartet (die vorgabem��ige Installation von MySQL
ist auf minimalen Ressourcenverbrauch eingestellt).
@end itemize

Great Bridge hat einen neuen Test gefahren, wobei zwar unsere optimierten
ODBC-Treiber und bessere Startoptionen f�r MySQL benutzt wurden, weigerte
sich aber, entweder unsere aktualisierte glibc-Bibliothek oder unsere
Standard-Bin�rversion (von mehr als 80% unserer Benutzer genutzt) zu
verwenden, sondern benutzte statt dessen eine statisch gelinkte feste
glibc-Bibliothek.

Nach allem, was wir wissen, hat Great Bridge nichts getan, um
sicherzustellen, dass die anderen Datenbanken korrekt konfiguriert wurden,
um in ihrer Testumgebung gut zu laufen. Wir sind jedoch sicher, dass sie
weder Oracle noch Microsoft kontaktiert haben, um sie um Rat in dieser
Angelegenheit zu bitten ;)

@item
Der Benchmark wurde von Great Bridge bezahlt und sie beschlossen, nur
teilweise, ausgew�hlte Ergebnisse zu ver�ffentlichen (statt alles publik zu
machen).
@end itemize

Tim Perdue, seit langer Zeit PostgreSQL-Fan und ein widerwilliger
MySQL-Benutzer, hat einen Vergleich auf
@uref{http://www.phpbuilder.com/columns/tim20001112.php3,phpbuilder}
ver�ffentlicht.

Als wir von diesem Vergleich erfuhren, telefonierten wir mit Tim Perdue zu
diesem Thema, weil es eine Menge merkw�rdiger Dinge in seinen Ergebnissen
gab. Er behauptete zum Beispiel, dass MySQL bei seinem Test ein Problem mit
f�nf Benutzern hatte, w�hrend wir wissen, dass es Benutzer mit �hnlichen
Maschinen wie seine gibt, die MySQL mit 2000 simultanen Verbindungen
betreiben, die 400 Anfragen pro Sekunde abarbeiten. (In diesem Fall war die
Beschr�nkung durch die Web-Bandbreite gegeben, nicht durch die Datenbank.)

Es schien, als h�tte er einen Linux-Kernel benutzt, der entweder Probleme
mit vielen Threads hatte, wie ein Kernel vor Version 2.4, der ein Problem
mit vielen Threads auf Mehrprozessor-Maschinen hat. Wir haben in diesem
Handbuch dokumentiert, wie man das behebt, und Tim sollte sich dieses
Problems bewusst sein.

Das andere m�gliche Problem k�nnte eine alte glibc-Bibliothek gewesen sein,
und dass Tim keine MySQL-Bin�rdistribution von unserer Site benutzte, die
mit einer korrigierten glibc-Bibliothek gelinkt ist, sondern statt dessen
eine eigene Version kompiliert hat. Bei jedem der genannten F�lle w�rden
die Symptome genau die sein, die Tim gemessen hat.

Wir haben Tim gebeten, uns Zugang zu seinen Daten zu geben, damit wir den
Benchmark-Test wiederholen k�nnten, sowie die MySQL-Version auf seiner
Maschine zu pr�fen, um herauszufinden, was falsch lief, und er hat
versprochen, uns entsprechende Mitteilung zu geben. Das hat er bis heute
nicht gemacht.

Aus diesem Grund k�nnen wir auch diesem Benchmark in keiner Weise vertrauen
:(

Im Zeitverlauf haben sich die Dinge auch ge�ndert und die genannten
Benchmarks sind nicht mehr so relevant. MySQL hat mittlerweile eine Reihe
unterschiedlicher Tabellen-Handler mit unterschiedlichen Verh�ltnissen
zwischen Geschwindigkeit und Anzahl gleichzeitiger Zugriffe
(Speed/Concurrency Tradeoffs). @xref{Table types}. Es w�re interessant zu
sehen, wie die obigen Tests mit den verschiedenen transaktionalen Tabellen
von MySQL laufen w�rden. PostgreSQL hat nat�rlich auch neue Features
erhalten, seit die Tests durchgef�hrt wurden. Weil die genannten Tests
nicht �ffentlich erh�ltlich sind, gibt es keine M�glichkeit f�r uns
herauszufinden, wie die Datenbank heute mit denselben Tests laufen w�rde.


Fazit:

Der einzige Benchmark, der heutzutage existiert, den jeder herunter laden
und laufen lassen kann, um MySQL und PostgreSQL zu vergleichen, ist der
MySQL-Benchmark-Test. Wir hier bei MySQL sind der �berzeugung, dass
Open-Source-Datenbanken mit Open-Source-Werkzeuge getestet werden sollten! Das
ist die einzige M�glichkeit, um sicherzustellen, dass niemand Tests f�hrt,
die nicht reproduzierbar sind, und diese dazu benutzt, um zu behaupten,
dass eine Datenbank besser sei als die eine andere. Ohne die Fakten zu
kennen ist es unm�glich, auf die Behauptungen des Testers einzugehen.

Eine Sache, die wir merkw�rdig finden, ist, dass jeder Test, den wir zu
PostgreSQL gesehen haben - und wo es unm�glich ist, diesen zu wiederholen
-, behauptet, dass PostgreSQL in den meisten Hinsichten besser sei, w�hrend
unsere Tests, die jeder reproduzieren kann, eindeutig das Gegenteil
beweisen. Damit wollen wir nicht sagen, dass PostgreSQL nicht vieles sehr
gut kann (das kann es!) oder dass es nicht unter bestimmten Umst�nden
schneller ist als MySQL. Wir w�rden nur gern einen fairen Test sehen, der
zeigt, worin PostgreSQL sehr gut ist, damit wir einen freundlichen
Wettbewerb anzetteln k�nnen!

Mehr Informationen �ber unsere Benchmark-Suite finden Sie unter @xref{MySQL Benchmarks}.

Wir arbeiten an einer noch besseren Benchmark-Suite, die Mehrbenutzer-Tests
beinhaltet sowie eine bessere Dokumentation dessen, was die einzelnen Tests
genau tun und wie man weitere Tests zur Suite hinzuf�gt.

@node Installing, Tutorial, Deutsch, Top
@c German node Installation
@chapter Installation von MySQL

@cindex Installation, �berblick


Dieses Kapitel beschreibt, woher man MySQL bezieht und wie man MySQL
installiert:

@itemize @bullet
@item
Eine Liste der Site, von denen Sie MySQL beziehen k�nnen, finden Sie unter
@ref{Getting MySQL, , Wie man MySQL erh�lt}.

@item
@c German FIX unsplit @ref
Um festzustellen, welche Plattformen unterst�tzt werden, siehe
@ref{Which OS}. Beachten Sie bitte, dass nicht alle
unterst�tzten Systeme gleich gut
sind, um MySQL laufen zu lassen. Auf einigen l�uft es sehr viel robuster
und effizienter als auf anderen - siehe @ref{Which OS} f�r
Details.

@item
Mehrere Versionen von MySQL sind sowohl als Bin�r- als auch als
Quellcode-Distributionen erh�ltlich. Wir stellen auch �ffentlichen Zugriff
auf unseren aktuellen Quellcode-Baum f�r diejenigen zur Verf�gung, die die
aktuellsten Entwicklungen sehen und uns helfen wollen, neuen Code zu
testen. Um festzustellen, welche Version und welche Art von Distribution Sie
benutzen sollten, siehe @ref{Which version}. Im Zweifelsfall benutzen Sie
die Bin�rdistribution.

@item
Installationsanleitungen f�r Bin�r- und Quelldistributionen sind
beschrieben in @ref{MySQL binaries} und @ref{Installing source}. Jede
Anleitung enth�lt einen Abschnitt �ber System-spezifische Probleme, denen
Sie begegnen k�nnen.

@item
Prozeduren, die nach der Installation durchgef�hrt werden sollen / m�ssen,
finden Sie unter @ref{Post-installation}. Diese Prozeduren gelten, egal ob
Sie MySQL von einer Bin�r- oder einer Quellcode-Distribution installieren.
@end itemize


@menu
* Quick Standard Installation::  
* General Installation Issues::  
* Installing source::           
* Post-installation::           
* Upgrade::                     
* Operating System Specific Notes::  
* Perl support::                
@end menu

@node Quick Standard Installation, General Installation Issues, Installing, Installing
@c German node Schnelle Standard-Installation
@section Schnelle Standard-Installation von MySQL

@c This node name ist special


@menu
* Linux-RPM::                   
* Windows installation::        
@end menu

@node Linux-RPM, Windows installation, Quick Standard Installation, Quick Standard Installation
@c German node Linux-RPM
@subsection MySQL auf Linux installieren

@cindex RPM-Datei
@cindex RedHat Package Manager

Die empfohlene Vorgehensweise f�r die Installation von MySQL auf Linux ist
die Benutzung einer RPM-Datei. Die MySQL-RPMs werden aktuell auf einer
RedHat-Version 6.2 gebaut, sollten aber auch auf anderen Linux-Versionen
funktionieren, die @code{rpm} unterst�tzen und @code{glibc} benutzen.

Wenn Sie Probleme mit einer RPM-Datei haben, wenn Sie beispielsweise den
Fehler ``@code{Sorry, the host 'xxxx' could not be looked up}'' erhalten,
sehen Sie bitte unter @ref{Linux-RPM} nach.

Die RPM-Dateien, die Sie benutzen sollten, sind:

@itemize @bullet
@item @code{MySQL-VERSION.i386.rpm}

Der MySQL-Server. Sie brauchen diese, es sei denn, Sie wollen sich
lediglich mit einem MySQL-Server verbinden, der auf einer anderen Maschine
l�uft.

@item @code{MySQL-client-VERSION.i386.rpm}

Die Standard-MySQL-Client-Programme. Dieses Paket sollten Sie wohl immer
installieren.

@item @code{MySQL-bench-VERSION.i386.rpm}

Tests und Benchmarks. Erfordert Perl und msql-mysql-modules RPMs.

@item @code{MySQL-devel-VERSION.i386.rpm}

Bibliotheken und Include-Dateien, die ben�tigt werden, wenn Sie andere
MySQL-Clients kompilieren wollen, beispielsweise Perl-Module.

@item @code{MySQL-VERSION.src.rpm}

Dieses Paket enth�lt den Quelltext f�r alle obigen Pakete. Es kann auch
dazu benutzt werden, um RPMs f�r andere Architekturen zu bauen (zum
Beispiel f�r Alpha oder SPARC).
@end itemize

Um alle Dateien in einem RPM-Paket zu sehen, geben Sie folgendes ein:
@example
shell> rpm -qpl MySQL-VERSION.i386.rpm
@end example

Um eine minimale Standard-Installation durchzuf�hren, geben Sie folgendes
ein:

@example
shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
@end example

Um nur das Client-Paket zu installieren, geben Sie folgendes ein:

@example
shell> rpm -i MySQL-client-VERSION.i386.rpm
@end example

Das RPM legt Dateien in @file{/var/lib/mysql} ab. Ausserdem erzeugt das RPM
die entsprechenden Eintr�ge in @file{/etc/rc.d/}, um den Server beim Booten
automatisch zu starten. (Falls Sie bereits vorher eine Installation
durchgef�hrt haben, bedeutet das, dass Sie eine Kopie Ihrer vorher
installierten MySQL-Startdateien machen sollten, falls Sie darin �nderungen
vorgenommen haben, damit Sie diese �nderungen nicht verlieren.)

Nach der Installation der RPM-Datei(en) sollte der @code{mysqld}-Daemon
laufen und Sie sollten jetzt in der Lage sein, mit der Benutzung von MySQL
zu beginnen. @xref{Post-installation}.

Wenn etwas schief geht, finden Sie weitere Informationen im Kapitel �ber
die Bin�r-Installationen. @xref{MySQL binaries}.

@node Windows installation,  , Linux-RPM, Quick Standard Installation
@c German node Windows-Installation
@subsection Installation von MySQL unter Windows

Der MySQL-Server f�r Windows ist in zwei Distributionstypen erh�ltlich:
@enumerate
@item
Die Bin�rdistribution enth�lt ein Setup-Programm, das alles Ben�tigte
installiert, so dass Sie den Server sofort starten k�nnen.
@item
Die Quelldistribution enth�lt den gesamten Code und
Unterst�tzungsdateien, um die ausf�hrbaren Dateien unter Benutzung des
VC++-6.0-Kompilers zu bauen.
@xref{Windows source build}.
@end enumerate

Im Allgemeinen sollten Sie die Bin�rdistribution benutzen.

Sie ben�tigen folgendes:
@itemize @bullet
@item
Ein Windows-32-Bit-Betriebssystem der Familien Windows 9x, ME, NT oder
Windows 2000. Die NT-Familie gestattet, den MySQL-Server als
Systemdienst laufen zu lassen. @xref{NT start}.

Wenn Sie Tabellen benutzen, die gr��er als 4 GB sind, sollten Sie MySQL
auf NTFS oder einem neueren Dateisystem installieren. Vergessen Sie bei
der Erzeugung der Tabellen nicht, @code{MAX_ROWS} und
@code{AVG_ROW_LENGTH} zu benutzen. @xref{CREATE TABLE}.
@item
TCP/IP-Protokollunterst�tzung.
@item
Die MySQL-Bin�r- oder Quelldistribution f�r Windows kann von
@uref{http://www.mysql.com/downloads/} herunter geladen werden.

Hinweis: Die Distributionsdateien werden in einem komprimierten Format
zur Verf�gung gestellt. Wir empfehlen die Benutzung eines FTP-Clients,
der in der Lage ist, abgebrochene FTP-Downloads wieder aufzunehmen
(resume).
@item
Ein @code{ZIP}-Programm, um die Distributionsdatei zu entpacken.
@item
Genug Platz auf der Festplatte, um die Datenbanken entsprechend Ihren
Anforderungen zu entpacken, zu installieren und zu erzeugen.
@item
Wenn Sie planen, sich �ber @code{ODBC} mit dem MySQL-Server zu
verbinden, ben�tigen Sie zus�tzlich den @code{MyODBC}-Treiber.
@xref{ODBC}.
@end itemize



@menu
* Windows binary installation::  
@end menu

@node Windows binary installation,  , Windows installation, Windows installation
@c German node Windows-Bin�rinstallation
@subsubsection Bin�rdateien installieren

@enumerate
@item
Wenn Sie auf einem NT- oder Windows-2000-Server arbeiten, melden Sie
sich als Benutzer mit Administrationsrechten an.
@item
Wenn Sie ein Upgrade einer fr�heren MySQL-Installation durchf�hren,
m�ssen Sie den Server anhalten. Wenn Sie den Server als Systemdienst
laufen lassen, geben Sie ein:

@example
C:\> NET STOP MySQL
@end example

Ansonsten geben Sie folgendes ein:

@example
C:\mysql\bin> mysqladmin -u root shutdown
@end example

@item
Auf NT-/Windows-2000-Maschinen m�ssen Sie auch den Systemdienst
entfernen, wenn Sie die ausf�hrbare Datei des Servers (z. B. -max or -nt) austauschen wollen:

@example
C:\mysql\bin> mysqld-max-nt --remove
@end example

@item
Entpacken Sie die Distributionsdatei in ein tempor�res Verzeichnis.
@item
Starten Sie @file{setup.exe}, um den Installationsprozess zu beginnen.
Wenn Sie in ein anderes Verzeichnis als das vorgabem��ige
(@file{c:\mysql}) installieren wollen, legen Sie mit der Schaltfl�che
@code{Durchsuchen} das gew�nschte Verzeichnis fest.
@item
Beenden Sie den Installationsprozess.
@end enumerate


Seit MySQL 3.23.38 enth�lt die Windows-Distribution sowohl die normalen als
auch die @strong{MySQL-Max}-Bin�rdateien. Der wichtigste Vorteil der
Benutzung der normalen @code{mysqld.exe}-Bin�rdatei liegt darin, dass sie
etwas schneller ist und weniger Ressourcen belegt.

Hier ist eine Liste der unterschiedlichen MySQL-Server, die Sie benutzen
k�nnen:
@multitable @columnfractions .25 .75
@item @code{mysqld} @tab Kompiliert mit komplettem Debugging und automatischer �berpr�fung der Speicherzuordnung (memory allocation), symbolischen Links, InnoDB- und BDB-Tabellen.
@item @code{mysqld-opt} @tab Optimierte Bin�rdistribution ohne Unterst�tzung von Transaktionstabellen.
@item @code{mysqld-nt} @tab Optimierte Bin�rdatei f�r NT mit Unterst�tzung von Named Pipes. Man kann diese Version auf Windows 98 laufen lassen, aber in diesem Fall werden keine Named Pipes angelegt und man muss TCP/IP installiert haben.
@item @code{mysqld-max} @tab Optimierte Bin�rdistribution mit Unterst�tzung symbolischer Links, InnoDB und BDB-Tabellen.
@item @code{mysqld-max-nt} @tab Wie @code{mysqld-max}, aber mit Unterst�tzung von Named Pipes kompiliert.
@end multitable

Alle genannten Bin�rdistributionen sind f�r den Pentium Pro Prozessor
optimiert, sollten aber auf jedem Intel-Prozessor >= 386 laufen.

ACHTUNG: Wenn Sie InnoDB-Tabellen benutzen wollen, m�ssen Sie bestimmte
Start-Optionen in Ihrer @file{my.ini}-Datei festlegen! @xref{InnoDB start}.


@node General Installation Issues, Installing source, Quick Standard Installation, Installing
@c German node Allgemeine Installationsthemen
@section Allgemeine Installationsthemen

@c @node Methods of Installation, , ,
@c @subsection Installationsmethoden

@c FIX: this needs to be written? 



@menu
* Getting MySQL::               
* Which OS::                    
* Which version::               
* Installation layouts::        
* Many versions::               
* MySQL binaries::              
@end menu

@node Getting MySQL, Which OS, General Installation Issues, General Installation Issues
@c German node Wie man MySQL erh�lt
@subsection Wie man MySQL erh�lt

@cindex Download
@cindex MySQL-Version
@cindex Version, aktuelle
@cindex Wie man MySQL erh�lt
@cindex Mirror-Sites
@cindex URLS zum Download von MySQL

Sehen Sie wegen Informationen zur aktuellen Version und f�r
Download-Anweisungen auf @uref{http://www.mysql.com/, MySQL home page}
nach.

Unser Haupt-Mirror-Server f�r den Download ist hier:

@uref{http://mirrors.sunsite.dk/mysql/}

Wenn Sie Interesse haben, eine MySQL-Mirror-Site beizusteuern, k�nnen Sie
anonymes rsync mit @code{rsync://sunsite.dk/ftp/mirrors/mysql/} machen.
Schicken Sie bitte eine E-Mail an @email{webmaster@@mysql.com} und geben
Sie uns Bescheid, wo Ihr Mirror liegt, damit wir ihn der unten stehenden
Liste hinzuf�gen k�nnen.

Wenn Sie Probleme beim Download von unserer Hauptseite aus haben, probieren
Sie eine der unten stehenden Mirror-Sites.

Geben Sie bitte @email{webmaster@@mysql.com} Bescheid, wenn Sie auf
schlechte oder veraltete Mirror-Sites sto�en.

@c START_OF_MIRROR_LISTING

@c German FIX added include of mirror listing (old German text was bad Texinfo)

@c Mirrors list is created by PHP script (that really needs to be documented!) from database (tfr@mysql.com)
@include mirrors.texi

@c END_OF_MIRROR_LISTING


@node Which OS, Which version, Getting MySQL, General Installation Issues
@c German node Welches Betriebssystem
@subsection Betriebssysteme, die von MySQL unterst�tzt werden

@cindex Betriebssysteme, unterst�tzte
@cindex Native Thread-Unterst�tzung
@cindex Thread-Unterst�tzung
@cindex Prozess-Unterst�tzung
@cindex Unterst�tzung, f�r Betriebssysteme

Wir benutzen GNU Autoconf, daher ist es m�glich, MySQL auf alle modernen
Betriebssysteme zu portieren, auf denen Posix-Threads und ein C++-Kompiler
funktionieren. (Um nur den Client-Code zu kompilieren, wir lediglich ein
C++-Kompiler ben�tigt.) Wir benutzen und entwickeln die Software selbst
haupts�chlich auf Sun Solaris (Versionen 2.5 - 2.7) und SuSE Linux Version
7.x.

Beachten Sie, dass die native Thread-Unterst�tzung f�r viele
Betriebssysteme nur mit den neuesten Versionen funktioniert. Es wurde
berichtet, dass MySQL erfolgreich auf folgenden Betriebssystemen /
Thread-Paket-Kombinationen kompiliert wurde:

@itemize @bullet
@item
AIX 4.x mit nativen Threads.  @xref{IBM-AIX}.
@item
Amiga.
@item
BSDI 2.x mit enthaltenem MIT-pThreads-Paket.  @xref{BSDI}.
@item
BSDI 3.0, 3.1 und 4.x mit nativen Threads.  @xref{BSDI}.
@item
DEC Unix 4.x mit nativen Threads.  @xref{Alpha-DEC-UNIX}.
@item
FreeBSD 2.x mit enthaltenem MIT-pThreads-Paket.  @xref{FreeBSD}.
@item
FreeBSD 3.x und 4.x mit nativen Threads.  @xref{FreeBSD}.
@item
HP-UX 10.20 mit enthaltenem MIT-pThreads-Paket.  @xref{HP-UX 10.20}.
@item
HP-UX 11.x mit nativen Threads.  @xref{HP-UX 11.x}.
@item
Linux 2.0+ mit LinuxThreads 0.7.1+ oder @code{glibc} 2.0.7+.  @xref{Linux}.
@item
Mac OS X Server.  @xref{Mac OS X}.
@item
NetBSD 1.3/1.4 Intel und NetBSD 1.3 Alpha (ben�tigt GNU make).  @xref{NetBSD}.
@item
OpenBSD > 2.5 mit nativen Threads. OpenBSD < 2.5 mit enthaltenem
MIT-pThreads-Paket.  @xref{OpenBSD}.
@item
OS/2 Warp 3, FixPack 29 und OS/2 Warp 4, FixPack 4.  @xref{OS/2}.
@item
SGI Irix 6.x mit nativen Threads.  @xref{SGI-Irix}.
@item
Solaris 2.5 und h�her mit nativen Threads auf SPARC und x86.  @xref{Solaris}.
@item
SunOS 4.x mit enthaltenem MIT-pThreads-Paket.  @xref{Solaris}.
@item
Caldera (SCO) OpenServer mit einem aktuellen Port des FSU-PThreads-Pakets.  @xref{Caldera}.
@item
Caldera (SCO) UnixWare 7.0.1.  @xref{Caldera Unixware}.
@item
Tru64 Unix
@item
Windows 95, Windows 98, NT und Windows 2000.  @xref{Windows}.
@end itemize

Beachten Sie, dass nicht alle Plattformen gleicherma�en gut geeignet sind,
um MySQL laufen zu lassen. Wie gut eine bestimmte Plattform f�r hohe Last
und gesch�ftskritische Anwendungen geeignet ist, h�ngt von folgenden
Faktoren ab:

@itemize @bullet
@item
Allgemeine Stabilit�t der Thread-Bibliothek. Eine Plattform mag in anderer
Hinsicht einen exzellenten Ruf haben, aber wenn die Thread-Bibliothek
unstabil ist, die von MySQL aufgerufen wird, l�uft MySQL nur so stabil wie
die Thread-Bibliothek, selbst wenn alles Sonstige perfekt ist.

@item
F�higkeit des Kernels und / oder der Thread-Bibliothek, die Vorteile von
@strong{SMP} auf Mehrprozessor-Systemen wahrzunehmen. Mit anderen Worten:
Wenn ein Prozess einen Thread anlegen, sollte es f�r diesen Thread m�glich
sein, auf anderen Prozessoren zu laufen als der Original-Prozess.

@item
F�higkeit des Kernels und / oder der Thread-Bibliothek, viele Threads
laufen zu lassen, die h�ufig einen Mutex �ber eine kurze, kritische Region
anlegen / l�sen k�nnen ohne exzessive Kontext-Umschaltungen. Mit anderen
Worten: Wenn die Implementation von @code{pThread_mutex_lock()} zu sehr
darauf bedacht ist, CPU zu erlangen, wird das MySQL gewaltig schmerzen.
Wenn man sich dieser Tatsache nicht bewusst ist, machen zus�tzliche
Prozessoren MySQL in der Tat langsamer.

@item
Allgemeine Stabilit�t und Performance des Dateisystems.

@item
F�higkeit des Dateisystems, �berhaupt mit gro�en Dateien umgehend zu
k�nnen, und zwar effizient, wenn Ihre Tabellen Gro� sind.

@item
Unser Grad von Erfahrung, hier bei MySQL AB, mit der Plattform. Wenn wir
eine Plattform gut kennen, setzen wir plattformspezifische Optimierungen /
Verbesserungen (Fixes) ein, die zur Kompilierzeit aktiv werden. Dar�ber
hinaus k�nnen wir Sie beraten, wie Sie Ihr System optimal f�r MySQL
konfigurieren.

@item
Umfang des Testens �hnlicher Konfigurationen, das wir intern durchgef�hrt
haben.

@item
Anzahl von Benutzern, die MySQL auf dieser Plattform erfolgreich mit
�hnlichen Konfigurationen haben laufen lassen. Wenn diese Zahl Gro� ist,
ist die Wahrscheinlichkeit viel geringer, plattformspezifische
�berraschungen zu erleben.
@end itemize

Nach den genannten Kriterien sind die besten Plattformen f�r MySQL bislang
x86 mit SuSE Linux 7.1, 2.4 Kernel und ReiserFS (oder jede �hnliche
Linux-Distribution) und Sparc mit Solaris 2.7 oder 2.8. FreeBSD kommt als
drittes, aber wir hoffen wirklich, dass es zur Spitze aufschlie�t, sobald
erst einmal die Thread-Bibliothek verbessert ist. Wir hoffen auch, dass wir
alle anderen Plattformen, auf denen MySQL kompiliert werden kann und
korrekt l�uft, die aber nicht ganz denselben Grad an Stabilit�t und
Performance aufweisen, in die Spitzenkategorie aufnehmen k�nnen. Das
erfordert von unserer Seite aus einige Kooperationsbem�hungen mit den
Entwicklern der Betriebssystem-Bibliothek-Komponenten, von denen MySQL
abh�ngt. Wenn Sie Interesse daran haben, eine dieser Komponenten zu
verbessern und in der Lage sind, ihre Entwicklung zu beeinflussen, und
detailliertere Informationen dar�ber brauchen, was MySQL ben�tigt, um
besser zu laufen, schicken Sie eine E-Mail an
@email{internals@@lists.mysql.com}.

Beachten Sie bitte auch, dass der obige Vergleich nichts dar�ber aussagen
will, dass ein Betriebssystem allgemein besser oder schlechter als ein
anderes sei. Wir reden hier �ber die Auswahl eines bestimmten
Betriebssystems f�r einen ganz bestimmten Zweck - n�mlich, MySQL laufen zu
lassen, und vergleichen die Betriebssysteme nur in dieser Hinsicht.
Folglich w�re das Ergebnis dieses Vergleichs ein anderes, wenn wir weitere
Belange ber�cksichtigen w�rden. In manchen F�llen liegt der Grund, warum
ein Betriebssystem besser als ein anderes geeignet ist, schlicht darin,
dass wir auf dieser speziellen Plattform mehr Tests und Optimierungen
durchgef�hrt haben. Wir stellen hier nur unsere Beobachtungen dar, um Ihnen
bei der Entscheidung zu helfen, auf welcher Plattform Sie MySQL benutzen
sollten.


@node Which version, Installation layouts, Which OS, General Installation Issues
@c German node Welche Version
@subsection Welche MySQL-Version Sie benutzen sollten

@cindex MySQL-Bin�rdistribution
@cindex MySQL-Quelldistribution
@cindex Release-Nummer
@cindex Version, Auswahl
@cindex Auswahl, einer MySQL-Version

Zun�chst m�ssen Sie entscheiden, ob Sie das letzte Entwicklungs-Release
oder das letzte stabile Release benutzen wollen:

@itemize @bullet
@item
Normalerweise, wenn Sie MySQL zum ersten Mal benutzen, oder wenn Sie
versuchen, MySQL auf ein System zu portieren, f�r das es keine
Bin�rdistribution gibt, empfehlen wir, das stabile Release zu nehmen
(aktuell Version @value{mysql_version}). Beachten Sie, dass alle
MySQL-Releases mit den MySQL-Benchmarks und einer umfassenden Test-Suite
getestet sind, bevor das Release heraus gegeben wird.

@item
Wenn Sie ein altes System laufen lassen und es aktualisieren m�chten, aber
nicht riskieren wollen, dass ein Update nicht reibungslos klappt, sollten
Sie zur aktuellsten Version des Zweiges aktualisieren, den Sie benutzen
(bei dem nur die letzte Versionsnummer neuer ist als Ihre, also z. B. von
3.23.36 auf 3.23.44, wenn 3.23.44 die neueste Version des Zweigs ist). Wir
haben uns innerhalb der Versions-Zweige bem�ht, nur schwere Fehler zu
beseitigen und kleine, relativ sichere �nderungen zu machen.
@end itemize

Als n�chstes m�ssen Sie entscheiden, ob Sie eine Quelldistribution oder
eine Bin�rdistribution nehmen wollen. In den meisten F�llen ist es ratsam,
eine Bin�rdistribution zu nehmen, wenn eine f�r Ihre Plattform existiert,
weil sich diese im Allgemeinen leichter installieren l��t als eine
Quelldistribution.

In folgenden F�llen fahren Sie mit einer Quellinstallation wahrscheinlich
besser:

@itemize @bullet
@item
Wenn Sie MySQL an einer ganz bestimmten Stelle installieren wollen. (Die
Standard-Bin�rdistributionen sind an jeder Stelle lauff�hig, aber
vielleicht wollen Sie noch mehr Flexibilit�t haben.)

@item
Um unterschiedlichen Bed�rfnissen von Benutzern entgegen zu kommen, stellen
wir zwei unterschiedliche Bin�rversionen zur Verf�gung: Eine, die mit den
nicht transaktionalen Tabellen-Handlern kompiliert ist (eine kleine,
schnelle Bin�rdatei), sowie eine, die mit den wichtigsten erweiterten
Optionen wie transaktionssicheren Tabellen kompiliert ist. Beide Versionen
sind aus derselben Quelldistribution kompiliert. Alle nativen
@code{MySQL}-Clients k�nnen sich mit beiden MySQL-Versionen verbinden.

Die erweiterte MySQL-Bin�rdistribution ist mit dem @code{-max}-Suffix
gekennzeichnet und ist mit denselben Optionen konfiguriert wie
@code{mysqld-max}. @xref{mysqld-max, , @code{mysqld-max}}.

Wenn Sie das @code{MySQL-Max}-RPM benutzen wollen, m�ssen Sie zuerst das
Standard-@code{MySQL}-RPM installieren.

@item
Wenn Sie @code{mysqld} mit einigen zus�tzlichen Features konfigurieren
wollen, die NICHT in den Standard-Bin�rdistributionen enthalten sind. Hier
ist eine Liste der gebr�uchlichsten Zusatzoptionen, die Sie vielleicht
nutzen wollen:

@itemize @bullet
@item @code{--with-berkeley-db}
@item @code{--with-innodb}
@item @code{--with-raid}
@item @code{--with-libwrap}
@item @code{--with-named-z-lib  (ist in einigen Bin�rdateien enthalten)}
@item @code{--with-debug[=full]}
@end itemize

@item
Die vorgabem��ige Bin�rdistribution wird normalerweise mit Unterst�tzung
f�r alle Zeichens�tze kompiliert und sollte auf einer Vielzahl von
Prozessoren derselben Prozessorfamilie laufen.

Wenn Sie einen schnelleren MySQL-Server erhalten wollen, k�nnen Sie ihn
erneut kompilieren und nur die Zeichens�tze benutzen, die Sie brauchen. Sie
k�nnen auch einen besseren Kompiler (wie @code{pgcc}) oder andere
Kompilieroptionen benutzen, die besser auf Ihren Prozessor optimiert sind.

@item
Wenn Sie einen Bug gefunden und dem MySQL-Entwicklungsteam mitgeteilt
haben, werden Sie wahrscheinlich einen Patch erhalten, den Sie mit der
Quelldistribution verwenden m�ssen, um den Bug zu beheben.

@item
Wenn Sie den C- und C++-Code lesen (und / oder �ndern) wollen, aus dem
MySQL besteht, m�ssten Sie eine Quelldistribution laden. Der Quellcode ist
immer das ''letzte Handbuch''. Quelldistributionen enthalten auch mehr
Tests und Beispiele als Bin�rdistributionen.
@end itemize

@cindex naming, releases of MySQL
@cindex Releases, Benennungsschema

Das MySQL Benennungsschema benutzt Release-Nummern, die aus drei Zahlen und
einem Suffix bestehen. Ein Release-Name wie @code{mysql-3.21.17-beta} zum
Beispiel wird wie folgt interpretiert:

@itemize @bullet
@item
Die erste Zahl (@code{3}) beschreibt das Dateiformat. Alle
Version-3-Releases haben dasselbe Dateiformat.

@item
Die zweite Zahl (@code{21}) ist die Release-Ebene (Level). Normalerweise
kann man hier zwischen zweien ausw�hlen. Einer ist der stabile Zweig des
Releases (aktuell @code{23}), der andere ist der Entwicklungs-Zweig
(aktuell @code{4.0}). Normalerweise sind beide stabil, aber die
Entwicklungsversion kann Macken oder fehlende Dokumentation neuer Features
haben oder sich auf einigen Systemen nicht kompilieren lassen.

@item
Die dritte Zahl (@code{17}) ist die Versionsnummer innerhalb der
Release-Ebene. Diese wird f�r jede neue Distribution hochgez�hlt.
�blicherweise werden Sie die neueste Version der Release-Ebene einsetzen
wollen, die Sie gew�hlt haben.

@item
Das Suffix (@code{beta}) zeigt den Stabilit�tsgrad des Releases an.
M�gliche Suffixe sind:

@itemize @minus
@item 
@code{alpha} zeigt an, dass das Release gr��ere Abschnitte von neuem Code
enth�lt, der noch nicht zu 100% getestet wurde. Bekannte Bugs
(�blicherweise gibt es keine) sind im News-Abschnitt dokumentiert.
@xref{News}. In den meisten Alpha-Releases gibt es neue Befehle und
Erweiterungen. Bei einem Alpha-Release k�nnen durch aktive
Weiterentwicklung gr��ere Code-�nderungen vorkommen, aber alles wird
getestet, bevor ein Release ver�ffentlicht wird. Es sollte in keinem
MySQL-Release bekannte Bugs geben.

@item
@code{beta} bedeutet, dass jeglicher neue Code getestet wurde. Es wurden
keine neuen Features hinzugef�gt, die bei altem Code Probleme verursachen
k�nnten. Es sollte keine bekannten Bugs geben. Eine Version wird von Alpha
auf Beta gesetzt, wenn innerhalb der Alpha-Version mindestens einen Monat
lang keine schweren Fehler mehr berichtet wurden. Wir planen f�r eine
solche Version dann keine neuen Features mehr, die einen alten Befehl
unzuverl�ssiger machen k�nnten.

@item
@code{gamma} ist eine Beta-Version, die eine ganze Weile draussen war und
offensichtlich gut funktioniert. Nur kleinere Problembehebungen wurden
hinzugef�gt. So etwas nennen viele andere Unternehmen ein Release.

@item
Wenn eine Version kein Suffix besitzt, bedeutet das, dass diese Version
schon eine ganze Weile auf vielen unterschiedlichen Sites eingesetzt wird,
wobei keine Bugs ausser plattformspezifischen Bugs berichtet wurden. F�r
ein solches Release werden nur kritische Fehlerbehebungen durchgef�hrt. So
etwas nennen wir ein stabiles Release.
@end itemize
@end itemize

Alle Versionen von MySQL laufen durch unsere Standard-Tests und
-Benchmarks, um sicherzustellen, dass man sie relativ sicher benutzen kann.
Weil die Standard-Tests im Laufe der Zeit erweitert werden, um auf alle
fr�her gefundenen Bugs zu pr�fen, wird die Test-Suite immer besser.

@cindex releases, testing
@cindex Testen, von MySQL-Releases

Beachten Sie, dass alle Releases mindestens wie folgt getestet wurden:

@table @asis
@item Mit der internen Test-Suite
Diese ist Teil unseres Produktionssystems f�r einen Kunden. Sie besitzt
viele Tabellen mit Hunderten Megabytes an Daten.

@item Mit der MySQL-Benchmark-Suite
Diese l��t eine Reihe gebr�uchlicher Anfragen laufen. Das ist zus�tzlich
ein Test darauf, ob die letzten Optimierungen den Code tats�chlich
schneller gemacht haben.
@xref{MySQL Benchmarks}.

@item Mit dem @code{crash-me}-Test
Dieser Test versucht festzustellen, welche Features die Datenbank
unterst�tzt und was ihre F�higkeiten und Beschr�nkungen sind. @xref{MySQL Benchmarks}.
@end table

Ein weiterer Test besteht darin, dass wir die neueste MySQL-Version in
unserer internen Entwicklungsumgebung einsetzen, mindestens auf einer
Maschine. Wir arbeiten hierbei mit mehr als 100 Gigabytes an Daten.


@node Installation layouts, Many versions, Which version, General Installation Issues
@c German node Installationslayouts
@subsection Installationslayouts

@cindex Installationslayouts
@cindex Layout der Installation
@cindex Verzeichnisstruktur, Vorgabe
@cindex Vorgabem��iger Installationsort

Dieser Abschnitt beschreibt das vorgabem��ige Layout der Verzeichnisse,
die durch die Installation von Bin�r- und Quelldistributionen angelegt
werden.

Eine Bin�rdistribution wird installiert, indem sie an die
Installationsstelle entpackt wird, die Sie ausw�hlen (typischer Weise
@file{/usr/local/mysql}). Die Installation erstellt folgende Verzeichnisse
an dieser Stelle:

@multitable @columnfractions .3 .7
@item @strong{Verzeichnis} @tab @strong{Verzeichnisinhalt}
@item @file{bin}           @tab Client-Programme und der
@code{mysqld}-Server
@item @file{data}          @tab Log-Dateien, Datenbanken
@item @file{include}       @tab Include-(Header)-Dateien
@item @file{lib}           @tab Bibliotheken
@item @file{scripts}       @tab @code{mysql_install_db}
@item @file{share/mysql}   @tab Dateien mit Fehlernachrichten
@item @file{sql-bench}     @tab Benchmarks
@end multitable

Eine Quelldistribution wird installiert, nachdem Sie sie konfiguriert und
kompiliert haben. Vorgabem��ig werden Dateien unter @file{/usr/local}
installiert, und zwar in den folgenden Unterverzeichnissen:

@multitable @columnfractions .3 .7
@item @strong{Verzeichnis} @tab @strong{Verzeichnisinhalt}
@item @file{bin}           @tab Client-Programme und -Skripte
@item @file{include/mysql} @tab Include-(Header)-Dateien
@item @file{info}	   @tab Dokumentation im Info-Format
@item @file{lib/mysql}     @tab Bibliotheken
@item @file{libexec}       @tab Der @code{mysqld}-Server
@item @file{share/mysql}   @tab Dateien mit Fehlernachrichten
@item @file{sql-bench}     @tab Benchmarks und @code{crash-me}-Test
@item @file{var}           @tab Datenbanken und Log-Dateien
@end multitable

Innerhalb eines Installationsverzeichnisses weicht das Layout einer
Quellinstallation von dem einer Bin�rinstallation wie folgt ab:

@itemize @bullet
@item
Der @code{mysqld}-Server wird in das @file{libexec}-Verzeichnis installiert
und nicht in das @file{bin}-Verzeichnis.

@item
Das Daten-Verzeichnis ist @file{var} und nicht @file{data}.

@item
@code{mysql_install_db} wird in das @file{/usr/local/bin} Verzeichnis
installiert und nicht in @file{/usr/local/mysql/Skripts}.

@item
Die Header-Datei und Bibliotheksverzeichnisse sind @file{include/mysql} und
@file{lib/mysql} und nicht @file{include} und @file{lib}.
@end itemize

Sie k�nnen Ihre eigene Bin�rinstallation aus einer kompilierten
Quelldistribution erzeugen, indem Sie das Skript
@file{Skripts/make_binary_Distribution} ausf�hren.


@node Many versions, MySQL binaries, Installation layouts, General Installation Issues
@c German node Viele Versionen
@subsection Wann und wie Updates ver�ffentlicht werden

@cindex Releases, Updates
@cindex Updates, Releases von MySQL

MySQL entwickelt sich ziemlich schnell hier bei MySQL AB und wir wollen,
dass andere MySQL-Benutzer daran teilhaben. Wir versuchen, immer dann ein
neues Release heraus zu bringen, wenn wir sehr n�tzliche Features haben,
f�r die offensichtlich ein Bedarf besteht.

Auch versuchen wir, unseren Benutzern zu helfen, wenn Sie nach Features
anfragen, die einfach zu implementieren sind. Wir notieren, was unsere
lizensierten Nutzer haben wollen, und insbesondere, was unsere Benutzer mit
erweitertem E-Mail-Support haben wollen, und versuchen ihnen, eben das zu
bieten.

Niemand muss einen neuen Release herunter laden. Im News-Abschnitt steht
stets, ob das neue Release etwas beinhaltet, was Sie wirklich brauchen.
@xref{News}.

Wenn wir MySQL aktualisieren, fahren wir folgende Politik:

@itemize @bullet
@item
Bei kleineren Updates wird die letzte Zahl (von rechts) in der
Versionsnummer herauf gez�hlt (Minor Release). Wenn es gr��ere neue
Features gibt oder kleinere Inkompatibilit�ten mit vorherigen Versionen,
wird die zweite Zahl der Versionsnummer herauf gez�hlt (Major Release).
Wenn sich das Dateiformat �ndert, wird die erste Zahl herauf gez�hlt.

@item
@c Question: This is supposed to mean "stable major releases". What does it
have to do with "small bugs" => minor releases?
Stable tested releases are meant to appear about 1-2 times a year, but
if small bugs are found, a release mit only bug fixes will be released.
Als stabil getestete Releases sollten etwa ein- bis zweimal im Jahr
erscheinen, aber wenn kleinere Fehler gefunden werden, wird nur ein Release
mit Bug-Fixes heraus gegeben.


@item
Funktionierende Releases sollten etwa alle 1 bis 8 Wochen erscheinen.

@item
Bin�rdistributionen f�r einige Plattformen werden von uns f�r gr��ere
Releases (Major) heraus gegeben. Andere Leute stellen vielleicht auch
Bin�rdistributionen f�r andere Systeme her, aber nicht so h�ufig.

@item
Patches stellen wir �blicherweise zur Verf�gung, sobald wir kleinere Bugs
ausfindig gemacht und behoben haben.

@item
F�r nicht kritische, aber st�rende Bugs machen wir Patches verf�gbar, wenn
sie uns zugesandt werden. Ansonsten kombinieren wir mehrere davon in einem
gr��eren Patch.

@item
Wenn durch ungl�ckliche Umst�nde ein Release einen schweren Fehler enth�lt,
erstellen wir sobald wie m�glich ein neues Release. Das w�rden wir auch
gern bei anderen Unternehmen so sehen.
@end itemize


@c Question: I will not translate this paragraph now. Please update this!
The current stable release ist Version 3.23; We have already moved active
Entwicklung to Version 4.0.  Bugs will still be fixed in the stable version.
We don't believe in a complete freeze, as this also leaves out bug fixes
und things that ``must be done.''  ``Somewhat frozen'' means that we may
add small things that ``almost surely will not affect anything that's
already working.''


@node MySQL binaries,  , Many versions, General Installation Issues
@c German node MySQL-Bin�rdistributionen
@subsection MySQL-Bin�rdistributionen, die von MySQL AB kompiliert wurden

@cindex Bin�rdistributionen

Als Service stellen wir bei MySQL AB einen Satz von Bin�rdistributionen von
MySQL zur Verf�gung, die auf unserer Site kompiliert wurden oder auf Sites
von Kunden, die uns freundlicherweise Zugang zu Ihren Maschinen gew�hrt
haben.

Diese Distributionen werden mit @code{Skripts/make_binary_distribution}
erzeugt und mit folgenden Kompilern und Optionen konfiguriert:

@table @asis
@item SunOS 4.1.4 2 sun4c mit @code{gcc} 2.7.2.1
@code{CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-assembler}

@item SunOS 5.5.1 (und h�her) sun4u mit @code{egcs} 1.0.3a oder 2.90.27 oder gcc 2.95.2 und neuer
@code{CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex --enable-assembler}

@item SunOS 5.6 i86pc mit @code{gcc} 2.8.1
@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex}

@item Linux 2.0.33 i386 mit @code{pgcc} 2.90.29 (@code{egcs} 1.0.3a)
@code{CFLAGS="-O3 -mpentium -mstack-align-double" CXX=gcc CXXFLAGS="-O3 -mpentium -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=complex}

@item Linux 2.2.x mit x686 mit @code{gcc} 2.95.2
@code{CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charset=complex}

@item SCO 3.2v5.0.4 i386 mit @code{gcc} 2.7-95q4
@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex}

@item AIX 2 4 mit @code{gcc} 2.7.2.2
@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex}

@item OSF1 V4.0 564 alpha mit @code{gcc} 2.8.1
@code{CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex}

@item Irix 6.3 IP32 mit @code{gcc} 2.8.0
@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex}

@item BSDI BSD/OS 3.1 i386 mit @code{gcc} 2.7.2.1
@code{CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex}

@item BSDI BSD/OS 2.1 i386 mit @code{gcc} 2.7.2
@code{CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex}
@end table

Wenn jemand optimalere Optionen f�r die obigen Konfigurationen hat, k�nnen
diese jederzeit der Entwickler-Mailing-Liste unter
@email{internals@@lists.mysql.com} mitgeteilt werden.

RPM-Distributionen von MySQL-Version 3.22 wurden durch Benutzer
beigesteuert. Ab Version 3.22 werden die RPMs von uns bei MySQL AB erzeugt.

Wenn Sie eine Debug-Version von MySQL kompilieren wollen, m�ssen Sie den
oben genannten Kompilierzeilen @code{--with-debug} oder
@code{--with-debug=full} hinzuf�gen und jegliche
@code{-fomit-frame-pointer}-Optionen entfernen.


@node Installing source, Post-installation, General Installation Issues, Installing
@c German node Installation der Quelldistribution
@section Installation der Quelldistribution

@cindex Installation, Quelldistribution
@cindex Quelldistribution, Installation
@cindex Installation, �berblick

Bevor Sie mit der Quellinstallation fortfahren, sehen Sie nach, ob eine
Bin�rdistribution f�r Ihre Plattform verf�gbar ist, die so wie Sie wollen
funktioniert. Wir geben uns viel M�he, die Bin�rdistributionen mit den
bestm�glichen Optionen zu bauen.

Sie ben�tigen folgende Werkzeuge, um MySQL aus der Quelldistribution zu bauen
und zu installieren:

@itemize @bullet
@item
GNU @code{gunzip}, um die Distribution zu entpacken.

@item
Ein vern�nftiges @code{tar}, um die Distribution zu entpacken. Von GNU
@code{tar} ist bekannt, dass es funktioniert. Sun @code{tar} ist daf�r
bekannt, dass es Probleme verursacht.

@item
Einen funktionierenden ANSI-C++-Kompiler. @code{gcc} >= 2.95.2, @code{egcs} >= 1.0.2
oder @code{egcs 2.91.66}, SGI C++ und SunPro C++ sind einige der Kompiler,
von denen bekannt ist, dass sie funktionieren. @code{libg++} wird nicht
ben�tigt, wenn Sie @code{gcc} benutzen. @code{gcc} 2.7.x hat einen Bug, der
es verunm�glicht, einige perfekt der vorgeschriebenen Form entsprechende
C++-Dateien zu kompilieren, zum Beispiel @file{sql/sql_base.cc}. Wenn Sie
nur @code{gcc} 2.7.x zur Verf�gung haben, m�ssen Sie Ihren @code{gcc}
aktualisieren, um MySQL kompilieren zu k�nnen. @code{gcc} 2.8.1 ist
ebenfalls f�r Probleme auf einigen Plattformen bekannt, daher sollten Sie
auch diesen vermeiden, wenn Sie einen neueren Kompiler f�r diese Plattform
zur Verf�gung haben.

@code{gcc} >= 2.95.2 wird f�r das Kompilieren von MySQL-Versionen 3.23.x
empfohlen.

@item
Ein gutes @code{make}-Programm. GNU @code{make} wird stets empfohlen und
ist manchmal erforderlich. Wenn Sie Probleme bekommen, empfehlen wir, es
mit GNU @code{make} 3.75 oder neuer zu versuchen.
@end itemize

Wenn Sie eine aktuelle Version von @strong{gcc} verwenden (aktuell genug,
um die @code{-fno-exceptions}-Option zu verstehen), ist es @strong{SEHR
WICHTIG}, dass Sie diese Option benutzen. Ansonsten k�nnte es sein, dass
Sie eine Bin�rdatei kompilieren, die zu zuf�lligen Zeitpunkten abst�rzt.
Wir empfehlen zus�tzlich, dass Sie @code{-felide-contructors} und
@code{-fno-rtti} zusammen mit @code{-fno-exceptions} benutzen. Im Zweifel
gehen Sie wie folgt vor:

@example

CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static

@end example

F�r die meisten Systeme werden Sie dadurch eine schnelle, stabile
Bin�rinstallation erhalten.

@c texi2html fails to split chapters if I use strong f�r all of this.
Wenn Sie Probleme bekommen, @strong{BITTE BENUTZEN SIE IMMER
@code{mysqlbug}} zum Fragenstellen die Liste
@email{mysql@@lists.mysql.com}. Selbst wenn das Problem kein Bug ist,
sammelt @code{mysqlbug} Systeminformationen, die anderen helfen werden, Ihr
Problem zu l�sen. Wenn Sie @code{mysqlbug} nicht benutzen, verringern Sie
die M�glichkeit, eine L�sung Ihres Problems zu bekommen! @code{mysqlbug}
finden Sie im @file{scripts}-Verzeichnis, nachdem Sie die Distribution
entpackt haben. @xref{Bug reports}.



@menu
* Quick install::               
* Applying patches::            
* configure options::           
* Installing source tree::      
* Compilation problems::        
* MIT-pthreads::                
* Windows source build::        
@end menu

@node Quick install, Applying patches, Installing source, Installing source
@c German node Schnellinstallation
@subsection Schnellinstallation, �berblick

Die grundlegenden Befehle, die Sie ausf�hren m�ssen, um eine
MySQL-Quelldistribution zu installieren, sind:

@example
shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> scripts/mysql_install_db
shell> chown -R root  /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
@end example

@c German FIX added @samp before {#}
Wenn Sie Unterst�tzung f�r InnoDB-Tabellen haben wollen, sollten Sie die
Datei @code{/etc/my.cnf} editieren und die @samp{#}-Zeichen vor den Parametern
entfernen, der mit @code{innodb_...} beginnen. @xref{Option files}.
@xref{InnoDB start}.

Wenn Sie mit einem Quell-RPM anfangen, gehen Sie wie folgt vor:

@example
shell> rpm --rebuild MySQL-VERSION.src.rpm
@end example

Das erzeugt ein Bin�r-RPM, das Sie installieren k�nnen.

Sie k�nnen neue Benutzer hinzuf�gen, indem Sie das
@code{bin/mysql_setpermission}-Skript benutzen, falls Sie die @code{DBI}-
und @code{Msql-Mysql-modules}-Perl-Module installieren.

Eine detailliertere Beschreibung folgt.

Um eine Quelldistribution zu installieren, f�hren Sie die unten stehenden
Schritte aus und gehen dann weiter zu @ref{Post-installation}, um die
Schritte nach der Installation und ein paar Tests durchzuf�hren.

@enumerate
@item
W�hlen Sie das Verzeichnis, in dem Sie die Distribution entpacken wollen,
und wechseln Sie dort hinein.

@item
Holen Sie sich eine Distributionsdatei von einer der Sites, die unter
@ref{Getting MySQL, , Wie man MySQL erh�lt} aufgelistet sind.

@item
Wenn Sie Berkeley-DB-Tabellen mit MySQL verwenden wollen, m�ssen Sie sich
eine gepatchte Version des Berkeley-DB-Quellcodes besorgen. Bitte lesen Sie
das Kapitel �ber Berkeley-DB-Tabellen, bevor Sie fortfahren.  @xref{BDB}.

MySQL-Quelldistributionen stehen als komprimierte @code{tar}-Archive zur
Verf�gung und haben Namen wie @file{mysql-VERSION.tar.gz}, wobei
@code{VERSION} eine Zahl ist, wie @value{mysql_version}.

@item
F�gen Sie einen Benutzer (User) und eine Gruppe (Group) hinzu, unter dem /
der @code{mysqld} laufen soll:

@example
shell> groupadd mysql
shell> useradd -g mysql mysql
@end example

Diese Befehle f�gen den Benutzer @code{mysql} und die Gruppe @code{mysql}
hinzu. Die Syntax f�r @code{useradd} und @code{groupadd} kann sich auf
unterschiedlichen Unix-Systemen geringf�gig unterscheiden. Die Befehle
k�nnen @code{adduser} und @code{addgroup} hei�en. Wenn Sie wollen, k�nnen
Sie Benutzer und Gruppe auch anders nennen als @code{mysql}.

@item
Entpacken Sie die Distribution ins aktuelle Verzeichnis:
@example
shell> gunzip < /pfad/zu/mysql-VERSION.tar.gz | tar xvf -
@end example

Dieser Befehl erzeugt ein Verzeichnis namens @file{mysql-VERSION}.

@item
Wechseln Sie in das oberste Verzeichnis der entpackten Distribution:

@example
shell> cd mysql-VERSION
@end example

Beachten Sie, dass Sie aktuell MySQL aus diesem obersten Verzeichnis
konfigurieren und bauen m�ssen. Sie k�nnen MySQL nicht in ein anderes
Verzeichnis bauen.

@item
Konfigurieren Sie das Release und kompilieren Sie alles:

@example
shell> ./configure --prefix=/usr/local/mysql
shell> make
@end example

Wenn Sie @code{configure} laufen lassen, k�nnen Sie dabei einige Optionen
angeben. Geben Sie @code{./configure --help} ein, um eine Liste von
Optionen zu erhalten. @ref{configure options, , @code{configure}-Optionen}
er�rtert einige der n�tzlicheren Optionen.

Wenn @code{configure} fehlschl�gt und Sie sich wegen Hilfe an
@email{mysql@@lists.mysql.com} wenden, geben Sie bitte alle Zeilen aus
@file{config.log} an, von denen Sie annehmen, dass sie bei der
Problembehebung hilfreich sein k�nnten. F�gen Sie auch die letzten Zeilen
der Ausgabe von @code{configure} hinzu, wenn @code{configure} abbricht.
Schicken Sie den Bug-Bericht ein, indem Sie das @code{mysqlbug}-Skript
benutzen. @xref{Bug reports}.

Wenn das Kompilieren fehlschl�gt, sehen Sie unter
@ref{Compilation problems} nach, was bei einer Reihe gel�ufiger Probleme
hilft.

@item
Installieren Sie alles:

@example
shell> make install
@end example

Eventuell m�ssen Sie diesen Befehl als @code{root} ausf�hren.

@item
Erzeugen Sie die MySQL-Berechtigungstabellen (Grant Tables, nur notwendig,
wenn Sie MySQL noch nie vorher installiert haben):

@example
shell> scripts/mysql_install_db
@end example

Beachten Sie, dass bei MySQL-Versionen vor Version 3.22.10 der MySQL-Server
startet, wenn Sie @code{mysql_install_db} laufen lassen. Das gilt f�r
neuere Versionen nicht mehr!

@item
�ndern Sie den Besitzer der Bin�rdateien zu @code{root} und den Besitzer
des Daten-Verzeichnisses zu dem Benutzer, unter dem Sie @code{mysqld} laufen
lassen wollen:

@example
shell> chown -R root  /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
@end example

Der erste Befehl �ndert die @code{owner}-Attribute der Dateien auf den
Benutzer @code{root}, der zweite �ndert die @code{owner}-Attribute des
Daten-Verzeichnisses auf den Benutzer @code{mysql} und der dritte �ndert die
@code{group}-Attribute auf die Gruppe @code{mysql}.

@item
Wenn Sie die Unterst�tzung f�r die Perl-@code{DBI}/@code{DBD}-Schnittstelle
hinzuf�gen wollen, sehen Sie unter @ref{Perl} nach.

@item
Wenn Sie wollen, dass MySQL automatisch startet, wenn Sie Ihre Maschine
hoch fahren, kopieren Sie @code{support-files/mysql.server} an die Stelle,
wo Ihr System seine Startdateien hat. Weitere Informationen finden Sie im
@code{support-files/mysql.server}-Skript selbst sowie unter
@ref{Automatic start}.
@end enumerate

Nachdem alles installiert wurde, sollten Sie Ihre Distribution
initialisieren und testen:

@example
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
@end example

Wenn dieser Befehl sofort mit @code{mysqld daemon ended} fehlschl�gt,
finden Sie einige Informationen dazu in der Datei
@file{mysql-Daten-Verzeichnis/'hostname'.err}. Der wahrscheinliche Grund ist
der, dass bereits ein anderer @code{mysqld}-Server l�uft. @xref{Multiple servers}.

@xref{Post-installation}.


@node Applying patches, configure options, Quick install, Installing source
@c German node Patches anwenden
@subsection Wie man Patches anwendet

@cindex Patches, anwenden
@cindex Anwenden, Patches

Manchmal erscheinen Patches auf der Mailing-Liste oder werden auf
@uref{http://www.mysql.com/Downloads/Patches, Patches-Bereich} auf der
MySQL-Website eingestellt.

Um einen Patch aus der Mailing-Liste anzuwenden, speichern Sie die
Nachricht, in der der Patch enthalten ist, in eine Datei. Wechseln Sie dann
ins oberste Verzeichnis Ihres MySQL-Source-Trees und geben Sie folgende
Befehle ein:

@example
shell> patch -p1 < patch-datei-name
shell> rm config.cache
shell> make clean
@end example

Patches von der FTP-Site werden als Klartextdateien (Plain Text) oder als
mit @code{gzip} komprimierte Dateien distribuiert. Ein Klartext-Patch
wenden Sie genau so an, wie oben f�r die Patches von der Mailing-Liste
beschrieben. Um ein komprimiertes Patch anzuwenden, wechseln Sie ins
oberste Verzeichnis Ihres MySQL-Source-Trees und geben Sie folgende Befehle
ein:

@example
shell> gunzip < patch-datei-name.gz | patch -p1
shell> rm config.cache
shell> make clean
@end example

Nachdem Sie einen Patch angewendet haben, folgen Sie den Anweisungen f�r
eine normale Installation vom Quellcode, indem Sie mit dem Schritt
@code{./configure} anfangen. Nach dem Schritt @code{make install}, starten
Sie den MySQL-Server neu.

Es kann sein, dass Sie jeden laufenden Server anhalten m�ssen, bevor Sie
@code{make install} laufen lassen k�nnen. (Das machen Sie mit
@code{mysqladmin shutdown}.) Einige Systeme lassen es nicht zu, dass eine
neue Programmversion installiert wird, wenn diese eine Version ersetzt, die
momentan ausgef�hrt wird.


@node configure options, Installing source tree, Applying patches, Installing source
@c German node Optionen konfigurieren
@subsection Typische @code{configure}-Optionen

@findex without-server-Option
@cindex @code{configure}-Skript
@cindex Optionen, configure
@cindex Konfigurationsoptionen
@cindex Log-Dateien
@cindex Dateien, Log

Das @code{configure}-Skript gibt Ihnen in gro�em Umfang Kontrolle �ber die
Konfigurationsm�glichkeiten Ihrer MySQL-Distribution. Typischerweise machen
Sie das unter Verwendung der Optionen auf der
@code{configure}-Kommandozeile. Sie k�nnen ausserdem @code{configure}
beeinflussen, indem Sie bestimmte Umgebungsvariablen benutzen.
@xref{Environment variables}. Um eine Liste der Optionen zu erhalten, die
@code{configure} unterst�tzt, geben Sie folgendes ein:

@example
shell> ./configure --help
@end example

Einige der gebr�uchlicheren @code{configure}-Optionen sind im Folgenden
beschrieben:

@itemize @bullet
@item
Um nur die MySQL-Client Bibliotheken und Client-Programme und nicht den
Server zu kompilieren, benutzen Sie die @code{--ohne-server}-Option:

@example
shell> ./configure --without-server
@end example

@c FIX incorrect..

Wenn Sie keinen C++-Kompiler haben, k�nnen Sie @code{mysql} nicht
kompilieren (MySQL ist das einzige Client-Programm, das C++ erfordert). In
diesem Fall k�nnen Sie den Code in @code{configure} entfernen, der auf den
C++-Kompiler testet, und dann @code{./configure} mit der
@code{--without-server}-Option eingeben. Dieser Kompilierschritt wird nach
wie vor versuchen, @code{mysql} zu bauen, aber Sie k�nnen alle Warnungen zu
@file{mysql.cc} ignorieren. (Wenn @code{make} anh�lt, versuchen Sie
@code{make -k}, um ihm mitzuteilen, dass es mit dem Rest des Builds
fortfahren soll, auch wenn Fehler auftreten.)

@item
Wenn Sie nicht wollen, dass Ihre Log-Dateien und Datenbankverzeichnisse
unter @file{/usr/local/var} liegen, benutzen Sie ein
@code{configure}-Kommando wie folgendes:

@example
shell> ./configure --prefix=/usr/local/mysql
shell> ./configure --prefix=/usr/local \
           --localstatedir=/usr/local/mysql/data
@end example

Der erste Befehl �ndert das Installationspr�fix, so dass alles unter
@file{/usr/local/mysql} statt unter @file{/usr/local} installiert wird. Der
zweite Befehl bewahrt das vorgabem��ige Installationspr�fix, aber
�berschreibt die vorgabem��ige Stelle f�r Datenbankverzeichnisse
(normalerweise @file{/usr/local/var}) und �ndert sie zu
@code{/usr/local/mysql/data}.

@cindex Speicherort des Sockets �ndern
@cindex Socket-Speicherort, �ndern
@cindex mysql.sock, �nderung des Speicherorts
@item

Wenn Sie Unix benutzen und wollen, dass der MySQL-Socket an anderer Stelle
liegt als vorgabem��ig (normalerweise im Verzeichnis @file{/tmp} oder
@file{/var/run}), benutzen Sie ein @code{configure}-Kommando wie folgendes:

@example
shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
@end example

Beachten Sie, dass die angegebene Datei mit einem absoluten Pfadnamen
angegeben werden muss! Sie k�nnen den Speicherort von @file{mysql.sock}
auch sp�ter noch �ndern, indem Sie die MySQL Optionsdateien benutzen.
@xref{Problems with mysql.sock}.

@cindex Kompilieren, statisch
@cindex Statisch, Kompilieren
@item
Wenn Sie statisch gelinkte Programme kompilieren wollen (um zum Beispiel
eine Bin�rdistribution zu machen, mehr Geschwindigkeit zu erhalten oder
Probleme mit RedHat-Linux-Distributionen zu umgehen (Workaround)), geben
Sie @code{configure} wie folgt ein:

@example
shell> ./configure --with-client-ldflags=-all-static \
           --with-mysqld-ldflags=-all-static
@end example



@tindex @code{CC} Umgebungsvariable
@tindex Umgebungsvariable, @code{CC}
@tindex @code{CXX} Umgebungsvariable
@tindex Umgebungsvariable, @code{CXX}
@cindex @code{gcc}
@cindex C++-Kompiler, @code{gcc}
@cindex Kompiler, C++ @code{gcc}
@item
Wenn Sie @code{gcc} benutzen und @code{libg++} oder @code{libstdc++} nicht
installiert haben, k�nnen Sie @code{configure} mitteilen, @code{gcc} als
Ihren C++-Kompiler zu benutzen:

@example
shell> CC=gcc CXX=gcc ./configure
@end example

Wenn Sie @code{gcc} als C++-Kompiler benutzen, versucht dieser nicht,
@code{libg++} oder @code{libstdc++} zu linken.

Hier sind einige gebr�uchliche Umgebungsvariablen, die man in Abh�ngigkeit
vom verwendeten Kompiler setzen kann:

@tindex CXXFLAGS Umgebungsvariable
@tindex Umgebungsvariable, CXXFLAGS
@multitable @columnfractions .20 .80
@item gcc 2.7.2.1 @tab
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors"
@item egcs 1.0.3a @tab
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti"
@item gcc 2.95.2 @tab
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti"
@item pgcc 2.90.29 oder newer @tab
CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti"
@end multitable

In den meisten F�llen erhalten Sie eine ziemlich optimale MySQL-Bin�rdatei,
indem Sie die Optionen von weiter oben nutzen und die folgenden Optionen
zur Konfigurationszeile hinzuf�gen:

@example
--prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static
@end example

Die komplette Konfigurationszeile w�rde also etwa wie folgt aussehen (f�r
alle aktuellen gcc-Versionen):

@example
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static
@end example

Die Bin�rdistributionen, die wir auf der MySQL-Website unter
@uref{http://www.mysql.com} zur Verf�gung stellen, sind allesamt mit voller
Optimierung kompiliert und sollten daher f�r die meisten Benutzer perfekt
sein. @xref{MySQL binaries}. Einiges k�nnen Sie noch fein justieren, um
noch schnellere Bin�rdistributionen zu erhalten, aber das ist nur etwas f�r
fortgeschrittene Benutzer.  @xref{Compile and link options}.

Wenn der Build fehlschl�gt und Fehler produziert, die aussagen, dass Ihr
Kompiler oder Linker nicht in der Lage ist, die gemeinsam benutzte
(shared) Bibliothek @file{libmysqlclient.so.#} (@samp{#} ist eine
Versionsnummer) zu erzeugen, k�nnen Sie dieses Problem umgehen, indem Sie
die @code{--disable-shared}-Option von @code{configure} benutzen. In diesem
Fall baut @code{configure} keine gemeinsam benutzte
@code{libmysqlclient.so.#}-Bibliothek.

@cindex Vorgabewerte, Unterdr�ckung
@cindex Unterdr�ckung, Vorgabewerte
@item
Sie k�nnen MySQL so konfigurieren, dass keine @code{DEFAULT}-Spaltenwerte
f�r Nicht-@code{NULL}-Spalten benutzt werden (also Spalten, bei denen nicht
zul�ssig ist, dass sie @code{NULL} sind). Das f�hrt dazu, dass
@code{INSERT}-Statements einen Fehler erzeugen, ausser wenn ausdr�cklich
Werte f�r Spalten angegeben werden, die einen Nicht-@code{NULL}-Werte
verlangen. Um die Benutzung von Vorgabewerten zu unterdr�cken, geben Sie
@code{configure} wie folgt ein:

@tindex CXXFLAGS Umgebungsvariable
@tindex Umgebungsvariable, CXXFLAGS
@example
shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
@end example

@cindex Zeichens�tze
@findex configure-Option, --with-charset
@findex configure-Option, --with-extra-charset
@item
Als Vorgabe benutzt MySQL den Zeichensatz ISO-8859-1 (Latin1). Um diesen
Vorgabesatz zu �ndern, benutzen Sie die @code{--with-charset}-Option:
@example
shell> ./configure --with-charset=CHARSET
@end example
@code{CHARSET} kann einer der folgenden sein: @code{big5}, @code{cp1251}, @code{cp1257},
@code{czech}, @code{danish}, @code{dec8}, @code{dos}, @code{euc_kr},
@code{gb2312}, @code{gbk}, @code{german1}, @code{hebrew}, @code{hp8},
@code{hungarian}, @code{koi8_ru}, @code{koi8_ukr}, @code{latin1},
@code{latin2}, @code{sjis}, @code{swe7}, @code{tis620}, @code{ujis},
@code{usa7} oder @code{win1251ukr}.
@xref{Character sets}.

Wenn Sie Zeichen zwischen Server und Client konvertieren wollen, sollten
Sie sich den @code{SET OPTION CHARACTER SET}-Befehl ansehen.
@xref{SET OPTION, , @code{SET OPTION}}.

@cindex @code{myisamchk}
@strong{Achtung:} Wenn Sie Zeichens�tze �ndern, nachdem Sie irgend welche
Tabellen angelegt haben, m�ssen Sie @code{myisamchk -r -q} �ber jede
Tabelle laufen lassen, denn ansonsten k�nnten Ihre Indexe falsch sortiert
werden. (Das kann passieren, wenn Sie MySQL installieren, ein paar Tabellen
erzeugen und danach MySQL rekonfigurieren, so dass es einen anderen
Zeichensatz benutzt, und dann neu installieren.)

Mit der Option @code{--with-extra-charset=LIST} k�nnen Sie zus�tzliche
Zeichens�tze definieren, die in den Server einkompiliert werden sollen.

Hierbei ist @code{LIST} entweder eine Liste eines Zeichensatzes, die durch
Leerzeichen getrennt ist, oder @code{complex}, um alle Zeichen
einzuschlie�en, die nicht dynamisch geladen werden k�nnen, oder
@code{all}, um alle Zeichens�tze in die Bin�rdateien einzuschlie�en.

@item
Um MySQL mit Debug-Code zu konfigurieren, benutzen Sie die
@code{--with-debug}-Option:
@example
shell> ./configure --with-debug
@end example
Das bewirkt, dass eine sichere Speicherzuweisung (Memory Allocator)
eingeschlossen wird, die einige Fehler finden kann und die Ausgaben
liefert, was passiert ist. @xref{Debugging server}.

@item
Wenn Ihre Client-Programme Threads benutzen, m�ssen Sie zus�tzlich eine
Thread-sichere Version der MySQL-Client-Bibliothek mit der
@code{--enable-Thread-safe-client}-configure-Option kompilieren. Hierdurch
wird eine @code{libmysqlclient_r}-Bibliothek angelegt, mit der Sie Ihre
threaded Applikationen linken k�nnen. @xref{Threaded clients}.

@item
Optionen, die zu bestimmten Systemen geh�ren, finden sich im
systemspezifischen Abschnitt dieses Handbuchs. @xref{Which OS, , Betriebssystemspezifische Anmerkungen}.
@end itemize


@node Installing source tree, Compilation problems, configure options, Installing source
@c German node Installation vom Entwicklungs-Source-Tree
@subsection Installation vom Entwicklungs-Source-Tree

@cindex Entwicklungs-Source-Tree
@cindex BitKeeper-Tree
@cindex CVS-Tree

@strong{VORSICHT:} Sie sollten diesen Abschnitt nur lesen, wenn Sie daran
interessiert sind, uns beim Testen von neuem Code zu helfen. Wenn Sie nur
wollen, dass MySQL auf Ihrem System l�uft, sollten Sie eine
Standard-Distribution w�hlen (entweder eine Quell- oder eine
Bin�rdistribution).

Um unseren aktuellsten Entwicklungs-Source-Tree zu bekommen, folgen Sie
diesen Anweisungen:

@enumerate
@item
Laden Sie @strong{BitKeeper} von
@uref{http://www.bitmover.com/cgi-bin/download.cgi} herunter. Sie ben�tigen
@strong{Bitkeeper} 2.0 oder neuer, um auf unser Repository zuzugreifen.

@item
Folgen Sie den Anweisungen, um BitKeeper zu installieren.

@item
Nachdem @strong{BitKeeper} installiert ist, benutzen Sie diesen Befehl, um
den MySQL-3.23-Branch zu klonen:

@example
shell> bk clone bk://work.mysql.com:7000 mysql
@end example

Um den 4.0-Branch zu klonen, benutzen Sie statt dessen diesen Befehl:

@example
shell> bk clone bk://work.mysql.com:7001 mysql-4.0
@end example

Das erstmalige Herunterladen des Source-Trees kann eine Weile dauern,
abh�ngig von Ihrer Verbindungsgeschwindigkeit. Bitte Geduld.

@item
Sie brauchen GNU @code{autoconf}, @code{automake}, @code{libtool} und
@code{m4}, um die n�chsten Befehle auszuf�hren.
Wenn Sie in diesem Stadium seltsame Fehler erhalten, �berpr�fen Sie bitte,
ob Sie wirklich @code{libtool} installiert haben!

@example
shell> cd mysql
shell> bk -r edit
shell> aclocal; autoheader; autoconf;  automake;
shell> ./configure  # Geben Sie hier Ihre Lieblingsoptionen an
shell> make
@end example

Eine Sammlung unserer Standard-configure-Skripts befindet sich im
@file{BUILD/} Unterverzeichnis. Wenn Sie faul sind, k�nnen Sie
@file{BUILD/compile-pentium-debug} benutzen. Um f�r unterschiedliche
Architekturen zu kompilieren, �ndern Sie das Skript ab und entfernen die
Flags, die Pentium-spezifisch sind.

@item
Wenn der Build fertig ist, lassen Sie @code{make install} laufen. Seien Sie
damit vorsichtig auf Produktionsmaschinen, denn dieser Befehl kann Ihre
Live-Release-Installation �berschreiben! Wenn Sie eine weitere Installation
von MySQL haben, empfehlen wir, dass Sie @code{./configure} mit anderen
Werten f�r die @code{prefix}-, @code{tcp-port}- und
@code{unix-socket-path}-Optionen ausf�hren als die, die f�r Ihren
Produktionsserver benutzt werden.

@item
Spielen Sie reichlich mit Ihrer neuen Installation herum und versuchen Sie,
die neuen Features zum Absturz zu bringen. Fangen Sie an, indem Sie
@code{make test} laufen lassen. @xref{MySQL-Test-Suite}.

@item
Wenn Sie bis zum @code{make}-Stadium gekommen sind und die Distribution
sich nicht kompilieren l��t, berichten Sie das bitte an
@email{bugs@@lists.mysql.com}. Wenn Sie die letzten Versionen der
erforderlichen GNU-Werkzeuge installiert haben und sie abst�rzen, wenn Sie
versuchen, Ihre Konfigurationsdateien zu verarbeiten, berichten Sie das
bitte ebenfalls. Wenn Sie jedoch @code{aclocal} und einen @code{Befehl
nicht gefunden}-Fehler erhalten, berichten Sie diesen nicht. Stellen Sie
statt dessen sicher, dass alle notwendigen Werkzeuge installiert sind und dass
Ihre @code{PATH}-Variable korrekt gesetzt ist, damit Ihre Shell diese
finden kann.

@item
Nach der erstmaligen @code{bk clone}-Operation, um den Source-Tree zu
erhalten, sollten Sie in regelm��igen Abst�nden @code{bk pull} laufen
lassen, um Aktualisierungen zu erhalten.

@item
Sie erhalten die �nderungen-Geschichte (Change History) des Trees mit allen
Diffs, indem Sie @code{bk sccstool} benutzen. Wenn Sie seltsame Diffs sehen
oder Code, zu dem Sie Fragen haben, z�gern Sie nicht, uns eine E-Mail an
@email{internals@@lists.mysql.com} zu schicken. Auch wenn Sie meinen, eine
bessere Idee zu haben, wie etwas gemacht werden sollte, schicken Sie uns
eine E-Mail an dieselbe Adresse, mit einem Patch. @code{bk diffs} erzeugt
ein Patch f�r Sie, nachdem Sie �nderungen am Quellcode durchgef�hrt haben.
Wenn Sie keine Zeit haben, Ihre Idee zu kodieren, schicken Sie einfach eine
Beschreibung.

@item
@strong{BitKeeper} hat ein nettes Hilfe-Dienstprogramm, auf das Sie �ber @code{bk
helptool} zugreifen k�nnen.

@end enumerate


@node Compilation problems, MIT-pthreads, Installing source tree, Installing source
@c German node Kompilierungsprobleme
@subsection Probleme beim Kompilieren?

@cindex Kompilieren, Probleme
@cindex Probleme, Kompilieren
@cindex Rekonfigurieren
@cindex @code{config.cache}-Datei
@cindex Dateien, @code{config.cache}

Alle MySQL-Programme lassen sich sauber ohne Warnungen auf Solaris mit
@code{gcc} kompilieren. Auf anderen Systemen k�nnen Warnungen wegen
Unterschieden in System-Include-Dateien auftreten. Siehe @ref{MIT-pthreads}
wegen Warnungen, die auftreten k�nnen, wenn Sie MIT-pThreads verwenden.
Wegen anderer Probleme sehen Sie bitte in der unten stehenden Liste nach.

Die L�sung f�r viele Probleme beinhaltet Rekonfigurieren. Wenn Sie
rekonfigurieren m�ssen, beachten Sie Folgendes:

@cindex @code{configure} nach dem ersten Aufruf laufen lassen
@cindex @code{configure}, laufen lassen nach dem ersten Aufruf
@cindex Rekonfigurieren
@cindex config.cache
@itemize @bullet
@item
Wenn @code{configure} laufen gelassen wird, nachdem es schon einmal lief,
benutzt es m�glicherweise Informationen, die bei vorherigen Aufrufen
gesammelt wurden. Diese Information wird in der Datei @file{config.cache}
gespeichert. Wenn @code{configure} startet, sucht es diese Datei und liest
ihren Inhalt, wenn sie existiert, unter der Annahme, dass diese Information
immer noch stimmt. Diese Annahme ist falsch, wenn Sie rekonfigurieren.

@item
Immer, wenn Sie @code{configure} laufen lassen, m�ssen Sie auch @code{make}
laufen lassen, um erneut zu kompilieren. Sie werden jedoch einige alte
Objektdateien vorheriger Builds entfernen wollen, denn diese wurden mit
anderen Konfigurationsoptionen kompiliert.
@end itemize

Um zu verhindern, dass alte Konfigurationsinformationen oder Objektdateien
benutzt werden, geben Sie vor dem erneuten Aufruf von @code{configure}
folgende Befehle ein:

@example
shell> rm config.cache
shell> make clean
@end example

Alternativ k�nnen Sie auch @code{make distclean} laufen lassen.

Die unten stehende Liste beschreibt einige der Probleme, die beim
Kompilieren von MySQL am h�ufigsten auftreten:

@itemize @bullet
@item
@cindex @code{cc1plus}-Probleme
@cindex @code{fatal signal 11}
@cindex @code{sql_yacc.cc}-Probleme
@cindex Interne Kompiler-Fehler
@cindex Virtueller Speicher, Probleme beim Kompilieren
@cindex configure-Option, --with-low-memory
Wenn Sie Probleme beim Kompilieren von @file{sql_yacc.cc} erhalten, die den
unten gezeigten �hneln, haben Sie wahrscheinlich keinen Arbeitsspeicher
oder Swap-Platz (Auslagerungsdatei) mehr.

@example
Internal compiler error: Programm cc1plus got fatal signal 11
  oder
Out of virtual memory
  oder
Virtual memory exhausted
@end example

Das Problem liegt darin, dass @code{gcc} riesige Mengen von Arbeitsspeicher
ben�tigt, um @file{sql_yacc.cc} mit Inline-Funktionen zu kompilieren.
Versuchen Sie, @code{configure} mit der @code{--with-low-memory}-Option
auszuf�hren:

@example
shell> ./configure --with-low-memory
@end example

Diese Option veranlasst, dass @code{-fno-inline} zur Kompilierzeile
hinzugef�gt wird, wenn Sie @code{gcc} benutzen, bzw. @code{-O0}, wenn Sie
etwas anderes benutzen. Sie sollten die @code{--with-low-memory}-Option
selbst dann benutzen, wenn Sie glauben, so viel Arbeitsspeicher und
Swap-Platz zu haben, dass Ihnen diese unm�glich ausgehen k�nnen. Das
Problem wurde selbst auf Systemen mit gro�z�giger Hardware-Ausstattung
beobachtet, und die @code{--with-low-memory}-Option behebt es
�blicherweise.

@item
Vorgabem��ig sucht @code{configure} @code{c++} als Kompiler-Namen aus und
GNU @code{c++} linkt mit @code{-lg++}. Wenn Sie @code{gcc} benutzen, kann
dieses Verhalten Probleme bei Konfigurationen wie dieser verursachen:

@cindex C++-Kompiler kann keine ausf�hrbaren Dateien (Executables) erzeugen
@example
configure: error: installation oder configuration problem:
c++ compiler cannot create executables.
@end example

@tindex CXX-Umgebungsvariable
@tindex Umgebungsvariable, CXX
Eventuell sto�en Sie beim Kompilieren auch auf Probleme, die mit
@code{g++}, @code{libg++} oder @code{libstdc++} zu tun haben.

Eine Ursache dieser Probleme liegt darin, dass Sie kein @code{g++} haben
d�rfen, oder Sie d�rfen @code{g++} haben, aber nicht @code{libg++} oder
@code{libstdc++}. Schauen Sie in die @file{config.log}-Datei! Sie sollten
die genaue Ursache enthalten, warum Ihr C++-Kompiler nicht funktioniert! Um
dieses Problem zu umgehen, k�nnen Sie @code{gcc} als Ihren C++-Kompiler
benutzen. Versuchen Sie, die Umgebungsvariable @code{CXX} auf @code{"gcc
-O3"} zu setzen. Beispiel:

@tindex CXX-Umgebungsvariable
@tindex Umgebungsvariablen, CXX
@example
shell> CXX="gcc -O3" ./configure
@end example

Das funktioniert, weil @code{gcc} C++-Quellen genau so gut wie @code{g++}
kompiliert, aber vorgabem��ig weder @code{libg++} noch @code{libstdc++}
linkt.

Eine andere M�glichkeit, das Problem zu beheben, besteht nat�rlich darin,
@code{g++}, @code{libg++} und @code{libstdc++} zu installieren.

@item
Wenn Ihr Kompilieren mit Fehlern wie dem folgenden fehlschl�gt, m�ssen Sie
Ihre Version von @code{make} auf GNU @code{make} aktualisieren:

@example
making all in mit-pThreads
make: Fatal error in reader: Makefile, line 18:
Badly formed macro assignment
  oder
make:Datei `Makefile' line 18: Must be a separator (:
  oder
pThread.h: No such file or directory
@end example

@cindex Solaris-Troubleshooting
@cindex FreeBSD-Troubleshooting
@cindex Troubleshooting, Solaris
@cindex Troubleshooting, FreeBSD
Von Solaris und FreeBSD ist bekannt, dass sie problembehaftete
@code{make}-Programme haben.

GNU @code{make} Version 3.75 funktioniert bekannterma�en.

@tindex CC-Umgebungsvariable
@tindex Umgebungsvariable, CC
@tindex CXX-Umgebungsvariable
@tindex Umgebungsvariable, CXX
@tindex CFLAGS-Umgebungsvariable
@tindex Umgebungsvariable, CFLAGS
@tindex CXXFLAGS-Umgebungsvariable
@tindex Umgebungsvariable, CXXFLAGS
@item
Wenn Sie Flags definieren wollen, die von Ihrem C- oder C++-Kompiler
benutzt werden, f�gen Sie die Flags den @code{CFLAGS}- und
@code{CXXFLAGS}-Umgebungsvariablen hinzu. Sie k�nnen auf diese Weise auch
die Kompilernamen festlegen, indem Sie @code{CC} und @code{CXX} benutzen.
Beispiel:

@example
shell> CC=gcc
shell> CFLAGS=-O3
shell> CXX=gcc
shell> CXXFLAGS=-O3
shell> export CC CFLAGS CXX CXXFLAGS
@end example

Siehe @ref{MySQL binaries}: Eine Liste von Flag-Definitionen, die sich
auf verschiedenen Systemen als n�tzlich erwiesen haben.

@item
Wenn Sie einen Fehler wie den folgenden erhalten, m�ssen Sie Ihren
@code{gcc}-Kompiler aktualisieren:

@example
client/libmysql.c:273: parse error before `__attribute__'
@end example

@code{gcc} 2.8.1 funktioniert bekannterma�en, aber wir empfehlen statt
dessen @code{gcc} 2.95.2 oder @code{egcs} 1.0.3a.

@item
Wenn Sie Fehler wie die unten stehenden erhalten, wenn Sie @code{mysqld}
kompilieren, hat @code{configure} den Typ des letzten Arguments f�r
@code{accept()}, @code{getsockname()} oder @code{getpeername()} nicht
korrekt erkannt:

@example
cxx: Error: mysqld.cc, line 645: In this statement, the referenced
     type of the pointer value "&length" is "unsigned long", which
     is not compatible with "int".
new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
@end example

Um das zu beheben, editieren Sie die @file{config.h}-Datei (die von
@code{configure} angelegt wird). Suchen Sie nach folgenden Zeilen:

@example
/* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX
@end example

�ndern Sie @code{XXX} zu @code{size_t} oder @code{int}, abh�ngig von Ihrem
Betriebssystem. (Beachten Sie, dass Sie das jedes Mal tun m�ssen, wenn Sie
@code{configure} laufen lassen, weil @code{configure} die Datei
@file{config.h} neu erzeugt.)

@item
Die @file{sql_yacc.cc}-Datei wird von @file{sql_yacc.yy} erzeugt.
Normalerweise muss der Build-Prozess keine @file{sql_yacc.cc} erzeugen,
weil MySQL schon mit einer fertig erzeugten Kopie daher kommt. Wenn Sie sie
jedoch neu erzeugen m�ssen, k�nnten Sie folgenden Fehler erhalten:

@example
"sql_yacc.yy", line xxx fatal: default action causes potential...
@end example

Das ist ein Indiz daf�r, dass Ihre Version von @code{yacc} fehlerhaft ist.
Sie m�ssen statt dessen wahrscheinlich @code{bison} (die GNU-Version von
@code{yacc}) installieren und benutzen.

@item
Wenn Sie @code{mysqld} oder einen MySQL-Client debuggen wollen, lassen Sie
@code{configure} mit der @code{--with-debug}-Option laufen. Kompilieren Sie
danach neu und linken Sie Ihre Clients mit der neuen Client-Bibliothek.
@xref{Debugging client}.
@end itemize

@node MIT-pthreads, Windows source build, Compilation problems, Installing source
@c German node MIT-pThreads
@subsection Anmerkungen zu MIT-pThreads

@cindex MIT-pThreads
@cindex Thread-Unterst�tzung, nicht-native

Dieser Abschnitt beschreibt einige der Themen im Zusammenhang mit MIT-pThreads.

Beachten Sie, dass Sie auf Linux KEINE MIT-pThreads benutzen, sondern statt
dessen LinuxThreads installieren sollten!
@xref{Linux}.

Wenn Ihr System keine native Thread-Unterst�tzung bietet, m�ssen Sie MySQL
unter Verwendung des MIT-pThread-Pakets bauen. Das betrifft �ltere
FreeBSD-Systeme, SunOS 4.x, Solaris 2.4 und fr�her und einige andere.
@xref{Which OS}.

@itemize @bullet
@item
Auf den meisten Systemen k�nnen Sie die Benutzung von erzwingen, indem Sie
@code{configure} mit der @code{--with-mit-Threads}-Option laufen lassen:

@example
shell> ./configure --with-mit-threads
@end example

Wenn Sie MIT-pThreads benutzen, wird das Bauen (Building) in ein
Nicht-Quellcode-Verzeichnis nicht unterst�tzt, weil wir die �nderungen an
diesem Code minimal halten wollen.

@item
Die �berpr�fungen, die festlegen, ob MIT-pThreads benutzt werden sollten
oder nicht, finden nur in dem Teil des Konfigurationsprozesses statt, der
mit dem Server-Code zu tun hat. Wenn Sie die Distribution mit
@code{--without-server} konfigurieren, um nicht den Client-Code zu bauen,
wissen die Clients nicht, ob sie MIT-pThreads benutzen sollen oder nicht
und werden vorgabem��ig Unix-Socket-Verbindungen benutzen. Weil
Unix-Sockets unter MIT-pThreads nicht laufen, hei�t das, dass Sie
@code{-h} oder @code{--host} benutzen m�ssen, wenn Sie Client-Programme
laufen lassen.

@item
Wenn MySQL so kompiliert wird, dass es MIT-pThreads benutzt, wird
System-Sperren (System Locking) vorgabem��ig aus Performance-Gr�nden
ausgeschaltet. Mit der @code{--use-locking}-Option k�nnen Sie dem Server
mitteilen, System-Sperren zu benutzen.

@item
Manchmal schl�gt der pThread-@code{bind()}-Befehl fehl und bindet nicht an
ein Socket, ohne jede Fehlermeldung (zumindest auf Solaris). Als Ergebnis
schlagen alle Verbindungen zum Server fehl. Beispiel:

@example
shell> mysqladmin version
mysqladmin: connect to server at '' failed;
error: 'Can't connect to mysql server on localhost (146)'
@end example

Die L�sung besteht darin, den @code{mysqld}-Server zu killen und neu zu
starten. Uns ist das nur dann passiert, wenn wir den Server gezwungen
haben, herunter zu fahren und sofort danach einen Neustart durchgef�hrt
haben.

@item
Bei MIT-pThreads l��t sich der @code{sleep()}-Systemaufruf nicht mit
@code{SIGINT} (break) unterbrechen. Das merken Sie nur, wenn Sie
@code{mysqladmin --sleep} ausf�hren. Sie m�ssen dann warten, bis der
@code{sleep()}-Aufruf beendet wurde, bevor die Unterbrechungsanforderung
(Interrupt) bedient wird und der Prozess anh�lt.

@item
Wenn Sie linken, erhalten Sie m�glicherweise Warnmeldungen wie diese
(zumindest auf Solaris). Sie k�nnen sie ignorieren:

@example
ld: warning: symbol `_iob' hat differing sizes:
    (file /my/local/pThreads/lib/libpThread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
    /my/local/pThreads/lib/libpThread.a(findfp.o) definition taken
ld: warning: symbol `__iob' hat differing sizes:
    (file /my/local/pThreads/lib/libpThread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
    /my/local/pThreads/lib/libpThread.a(findfp.o) definition taken
@end example

@item
Einige weitere Warnungen k�nnen ebenfalls ignoriert werden:

@example
implicit declaration of function `int strtoll(...)'
implicit declaration of function `int strtoul(...)'
@end example

@item
Wir haben es bislang nicht geschafft, @code{readline} mit MIT-pThreads zum
Laufen zu bringen. (Das wird zwar nicht ben�tigt, mag aber f�r einige
interessant sein.)
@end itemize

@menu
* Windows-Umgebung vorbereiten::  
@end menu

@node Windows-Umgebung vorbereiten,  , MIT-pthreads, MIT-pthreads
@c German node <no English equivalent>
@subsubsection Vorbereitung der Windows-Umgebung

@node Windows source build,  , MIT-pthreads, Installing source
@c German node Windows-Quelldistribution
@subsection Windows-Quelldistribution

Sie ben�tigen folgendes:

@itemize @bullet
@item
VC++-6.0-Kompiler (aktualisiert mit Service-Pack 4 oder 5 und dem
Pr�prozessor-Paket). Das Pr�prozessor-Paket wird f�r den Makro-Assembler
ben�tigt. Weitere Details finden Sie unter:
@uref{http://msdn.microsoft.com/vstudio/sp/vs6sp5/faq.asp}.
@item
Die MySQL-Quelldistribution f�r Windows, die von
@uref{http://www.mysql.com/downloads/} herunter geladen werden kann.
@end itemize

MySQL bauen

@enumerate
@item
Erzeugen Sie ein Arbeitsverzeichnis (z. B. workdir).
@item
Entpacken Sie die Quelldistribution in dieses Verzeichnis.
@item
Starten Sie den VC++-6.0-Kompiler.
@item
W�hlen Sie im @code{File}-Men� @code{Open Workspace}.
@item
�ffnen Sie den @file{mysql.dsw}-Workspace, den Sie im Arbeitsverzeichnis
finden.
@item
W�hlen Sie im @code{Build}-Men� das @code{Set Active Configuration}-
Men�.
@item
W�hlen Sie @code{mysqld - Win32 Debug} und klicken Sie auf OK.
@item
Dr�cken Sie @code{F7}, um mit dem Bauen des Debug-Servers, der
Bibliotheken und einiger Client-Applikationen zu beginnen.
@item
Wenn das Kompilieren beendet ist, kopieren Sie die Bibliotheken und die
ausf�hrbaren Dateien in ein separates Verzeichnis.
@item
Kompilieren Sie die Release-Versionen, die Sie haben wollen, auf
dieselbe Art.
@item
Erzeugen Sie das Verzeichnis f�r die MySQL-Dateien, z. B.
@file{c:\mysql}.
@item
Kopieren Sie aus dem Arbeitsverzeichnis folgende Verzeichnisse in das
c:\mysql-Verzeichnis:

@itemize @bullet
@item Data
@item Docs
@item Share
@end itemize

@item
Erzeugen Sie das Verzeichnis @file{c:\mysql\bin} und kopieren Sie alle
Server und Clients, die Sie vorher kompiliert haben, hinein.
@item
Wenn Sie wollen, k�nnen Sie auch das @file{lib}-Verzeichnis erzeugen und
die vorher kompilierten Bibliotheken hinein kopieren.
@item
F�hren Sie mit Visual Studio ein Clean durch.
@end enumerate

Konfigurieren und starten Sie den Server auf dieselbe Weise wie bei der
Windows-Bin�rdistribution. @xref{Windows-Umgebung vorbereiten}.


@node Post-installation, Upgrade, Installing source, Installing
@c German node Nach der Installation
@section Einstellungen und Tests nach der Installation

@cindex Nach der Installation, Einstellungen und Tests
@cindex Testen, nach der Installation
@cindex Setup, nach der Installation


Wenn Sie MySQL erst einmal installiert haben (aus einer Bin�r- oder einer
Quelldistribution), m�ssen Sie die Berechtigungstabellen (Grant Tables)
initialisieren, den Server starten und sicherstellen, dass der Server
korrekt funktioniert. Eventuell wollen Sie auch einrichten, dass der Server
automatisch gestartet und angehalten wird, wenn Ihr System startet oder
herunter gefahren wird.

Normalerweise installieren Sie die Berechtigungstabellen und starten den
Server wie folgt:
Bei der Installation einer Quelldistribution:
@cindex Start, den Server
@cindex Server, starten

@example
shell> ./scripts/mysql_install_db
shell> cd mysql_installations_verzeichnis
shell> ./bin/safe_mysqld --user=mysql &
@end example

Bei einer Bin�rdistribution (nicht RPM- oder pkg-Pakete) tun Sie folgendes:

@example
shell> cd mysql_installations_verzeichnis
shell> ./bin/mysql_install_db
shell> ./bin/safe_mysqld --user=mysql &
@end example

Das legt die @code{mysql}-Datenbank an, die alle Zugriffsrechte auf
Datenbanken enth�lt, die @code{test}-Datenbank, die Sie benutzen k�nnen, um
MySQL zu testen und zus�tzlich Berechtigungseintr�ge f�r den Benutzer, der
@code{mysql_install_db} ausf�hrt sowie einen @code{root}-Benutzer (ohne
Passworte!). Durch den letzten Befehl wird der @code{mysqld}-Server
gestartet.

@code{mysql_install_db} �berschreibt keine alten Berechtigungstabellen,
deshalb sollte es unter allen Umst�nden sicher sein. Wenn Sie die
@code{test}-Datenbank nicht haben wollen, k�nnen Sie sie mit
@code{mysqladmin -u root drop test} entfernen.

Am einfachsten l��t sich das Durchtesten vom obersten Verzeichnis der
MySQL-Distribution durchf�hren. Bei einer Bin�rdistribution ist das Ihr
Installationsverzeichnis (�blicherweise etwas wie @file{/usr/local/mysql}).
Bei einer Quelldistribution ist es das Hauptverzeichnis Ihres
MySQL-Source-Trees.
@cindex Testen, den Server


In den unten dargestellten Befehlen dieses Abschnitts und der folgenden
Unterabschnitte ist @code{BINDIR} der Pfad zu dem Speicherort, wo Programme
wie @code{mysqladmin} und @code{safe_mysqld} installiert sind. Bei einer
Bin�rdistribution ist das @file{bin}-Verzeichnis innerhalb der
Distribution. Bei einer Quelldistribution ist @code{BINDIR} wahrscheinlich
@file{/usr/local/bin}, es sei denn, Sie haben ein anderes
Installationsverzeichnis als @file{/usr/local} angegeben, als Sie
@code{configure} laufen lie�en. @code{EXECDIR} ist der Speicherort, in dem
der @code{mysqld}-Server installiert ist. Bei einer Bin�rdistribution ist
das derselbe wie @code{BINDIR}. Bei einer Quelldistribution ist
@code{EXECDIR} wahrscheinlich @file{/usr/local/libexec}.

Das Durchtesten wird im Folgenden detailliert beschrieben.
@cindex Testen, Installation

@enumerate
@item
Falls notwendig, starten Sie den @code{mysqld}-Server und richten die
anf�nglichen MySQL-Berechtigungstabellen ein, die alle Zugriffsrechte
enthalten, die festlegen, wie sich Benutzer mit dem Server verbinden
d�rfen. Das wird normalerweise mit dem @code{mysql_install_db}-Skript
gemacht:

@example
shell> scripts/mysql_install_db
@end example

Typischerweise m�ssen Sie @code{mysql_install_db} nur laufen lassen, wenn
Sie MySQL zum ersten Mal installieren. Wenn Sie eine existierende
Installation aktualisieren (Update), k�nnen Sie deshalb diesen Schritt
�berspringen. (@code{mysql_install_db} ist jedoch ziemlich sicher und
aktualisiert keine bereits existierenden Tabellen, daher k�nnen Sie im
Zweifel immer @code{mysql_install_db} laufen lassen.)

@code{mysql_install_db} erzeugt sechs Tabellen (@code{user}, @code{db},
@code{host}, @code{tables_priv}, @code{columns_priv} und @code{func}) in
der @code{mysql}-Datenbank.  Eine Beschreibung der anf�nglichen
Zugriffsrechte wird in @ref{Privileges} festgelegt. Kurz gesagt
erlauben diese Zugriffsrechte dem MySQL-Benutzer @code{root}, alles zu tun,
und jedem, Datenbanken anzulegen oder zu benutzen, deren Name @code{'test'}
ist oder mit @code{'test_'} beginnt.

Wenn Sie die Zugriffsberechtigungstabellen (Grant Tables) nicht einrichten,
wird folgender Fehler in der Logdatei erscheinen, wenn Sie den Server
starten:

@tindex host.frm, problems finding
@example
mysqld: Can't find file: 'host.frm'
@end example

Dasselbe kann auch bei einer MySQL-Bin�rdistribution passieren, wenn Sie
MySQL nicht mit exakt @code{./bin/safe_mysqld} starten!
@xref{safe_mysqld, , @code{safe_mysqld}}.

Eventuell m�ssen Sie @code{mysql_install_db} als @code{root} laufen lassen.
Wenn Sie wollen, k�nnen Sie jedoch den MySQL-Server als unprivilegierter
(non-@code{root})-Benutzer laufen lassen, vorausgesetzt, dieser Benutzer
darf Dateien im Datenbank-Verzeichnis lesen und schreiben. Anweisungen, wie
Sie MySQL als unprivilegierter Benutzer laufen lassen k�nnen, finden Sie in
@ref{Privilege changes, , Den MySQL-Benutzer �ndern}.

Wenn Sie Probleme mit @code{mysql_install_db} bekommen, sehen Sie bitte
unter @ref{mysql_install_db, , @code{mysql_install_db}} nach.

Es gibt eine Reihe von Alternativen zum Laufenlassen des
@code{mysql_install_db}-Skripts, was mit der MySQL-Distribution
mitgeliefert wird:

@itemize @bullet
@item
Sie k�nnen @code{mysql_install_db} editieren, bevor Sie es laufen lassen,
um die anf�nglichen Zugriffsrechte zu �ndern, die in die Rechtetabellen
installiert werden. Das ist n�tzlich, wenn Sie MySQL auf einer gro�en Zahl
von Maschinen mit denselben Zugriffsrechten installieren wollen. In diesem
Fall m�ssen Sie wahrscheinlich nur ein paar zus�tzliche
@code{INSERT}-Statements f�r die @code{mysql.user}- und
@code{mysql.db}-Tabellen hinzuf�gen!

@item
Wenn Sie Dinge in den Berechtigungstabellen �ndern wollen, nachdem diese
installiert wurden, lassen Sie @code{mysql_install_db} laufen und geben
dann den Befehl @code{mysql -u root mysql} ein, um sich als
MySQL-@code{root}-Benutzer mit den Berechtigungstabellen zu verbinden.
Danach k�nnen Sie SQL-Statements eingeben, um die Tabellen direkt zu
ver�ndern.

@item
Es ist m�glich, die Berechtigungstabellen komplett neu zu erzeugen, nachdem
Sie angelegt wurden. Das werden Sie zum Beispiel tun wollen, wenn Sie die
Tabellen bereits angelegt haben, Sie nun aber neu anlegen wollen, weil Sie
@code{mysql_install_db} editiert haben.
@end itemize

Zu weiteren Informationen �ber diese Alternativen siehe
@ref{Privilege system}.

@item
Starten Sie den MySQL-Server wie folgt:

@example
shell> cd mysql_installations_verzeichnis
shell> bin/safe_mysqld &
@end example

Wenn Sie Probleme haben, den Server zu starten, sehen Sie unter
@ref{Starting server} nach.

@item
Benutzen Sie @code{mysqladmin}, um sicherzustellen, dass der Server l�uft.
Die folgenden Befehle sind ein einfacher Test, um zu �berpr�fen, ob der
Server l�uft und auf Verbindungen reagiert:

@example
shell> BINDIR/mysqladmin version
shell> BINDIR/mysqladmin variables
@end example

Die Ausgabe von @code{mysqladmin version} kann geringf�gig variieren,
abh�ngig von Ihrer Plattform und der Version von MySQL, sollte aber etwa
wie folgt aussehen:

@example
shell> BINDIR/mysqladmin version
mysqladmin  Ver 8.14 Distrib 3.23.32, for linux on i586
Copyright (C) 2000 MySQL AB & MySQL Finnland AB & TCX DataKonsult AB
This software comes mit ABSOLUTELY NO WARRANTY. This ist free software,
und you are welcome to modify und redistribute it under the GPL license

Server version          3.23.32-debug
Protokoll version        10
Connection              Localhost via Unix socket
TCP port                3306
UNIX socket             /tmp/mysql.sock
Uptime:                 16 sec

Threads: 1  Questions: 9  Slow queries: 0  Opens: 7  Flush tables: 2  Open tables: 0 Queries per second avg: 0.000  Memory in use: 132K  Max memory used: 16773K
@end example

Um ein Gef�hl daf�r zu bekommen, was Sie sonst noch mit
@code{BINDIR/mysqladmin} tun k�nnen, rufen Sie es mit der
@code{--help}-Option auf.

@item
Stellen Sie sicher, dass Sie den Server herunter fahren k�nnen:
@cindex Server, Herunterfahren
@cindex Herunterfahren, den Server

@example
shell> BINDIR/mysqladmin -u root shutdown
@end example

@item
Stellen Sie sicher, dass Sie den Server erneut starten k�nnen. Tun Sie das
unter Benutzung von @code{safe_mysqld} oder indem Sie @code{mysqld} direkt
aufrufen. Beispiel:

@cindex Server, neu starten
@cindex Neustart, des Servers

@example
shell> BINDIR/safe_mysqld --log &
@end example

Wenn @code{safe_mysqld} fehlschl�gt, versuchen Sie, es vom
MySQL-Installationsverzeichnis aus zu starten (falls Sie noch nicht dort
sind). Wenn das nicht funktioniert, sehen Sie unter see @ref{Starting server} nach.

@item
Lassen Sie ein paar einfache Tests ablaufen um sicherzustellen, dass der
Server funktioniert. Die Ausgabe sollte �hnlich der folgenden sein:

@example
shell> BINDIR/mysqlshow
+-----------+
| Databases |
+-----------+
| mysql     |
+-----------+

shell> BINDIR/mysqlshow mysql
Datenbank: mysql
+--------------+
|    Tables    |
+--------------+
| columns_priv |
| db           |
| func         |
| host         |
| tables_priv  |
| user         |
+--------------+

shell> BINDIR/mysql -e "select host,db,user from db" mysql
+------+--------+------+
| host | db     | user |
+------+--------+------+
| %    | test   |      |
| %    | test_% |      |
+------+--------+------+
@end example

Zus�tzlich gibt es eine Benchmark-Suite im @file{sql-bench}-Verzeichnis
(unterhalb des MySQL-Installationsverzeichnisses), die Sie benutzen k�nnen,
um die Leistungsdaten von MySQL auf verschiedenen Plattformen zu
vergleichen. Das @file{sql-bench/Results}-Verzeichnis enth�lt die
Ergebnisse vieler Testl�ufe mit verschiedenen Datenbanken und Plattformen.
Um alle Tests durchzuf�hren, geben Sie folgende Befehle ein:

@example
shell> cd sql-bench
shell> run-all-tests
@end example

Wenn Sie kein @file{sql-bench}-Verzeichnis haben, benutzen Sie
wahrscheinlich ein RPM f�r eine Bin�rdistribution. (Quelldistributions-RPMs
beinhalten das Benchmark-Verzeichnis.) In diesem Fall m�ssen Sie die
Benchmark-Suite zuerst installieren, bevor Sie sie benutzen k�nnen. Ab
MySQL Version 3.22 gibt es Benchmark-RPM-Dateien, die
@file{mysql-bench-VERSION-i386.rpm} benannt sind, die Benchmark-Code und
Daten enthalten.

Wenn Sie eine Quelldistribution haben, k�nnen Sie auch die Tests im
@file{tests}-Unterverzeichnis ausf�hren. Um beispielsweise
@file{auto_increment.tst} auszuf�hren, geben Sie folgendes ein:

@example
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
@end example

Die Ergebnisse stehen dann in der @file{./tests/auto_increment.res}-Datei.
@end enumerate


@menu
* mysql_install_db::            
* Starting server::             
* Automatic start::             
@end menu

@node mysql_install_db, Starting server, Post-installation, Post-installation
@c German node mysql_install_db
@subsection Probleme mit @code{mysql_install_db}
@cindex @code{mysql_install_db}-Skript
@cindex Skripte, @code{mysql_install_db}

Der Zweck des @code{mysql_install_db}-Skripts ist, neue
MySQL-Berechtigungstabellen zu erzeugen. Es betrifft keine anderen Daten!
Es tut nichts, wenn Sie bereits MySQL-Berechtigungstabellen installiert
haben!

Wenn Sie Ihre Berechtigungstabellen neu erzeugen wollen, sollten Sie den
@code{mysqld}-Server herunter fahren, falls er l�uft, und dann etwas
�hnliches wie folgendes tun:

@example
mv mysql-data-verzeichnis/mysql mysql-data-verzeichnis/mysql-old
mysql_install_db
@end example

Dieser Abschnitt listet Probleme auf, denen Sie vielleicht begegnen, wenn
Sie @code{mysql_install_db} laufen lassen:

@table @strong
@item @code{mysql_install_db} installiert die Berechtigungstabellen nicht.

Eventuell stellen Sie fest, dass @code{mysql_install_db} bei der
Installations der Berechtigungstabellen fehlschl�gt und mit folgenden
Meldungen endet:

@example
starting mysqld daemon with databases from XXXXXX
mysql daemon ended
@end example

In diesem Fall sollten Sie einen gr�ndlichen Blick in die Log-Datei werfen!
Diese sollte sich im Verzeichnis @file{XXXXXX} befinden, das in der
Fehlermeldung ausgegeben wird, und sollte anzeigen, warum @code{mysqld}
nicht startete. Wenn Sie nicht verstehen, was passiert ist, schicken Sie
einen Bug-Bericht inklusive Log. Benutzen Sie hierf�r @code{mysqlbug}!
@xref{Bug reports}.

@item Es l�uft bereits ein @code{mysqld}-Daemon.

In diesem Fall m�ssen Sie wahrscheinlich @code{mysql_install_db} �berhaupt
nicht starten. Sie m�ssen @code{mysql_install_db} nur einmal starten, und
zwar, wenn Sie MySQL zum ersten Mal installieren.

@item Die Installation eines zweiten @code{mysqld}-Daemons schl�gt fehl,
wenn bereits ein Daemon l�uft.

Das kann vorkommen, wenn Sie bereits eine existierende MySQL-Installation
haben, aber eine neue Installation an einem anderen Speicherort
unterbringen wollen (zum Beispiel f�r Testzwecke, oder vielleicht wollen
Sie auch einfach zwei Installationen zugleich laufen lassen. Im Allgemeinen
ist der Grund f�r das Problem, wenn Sie versuchen, den zweiten Server
laufen zu lassen, dass der zweite Server versucht, denselben Socket und
Port wie der alte zu benutzen. In diesem Fall erhalten Sie als
Fehlermeldung: @code{Can't start server: Bind on TCP/IP port: Address
already in use} oder @code{Can't start server : Bind on unix socket...}.
@xref{Multiple servers}.

@item Sie haben keinen Schreibzugriff auf @file{/tmp}.
@cindex Schreibzugriff, tmp
@cindex Tempor�re Datei, Schreibzugriff
@cindex Dateien, @code{tmp}

Wenn Sie keinen Schreibzugriff haben, um eine Socket-Datei am
vorgabem��igen Ort anzulegen (in @file{/tmp}) oder keine Berechtigung, um
tempor�re Dateien in @file{/tmp} anzulegen, erhalten Sie einen Fehler, wenn
Sie @code{mysql_install_db} laufen lassen oder starten oder wenn Sie
@code{mysqld} benutzen.

So k�nnen Sie einen anderen Socket und ein anderes tempor�res Verzeichnis
festlegen:

@tindex TMPDIR Umgebungsvariable
@tindex MYSQL_UNIX_PORT Umgebungsvariable
@tindex Umgebungsvariable, TMPDIR
@tindex Umgebungsvariable, MYSQL_UNIX_PORT
@example
shell> TMPDIR=/irgendein_temporaeres_verzeichnis/
shell> MYSQL_UNIX_PORT=/irgendein_temporaeres_verzeichnis/mysqld.sock
shell> export TMPDIR MYSQL_UNIX_PORT
@end example

@xref{Problems with mysql.sock}.

@file{irgendein_temporaeres_verzeichnis} sollte der Pfad zu einem
Verzeichnis sein, f�r das Sie Schreibberechtigung haben.
@xref{Environment variables}.

Danach sollten Sie in der Lage sein, @code{mysql_install_db} laufen zu
lassen und den Server zu starten, und zwar mit folgenden Befehlen:

@example
shell> scripts/mysql_install_db
shell> BINDIR/safe_mysqld &
@end example

@item @code{mysqld} st�rzt sofort ab

Wenn Sie RedHat Version 5.0 mit einer Version von @code{glibc} laufen
lassen, die �lter als 2.0.7-5 ist, sollten Sie sicherstellen, dass Sie alle
@code{glibc}-Patches installiert haben!
Dar�ber gibt es jede Menge Informationen in den MySQL-Mail-Archiven. Links
zu den Mail-Archiven finden Sie online unter
@uref{http://www.mysql.com/documentation/}.
Siehe auch @ref{Linux}.

Sie k�nnen @code{mysqld} auch manuell starten, dabei die
@code{--skip-grant-tables}-Option benutzen und dann die
Berechtigungsinformationen selbst mit @code{mysql} eintragen:

@example
shell> BINDIR/safe_mysqld --skip-grant-tables &
shell> BINDIR/mysql -u root mysql
@end example

Von @code{mysql} aus geben Sie die SQL-Befehle ein, die in
@code{mysql_install_db} stehen. Stellen Sie sicher, dass Sie danach
@code{mysqladmin flush-privileges} oder @code{mysqladmin reload} laufen
lassen, um dem Server mitzuteilen, die Berechtigungstabellen neu zu laden.
@end table


@node Starting server, Automatic start, mysql_install_db, Post-installation
@c German node Server starten
@subsection Probleme mit dem Start des MySQL-Servers
@cindex Server, Startprobleme
@cindex Probleme, beim Starten des Servers

Wenn Sie Tabellen einsetzen werden, die Transaktionen unterst�tzen (InnoDB,
BDB), sollten Sie zuerst eine my.cnf-Datei anlegen und die
Startoptionen f�r die Tabellentypen setzen, die Sie einsetzen wollen.
@xref{Table types}.

Im allgemeinen starten Sie den @code{mysqld}-Server auf eine der drei
folgenden Weisen:

@itemize @bullet
@item
Indem Sie @code{mysql.server} aufrufen. Dieses Skript wird haupts�chlich
beim Systemstart und -herunterfahren eingesetzt. Es wird ausf�hrlicher in
@ref{Automatic start} beschrieben.

@item
Indem Sie @code{safe_mysqld} aufrufen. Dieses Skript versucht die korrekten
Optionen f�r @code{mysqld} festzustellen und l��t den Server dann mit
diesen Optionen laufen. @xref{safe_mysqld, ,@code{safe_mysqld}}.

@item
Auf Windows NT sollten Sie @code{mysqld} wie folgt als Systemdienst
starten:
@example
bin\mysqld-nt --install               # MySQL als Systemdienst installieren
@end example

Jetzt k�nnen Sie @code{mysqld} wie folgt starten / anhalten:
@example
NET START mysql
NET STOP mysql
@end example

Beachten Sie, dass Sie in diesem Fall keine weiteren Optionen f�r
@code{mysqld} benutzen k�nnen!

Sie k�nnen den Systemdienst wie folgt entfernen:
@example
bin\mysqld-nt --remove                # MySQL als Systemdienst entfernen
@end example

@item
Indem Sie @code{mysqld} direkt aufrufen.
@end itemize

Wenn der @code{mysqld}-Daemon hoch f�hrt, wechselt er in das
Daten-Verzeichnis. Dort erwartet er, Log-Dateien und die (process ID)-Datei
schreiben zu k�nnen. Ebenfalls erwartet er dort, Datenbanken zu finden.

Der Speicherort des Daten-Verzeichnisses wird zum Zeitpunkt des Kompilierens
der Distribution fest verdrahtet. Wenn @code{mysqld} jedoch erwartet, das
Daten-Verzeichnis irgendwo sonst als an der Stelle zu finden, wo es auf
Ihrem System tats�chlich ist, funktioniert er nicht richtig. Wenn Sie
Probleme mit fehlerhaften Pfaden haben, k�nnen Sie durch den Aufruf von
@code{mysqld} mit der @code{--help}-Option herausfinden, welche Optionen
@code{mysqld} erlaubt und was die vorgabem��igen Pfad-Einstellung sind.
Sie k�nnen die Vorgaben �berschreiben, indem Sie die korrekten Pfadnamen
als Kommandozeilen-Argumente f�r @code{mysqld} festlegen. (Diese Optionen
k�nnen auch bei @code{safe_mysqld} benutzt werden.)

Normalerweise sollte es lediglich n�tig sein, @code{mysqld} das
Basis-Verzeichnis mitzuteilen, wo MySQL installiert ist. Das k�nnen Sie mit
der Option @code{--basedir} machen. Zus�tzlich k�nnen Sie @code{--help}
benutzen, um die Auswirkung der Pfad�nderungsoptionen zu �berpr�fen
(beachten Sie, dass @code{--help} die letzte Option des
@code{mysqld}-Befehls wein @emph{muss}. Beispiel:

@example
shell> EXECDIR/mysqld --basedir=/usr/local --help
@end example

Wenn Sie die Pfadeinstellungen erst einmal festgelegt haben, die Sie
wollen, starten Sie den Server ohne die @code{--help}-Option.

Mit welcher Methode auch immer Sie den Server starten: Wenn er nicht
korrekt hoch f�hrt, untersuchen Sie die Log-Datei, um zu sehen, ob Sie den
Grund daf�r herausfinden k�nnen. Log-Dateien liegen im Daten-Verzeichnis
(typischerweise @file{/usr/local/mysql/data} bei einer Bin�rdistribution,
@file{/usr/local/var} bei einer Quelldistribution und
@file{\mysql\data\mysql.err} unter Windows). Suchen Sie im Daten-Verzeichnis
nach Dateien mit Namen der Form @file{host_name.err} und
@file{host_name.log}, wobei @code{host_name} der Name Ihres Server-Hosts
ist. Sehen Sie in den letzten paar Zeilen dieser Dateien nach:

@example
shell> tail host_name.err
shell> tail host_name.log
@end example

Wenn Sie etwas wie das Folgende in der Log-Datei finden:
@example
000729 14:50:10  bdb:  Recovery function for LSN 1 27595 failed
000729 14:50:10  bdb:  warning: ./test/t1.db: No such file or directory
000729 14:50:10  Can't init databases
@end example

Das bedeutet, dass Sie @code{mysqld} nicht mit @code{--bdb-no-recover}
gestartet haben und Berkeley DB findet, dass etwas mit seinen Log-Dateien
nicht in Ordnung ist, als es versuchte, Ihre Datenbanken
wiederherzustellen. Um weitermachen zu k�nnen, sollten Sie alle alten
Berkeley-DB-Log-Dateien aus dem Datenbankverzeichnis an eine andere Stelle
verschieben, wo Sie sie sp�ter untersuchen k�nnen. Die Log-Dateien sind wie
@file{log.0000000001} benannt, wobei die Nummer im Zeitablauf hochgez�hlt
wird.

Wenn Sie @code{mysqld} mit BDB-Tabellenunterst�tzung laufen lassen und
@code{mysqld} beim Start einen Speicherauszug (Core Dump) liefert, k�nnte
das an Problemen mit den BDB-Wiederherstellungs-Logs liegen. In diesem Fall
k�nnen Sie versuchen, @code{mysqld} mit @code{--bdb-no-recover} zu starten.
Wenn das hilft, sollten Sie danach alle @file{log.*}-Dateien aus dem
Daten-Verzeichnis entfernen und versuchen, @code{mysqld} erneut zu starten.

Wenn Sie folgenden Fehler bekommen, bedeutet das, dass ein anderes Programm
(oder ein anderer @code{mysqld}-Server) bereits den TCP/IP-Port oder
-Socket benutzt, den @code{mysqld} versucht zu benutzen:

@example
Can't start server: Bind on TCP/IP-Port: Address already in use
  oder
Can't start server : Bind on unix socket...
@end example

Benutzen Sie @code{ps}, um sicherzustellen, dass kein weiterer
@code{mysqld}-Server l�uft. Wenn Sie keinen weiteren Server finden, k�nnen
Sie den Befehl @code{telnet ihr-host-name tcp-ip-port-nummer} eingeben und
mehrere Male @code{EINGABE} dr�cken. Wenn Sie keine Fehlermeldung wie
@code{telnet: Unable to connect to remote host: Connection refused}
erhalten, benutzt irgend etwas anderes den TCP/IP-Port, den @code{mysqld}
versucht zu benutzen. Siehe @ref{mysql_install_db} und @ref{Multiple servers}.

Wenn @code{mysqld} gerade l�uft, k�nnen Sie herausfinden, welche
Pfadeinstellungen er benutzt, indem Sie folgenden Befehl ausf�hren:

@example
shell> mysqladmin variables
@end example

oder

@example
shell> mysqladmin -h 'ihr-host-name' variables
@end example

Wenn @code{safe_mysqld} hoch den Server hoch f�hrt, Sie sich aber nicht mit
ihm verbinden k�nnen, stellen Sie sicher, dass Sie einen Eintrag wie den
folgenden in @file{/etc/hosts} haben:

@example
127.0.0.1       localhost
@end example

Dieses Problem tritt nur auf Systemen auf, die keine funktionierende
Thread-Bibliothek besitzen, und f�r die MySQL so konfiguriert werden muss,
dass es MIT-pThreads benutzt.

Wenn Sie es nicht schaffen, @code{mysqld} zu starten, k�nnen Sie versuchen,
eine Trace-Datei anzulegen, um das Problem zu finden. @xref{Making trace files}.

Wenn Sie InnoDB-Tabellen benutzen, sehen Sie bei den InnoDB-spezifischen
Startoptionen nach. @xref{InnoDB start}.

Wenn Sie BDB-(Berkeley DB)-Tabellen benutzen, sollten Sie sich mit den
verschiedenen Startoptionen von BDB vertraut machen. @xref{BDB start}.


@node Automatic start,  , Starting server, Post-installation
@c German node Automatischer Start
@subsection MySQL automatisch starten und anhalten

@cindex Start, Server automatisch starten
@cindex Anhalten, den Server
@cindex Server, starten und anhalten

Die @code{mysql.server}- und @code{safe_mysqld}-Skripte k�nnen benutzt
werden, um den Server automatisch beim Hochfahren des Systems zu starten.
@code{mysql.server} kann ebenfalls dazu benutzt werden, den Server
anzuhalten.

Das @code{mysql.server}-Skript kann benutzt werden, um den Server zu
starten oder anzuhalten, indem man es mit den @code{start}- oder
@code{stop}-Argumenten aufruft:

@example
shell> mysql.server start
shell> mysql.server stop
@end example

@code{mysql.server} liegt im @file{share/mysql}-Verzeichnis unterhalb des
MySQL-Installationsverzeichnisses oder im @file{support-files}-Verzeichnis
des MySQL-Source-Trees.

Bevor @code{mysql.server} den Server startet, wechselt es in das
MySQL-Installationsverzeichnis. Dann ruft es @code{safe_mysqld} auf.
Eventuell m�ssen Sie @code{mysql.server} editieren, wenn Sie eine
Bin�rdistribution haben, die Sie an eine nicht stardardm��ige Stelle
installiert haben. �ndern Sie es so ab, dass es in das richtige Verzeichnis
wechselt (@code{cd}), bevor es @code{safe_mysqld} startet. Wenn Sie wollen,
dass der Server unter einem bestimmten Benutzer l�uft, f�gen Sie eine
entsprechende @code{user}-Zeile zur @file{/etc/my.cnf}-Datei hinzu, so wie
weiter unten in diesem Abschnitt dargestellt.

@code{mysql.server stop} h�lt den Server an, indem es ihm ein Signal
sendet. Sie k�nnen den Server auch automatisch herunter fahren, indem Sie
@code{mysqladmin shutdown} ausf�hren.

Wenn Sie m�chten, k�nnen Sie diese Start- und Stop-Befehle an den
entsprechenden Stellen Ihrer @file{/etc/rc*}-Dateien einf�gen, wenn Sie
MySQL f�r Produktions-Applikationen benutzen. Beachten Sie, wenn Sie
@code{mysql.server} editieren und dann gelegentlich MySQL aktualisieren
(Update), dass dann Ihre ge�nderte Version �berschrieben wird. Daher
sollten Sie eine Kopie Ihrer editierten Version machen, die Sie erneut
installieren k�nnen.

Wenn Ihr System @file{/etc/rc.local} benutzt, um externe Skripte zu
starten, sollten Sie folgendes anh�ngen:
@example
/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
@end example

@cindex Den Speicherort des Sockets �ndern
Sie k�nnen Optionen f�r @code{mysql.server} in einer globalen
@file{/etc/my.cnf}-Datei hinzuf�gen. Eine typische @file{/etc/my.cnf}-Datei
sieht wie folgt aus:

@example
[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql

[mysql.server]
basedir=/usr/local/mysql
@end example

Das @code{mysql.server}-Skript kennt folgende Optionen:
@code{datadir}, @code{basedir} und @code{pid-file}.

Folgende Tabelle zeigt, welche Optionsgruppen jedes der Startskripts aus
den Optionsdateien liest:

@multitable @columnfractions .20 .80
@item @strong{Skript} @tab @strong{Optionsgruppen}
@item @code{mysqld} @tab @code{mysqld} und @code{server}
@item @code{mysql.server} @tab @code{mysql.server}, @code{mysqld}, und @code{server}
@item @code{safe_mysqld} @tab @code{mysql.server}, @code{mysqld}, und @code{server}
@end multitable

@xref{Option files}.


@node Upgrade, Operating System Specific Notes, Post-installation, Installing
@c German node Upgrade
@section MySQL aktualisieren (Upgrade / Downgrade)

@cindex Upgrade
@cindex Downgrade

Sie k�nnen die MySQL-form- und data-Dateien jederzeit f�r verschiedene
Versionen auf derselben Architektur benutzen, solange Sie dieselbe
Grundversion von MySQL haben. Die aktuelle Grundversion ist 3. Wenn Sie den
Zeichensatz �ndern, w�hrend MySQL l�uft (was auch die Sortierreihenfolge
betreffen kann), m�ssen Sie @code{myisamchk -r -q} auf alle Tabellen
ausf�hren. Ansonsten k�nnte es sein, dass Ihre Indexe nicht korrekt
sortiert werden.

Wenn Sie vor neuen Versionen zur�ck schrecken, k�nnen Sie Ihren alten
@code{mysqld} zu etwas wie @code{mysqld}-'alte-versions-nummer' umbenennen.
Wenn Ihr neuer @code{mysqld} dann etwas Unerwartetes tut, k�nnen Sie ihn
einfach anhalten und mit Ihrem alten @code{mysqld} neu starten!

Wenn Sie ein Upgrade vornehmen, sollte Sie nat�rlich Ihre alten Datenbanken
sichern.

Wenn Sie nach einem Upgrade auf Probleme mit neu kompilierten
Client-Programmen sto�en, zum Beispiel @code{Commands out of sync} oder
unerwartete Speicherausz�ge (Core Dumps), haben sie wahrscheinlich einen
alten Header oder eine alte Bibliotheksdatei benutzt, als Sie die Programme
kompilierten. In diesem Fall sollten Sie das Datum Ihrer
@file{mysql.h}-Datei und @file{libmysqlclient.a}-Bibliothek �berpr�fen, um
sicherzustellen, dass sie aus der neuen MySQL-Distribution stammten. Wenn
nicht, kompilieren sie Ihre Programme bitte neu!

Wenn Sie Probleme der Art erhalten, dass Ihr neuer @code{mysqld}-Server
nicht startet oder dass Sie sich nicht ohne Passwort verbinden k�nnen,
�berpr�fen Sie, ob Sie nicht etwa noch die alte @file{my.cnf}-Datei Ihrer
alten Installation haben! Sie k�nnen das mit @code{program-name
--print-defaults} tun. Wenn es irgend etwas anderes als den Programmnamen
ausgibt, haben Sie eine aktive @code{my.cnf}-Datei, die sich auf die Dinge
auswirkt!

Es ist eine gute Idee, die @code{Msql-Mysql-modules}-Distribution neu zu
bauen und neu zu installieren, wann immer Sie ein neues Release von MySQL
installieren, speziell dann, wenn Sie Symptome wie die bemerken, dass alle
Ihre @code{DBI}-Skripte mit Core-Dumps abbrechen, nachdem Sie MySQL
aktualisiert haben.


@cindex Kompatibilit�t, zwischen MySQL-Versionen
@cindex Upgrade, 3.23 auf 4.0
@menu
* Upgrading-from-3.23::         
* Upgrading-from-3.22::         
* Upgrading-from-3.21::         
* Upgrading-from-3.20::         
* Upgrading-to-arch::           
@end menu

@node Upgrading-from-3.23, Upgrading-from-3.22, Upgrade, Upgrade
@c German node Upgrading-from-3.23
@subsection Upgrade von 3.23 auf Version 4.0

Sie k�nnen Ihre alten data-Dateien ohne jede �nderung mit Version 4.0
benutzen. Wenn Sie Ihre Daten eines MySQL-4.0-Servers f�r einen �lteren
Server verwenden wollen, m�ssen Sie @code{mysqldump} benutzen.

Alte Clients sollen mit einem Server Version 4.0 ohne jedes Problem
funktionieren.

Die folgende Liste stellt dar, auf was Sie aufpassen m�ssen, wenn Sie auf
Version 4.0 aktualisieren (Upgrade):

@itemize @bullet
@item
@file{safe_mysqld} wurde zu @file{mysqld_safe} umbenannt.
@item
Die alten C-API-Funktionen @code{mysql_drop_db}, @code{mysql_create_db} und
@code{mysql_connect} werden nicht mehr unterst�tzt, es sei denn, MySQL wird
mit @code{USE_OLD_FUNCTIONS} kompiliert.
@item
Sie sollten @code{TRUNCATE TABLE} benutzen, wenn Sie alle Zeilen aus einer
Tabelle l�schen wollen und Ihnen egal ist, wie viele Zeilen gel�scht
wurden. (@code{TRUNCATE TABLE} ist schneller als @code{DELETE FROM tabelle}).
@item
Sie bekommen einen Fehler, wenn Sie ein aktives @code{LOCK TABLES} oder
eine aktive Transaktion am Laufen haben, wenn Sie versuchen, @code{TRUNCATE
TABLE} oder @code{DROP DATABASE} auszuf�hren.
@item
Sie sollten Ganzzahl-(Integer)-Werte in BIGINT-Spalten benutzen (anstelle
von Zeichenketten wie in MySQL 3.23). Man kann immer noch Zeichenketten
benutzen, aber die Benutzung von Ganzzahlen ist viel effizienter.
@item
Das Format von @code{SHOW OPEN TABLE} hat sich ge�ndert.
@item
Multithreaded Clients sollten @code{mysql_thread_init()} und
@code{mysql_thread_end()} benutzen. @xref{Threaded clients}.
@end itemize
@node Upgrading-from-3.22, Upgrading-from-3.21, Upgrading-from-3.23, Upgrade
@c German node Upgrading-from-3.22
@subsection Upgrade von einer Version 3.22 auf 3.23

@cindex Kompatibilit�t, zwischen MySQL-Versionen
@cindex Upgrade, 3.22 to 3.23

MySQL-Version 3.23 unterst�tzt Tabellen des neuen @code{MyISAM}-Typs und
des alten @code{ISAM}-Typs. Sie m�ssen Ihre alten Tabellen nicht
konvertieren, um sie mit Version 3.23 einsetzen zu k�nnen. Vorgabem��ig
werden alle neuen Tabellen mit dem Typ @code{MyISAM} angelegt (es sei denn,
Sie starten @code{mysqld} mit der @code{--default-table-type=isam}-Option).
Sie k�nnen eine @code{ISAM}-Tabelle zu einer @code{MyISAM}-Tabelle mit
@code{ALTER TABLE tabelle TYPE=MyISAM} konvertieren oder mit dem
Perl-Skript @code{mysql_convert_table_format}.

Clients der Versionen 3.22 und 3.21 funktionieren ohne jedes Problem mit
einem Server der Version 3.23.

Die folgende Liste stellt dar, auf was Sie aufpassen m�ssen, wenn Sie auf
Version 3.23 aktualisieren (Upgrade):

@itemize @bullet
@item
Alle Tabellen, die den @code{tis620}-Zeichensatz benutzen, m�ssen mit
@code{myisamchk -r} oder @code{REPAIR TABLE} in Ordnung gebracht werden.

@item
Wenn Sie ein @code{DROP DATABASE} auf eine mit symbolischem Link verkn�pfte
Datenbank ausf�hren, werden sowohl der symbolische Links als auch die
Datenbank gel�scht. (Das war in Version 3.22 nicht der Fall, weil configure
den @code{readlink}-Systemaufruf nicht erkannte).

@item
@code{OPTIMIZE TABLE} funktioniert jetzt nur bei @strong{MyISAM}-Tabellen.
Bei anderen Tabellentypen k�nnen Sie @code{ALTER TABLE} benutzen, um die
Tabelle zu optimieren. W�hrend der Ausf�hrung von @code{OPTIMIZE TABLE}
wird die Tabelle jetzt vor dem Zugriff anderer Threads gesperrt.

@item
Der MySQL-Client @code{mysql} wir jetzt vorgabem��ig mit der Option
@code{--no-named-commands (-g)} gestartet. Diese Option kann mit
@code{--enable-named-commands (-G)} abgeschaltet werden. Dies kann ein paar
Inkompatibilit�tsprobleme verursachen, zum Beispiel in SQL-Skripten, die
benannte (named) Befehle ohne ein Semikolon! Befehle im Langformat dagegen
funktionieren noch auf der ersten Zeile.
@c Question: ... still work from the first line?
some cases, f�r Beispiel in SQL Skripts that use named Befehle ohne a
semicolon!  Long format Befehle still work from the first line.

@item
If you are using the @code{german} character sort order, you must repair
all your Tabellen mit @code{isamchk -r}, as we have made some changes in
the sort order!

@item
The default return type of @code{IF} will now depend on both arguments
und not only the first argument.

@item 
@code{AUTO_INCREMENT} funktioniert nicht mit negativen Zahlen. Der Grund
liegt darin, dass negative Zahlen beim �bergang von -1 auf 0 Probleme
verursachen. @code{AUTO_INCREMENT} wird jetzt bei MyISAM-Tabellen auf einem
niedrigeren Level gehandhabt und ist viel schneller als vorher. Bei
MyISAM-Tabellen werden alte Zahlen auch nicht mehr wieder benutzt, selbst
wenn Sie einige Zeilen aus der Tabelle l�schen.

@item 
@code{CASE}, @code{DELAYED}, @code{ELSE}, @code{END}, @code{FULLTEXT}, 
@code{INNER}, @code{RIGHT}, @code{THEN} und @code{WHEN} sind jetzt
reservierte W�rter.

@item 
@code{FLOAT(X)} ist jetzt ein echter Flie�komma-Typ und kein Wert mit
einer festen Anzahl von Dezimalstellen.

@item 
Wenn Sie @code{DECIMAL(length,dec)} deklarieren, beinhaltet das
L�ngen-Argument nicht mehr den Platz f�r das Vorzeichen oder den
Dezimalpunkt.

@item 
Eine @code{TIME}-Zeichenkette muss jetzt von einem der folgenden Formate
sein:
@code{[[[DAYS] [H]H:]MM:]SS[.bruchteil]} oder
@code{[[[[[H]H]H]H]MM]SS[.bruchteil]}

@item 
@code{LIKE} vergleicht jetzt Zeichenketten unter Verwendung derselben
Vergleichsregeln wie @code{'='}. Wenn Sie das alte Verhalten ben�tigen,
k�nnen Sie MySQL mit dem @code{CXXFLAGS=-DLIKE_CMP_TOUPPER}-Flag
kompilieren.

@item 
@code{REGEXP} arbeitet jetzt bei normalen (nicht bin�ren) Zeichenketten
unabh�ngig von der Gro�-/Kleinschreibung.

@item 
Wenn Sie Tabellen pr�fen / reparieren, sollten Sie @code{CHECK TABLE} oder
@code{myisamchk} f�r @code{MyISAM}-Tabellen (@code{.MYI}) benutzen und
@code{isamchk} f�r ISAM-Tabellen (@code{.ISM}).

@item 
Wenn Sie wollen, dass @code{mysqldump}-Dateien zwischen MySQL-Version 3.22
und Version 3.23 kompatibel sind, sollten Sie nicht die @code{--opt}- oder
@code{--full}-Option f�r @code{mysqldump} benutzen.

@item 
�berpr�fen Sie Ihre Aufrufe von @code{DATE_FORMAT()} und stellen Sie
sicher, dass vor jedem Formatierungszeichen ein @samp{%} steht. (Sp�tere
MySQL-Versionen 3.22 lie�en diese Syntax zu.)

@item
@code{mysql_fetch_fields_direct} ist jetzt eine Funktion (es war ein Makro)
und gibt einen Zeiger auf @code{MYSQL_FIELD} anstelle eines
@code{MYSQL_FIELD} zur�ck.

@item
@code{mysql_num_fields()} kann nicht mehr f�r ein @code{MYSQL*}-Objekt
benutzt werden (es ist jetzt eine Funktion, die @code{MYSQL_RES*} als
Argument nimmt. Sie sollten jetzt statt dessen @code{mysql_field_count()}
benutzen.

@item
In MySQL-Version 3.22 war die Ausgabe von @code{SELECT DISTINCT ...} fast
immer sortiert. In Version 3.23 m�ssen Sie @code{GROUP BY} oder @code{ORDER
BY} benutzen, um eine sortierte Ausgabe zu erhalten.

@item
@code{SUM()} gibt jetzt @code{NULL} zur�ck statt 0, wenn es keine �berein
stimmenden Zeilen gibt. Das ist in �bereinstimmung mit ANSI-SQL.

@item
Ein @code{AND} oder @code{OR} mit @code{NULL}-Werten gibt jetzt @code{NULL}
anstelle von 0 zur�ck. Das betrifft haupts�chlich Anfragen, die @code{NOT}
bei einem @code{AND/OR}-Ausdruck wie @code{NOT NULL} = @code{NULL}
benutzen.
@code{LPAD()} und @code{RPAD()} k�rzen die Ergebnis-Zeichenkette, wenn sie
l�nger als das L�ngen-Argument ist.
@end itemize

@node Upgrading-from-3.21, Upgrading-from-3.20, Upgrading-from-3.22, Upgrade
@c German node Upgrading-from-3.21
@subsection Upgrade von Version 3.21 auf Version 3.22

@cindex Kompatibilit�t, zwischen MySQL-Versionen
@cindex Upgrade, 3.21 auf 3.22

Nichts, was die Kompatibilit�t betrifft, hat sich zwischen Version 3.21 und
3.22 ge�ndert. Die einzige Falle ist die, dass neue Tabellen, die unter
Verwendung des @code{DATE}-Typs erzeugt werden, die neue Art der
Datenspeicherung benutzen. Diese neuen Felder kann man daher nicht von
einer alten Version von @code{mysqld} ansprechen.

Nachdem Sie MySQL-Version 3.22 installiert haben, starten Sie den neuen
Server und lassen dann das @code{mysql_fix_privilege_tables}-Skript laufen.
Dieses f�gt die neuen Zugriffsberechtigungen ein, die Sie ben�tigen, um den
@code{GRANT}-Befehl zu benutzen. Wenn Sie das vergessen, erhalten Sie ein
@code{Access denied}, wenn Sie versuchen, @code{ALTER TABLE}, @code{CREATE
INDEX} oder @code{DROP INDEX} zu benutzen. Wenn Ihr MySQL-Root ein Passwort
ben�tigt, m�ssen Sie dieses als Argument zu
@code{mysql_fix_privilege_tables} angeben.

Die C-API-Schnittstelle f�r @code{mysql_real_connect()} hat sich ge�ndert.
Wenn Sie ein altes Client-Programm haben, das diese Funktion aufruft,
m�ssen Sie eine @code{0} als neues @code{db}-Argument einf�gen (oder den
Client neu kodieren, so dass er das @code{db}-Element f�r schnellere
Verbindungen benutzt). Zus�tzlich m�ssen Sie @code{mysql_init()} aufrufen,
bevor Sie @code{mysql_real_connect()} aufrufen! Diese �nderung wurde
durchgef�hrt, damit die neue @code{mysql_options()}-Funktion in der
@code{MYSQL}-Handler-Struktur Optionen speichern kann.

The @code{mysqld}-Variable @code{key_buffer} wurde umbenannt in
@code{key_buffer_size}, Sie k�nnen aber in Ihren Startdateien immer noch
den alten Namen verwenden.


@node Upgrading-from-3.20, Upgrading-to-arch, Upgrading-from-3.21, Upgrade
@c German node Upgrading-from-3.20
@subsection Upgrade von Version 3.20 auf Version 3.21

@cindex Upgrade, 3.20 auf 3.21

Wenn Sie eine Version benutzen, die �lter als Version 3.20.28 ist, und auf
Version 3.21 umstellen wollen, m�ssen Sie folgendes tun:

Sie k�nnen den @code{mysqld}-Server Version 3.21 mit @code{safe_mysqld
--old-protocol} starten, um ihn mit Clients aus einer Distribution Version
3.20 zu benutzen. In diesem Fall gibt die neue Client-Funktion
@code{mysql_errno()} �berhaupt keine Server-Fehler zur�ck, nur
@code{CR_UNKNOWN_ERROR} (funktioniert aber bei Client-Fehlern), und der
Server benutzt die alte @code{password()}-�berpr�fung statt der neuen.

Wenn Sie die @code{--old-protocol}-Option @strong{NICHT} f�r @code{mysqld}
benutzen, m�ssen Sie folgende �nderungen durchf�hren:

@itemize @bullet
@item
Jeder Client-Code muss neu kompiliert werden. Wenn Sie ODBC benutzen,
m�ssen Sie die neuen @strong{MyODBC}-2.x-Treiber verwenden.
@item
Sie m�ssen das Skript @code{Skripts/add_long_password} laufen lassen, um
das @code{Password}-Feld in der @code{mysql.user}-Tabelle zu
@code{CHAR(16)} zu �ndern.
@item
Alle Passw�rter m�ssen in der @code{mysql.user}-Tabelle neu zugewiesen
werden (um 62-Bit- statt 31-Bit-Passw�rter zu erhalten).
@item
Das Tabellenformat hat sich nicht ge�ndert, daher m�ssen Sie keinerlei
Tabellen konvertieren.
@end itemize

MySQL-Version 3.20.28 und h�her kann das neue @code{user}-Tabellenformat
handhaben, ohne sich auf Clients auszuwirken. Wenn Sie eine MySQL-Version
vor Version 3.20.28 haben, funktionieren Passw�rter damit nicht mehr, wenn
Sie die @code{user}-Tabelle konvertieren. Um auf Nummer Sicher zu gehen,
sollten Sie mindestens auf Version 3.20.28 aktualisieren und erst dann auf
Version 3.21.

@cindex Protokoll-Unvertr�glichkeit
Der neue Client-Code funktioniert bei einem 3.20.x @code{mysqld}-Server.
Wenn Sie daher Probleme mit 3.21.x bekommen, k�nnen Sie den alten
3.20.x-Server benutzen, ohne die Clients neu kompilieren zu m�ssen.

Wenn Sie nicht die @code{--old-protocol}-Option f�r @code{mysqld} benutzen,
werden alte Clients folgende Fehlermeldung ausgeben:

@example
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
@end example

Die neue Perl-@code{DBI}/@code{DBD}-Schnittstelle unterst�tzt auch die alte
@code{mysqlperl}-Schnittstelle. Die einzige �nderung, die Sie machen
m�ssen, wenn Sie @code{mysqlperl} benutzen, ist, die Argumente f�r die
@code{connect()}-Funktion zu �ndern. Die neuen Argumente sind: @code{host},
@code{database}, @code{user} und @code{password} (die @code{user}- und
@code{password}-Argumente haben die Pl�tze getauscht.
@xref{Perl DBI Class, , Perl-@code{DBI}-Klasse}.

Folgende �nderungen k�nnen Anfragen in alten Applikationen betreffen:

@itemize @bullet
@item
@code{HAVING} muss jetzt vor einer m�glichen @code{ORDER BY}-Klausel
spezifiziert werden.
@item
Die Parameter f�r @code{LOCATE()} wurden getauscht.
@item
Es gibt einige neue reservierte W�rter. Die wichtigsten sind @code{DATE},
@code{TIME} und @code{TIMESTAMP}.
@end itemize


@node Upgrading-to-arch,  , Upgrading-from-3.20, Upgrade
@c German node Upgrading-to-arch
@subsection Upgrade auf eine andere Architektur

@cindex Upgrade, auf andere Architektur

Wenn Sie MySQL-Version 3.23 benutzen, k�nnen Sie die @code{.frm}-,
@code{.MYI}- und @code{.MYD}-Dateien zwischen verschiedenen Architekturen
kopieren, die dasselbe Flie�komma-Format unterst�tzen. (MySQL k�mmert sich
um eventuelle Byte-Tausch-Belange.)

Die MySQL-@code{ISAM}-Daten und Index-Dateien (@file{.ISD} und
@file{*.ISM}, je nachdem) sind Architektur-abh�ngig und in manchen F�llen
Betriebssystem-abh�ngig. Wenn Sie Ihre Applikationen auf eine andere
Maschine mit einer unterschiedlichen Architektur oder einem anderen
Betriebssystem verlagern wollen, wollten Sie nicht einfach eine Datenbank
verschieben, indem Sie deren Dateien auf die andere Maschine kopieren.
Benutzen Sie statt dessen @code{mysqldump}.

Vorgabem��ig erzeugt @code{mysqldump} eine Datei mit SQL-Statements. Sie
k�nnen diese Datei auf die andere Maschine �bertragen und Sie als Eingabe
f�r den @code{mysql}-Client benutzen.

@code{mysqldump --help} zeigt Ihnen, welche Optionen verf�gbar sind. Wenn
Sie die Daten mit einer neueren Version von MySQL benutzen werden, sollten
Sie @code{mysqldump --opt} mit der neueren Version benutzen, um einen
schnellen, kompakten Dump zu erhalten.

Die einfachste (wenngleich nicht schnellste) Art, eine Datenbank von einer
Maschine auf eine andere zu bringen, ist, die folgenden Befehle auf der
Maschine auszuf�hren, auf der die Datenbank liegt:

@example
shell> mysqladmin -h 'anderer hostname' create db_name
shell> mysqldump --opt db_name \
        | mysql -h 'anderer hostname' db_name
@end example

Wenn Sie eine Datenbank von einer entfernten Maschine �ber ein langsames
Netzwerk kopieren wollen, k�nnen Sie folgendes benutzen:

@example
shell> mysqladmin create db_name
shell> mysqldump -h 'anderer hostname' --opt --compress db_name \
        | mysql db_name
@end example

Sie k�nnen das Ergebnis auch in einer Datei speichern, diese Datei auf die
Zielmaschine �bertragen und dort in die Datenbank laden. Sie k�nnen zum
Beispiel wie folgt die Datenbank in eine Datei auf der Quellmaschine
ausgeben (dumpen):

@example
shell> mysqldump --quick db_name | gzip > db_name.inhalte.gz
@end example

(Die in diesem Beispiel erzeugte Datei ist komprimiert.) �bertragen Sie die
Datei, die die Datenbankinhalte enth�lt, auf die Zielmaschine und geben Sie
dort diese Befehle ein:

@example
shell> mysqladmin create db_name
shell> gunzip < db_name.inhalte.gz | mysql db_name
@end example

@cindex @code{mysqldump}
@cindex @code{mysqlimport}
Sie k�nnen auch @code{mysqldump} und @code{mysqlimport} benutzen, um den
Datenbank-Transfer zu bewerkstelligen.
Das ist bei gro�en Tabellen wesentlich schneller als die Benutzung von
@code{mysqldump}. In den unten dargestellten Befehlen repr�sentiert
@code{DUMPDIR} den vollen Pfadnamen des Verzeichnisses, das Sie benutzen,
um die Ausgabe von @code{mysqldump} zu speichern.

Legen Sie zun�chst das Verzeichnis f�r die Ausgabe-Dateien an und geben Sie
die Datenbank aus (Dump):

@example
shell> mkdir DUMPDIR
shell> mysqldump --tab=DUMPDIR db_name
@end example

�bertragen Sie dann die Dateien des @code{DUMPDIR}-Verzeichnisses in ein
entsprechendes Verzeichnis auf der Zielmaschine und laden Sie dort die
Dateien in MySQL:

@example
shell> mysqladmin create db_name           # Datenbank erzeugen
shell> cat DUMPDIR/*.sql | mysql db_name   # Tabellen in der Datenbank erzeugen
shell> mysqlimport db_name DUMPDIR/*.txt   # Daten in die Tabellen laden
@end example

Vergessen Sie auch nicht, die @code{mysql}-Datenbank zu kopieren, den dort
befinden Sie die Berechtigungstabellen (@code{user}, @code{db},
@code{host}). Eventuell m�ssen Sie die Befehle als
MySQL-@code{root}-Benutzer auf der neuen Maschine eingeben, um die
@code{mysql}-Datenbank angelegt zu bekommen.

Nachdem Sie die @code{mysql}-Datenbank auf die neue Maschine kopiert haben,
f�hren Sie @code{mysqladmin flush-privileges} aus, damit der Server die
Berechtigungsinformationen neu einliest.


@node Operating System Specific Notes, Perl support, Upgrade, Installing
@c German node Clientseitig
@section Betriebssystem-spezifische Anmerkungen



@menu
* Linux::                       
* Windows::                     
* Solaris::                     
* BSD Notes::                   
* Mac OS X::                    
* Other Unix Notes::            
* OS/2::                        
* BeOS::                        
* Novell Netware::              
@end menu

@node Linux, Windows, Operating System Specific Notes, Operating System Specific Notes
@c German node Linux
@subsection Linux (alle Linux-Versionen)


Die Anmerkungen weiter unten, die @strong{glibc} betreffen, gelten nur
dann, wenn Sie MySQL selbst bauen. Wenn Sie Linux auf einer x86-Maschine
fahren, ist es in den meisten F�llen wesentlich besser, einfach unsere
Bin�rdateien zu benutzen. Wir linken unsere Bin�rdateien an die am besten
gepatchte Version von @strong{glibc}, die wir bieten k�nnen, und mit den
besten Kompiler-Optionen, wobei wir versuchen, MySQL f�r Hochlast-Server
geeignet zu machen. Wenn Sie also den Text unten lesen und sich nicht
sicher sind, was Sie tun sollen, sollten Sie zun�chst unsere Bin�rdateien
ausprobieren, um zu sehen, ob diese Ihren Anforderungen entsprechen.
K�mmern Sie sich nur dann um einen eigenen Build, wenn Sie feststellen,
dass unsere Bin�rdateien nicht gut genug sind. In diesem Fall w�ren wir f�r
einen Hinweis dazu dankbar, damit wir beim n�chsten Mal eine bessere
Bin�rdatei bauen k�nnen. F�r eine typische Benutzung, selbst bei einer
gro�en Zahl gleichzeitiger Verbindungen und / oder Tabellen, die gr��er
als 2 GB sind, sind unsere Bin�rdateien in den meisten F�llen die beste
Wahl.

MySQL benutzt auf Linux LinuxThreads. Wenn Sie eine alte Linux-Version
benutzen, die keine @code{glibc2} hat, m�ssen Sie LinuxThreads
installieren, bevor Sie MySQL kompilieren. Sie erhalten LinuxThreads unter
@uref{http://www.mysql.com/downloads/Linux}.

@strong{ACHTUNG:} Wir haben einige seltsame Probleme bei Linux 2.2.14 und
MySQL auf SMP-Systemen festgestellt. Wenn Sie ein SMP-System haben,
empfehlen wir, so schnell wie m�glich auf Linux 2.4 zu aktualisieren
(Upgrade)! Dadurch wird Ihr System ausserdem schneller und stabiler!

Beachten Sie, dass @code{glibc}-Versionen vor und einschlie�lich Version
2.1.1 einen schweren Fehler im @code{pThread_mutex_timedwait}-Handling
haben, was benutzt wird, wenn Sie @code{INSERT DELAYED} verwenden. Wir
empfehlen, vor einem Upgrade der glibc @code{INSERT DELAYED} nicht zu
verwenden.

Wenn Sie planen, mehr als 1000 gleichzeitige Verbindungen zu haben, m�ssen
Sie einige �nderungen an LinuxThreads vornehmen, es neu kompilieren und mit
der neuen @file{libpThread.a} linken. Setzen Sie @code{PTHREAD_THREADS_MAX} in
@file{sysdeps/unix/sysv/linux/bits/local_lim.h} auf 4096 herauf und setzen
Sie @code{STACK_SIZE} in @file{linuxThreads/internals.h} auf 256 KB
herunter. Die Pfade sind relativ zum Wurzelverzeichnis von @code{glibc}.
Beachten Sie, dass MySQL bei etwa 600 bis 1000 Verbindungen nicht stabil
l�uft, wenn @code{STACK_SIZE} auf den Vorgabewert von 2 MB gesetzt wird.

Wenn Sie Probleme damit bekommen, dass MySQL nicht genug Dateien oder
Verbindungen �ffnen kann, haben Sie m�glicherweise Linux nicht so
konfiguriert, dass es genug Dateien handhaben kann.

In Linux 2.2 und Folgenden k�nnen Sie die Anzahl der allozierten
Datei-Handler herausbekommen, wenn Sie folgendes eingeben:

@example
cat /proc/sys/fs/file-max
cat /proc/sys/fs/dquot-max 
cat /proc/sys/fs/super-max
@end example

Wenn Sie mehr als 16M Speicher haben, sollten Sie etwas �hnliches wie
folgendes in Ihr Boot-Skript (@file{/etc/rc/boot.local} auf SuSE)
eintragen:

@example
echo 65536 > /proc/sys/fs/file-max
echo 8192 > /proc/sys/fs/dquot-max
echo 1024 > /proc/sys/fs/super-max
@end example

Das k�nnen Sie auch von der Kommandozeile aus als Root eingeben, aber in
diesem Fall werden die alten Beschr�nkungen wieder benutzt, wenn Sie Ihren
Computer neu starten.

Zus�tzlich sollten Sie in /etc/my.cnf einf�gen:

@example
[safe_mysqld]
open-files-limit=8192
@end example

Das sollte MySQL erlauben, bis zu 8192 Verbindungen und Dateien zu
erzeugen.

Die @code{STACK_SIZE}-Konstante in LinuxThreads steuert das Spacing von
Thread-Stacks im Adressraum. Sie muss Gro� genug sein, damit reichlich
Platz f�r den Stack jedes individuellen Threads bleibt, aber klein genug,
um den Stack irgend eines Threads davon abzuhalten, mit den globalen
@code{mysqld}-Daten zu kollidieren. Wie wir durch Experimentieren heraus
fanden, unmappt die Linux-Implementation von @code{mmap()} erfolgreich eine
bereits gemappte Region, wenn Sie sie anweisen, eine Adresse auszumappen,
die bereits in Benutzung ist, wobei sie alle Daten der gesamten Seite auf
Null setzt, statt einen Fehler zur�ck zu geben. Daher beruht die Sicherheit
von @code{mysqld} oder jeder anderen Thread-Applikation auf dem
"Gentleman"-Verhalten des Codes, der Threads erzeugt. Der Benutzer muss
Vorkehrungen treffen, die sicherstellen, dass die Anzahl laufender Threads
jederzeit ausreichend gering ist, damit die Thread-Stacks sich vom globalen
Heap fernhalten. Bei @code{mysqld} sollten Sie dieses "Gentleman"-Verhalten
forcieren, indem Sie einen vern�nftigen Wert f�r die the
@code{max_connections}-Variable setzen.

Wenn Sie MySQL selbst bauen und sich nicht mit dem Patchen von LinuxThreads
herum plagen wollen, sollten Sie @code{max_connections} auf einen Wert
nicht gr��er als 500 setzen. Dieser Wert sollte sogar noch kleiner sein,
wenn Sie einen gro�en Schl�sselpuffer (Key Buffer), gro�e Heap-Tabellen
oder andere Dinge haben, die @code{mysqld} dazu bringen k�nnten, eine Menge
Speicher zu allozieren, oder wenn Sie einen 2.2-Kernel mit einem 2GB-Patch
fahren. Wenn Sie unsere Bin�rdateien oder RPM-Versionen 3.23.23 oder sp�ter
benutzen, k�nnen Sie @code{max_connections} sicher auf 1500 setzen, unter
der Annahme, dass es keine gro�en Schl�sselpuffer oder Heap-Tabellen mit
vielen Daten gibt. Je mehr Sie @code{STACK_SIZE} in LinuxThreads reduzieren
k�nnen, desto mehr k�nnen Sie sicher Threads erzeugen. Wir empfehlen einen
Wert zwischen 128K und 256K.

Wenn Sie viele gleichzeitige Verbindungen benutzen, bekommen Sie vielleicht
Probleme durch ein "Feature" im 2.2-Kernel, der einen Prozess daf�r
bestraft, dass er sich aufspaltet (fork) oder einen Kindprozess klont, um
einen Fork-Bombenangriff (Fork Bomb Attack) zu verhindern. Das bringt MySQL
dazu, nicht so gut zu skalieren, wenn Sie die Anzahl gleichzeitiger Clients
erh�hen. Wir konnten beobachten, dass sich das auf Einprozessor-Systemen
mit sehr langsamer Thread-Erzeugung bemerkbar macht, was sich darin zeigt,
dass es sehr lange dauern kann, sich mit MySQL zu verbinden (bis zu einer
Minute), und genau so lange, um es herunter zu fahren. Auf
Multiprozessor-Systemen haben wir einen allm�hlichen Abfall der
Anfrage-Geschwindigkeit beobachtet, wenn die Anzahl der Clients zunimmt. Im
Verlauf der Suche nach einer L�sung haben wir von einem unserer Benutzer
einen Kernel-Patch erhalten, von dem dieser sagt, dass er auf seiner Site
eine betr�chtliche Rolle spielt. Der Patch ist hier verf�gbar
(@uref{http://www.mysql.com/downloads/patches/linux-fork.patch}).
Inzwischen haben wir recht ausf�hrliche Tests dieses Patchs sowohl auf
Entwicklungs- als auch auf Produktionssystemen gemacht. Er hat die
Performance von @code{MySQL} erheblich verbessert, ohne irgend welche
Probleme zu verursachen, und wir empfehlen ihn jetzt denjenigen unserer
Benutzer, die immer noch Hochlast-Server auf 2.2-Kerneln fahren. Dieses
Problem wurde im 2.4-Kernel behoben. Wenn Sie daher nicht zufrieden mit der
momentanen Performance Ihres Systems sind, ist es wahrscheinlich einfacher,
auf 2.4 zu aktualisieren, statt den 2.2-Kernel zu patchen, was zus�tzlich
zur Behebung dieses Fairness-Bugs auch noch Multiprozessor-Systemen einen
netten Schub gibt.

Wir haben MySQL auf dem 2.4-Kernel auf einer Zweiprozessor-Maschine
getestet und haben festgestellt, dass MySQL VIEL bessere Leistungsdaten
bringt - es gab praktisch keine Verlangsamung bei Anfragen bis ganz herauf
zu 1000 Clients, und der Skalierungsfaktor von MySQL (berechnet als
Verh�ltnis von maximalem Durchsatz zum Durchsatz mit 1 Client) war 100%.
�hnliches haben wir auf einer Vierprozessor-Maschine beobachtet - praktisch
keine Verlangsamung, w�hrend die Anzahl der Clients bis auf 1000 stieg
sowie ein Skalierungsfaktor von 300%. F�r einen unter Hochlast fahrenden
Multiprozessor-Server empfehlen wir daher ausdr�cklich den 2.4-Kernel.
Weiter haben wir festgestellt, dass es essentiell wichtig ist, den
@code{mysqld}-Prozess auf dem 2.4-Kernel mit der h�chstm�glichen Priorit�t
laufen zu lassen, um maximale Performance zu erreichen. Das kann dadurch
erreicht werden, dass man den @code{renice -20 $$}-Befehl zu
@code{safe_mysqld} hinzuf�gt. Bei unseren Tests auf der
Vierprozessor-Maschine ergab die Erh�hung der Priorit�t eine 60%-ige
Steigerung des Durchsatzes bei 400 Clients.

Wir sind derzeit dabei, mehr Informationen �ber die Performance von
@code{MySQL} auf dem 2.4-Kernel auf 4-Weg- und 8-Weg-Systemen zu bekommen.
Wenn Sie Zugang zu einem solchen System haben und einige Benchmarks gemacht
haben, schicken Sie bitte eine Mail mit den Ergebnissen an
@email{docs@@mysql.com} - wir werden Sie dem Handbuch hinzuf�gen.

Es gibt eine weitere Sache, die die Performance von MySQL stark
beeintr�chtigt, besonders auf SMP-Systemen. Die Implementation von mutex
in LinuxThreads in @strong{glibc-2.1} ist sehr schlecht f�r Programme mit
vielen Threads, die den mutex nur f�r kurze Zeit behalten. Wenn Sie MySQL
mit unver�nderten @strong{LinuxThreads} linken, f�hrt ironischerweise
auf einem SMP-System in manchen F�llen das Entfernen von Prozessoren zu
einer Leistungssteigerung von MySQL. F�r @strong{glibc 2.1.3} haben wir ein
Patch bereit gestellt, um dieses Verhalten zu korrigieren:
@uref{http://www.mysql.com/downloads/Linux/linuxThreads-2.1-patch,linuxThreads-2.1-patch}

Bei Verwendung von @strong{glibc-2.2.2} benutzt MySQL-Version 3.23.36 den
adaptiven mutex, der sogar viel besser als der gepatchte von
@strong{glibc-2.1.3} ist. Seien Sie jedoch davor gewarnt, dass unter
bestimmten Umst�nden der aktuelle mutex-Code in @strong{glibc-2.2.2}
�berdrehen kann, was die Performance von MySQL beeintr�chtigt. Die Gefahr,
dass solche Umst�nde eintreten, kann dadurch verringert werden, dass der
@code{mysqld}-Prozess auf die h�chste Priorit�t gesetzt wird. Zus�tzlich
konnten wir das �berdrehverhalten mit einem Patch korrigieren, der
@uref{http://www.mysql.com/downloads/Linux/linuxThreads-2.2.2.patch,hier}
erh�ltlich ist. Der Patch kombiniert die Korrektur des �berdrehens, die
maximale Anzahl von Threads und das Stack-Spacing in einem. Sie wenden es
auf das @code{linuxThreads}-Verzeichnis mit @code{patch -p0
</tmp/linuxThreads-2.2.2.patch} an. Wir hoffen, dass der Patch in irgend
einer Form in zuk�nftigen Releases von @code{glibc-2.2} enthalten sein
wird. Wie es auch sei, wenn Sie mit @code{glibc-2.2.2} linken, m�ssen Sie
immer noch @code{STACK_SIZE} und @code{PTHREAD_THREADS_MAX} korrigieren.
Wir hoffen, dass diese Vorgabewerte zuk�nftig auf akzeptablere Werte f�r
eine MySQL-Hochlast-Einrichtung gesetzt werden, so dass Ihr eigener Build
auf @code{./configure; make; make install} reduziert werden kann.

Wir empfehlen, dass Die die oben genannten Patches benutzen, um eine
spezielle statische Version von @code{libpThread.a} zu bauen, die Sie nur
f�r statisches Linken mit @code{MySQL} benutzen. Wir wissen, dass die
Patches f�r @code{MySQL} sicher sind und seine Performance erheblich
verbessern, aber wir k�nnen diesbez�glich nichts �ber andere Applikationen
sagen. Wenn Sie andere Applikationen mit der gepatchten Version der
Bibliothek linken oder eine gepatchte gemeinsam benutzte (shared) Version
bauen und auf Ihrem System installieren, tun Sie das auf eigenes Risiko,
was andere Applikationen betrifft, die von @code{LinuxThreads} abh�ngen.

Wenn Sie w�hrend der Installation von MySQL irgend welche seltsamen
Probleme bekommen oder gebr�uchliche Utilities h�ngen bleiben, ist es sehr
wahrscheinlich, dass diese entweder Bibliotheks- oder Compiler-bezogen
sind. In diesem Fall wird die Benutzung unserer Bin�rdatei sie beheben.

Ein bekanntes Problem der Bin�rdistribution ist, dass Sie auf �lteren
Linux-Systemen, die @code{libc} benutzen (wie RedHat 4.x oder Slackware)
nicht-schwere (non-fatal) Probleme mit der Aufl�sung von Hostnamen
bekommen.
@xref{Linux-RPM}.

Wenn Sie LinuxThreads benutzen, werden Sie feststellen, dass mindestens
drei Prozesse laufen. Das sind in Wirklichkeit Threads. Es gibt einen
Thread f�r den LinuxThreads-Manager, einen Thread, um Verbindungen zu
handhaben und einen Thread, um Alarme und Signale zu handhaben.

Beachten Sie, dass der Linux-Kernel und die LinuxThread-Bibliothek
vorgabem��ig nur 1024 Threads haben k�nnen. Das bedeutet, dass Sie auf
einem ungepatchten System nur h�chstens 1021 Verbindungen zu MySQL haben
k�nnen. Die Seite @uref{http://www.volano.com/linuxnotes.html} enth�lt
Informationen, wie man diese Beschr�nkung umgeht.

Wenn Sie einen toten @code{mysqld}-Daemon-Prozess mit @code{ps} sehen,
bedeutet das �blicherweise, dass Sie einen Bug in MySQL oder eine zerst�rte
Tabelle gefunden haben. @xref{Crashing}.

Um auf Linux einen Speicherauszug (Core Dump) zu erhalten, wenn
@code{mysqld} mit einem SIGSEGV-Signal stirbt, k�nnen Sie @code{mysqld} mit
der @code{--core-file}-Option starten. Beachten Sie, dass Sie
wahrscheinlich @code{core file size} hoch setzen m�ssen, indem Sie
@code{ulimit -c 1000000} zu @code{safe_mysqld} hinzuf�gen oder
@code{safe_mysqld} mit @code{--core-file-sizes=1000000} starten.
@xref{safe_mysqld, , @code{safe_mysqld}}.

Wenn Sie Ihren eigenen MySQL-Client linken und bei der Ausf�hrung diesen
Fehler erhalten,

@example
ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
@end example

kann das Problem durch eine der folgenden Methoden behoben werden:

@itemize @bullet
@item
Linken Sie den Client mit dem folgenden Flag (anstelle von @code{-Lpath}):
@code{-Wl,r/path-libmysqlclient.so}.

@item
Kopieren Sie @code{libmysqclient.so} nach @file{/usr/lib}.

@tindex LD_RUN_PATH Umgebungsvariable
@tindex Umgebungsvariable, LD_RUN_PATH
@item
F�gen Sie der @code{LD_RUN_PATH}-Umgebungsvariablen den Pfadnamen des
Verzeichnisses hinzu, wo @code{libmysqlclient.so} liegt, bevor Sie Ihren
Client laufen lassen.
@end itemize

Wenn Sie den Fujitsu-Compiler @code{(fcc / FCC)} benutzen, werden Sie beim
Kompilieren von MySQL einige Probleme bekommen, weil die
Linux-Header-Dateien sehr @code{gcc}-orientiert sind.

Folgende @code{configure}-Zeile sollte mit @code{fcc/FCC} funktionieren:

@example
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=konstante -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib  -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=konstante -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory
@end example

@menu
* Binary notes-Linux::          
* Linux-x86::                   
* Linux-SPARC::                 
* Linux-Alpha::                 
* Linux-PowerPC::               
* Linux-MIPS::                  
* Linux-IA64::                  
@end menu

@node Binary notes-Linux, Linux-x86, Linux, Linux
@c German node Linux-Bin�rdateien
@subsubsection Anmerkungen zur Bin�rdistribution (Linux)

@cindex Bin�rdistributionen, unter Linux
@cindex Linux, Bin�rdistribution

MySQL ben�tigt zumindest Linux-Version 2.0.

@strong{ACHTUNG}:
Wir haben Berichte von MySQL-Benutzern erhalten, die schwer wiegende
Stabilit�tsprobleme mit Linux-Kernel 2.2.14 mitgeteilt haben. Wenn Sie
diesen Kernel benutzen, sollten Sie auf 2.2.19 (oder neuer) oder auf einen
2.4-Kernel aktualisieren. Wenn Sie eine Mehrprozessormaschine haben,
sollten Sie auf jeden Fall in Betracht ziehen, 2.4 zu benutzen, weil Ihnen
das erhebliche Geschwindigkeitssteigerung geben wird.

Die Bin�rdistribution wird mit @code{-static} gelinkt, was normalerweise
hei�t, dass Sie sich nicht um die Version der Systembibliotheken k�mmern
m�ssen, die Sie haben. Ausserdem brauchen Sie nicht LinuxThread
installieren. Ein Programm, das mit @code{-static} gelinkt ist, ist etwas
gr��er als ein dynamisch gelinktes Programm, und gleichzeitig etwas
schneller (3-5%). Ein Problem liegt jedoch darin, dass Sie bei einem
statisch gelinkten Programm keine benutzerdefinierten Funktionen (UDF)
benutzen k�nnen. Wenn Sie UDF-Funktionen schreiben oder benutzen wollen
(das ist nur etwas f�r C- oder C++-Programmierer), m�ssen Sie MySQL selbst
kompilieren und das dynamische Linken benutzen.

Wenn Sie ein @code{libc}-basierendes System benutzen (statt eines
@code{glibc2}-Systems), bekommen Sie bei der Bin�rdistribution
wahrscheinlich Probleme mit der Aufl�sung von Hostnamen und mit
@code{getpwnam()}. (Das liegt daran, dass @code{glibc} leider von einigen
externen Bibliotheken abh�ngt, um Hostnamen aufzul�sen und und
@code{getpwent()}, selbst wenn es mit @code{-static} kompiliert wird.) In
diesem Fall erhalten Sie wahrscheinlich folgende Fehlermeldung, wenn Sie
@code{mysql_install_db} ausf�hren:

@example
Sorry, the host 'xxxx' could not be looked up
@end example

oder den folgenden Fehler, wenn Sie versuchen, @code{mysqld} mit der
@code{--user}-Option laufen zu lassen:

@example
getpwnam: No such file or directory
@end example

Sie k�nnen dieses Problem auf eine der folgenden Weisen l�sen:

@itemize @bullet
@item
Holen Sie sich eine MySQL-Quelldistribution (eine RPM oder die
@code{tar.gz}-Distribution) und installieren Sie statt dessen diese.
@item
F�hren Sie @code{mysql_install_db --force} aus. Das f�hrt nicht den
@code{resolveip}-Test in @code{mysql_install_db} aus. Der Nachteil ist,
dass Sie keine Hostnamen in the Berechtigungstabellen benutzen k�nnen,
sondern nur IP-Nummern (ausser f�r @code{localhost}). Wenn Sie ein altes
MySQL-Release benutzen, das @code{--force} nicht unterst�tzt, m�ssen Sie
den @code{resolveip}-Test in @code{mysql_install} mit einem Editor
deaktivieren.
@item
Starten Sie @code{mysqld} mit @code{su} anstelle von @code{--user}.
@end itemize

Die Linux-Intel-Bin�rdatei und die RPM-Releases von MySQL sind f�r h�chst
m�gliche Geschwindigkeit konfiguriert. Wir versuchen immer, den schnellsten
stabilen Kompiler zu benutzen, der verf�gbar ist.

MySQL-Perl-Unterst�tzung erfordert Perl-Version 5.004_03 oder neuer.

Auf einigen Linux-2.2-Versionen erhalten Sie wom�glich den Fehler
@code{Resource temporarily unavailable}, wenn Sie eine Menge neuer
Verbindungen zu einem @code{mysqld}-Server �ber TCP/IP aufmachen.

Das Problem liegt darin, dass Linux eine Verz�gerung zwischen dem
Schlie�en eines TCP/IP-Sockets und dem tats�chlichen Freigeben durch das
System hat. Da es nur Platz f�r eine bestimmte Anzahl von TCP/IP-Slots
gibt, bekommen Sie den genannten Fehler, wenn Sie viele neue
TCP/IP-Verbindungen innerhalb kurzer Zeit aufbauen, zum Beispiel, wenn Sie
den MySQL-@file{test-connect}-Benchmark �ber TCP/IP laufen lassen.

Wir haben dieses Problem mehrfach an verschiedene Linux-Mailing-Listen
geschrieben, konnten aber bislang keine saubere L�sung erhalten.

Die einzige bekannte 'Behebung' des Problems liegt darin, persistente
Verbindungen bei Ihren Clients zu verwenden oder Sockets zu benutzen, wenn
Sie den Datenbankserver und die Clients auf derselben Maschine laufen
lassen. Wir hoffen, dass zuk�nftig der @code{Linux 2.4}-Kernel dieses
Problem l�sen wird.


@node Linux-x86, Linux-SPARC, Binary notes-Linux, Linux
@c German node Linux-x86
@subsubsection Anmerkungen zu Linux x86

MySQL erfordert @code{libc}-Version 5.4.12 oder neuer. Bekannt ist, dass
@code{libc} 5.4.46 funktioniert. @code{glibc}-Version 2.0.6 und sp�ter
sollten ebenfalls funktionieren. Es hat einige Probleme mit den
@code{glibc}-RPMs von RedHat gegeben. Wenn Sie Probleme haben, pr�fen Sie
daher, ob es Updates gibt! Die @code{glibc}-2.0.7-19- und -2.0.7-29-RPMs
funktionieren bekannterma�en ebenfalls.

Bei einigen �lteren Linux-Distributionen kann @code{configure} einen Fehler
wie folgt produzieren:

@example
Syntaxfehler in sched.h. �ndern Sie _P zu __P in der
/usr/include/sched.h-Datei. Siehe das Installationskapitel im
Referenzhandbuch.
@end example

Machen Sie, was die (englischsprachige) Fehlermeldung sagt. F�gen Sie also
einen zus�tzlichen Unterstrich zum @code{_P}-Makro hinzu, das nur einen
Unterstrich hat, und versuchen Sie es noch einmal.

M�glicherweise erhalten Sie beim Kompilieren Warnungen. Die folgenden davon
k�nnen ignoriert werden:

@example
mysqld.cc -o objs-thread/mysqld.o
mysqld.cc: In function `void init_signals()':
mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int'
mysqld.cc: In function `void * signal_hand(void *)':
mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'
@end example

In Debian-GNU/Linux m�ssen Sie folgendes tun, damit MySQL beim Hochfahren
des Systems automatisch startet:

@example
shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> /usr/sbin/update-rc.d mysql.server defaults 99
@end example

@code{mysql.server} befindet sich im @file{share/mysql}-Verzeichnis
unterhalb des MySQL-Installationsverzeichnisses oder im
@file{support-files}-Verzeichnis des MySQL-Source-Trees.

Wenn @code{mysqld} beim Start immer einen Speicherauszug (Core Dump)
erzeugt, kann das Problem darin liegen, dass Sie eine alte
@file{/lib/libc.a} haben. Versuchen Sie sie umzubenennen, entfernen Sie
dann @file{sql/mysqld}, f�hren Sie ein neues @code{make install} durch und
versuchen Sie es noch einmal. Dieses Problem wurde von einigen
Slackware-Installationen berichtet.

Wenn Sie beim Linken von @code{mysqld} folgenden Fehler erhalten, bedeutet
das, dass Ihre @file{libg++.a} nicht korrekt installiert ist:

@example
/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'
@end example

Sie k�nnen vermeiden, dass @file{libg++.a} benutzt wird, indem Sie
@code{configure} wie folgt ablaufen lassen:

@example
shell> CXX=gcc ./configure
@end example


@node Linux-SPARC, Linux-Alpha, Linux-x86, Linux
@c German node Linux-SPARC
@subsubsection Anmerkungen zu Linux SPARC

Bei einigen Implementationen ist @code{readdir_r()} fehlerhaft. Das �u�ert
sich darin, dass @code{SHOW DATABASES} immer einen leeren Satz (Empty Set)
zur�ck gibt. Das kann behoben werden, indem @code{HAVE_READDIR_R} aus


Einige Probleme erfordern, dass Sie Ihre Linux-Installation patchen. Der
Patch befindet sich unter
@uref{http://www.mysql.com/downloads/patches/Linux-sparc-2.0.30.diff}.

Dieser Patch bezieht sich auf Linux-Distribution
@file{sparclinux-2.0.30.tar.gz}, die auf @code{vger.rutgers.edu} verf�gbar
ist (eine Version von Linux, die nie mit der offiziellen 2.0.30 verbunden
wurde). Zus�tzlich m�ssen Sie LinuxThreads 0.6 oder neuer installieren.


@node Linux-Alpha, Linux-PowerPC, Linux-SPARC, Linux
@c German node Linux-Alpha
@subsubsection Anmerkungen zu Linux Alpha

MySQL-Version 3.23.12 ist die erste MySQL-Version, die auf Linux-Alpha
getestet wurde. Wenn Sie planen, MySQL auf Linux-Alpha einzusetzen, stellen
Sie sicher, dass Sie diese oder eine neuere Version haben.

Wir haben MySQL auf Alpha mit unseren Benchmarks und unserer Test-Suite
getestet, und es scheint gut zu funktionieren. Haupts�chlich noch nicht
getestet haben wird, wie die Dinge mit vielen gleichzeitigen Verbindungen
funktionieren.

Wir kompilieren die Standard-MySQL-Bin�rdatei mit SuSE 6.4, Kernel
2.2.13-SMP, Compaq-C-Kompiler Version 6.2-504 und Compaq-C++-Kompiler
Version 6.3-005 auf einer Compaq-DS20-Maschine mit einem
Alpha-EV6-Prozessor.

Sie finden die genannten Kompiler auf
@uref{http://www.support.compaq.com/alpha-tools}). Durch die Verwendung
dieser Kompiler anstelle von gcc erhalten wir eine 9% bis 14% bessere
Performance f�r MySQL.

Beachten Sie, dass die Konfigurationszeile die Bin�rversion auf die
aktuelle CPU optimiert. Das hei�t, dass Sie unsere Bin�rdatei nur benutzen
k�nnen, wenn Sie einen Alpha-EV6-Prozessor haben. Ausserdem haben wir
statisch kompiliert, um Bibliothek-Probleme zu vermeiden.

@example
CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
@end example

Bei Benutzung von egcs funktionierte bei uns die folgende
Konfigurationszeile:

@example
CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared
@end example

Einige bekannte Probleme, wenn MySQL auf Linux-Alpha l�uft:

@itemize @bullet
@item
Das Debuggen von threaded Applikationen wie MySQL funktioniert nicht mit
@code{gdb 4.18}. Statt dessen sollten Sie gdb 5.0 herunter laden und
benutzen!

@item
Wenn Sie versuchen, @code{mysqld} unter Benutzung von @code{gcc} statisch
zu linken, wird das resultierende Image beim Starten einen Speicherauszug
(Core Dump) erzeugen. Mit anderen Worten: Benutzen Sie @strong{NICHT}
@code{--with-mysqld-ldflags=-all-static} mit @code{gcc}.
@end itemize


@node Linux-PowerPC, Linux-MIPS, Linux-Alpha, Linux
@c German node Linux-PowerPC
@subsubsection Anmerkungen zu Linux PowerPC

MySQL sollte auf MkLinux mit dem neuesten @code{glibc}-Paket funktionieren
(getestet mit @code{glibc} 2.0.7).


@node Linux-MIPS, Linux-IA64, Linux-PowerPC, Linux
@c German node Linux-MIPS
@subsubsection Anmerkungen zu Linux MIPS

Um MySQL auf Qube2 zum Laufen zu bringen (Linux Mips), ben�tigen Sie die
neuesten @code{glibc}-Bibliotheken (@code{glibc-2.0.7-29C2} funktioniert
bekannterma�en). Ausserdem m�ssen Sie den @code{egcs}-C++-Kompiler
(@code{egcs-1.0.2-9}, @code{gcc 2.95.2} oder neuer) benutzen.


@node Linux-IA64,  , Linux-MIPS, Linux
@c German node Linux-IA64
@subsubsection Anmerkungen zu Linux IA64

Um MySQL auf Linux Ia64 zu kompilieren, mussten wir folgendes tun (wir
vermuten, dass das leichter wird, wenn die neue gcc-Version f�r ia64
herausgebracht wird).

Unter Verwendung von @code{gcc-2.9-final}:

@example
CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex
@end example

Nach @code{make} werden Sie einen Fehler erhalten, dass
@code{sql/opt_range.cc} nicht kompiliert (interner Kompiler-Fehler). Um das
zu beheben, gehen Sie ins sql-Verzeichnis und tippen Sie erneut @code{make}
ein. Kopieren Sie die Kompilierzeile, �ndern Sie aber -O2 zu -O0.  Die
Datei sollte nunmehr kompilieren.

Jetzt k�nnen Sie folgendes tun:

@example
cd ..
make
make_install
@end example

und @code{mysqld} sollte lauff�hig sein.

Auf Ia64 benutzen die MySQL-Client-Bin�rdateien gemeinsam genutzte (shared)
Bibliotheken. Wenn Sie daher unsere Bin�rdistribution an anderer Stelle als
@file{/usr/local/mysql} benutzen, m�ssen Sie entweder
@file{/etc/ld.so.conf} �ndern oder den Pfad zum Verzeichnis hinzuf�gen, wo
Sie @file{libmysqlclient.so} haben, und zwar in der
@code{LD_LIBRARY_PATH}-Umgebungsvariablen.

@xref{Link errors}.

@node Windows, Solaris, Linux, Operating System Specific Notes
@c German node Windows
@subsection Anmerkungen zu Windows

Dieser Abschnitt beschreibt Installation und Benutzung von MySQL auf
Windows. Diese Information steht zus�tzlich in der @file{README}-Datei, die
mit der MySQL-Windows-Distribution mitgeliefert wird.



@menu
* Win95 start::                 
* NT start::                    
* Windows running::             
* Windows and SSH::             
* Windows symbolic links::      
* Windows client compiling::    
* Windows vs Unix::             
@end menu

@node Win95 start, NT start, Windows, Windows
@c German node Win95-Start
@subsubsection Wie man MySQL auf Win95 / Win98 startet

MySQL benutzt TCP/IP, um einen Client mit einem Server zu verbinden. (Das
erlaubt jeder beliebigen Maschine in Ihrem Netzwerk, sich mit Ihrem
MySQL-Server zu verbinden.) Aus diesem Grund m�ssen Sie MySQL auf Ihrer
Maschine installieren, bevor Sie MySQL starten. Sie finden TCP/IP auf Ihrer
Windows-CD-ROM.

Beachten Sie, dass Sie bei Verwendung eines alten Win95-Releases (zum
Beispiel OSR2) wahrscheinlich ist, dass Sie ein altes Winsock-Paket haben!
MySQL erfordert Winsock 2! Sie erhalten das neueste Winsock von
@uref{http://www.microsoft.com/}. Win98 enth�lt die neue
Winsock-2-Bibliothek, deshalb trifft das Gesagte nicht auf Win98 zu.

Um den @code{mysqld}-Server zu starten, �ffnen Sie ein MS-DOS-Fenster
(MS-DOS-Eingabeaufforderung) und geben Sie ein:

@example
C:\> C:\mysql\bin\mysqld
@end example

Das startet @code{mysqld} im Hintergrund ohne Fenster.

Sie k�nnen den MySQL-Server killen, indem Sie eingeben:

@example
C:\> C:\mysql\bin\mysqladmin -u root shutdown
@end example

Beachten Sie, dass Win95 und Win98 die Erzeugung von Named Pipes nicht
unterst�tzen. Auf Win95 und Win98 k�nnen Sie Named Pipes nur benutzen, um
sich zu einem entfernten MySQL-Server zu verbinden, der auf einem
NT-Server-Host l�uft. (Nat�rlich muss auch der MySQL-Server Named Pipes
unterst�tzen. Beispielsweise l��t die Verwendung von @code{mysqld-opt}
unter NT keine Named-Pipe-Verbindungen zu. Sie sollten daher entweder
@code{mysqld-nt} oder @code{mysqld-max-nt} verwenden.)

Wenn @code{mysqld} nicht startet, �berpr�fen Sie bitte die
@file{\mysql\data\mysql.err}-Datei um zu sehen, ob der Server eine Meldung
ausgegeben hat, die auf die Ursache des Problems hinweist. Sie k�nnen auch
versuchen, den Server mit @code{mysqld --standalone} zu starten. In diesem
Fall erscheinen vielleicht n�tzliche Informationen auf dem Bildschirm, die
Ihnen bei der L�sung des Problems helfen.

Die letzte Option besteht darin, @code{mysqld} mit @code{--standalone
--debug} zu starten. In diesem Fall schreibt @code{mysqld} eine Log-Datei
@file{C:\mysqld.trace}, die die Ursache enthalten k�nnte, warum
@code{mysqld} nicht startet. @xref{Making trace files}.


@node NT start, Windows running, Win95 start, Windows
@c German node NT-Start
@subsubsection MySQL auf Windows NT oder Windows 2000 starten

Der Win95-/Win98-Abschnitt trifft auch auf NT/Win2000 zu, mit folgenden
Unterschieden:

Damit MySQL mit TCP/IP auf NT l�uft, m�ssen Sie Service-Pack 3 (oder neuer)
installieren!

Beachten Sie, dass alles Folgende, das f�r NT zutrifft, ebenfalls f�r
Win2000 zutrifft!

F�r NT/Win2000 ist der Servername @code{mysqld-nt}. Normalerweise sollten
Sie MySQL auf NT/Win2000 als Systemdienst installieren:

@example
C:\> C:\mysql\bin\mysqld-nt --install
@end example

oder

@example
C:\> C:\mysql\bin\mysqld-max-nt --install
@end example

(Unter Windows NT k�nnen Sie in der Tat jede der Server-Bin�rdateien als
Systemdienst installieren, aber nur diejenigen, die Namen haben, die auf
@code{-nt.exe} enden, bieten Unterst�tzung f�r Named Pipes.)

Sie k�nnen MySQL mit diesen Befehlen starten und anhalten:

@example
C:\> NET START mysql
C:\> NET STOP mysql
@end example

Beachten Sie, dass Sie in diesem Fall keine weiteren Optionen f�r
@code{mysqld-nt} angeben k�nnen!

Sie k�nnen @code{mysqld-nt} auf NT auch als allein ablaufendes Programm
(Stand-alone) laufen lassen, wenn Sie @code{mysqld-nt} mit irgend welchen
Optionen starten wollen! Wenn Sie @code{mysqld-nt} auf NT ohne Optionen
laufen lassen, versucht @code{mysqld-nt}, sich mit den Vorgabeoptionen als
Systemdienst zu starten. Wenn Sie @code{mysqld-nt} angehalten haben, m�ssen
Sie es mit @code{NET START mysql} neu starten.

Der Systemdienst wird installiert mit dem Namen @code{MySQL}. Einmal
installiert, muss er mit dem Systemdienst-Steuerungs-Manager (SCM) in der
Systemsteuerung gestartet werden, oder indem Sie den @code{NET START
MySQL}-Befehl benutzen. Wenn irgend welche Optionen angegeben werden
sollen, m�ssen diese als ``Startparameter'' im SCM-Dienstprogramm angegeben
werden, bevor Sie den MySQL-Dienst starten. Wenn @code{mysqld-nt} l�uft,
kann er mit @code{mysqladmin} oder dem SCM-Dienstprogramm angehalten werden, oder
indem Sie den Befehl @code{NET STOP MySQL} benutzen. Wenn Sie SCM benutzen
@code{mysqld-nt}, um den Server anzuhalten, gibt es eine seltsame Meldung
von SCM �ber @code{mysqld shutdown normally}. Wenn er als Systemdienst
l�uft, hat @code{mysqld-nt} keinen Zugriff auf die Konsole. Daher werden
auch keine Meldungen angezeigt.

Auf NT erhalten Sie m�glicherweise folgende Systemdienst-Fehlermeldungen:
@c Question: Die folgenden deutschen Meldungen auf NT �berpr�fen!
@multitable @columnfractions .3 .7
@item Zugriff verboten @tab Bedeutung: @code{mysqld-nt.exe} kann nicht
gefunden werden.
@item Kann nicht registrieren  @tab Bedeutung: Der Pfad ist falsch.
@item Installation des Systemdienstes fehlgeschlagen. @tab Bedeutung: Der
Systemdienst ist bereits installiert oder der
Systemdienst-Steuerungs-Manager ist in einem schlechten Zustand.
@end multitable

Wenn Sie Problem haben, @code{mysqld-nt} als Systemdienst zu installieren,
versuchen Sie, ihn mit dem vollen Pfad zu installieren:

@example
C:\> C:\mysql\bin\mysqld-nt --install
@end example

Wenn das nicht funktioniert, k�nnen Sie erreichen, dass @code{mysqld-nt}
korrekt startet, indem Sie den Pfad in der Registrierung korrigieren!

Wenn Sie nicht wollen, dass @code{mysqld-nt} als Systemdienst startet,
k�nnen Sie ihn wie folgt starten:

@example
C:\> C:\mysql\bin\mysqld-nt --standalone
@end example

oder

@example
C:\> C:\mysql\bin\mysqld --standalone --debug
@end example

Letztgenanntes gibt Ihnen eine Debug-Spur in @file{C:\mysqld.trace}.
@xref{Making trace files}.


@node Windows running, Windows and SSH, NT start, Windows
@c German node Laufen lassen auf Windows
@subsubsection MySQL auf Windows laufen lassen

@cindex TCP/IP
@cindex Named Pipes

MySQL unterst�tzt TCP/IP auf allen Windows-Plattformen und Named Pipes auf
NT. Vorgabem��ig werden Named Pipes f�r lokale Verbindungen auf NT und TCP/IP f�r
alle anderen F�lle benutzt, wenn der Client TCP/IP installiert hat. Der
Hostname legt fest, welches Protokoll benutzt wird:

@multitable @columnfractions .3 .7
@strong{Hostname} @tab @strong{Protokoll}
@item NULL (keiner) @tab Auf NT zuerst Named Pipes versuchen. Wenn das
nicht funktioniert, TCP/IP benutzen. Auf Win95/Win98 wird TCP/IP benutzt.
@item . @tab Named Pipes
@item localhost @tab TCP/IP zum aktuellen Host
@item hostname  @tab TCP/IP
@end multitable

Sie k�nnen erzwingen, dass ein MySQL-Client Named Pipes benutzt, indem Sie
die @code{--pipe}-Option oder @code{.} als Hostnamen angeben. Benutzen Sie
die @code{--socket}-Option, um den Namen der Pipe festzulegen.

Sie k�nnen feststellen, ob MySQL funktioniert, indem Sie die folgenden
Befehle eingeben:

@example
C:\> C:\mysql\bin\mysqlshow
C:\> C:\mysql\bin\mysqlshow -u root mysql
C:\> C:\mysql\bin\mysqladmin version status proc
C:\> C:\mysql\bin\mysql test
@end example

Wenn @code{mysqld} nur langsam auf Verbindungen auf Win95/Win98 antwortet,
gibt es wahrscheinlich ein Problem mit Ihrem DNS. Starten Sie in diesem
Fall @code{mysqld} mit @code{--skip-name-resolve} und benutzen Sie nur
@code{localhost} und IP-Nummern in den MySQL Berechtigungstabellen. Sie
k�nnen DNS bei einer Verbindung zu einem @code{mysqld-nt}-MySQL-Server, der
auf NT l�uft, ebenfalls dadurch vermeiden, dass Sie das
@code{--pipe}-Argument verwenden, um die Benutzung von Named Pipes
festzulegen. Das funktioniert bei den meisten MySQL-Clients.

Es gibt zwei Versionen des MySQL-Kommadozeilen-Werkzeugs:
@multitable @columnfractions .25 .75
@item @code{mysql} @tab Kompiliert auf nativem Windows, was sehr
eingeschr�nkte Texteditierm�glichkeiten bietet.
@item @code{mysqlc} @tab Kompiliert mit dem Cygnus-GNU-Kompiler und
-Bibliotheken, was @code{readline}-Editierm�glichkeit bietet.
@end multitable

Wenn Sie @code{mysqlc.exe} benutzen wollen, m�ssen Sie
@file{C:\mysql\lib\cygwinb19.dll} in Ihr Windows-Systemverzeichnis kopieren
(@file{\windows\system} oder ein �hnlicher Ort).

Vorgabem��ig geben die Berechtigungen auf Windows allen lokalen Benutzern
volle Zugriffsrechte auf alle Datenbanken, ohne ein Passwort anzugeben. Um
MySQL sicherer zu machen, sollten Sie f�r alle Benutzer ein Passwort setzen
und die Zeile in der Tabelle @code{mysql.user}, die @code{Host='localhost'}
und @code{User=''} enth�lt, l�schen.

Sie sollten auch f�r den @code{root}-Benutzer ein Passwort vergeben. Das
folgende Beispiel entfernt den anonymen Benutzer, der von jedem genutzt
werden kann, um auf die @code{test}-Datenbank zuzugreifen und setzt dann
f�r den @code{root}-Benutzer ein Passwort:

@example
C:\> C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
C:\> C:\mysql\bin\mysqladmin reload
C:\> C:\mysql\bin\mysqladmin -u root password ihr_passwort
@end example

Nachdem Sie das Passwort gesetzt haben, sollten Sie den
@code{mysqld}-Server herunter fahren, was Sie mit folgendem Befehl
bewerkstelligen k�nnen:

@example
C:\> mysqladmin --user=root --password=ihr_passwort shutdown
@end example

Wenn Sie die alte Shareware-Version von MySQL-Version 3.21 unter Windows
benutzen, schl�gt der genannte Befehl mit einem Fehler fehl:
@code{parse error near 'SET OPTION password'}. Die L�sung besteht darin,
auf die aktuelle MySQL-Version zu aktualisieren, die frei verf�gbar ist.

Mit den neuen MySQL-Versionen k�nnen Sie auf einfache Art neue Benutzer
hinzuf�gen und Zugriffsrechte mit den @code{GRANT}- und
@code{REVOKE}-Befehlen �ndern.
@xref{GRANT}.

@node Windows and SSH, Windows symbolic links, Windows running, Windows
@c German node Windows und SSH
@subsubsection Verbinden mit einem entfernten MySQL-Server von Windows mit SSH aus

@c FIX this ist ugly, real ugly.

@cindex SSH
@cindex Verbinden, auf entfernte Maschine mit SSH

Hier ist eine Anmerkung dazu, wie man sich �ber eine sichere Verbindung zu
einem entfernten MySQL-Server mit SSH verbindet (von David Carlson
@email{dcarlson@@mplcomm.com}):

@itemize @bullet
@item
Installieren Sie einen SSH-Client auf Ihrer Windows-Maschine. Das beste
nicht kostenlose Werkzeug, das ich gefunden habe, ist @code{SecureCRT} von
@uref{http://www.vundyke.com/}. Eine andere Option ist @code{f-secure} von
@uref{http://www.f-secure.com/}. Sie finden kostenlose Werkzeuge �ber
@strong{Google} auf
@uref{http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/Clients/Windows/}.

@item
Starten Sie Ihren Windows-SSH-Client. 
Konfigurieren Sie: @code{Host_Name = ihr_mysql_server_URL_oder_IP}. 
Konfigurieren Sie: @code{userid=ihre_userid}, um sich an Ihrem Server
anzumelden (wahrscheinlich nicht dasselbe wie Ihr MySQL-Benutzername /
-Passwort).

@item
Konfigurieren Sie Port-Forwarding. Machen Sie entweder ein Remote Forward
(einstellen: @code{local_port: 3306}, @code{remote_host:
ihr_mysql_servername_oder_ip}, @code{remote_port: 3306} ) oder ein lokales
Forward (einstellen: @code{port: 3306},  @code{host: localhost},
@code{remote port: 3306}).

@item
Speichern Sie alles, damit Sie es beim n�chsten Mal nicht noch einmal
eingeben m�ssen.

@item
Melden Sie sich an Ihrem Server mit der SSH-Sitzung, die Sie gerade erzeugt
haben.

@item
Starten Sie auf Ihrer Windows-Maschine irgend eine Applikation wie Access.

@item
Erzeugen Sie unter Windows eine neue Datei und stellen Sie eine Verkn�pfung
zu MySQL her, indem Sie den ODBC-Treiber so benutzen, wie Sie es
normalerweise tun, AUSSER dass Sie @code{localhost} als MySQL-Host-Server
eingeben - NICHT @code{yourmysqlservername}.
@end itemize

Jetzt sollten Sie eine ODBC-Verbindung zu MySQL haben, die mit SSH
verschl�sselt ist.


@node Windows symbolic links, Windows client compiling, Windows and SSH, Windows
@c German node Symbolische Links auf Windows
@subsubsection Daten auf verschiedenen Platten unter Win32 aufteilen

@cindex Symbolische Links
@cindex Mehrere Festplatten benutzen, um Daten zu speichern
@c Question: using multiple disks to start data (should be: store data)
@cindex Festplatten, Daten verteilen �ber mehrere

Ab MySQL-Version 3.23.16 werden die @code{mysqld-max}- und
@code{mysql-max-nt}-Server in der MySQL-Distribution mit der
@code{-DUSE_SYMDIR}-Option kompiliert. Das gibt Ihnen die M�glichkeit,
Datenbanken auf verschiedene Festplatten zu verteilen, indem Sie
symbolische Links darauf machen (in �hnlicher Weise, wie symbolische Links
unter Unix funktionieren).

Unter Windows legen Sie einen symbolischen Link auf eine Datenbank an,
indem Sie eine Datei erzeugen, die den Pfad zum Zielverzeichnis enth�lt,
und diese Datei im @file{mysql_data}-Verzeichnis unter dem Dateiname
@file{Datenbank.sym} speichern. Beachten Sie, dass der symbolische Link nur
dann benutzt wird, wenn das Verzeichnis @file{mysql_data_dir\datenbank}
nicht existiert.

Wenn Ihr MySQL-Daten-Verzeichnis beispielsweise @file{C:\mysql\data} ist und
Sie die Datenbank @code{foo} dort haben wollen, die aber in
@file{D:\data\foo} liegt, erzeugen Sie die Datei
@file{C:\mysql\data\foo.sym}, die als Text @code{D:\data\foo\} enth�lt.
Dann werden alle Tabellen, die in der Datenbank @code{foo} sind, in
@file{D:\data\foo} erzeugt.

Beachten Sie, dass wir dieses Feature nicht vorgabem��ig aktiviert haben,
weil es mit Geschwindigkeitsnachteilen verbunden ist. Es ist selbst dann
nicht aktiviert, wenn Sie MySQL mit Unterst�tzung daf�r kompiliert haben.
Um symbolische Links zu aktivieren, m�ssen Sie in Ihre @code{my.cnf}- oder
@code{my.ini}-Datei folgenden Eintrag machen:

@example
[mysqld]
use-symbolic-links
@end example

In MySQL 4.0 werden symbolische Links vorgabem��ig aktiviert sein. Wenn
Sie dies deaktivieren wollen, benutzen Sie die @code{skip-symlink}-Option.


@node Windows client compiling, Windows vs Unix, Windows symbolic links, Windows
@c German node Windows kompilieren
@subsubsection MySQL-Clients auf Windows kompilieren

@cindex Kompilieren, auf Windows
@cindex Windows, Kompilieren auf

In Ihren Quell-Dateien sollten Sie @file{windows.h} einschlie�en, bevor
Sie @file{mysql.h} einschlie�en:

@example
#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <mysql.h>
@end example

Sie k�nnen Ihren Code entweder mit der dynamischen
@file{libmysql.lib}-Bibliothek linken, die nur ein Wrapper zum Laden der
@file{libmysql.dll} bei Bedarf ist, oder mit der statischen
@file{mysqlclient.lib}-Bibliothek.

Beachten Sie, dass MySQL-Client-Bibliotheken als threaded Bibliotheken
kompiliert werden, daher sollten Sie auch Ihren Code so kompilieren, dass
er multi-threaded ist!


@node Windows vs Unix,  , Windows client compiling, Windows
@c German node Windows / Unix
@subsubsection MySQL-Windows im Vergleich zu Unix-MySQL

@cindex Windows, im Vergleich zu Unix
@cindex Betriebssysteme, Windows im Vergleich zu Unix

MySQL-Windows hat sich mittlerweile als sehr stabil erwiesen. Diese Version
von MySQL hat dieselben Features wie die entsprechende Unix-Version,
allerdings mit folgenden Ausnahmen:

@table @strong
@item Windows 95 und Threads
Windows 95 hat ein etwa 200 Bytes gro�es Hauptspeicher-Leck (Memory Leak) f�r
jede Thread-Erzeugung. Jede Verbindung zu MySQL erzeugt eine neues Thread,
daher sollten Sie @code{mysqld} nicht f�r l�ngere Zeitr�ume auf Windows 95
laufen lassen, wenn Ihr Server viele Verbindungen handhabt! Windows NT und
Windows 98 haben diesen Bug nicht.

@item Gleichzeitige Lesezugriffe
MySQL vertraut auf @code{pread()}- und @code{pwrite()}-Aufrufe, um in der
Lage zu sein, @code{INSERT} und @code{SELECT} zu mischen. Momentan benutzen
wir mutexes, um @code{pread()} / @code{pwrite()} zu emulieren. Langfristig
werden wir die Dateiebenen-Schnittstelle durch eine virtuelle Schnittstelle
ersetzen, um die @code{readfile()}- / @code{writefile()}-Schnittstelle auf
NT mit h�herer Geschwindigkeit benutzen zu k�nnen.
Die aktuelle Implementation begrenzt die Anzahl offener Dateien, die MySQL
benutzen kann, auf 1024, was bedeutet, dass Sie nicht so viele
gleichzeitige Threads auf NT benutzen k�nnen wie auf Unix.

@item Blockierendes Lesen
MySQL benutzt blockierendes Lesen (Blocking Read) f�r jede Verbindung. Das
bedeutet in der Anwendung:

@itemize @bullet
@item
Eine Verbindung wird nicht automatisch nach 8 Stunden abgebaut, wie es
unter der Unix-Version von MySQL der Fall ist.

@item
Wenn eine Verbindung h�ngen bleibt, ist es unm�glich, sie abzubrechen, ohne
MySQL zu killen.

@item
@code{mysqladmin kill} funktioniert nicht f�r schlafende Verbindungen.

@item
@code{mysqladmin shutdown} kann nicht abgebrochen werden, solange es noch
schlafende Verbindungen gibt.
@end itemize

Geplant ist, dieses Problem zu beheben, sobald unsere Windows-Entwickler
ein nettes Workaround heraus gefunden haben.

@item UDF-Funktionen
Momentan unterst�tzt MySQL-Windows keine benutzerdefinierten Funktionen
(UDF, user defined functions).

@item @code{DROP DATABASE}
Sie k�nnen keine Datenbank l�schen, die durch irgend einen Thread in
Benutzung ist.

@item MySQL vom Task-Manager aus killen
Sie k�nnen MySQL nicht vom Task-Manager oder mit dem Shutdown-Dienstprogramm unter
Windows 95 killen. Sie m�ssen es mit @code{mysqladmin shutdown} herunter
fahren.

@item Von Gro�-/Kleinschreibung unabh�ngige Namen
Unter Windows sind Dateinamen unabh�ngig von der Gro�-/Kleinschreibung.
Daher sind Datenbank- und Tabellennamen in MySQL f�r Windows ebenfalls
unabh�ngig von der Gro�-/Kleinschreibung. Die einzige Einschr�nkung ist
die, dass Datenbank- und Tabellennamen innerhalb eines bestimmten
Statements dieselbe Gro�-/Kleinschreibung haben m�ssen.
@xref{Case sensitivity}.

@item Das @samp{\}-Verzeichnis-Zeichen
Bestandteile von Pfadnamen werden unter Windows mit dem @samp{\}-Zeichen
getrennt, das in MySQL als Fluchtzeichen (Escape Character) dient. Wenn Sie
@code{LOAD DATA INFILE} oder @code{SELECT ... INTO OUTFILE} benutzen,
m�ssen Sie @samp{\} an solchen Stellen doppelt eingeben:

@example
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
@end example

Alternativ k�nnen Sie auch Dateinamen im Unix-Stil mit @samp{/}-Zeichen
benutzen:

@example
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
@end example

@item @code{Can't open named pipe}-Fehler
Wenn Sie MySQL-Version 3.22 auf NT mit den neuesten MySQL-Clients benutzen,
erhalten Sie folgende Fehlermeldung:

@example
error 2017: can't open named pipe to host: . pipe...
@end example

@tindex .my.cnf Datei
Das liegt daran, dass die MySQL-Version f�r NT auf NT vorgabem��ig Named
Pipes benutzt. Sie k�nnen diesen Fehler vermeiden, indem Sie bei den neuen
MySQL-Clients die @code{--host=localhost}-Option benutzen oder eine
Optionsdatei @file{C:\my.cnf} anlegen, die folgendes enth�lt:

@example
[client]
host = localhost
@end example

@item @code{Access denied for user}-Fehler
Wenn Sie den Fehler @code{Access denied for user: 'ein-benutzer@@unknown'
to database 'mysql'} erhalten, wenn Sie auf einen MySQL-Server auf
derselben Maschine zugreifen, hei�t das, dass MySQL Ihren Hostnamen nicht
richtig aufl�sen kann.

Um das zu beheben, legen Sie eine Datei @file{\windows\hosts} mit folgender
Zeile an:

@example
127.0.0.1       localhost
@end example

@item @code{ALTER TABLE}
Wenn Sie ein @code{ALTER TABLE}-Statement ausf�hren, ist die Tabelle gegen
Benutzung durch andere Threads gesperrt. Das hat damit zu tun, dass Sie
unter Windows keine Datei l�schen k�nnen, die durch andere Threads in
Benutzung ist. (Zuk�nftig finden wir m�glicherweise einen Weg, dieses
Problem zu umgehen.)

@item @code{DROP TABLE} auf eine Tabelle, die durch eine
@code{MERGE}-Tabelle in Benutzung ist, funktioniert nicht. Der
@code{MERGE}-Handler f�hrt sein Tabellen-Mapping versteckt vor MySQL durch.
Weil Windows das L�schen von Dateien verbietet, die offen sind, m�ssen Sie
zuerst alle @code{MERGE}-Tabellen flushen (mit @code{FLUSH TABLES}) oder
die @code{MERGE}-Tabelle l�schen, bevor Sie die Tabelle l�schen. Wir werden
das zusammen mit der Einf�hrung von Sichten (@code{VIEW}s) beheben.
@end table

Hier sind einige Themen f�r diejenigen, die uns beim Windows-Release helfen
wollen:

@cindex Windows, offene Fragen

@itemize @bullet
@item
Einen Ein-Benutzer-Server @code{MYSQL.DLL} herstellen. Das k�nnte alles
beinhalten, was einen Standard-Server ausmacht, ausser Thread-Erzeugung.
Das w�rde es erheblich erleichtern, MySQL in Applikationen zu benutzen, die
keinen echten Client/Server und keinen Zugriff auf den Server von anderen
Hosts ben�tigen.

@item
Ein paar nette Start- und Stop-Icons zur MySQL-Installation hinzuf�gen.

@item
Ein Werkzeug bauen, das Registrierungseintr�ge f�r die MySQL-Startoptionen
handhabt. Das Lesen der Registrierungseintr�ge ist bereits in
@file{mysqld.cc} kodiert, sollte aber umgeschrieben werden, damit es mehr
Parameter-orientiert ist. Das Werkzeug sollte auch in der Lage sein, die
@file{C:\my.cnf}-Optionsdatei zu aktualisieren, wenn der Benutzer diese
lieber als die Registrierungsdatei benutzen will.

@item
Wenn man @code{mysqld} als Systemdienst mit @code{--install} (auf NT)
installiert, w�re es nett, wenn man vorgabem��ige Optionen auf der
Kommandozeile hinzuf�gen k�nnte. Im Moment muss man diese fehlende
M�glichkeit durch eine Liste der Parameter in der @file{C:\my.cnf}-Datei
ersetzen.

@item
Es w�re eine feine Sache, wenn man @code{mysqld} vom Task-Manager aus
killen k�nnte. Momentan muss man @code{mysqladmin shutdown} benutzen.

@item
@code{readline} auf Windows portieren, damit es im
@code{mysql}-Kommandozeilen-Werkzeug benutzt werden kann.

@item
GUI-Versionen der Standard-MySQL-Clients (@code{mysql},
@code{mysqlshow}, @code{mysqladmin} und @code{mysqldump}) w�ren nett.

@item
Nett w�re auch, wenn die Socket-Lese- und Schreib-Funktionen in
@file{net.c} unterbrechbar w�ren. Das w�rde es erm�glichen, offen Threads
mit @code{mysqladmin kill} auf Windows zu killen.

@item
@c Question: Is it my lack of English or why don't I understand the
following two lines?
@code{mysqld} always starts in the "C" locale und not in the default locale.
We would like to have @code{mysqld} use the current locale f�r the sort order.

@item
Benutzerdefinierte Funktionen (UDF) mit @code{.DLL}s implementieren.

@item
Makros hinzuf�gen, um die schnelleren, Thread-sicheren
Inkrementierungs-/Dekrementierungsmethoden nutzen zu k�nnen, die Windows
bietet.

@end itemize

Weitere Windows-spezifische Themen sind in der @file{README}-Datei
beschrieben, die mit der MySQL-Windows-Distribution ausgeliefert wird.


@node Solaris, BSD Notes, Windows, Operating System Specific Notes
@c German node Solaris
@subsection Anmerkungen zu Solaris

@cindex Installationsprobleme auf Solaris
@cindex Probleme, Installation auf Solaris
@cindex Tar, Probleme auf Solaris
@cindex Fehler, Verzeichnispr�fsumme
@cindex Pr�fsummenfehler

Auf Solaris bekommen Sie vielleicht schon Probleme, bevor Sie �berhaupt
Ihre MySQL-Distribution entpackt haben! Solaris-@code{tar} kann nicht mit
langen Dateinamen umgehen. Daher sehen Sie vielleicht einen Fehler wie den
folgenden, wenn Sie MySQL entpacken:

@example
x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 Bytes, 0 tape blocks
tar: directory checksum error (Verzeichnis-Pr�fsummenfehler)
@end example

In diesem Fall m�ssen Sie GNU-@code{tar} (@code{gtar}) benutzen, um die
Distribution zu entpacken. Sie finden eine vorkompilierte Version f�r
Solaris auf @uref{http://www.mysql.com/downloads/}.

Native Sun-Threads funktinieren nur auf Solaris 2.5 und h�her. Auf 2.4 und
fr�her benutzt MySQL automatisch MIT-pThreads.
@xref{MIT-pthreads}.

Vielleicht erhalten Sie von configure folgenden Fehler:

@example
checking for restartable system calls... configure: error can not run test
programs while cross compiling
@end example

Das bedeutet, dass mit Ihrer Kompiler-Installation etwas nicht stimmt! In
diesem Fall sollten Sie Ihren Kompiler auf eine neuere Version
aktualisieren. Eventuell sind Sie in der Lage, das Problem zu l�sen, indem
Sie folgende Zeile in die @file{config.cache}-Datei einf�gen:

@example
ac_cv_sys_restartable_syscalls=$@{ac_cv_sys_restartable_syscalls='no'@}
@end example

Wenn Sie Solaris auf einer SPARC benutzen, ist der empfohlene Kompiler
@code{gcc} 2.95.2. Sie finden ihn auf @uref{http://gcc.gnu.org/}.
Beachten Sie, dass @code{egcs} 1.1.1 und @code{gcc} 2.8.1 auf SPARC nicht
zuverl�ssig laufen!

Die empfohlene @code{configure}-Zeile ist bei der Benutzung von @code{gcc}
2.95.2:

@example
CC=gcc CFLAGS="-O3" \
CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
@end example

Wenn Sie eine Ultra-Sparc haben, erhalten Sie 4 % mehr Performance, wenn
Sie "-mcpu=v8 -Wa,-xarch=v8plusa" zu CFLAGS und CXXFLAGS hinzuf�gen.

Wenn Sie einen Sun Workshop (Fortre) 5.3 (oder neueren) Kompiler haben,
k�nnen Sie @code{configure} wie folgt laufen lassen:

@example
CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \
CXX=CC CXXFLAGS="-noex -xO4 -mt" \
./configure --prefix=/usr/local/mysql --enable-assembler
@end example

In den MySQL-Benchmarks haben wir auf einer Ultra-Sparc 6%
Geschwindigkeitssteigerung erreicht, wenn wir Sun Workshop 5.3 benutzen, im
Vergleich mit der Benutzung von gcc mit -mcpu-Flags.

Wenn Sie Probleme mit @code{fdatasync} oder @code{sched_yield} bekommen,
k�nnen Sie diese beheben, indem Sie @code{LIBS=-lrt} zur
Konfigurationszeile hinzuf�gen.

Der folgende Absatz ist nur f�r �ltere Kompiler als WorkShop 5.3 relevant:

Eventuell m�ssen Sie auch das @code{configure}-Skript editieren und
folgende Zeile �ndern:

@example
#if !defined(__STDC__) || __STDC__ != 1
@end example

�ndern zu:

@example
#if !defined(__STDC__)
@end example

Wenn Sie @code{__STDC__} mit der @code{-Xc}-Option anschalten, kann der
Sun-Kompiler nicht mit der Solaris-@file{pThread.h}-Header-Datei
kompilieren. Das ist ein Bug von Sun (Kompiler-Problem oder besch�digte
Include-Datei).

Wenn @code{mysqld} beim Laufenlassen eine Fehlermeldung wie die unten
stehende ausgibt, haben Sie versucht, MySQL mit dem Sun-Kompiler zu
kompilieren, ohne die Multi-Thread-Option (@code{-mt}) anzuschalten:

@example
libc internal error: _rmutex_unlock: rmutex not held
@end example

F�gen Sie @code{-mt} zu @code{CFLAGS} und @code{CXXFLAGS} hinzu und
versuchen Sie es noch einmal.

Wenn Sie folgenden Fehler beim Kompilieren von MySQL mit @code{gcc}
erhalten, ist Ihr @code{gcc} nicht f�r Ihre Version von Solaris
konfiguriert:

@example
shell> gcc -O3 -g -O2 -DDBUG_OFF  -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'
@end example

Die einzige richtige M�glichkeit in diesem Fall ist, sich die neueste
Version von @code{gcc} zu besorgen und Sie mit Ihrem aktuellen
@code{gcc}-Kompiler zu kompilieren. Zumindest auf Solaris 2.5 haben fast
alle Bin�rversionen von @code{gcc} alte, unbrauchbare Include-Dateien, die
alle Programme besch�digen, die Threads benutzen (und m�glicherweise auch
andere Programme)!

Solaris stellt keine statischen Versionen aller Systembibliotheken zur
Verf�gung (@code{libpThreads} und @code{libdl}). Daher k�nnen Sie MySQL
nicht mit @code{--static} kompilieren. Wenn Sie es dennoch versuchen,
erhalten Sie folgenden Fehler:

@example
ld: fatal: library -ldl: not found

oder

undefined reference to `dlopen'

oder

cannot find -lrt
@end example

Wenn zu viele Prozesse zu schnell hintereinander versuchen, sich mit
@code{mysqld} zu verbinden, werden Sie folgenden Fehler im MySQL-Log sehen:

@example
Error in accept: Protocol error
@end example

Als Workaround k�nnen Sie versuchen, den Server mit der
@code{--set-variable back_log=50}-Option zu starten. @xref{Command-line options}.

Wenn Sie Ihren eigenen MySQL-Client linken, erhalten Sie m�glicherweise
folgenden Fehler, wenn Sie versuchen, ihn auszuf�hren:

@example
ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
@end example

Dieses Problem kann mit einer der folgenden Methoden vermieden werden:

@itemize @bullet
@item
Linken Sie den Client mit folgendem Flag (anstelle von @code{-Lpath}):
@code{-Wl,r/full-path-to-libmysqlclient.so}.

@item
Kopieren Sie @file{libmysqclient.so} nach @file{/usr/lib}.

@tindex LD_RUN_PATH-Umgebungsvariable
@tindex Umgebungsvariable, LD_RUN_PATH
@item
F�gen Sie den Pfadnamen des Verzeichnisses, wo @file{libmysqlclient.so}
liegt, der @code{LD_RUN_PATH}-Umgebungsvariablen hinzu, bevor Sie Ihren
Client laufen lassen.
@end itemize

Wenn Sie die @code{--with-libwrap}-configure-Option benutzen, m�ssen Sie
auch die Bibliotheken einschlie�en, die @file{libwrap.a} ben�tigt:

@example
--with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket
@end example

Wenn Sie Probleme mit configure haben, wenn Sie versuchen, mit @code{-lz}
zu linken und keine @code{zlib} installiert haben, haben Sie zwei
M�glichkeiten:

@itemize @bullet
@item
Wenn Sie in der Lage sein wollen, dass komprimierte Kommunikationsprotokoll
zu benutzen, m�ssen Sie zlib von ftp.gnu.org laden und installieren.

@item
Konfigurieren Sie mit @code{--with-named-z-libs=no}.
@end itemize

Wenn Sie gcc benutzen und Probleme mit dem Laden von @code{UDF}-Funktionen
in MySQL haben, versuchen Sie, @code{-lgcc} zur Link-Zeile f�r die
@code{UDF}-Funktion hinzuzuf�gen.

Wenn Sie wollen, dass MySQL automatisch startet, kopieren Sie
@file{Support-files/mysql.server} nach @file{/etc/init.d} und erzeugen Sie
einen symbolischen Link darauf, den Sie @file{/etc/rc3.d/S99mysql.server}
nennen.




@menu
* Solaris 2.7::                 
* Solaris x86::                 
@end menu

@node Solaris 2.7, Solaris x86, Solaris, Solaris
@c German node Solaris 2.7
@subsubsection Anmerkungen zu Solaris 2.7/2.8

Normalerweise k�nnen Sie eine Solaris-2.6-Bin�rdatei f�r Solaris 2.7 und
2.8 benutzen. Die meisten Dinge, die Solaris 2.6 betreffen, treffen auch
f�r Solaris 2.7 und 2.8 zu.

Beachten Sie, dass MySQL-Version 3.23.4 und h�her in der Lage sein sollte,
automatisch neue Versionen von Solaris zu erkennen und Workarounds f�r die
folgenden Probleme zu aktivieren!

Solaris 2.7 / 2.8 hat einige Bugs in den Include-Dateien. Eventuell sehen
Sie folgenden Fehler, wenn Sie @code{gcc} benutzen:

@example
/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition
@end example

Wenn das auftritt, k�nnen Sie folgendes tun, um das Problem zu l�sen:

Kopieren Sie @code{/usr/include/widec.h} nach
@code{.../lib/gcc-lib/os/gcc-version/include} und �ndern Sie Zeile 41 von:

@example
#if     !defined(lint) && !defined(__lint)

nach

#if     !defined(lint) && !defined(__lint) && !defined(getwc)
@end example

Alternativ k�nnen Sie @file{/usr/include/widec.h} direkt editieren. Egal,
wie Sie vorgehen: Nachdem Sie die Fehlerbehebung durchgef�hrt haben,
sollten Sie @file{config.cache} entfernen und @code{configure} noch einmal
laufen lassen!

Wenn Sie beim Laufenlassen von @code{make} folgende Fehler bekommen, liegt
das daran, dass @code{configure} die @file{curses.h}-Datei nicht erkannte
(vermutlich aufgrund des Fehlers in @file{/usr/include/widec.h}):

@example
In file included by mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'
@end example

Das Problem l�sen Sie auf eine der folgenden Weisen:

@itemize @bullet
@item
Konfigurieren Sie mit @code{CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure}.

@item
Editieren Sie @file{/usr/include/widec.h}, wie weiter oben gezeigt, und
lassen Sie configure noch einmal laufen.

@item
Entfernen Sie die @code{#define HAVE_TERM}-Zeile aus der
@file{config.h}-Datei und lassen Sie @code{make} noch einmal laufen.
@end itemize

Wenn Sie das Problem bekommen, dass Ihr Linker @code{-lz} nicht finden
kann, wenn Sie Ihr Client-Programm linken, liegt das wahrscheinlich daran,
dass Ihre @file{libz.so}-Datei in @file{/usr/local/lib} installiert ist.
Sie k�nnen das mit einer der folgenden Methoden beheben:

@itemize @bullet
@item
F�gen Sie @file{/usr/local/lib} zu @code{LD_LIBRARY_PATH} hinzu.

@item
F�gen Sie einen Link auf @file{libz.so} von @file{/lib} hinzu.

@item
Wenn Sie Solaris 8 benutzen, k�nnen Sie die optionale zlib aus Ihrer
Solaris-8-CD-Distribution installieren.

@item
Konfigurieren Sie MySQL mit der @code{--with-named-z-libs=no}-Option.
@end itemize


@node Solaris x86,  , Solaris 2.7, Solaris
@c German node Solaris x86
@subsubsection Anmerkungen zu Solaris x86

Auf Solaris 2.8 auf x86 erzeugt @code{mysqld} einen Speicherauszug (Core
Dump), wenn Sie darin 'strip' laufen lassen.

Wenn Sie @code{gcc} oder @code{egcs} auf Solaris x86 benutzen und Probleme
mit Speicherausz�gen (Core Dumps) unter Last erleben, sollten Sie folgenden
@code{configure}-Befehl benutzen:

@example
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \
CXX=gcc \
CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
./configure --prefix=/usr/local/mysql
@end example

Das vermeidet Probleme mit der @code{libstdc++}-Bibliothek und mit
C++-Ausnahmefehlern.

Wenn das nicht hilft, sollten Sie eine Debug-Version kompilieren und sie
mit einer Trace-Datei oder unter @code{gdb} laufen lassen. @xref{Using gdb on mysqld}.


@node BSD Notes, Mac OS X, Solaris, Operating System Specific Notes
@c German node BSD
@subsection Anmerkungen zu BSD



@menu
* FreeBSD::                     
* NetBSD::                      
* OpenBSD::                     
* OpenBSD 2.5::                 
* OpenBSD 2.8::                 
* BSDI::                        
* BSDI2::                       
* BSDI3::                       
* BSDI4::                       
@end menu

@node FreeBSD, NetBSD, BSD Notes, BSD Notes
@c German node FreeBSD
@subsubsection Anmerkungen zu FreeBSD

FreeBSD 3.x wird f�r MySQL empfohlen, weil das Thread-Paket sehr viel
integrierter ist.

Die einfachste und daher empfohlene Art der Installation ist die Benutzung
der mysql-server- und mysql-client-Ports, die auf
@uref{http://www.freebsd.org} verf�gbar sind.

Durch deren Benutzung erhalten Sie:
@itemize @bullet
@item
Ein funktionierendes MySQL mit allen Optimierungen bereits aktiviert, von
denen bekannt ist, dass Sie auf Ihrer Version von FreeBSD funktionieren.

@item
Automatische Konfiguration, automatisches Build.

@item
Start-Skripte, die in /usr/local/etc/rc.d installiert werden.

@item
Die M�glichkeit festzustellen, welche Dateien installiert sind, mit
pkg_info -L. Und die M�glichkeit, sie mit pkg_delete zu entfernen, wenn Sie
MySQL nicht mehr auf dieser Maschine haben wollen.
@end itemize

Empfohlen wird die Benutzung von MIT-pThreads auf FreeBSD 2.x und von
nativen Threads auf Version 3 und h�her. Es ist m�glich, auf einigen sp�ten
2.2.x-Versionen mit nativen Threads zu arbeiten, aber Sie k�nnen beim
Herunterfahren von @code{mysqld} Probleme bekommen.

Die MySQL-@file{Makefile}-Dateien erfordern GNU-make (@code{gmake}). Wenn
Sie MySQL kompilieren wollen, m�ssen Sie zuerst GNU-@code{make}
installieren.

Stellen Sie sicher, dass Ihr Namensaufl�ser (Name Resolver) korrekt
eingerichtet ist. Ansonsten erleben Sie vielleicht Resolver-Verz�gerungen
oder -Fehler, wenn Sie sich mit @code{mysqld} verbinden.

Stellen Sie sicher, dass der @code{localhost}-Eintrag in der
@file{/etc/hosts}-Datei stimmt. Ansonsten werden Sie Probleme haben, sich
mit der Datenbank zu verbinden. Die @file{/etc/hosts}-Datei sollte mit
folgender Zeile beginnen:

@example
127.0.0.1       localhost localhost.ihre.domain
@end example

Wenn Sie bemerken, dass @code{configure} MIT-pThreads benutzen wird, lesen
Sie die Anmerkungen zu MIT-pThreads. @xref{MIT-pthreads}.

Wenn @code{make install} meldet, dass es @file{/usr/include/pThreads} nicht
finden kann, hat @code{configure} nicht entdeckt, dass Sie MIT-pThreads
ben�tigen. Das kann durch die Ausf�hrung folgender Befehle behoben werden:

@example
shell> rm config.cache
shell> ./configure --with-mit-threads
@end example

FreeBSD ist daf�r bekannt, dass es vorgabem��ig einen sehr niedrigen Wert
f�r Datei-Handles eingestellt hat. @xref{Not enough file handles}.
Kommentieren Sie den Abschnitt ulimit -n section in safe_mysqld aus oder
erh�hen Sie die Werte f�r den @code{mysqld}-Benutzer in /etc/login.conf
(und bauen Sie es neu mit cap_mkdb /etc/login.conf). Stellen Sie ausserdem
sicher, dass Sie die korrekte Klasse f�r diesen Benutzer in der
Passwort-Datei einstellen, wenn Sie nicht den Vorgabewert benutzen
(benutzen Sie chpass mysqld-user-name). @xref{safe_mysqld,
,@code{safe_mysqld}}.

Wenn Sie Probleme mit dem aktuellen Datum in MySQL erhalten, wird das
Setzen der @code{TZ}-Variablen das wahrscheinlich beheben.
@xref{Environment variables}.

Um ein sicheres, stabiles System zu erhalten, sollten Sie ausschlie�lich
FreeBSD-Kernels benutzen, die als @code{-STABLE} markiert sind.


@node NetBSD, OpenBSD, FreeBSD, BSD Notes
@c German node NetBSD
@subsubsection Anmerkungen zu NetBSD

Um auf NetBSD zu kompilieren, ben�tigen Sie GNU @code{make}. Ansonsten wird
das Kompilieren abst�rzen, wenn @code{make} versucht, @code{lint} auf
C++Dateien laufen zu lassen.


@node OpenBSD, OpenBSD 2.5, NetBSD, BSD Notes
@c German node OpenBSD
@subsubsection Anmerkungen zu OpenBSD



@node OpenBSD 2.5, OpenBSD 2.8, OpenBSD, BSD Notes
@c German node <no English equivalent>
@subsubsection Anmerkungen zu OpenBSD 2.5

Auf OpenBSD-Version 2.5 k�nnen Sie MySQL mit nativen Threads mit folgenden
Optionen kompilieren:

@example
CFLAGS=-pThread CXXFLAGS=-pThread ./configure --with-mit-threads=no
@end example


@node OpenBSD 2.8, BSDI, OpenBSD 2.5, BSD Notes
@c German node OpenBSD 2.8
@subsubsection Anmerkungen zu OpenBSD 2.8

Unsere Benutzer haben berichtet, dass OpenBSD 2.8 einen Thread-Bug hat, der
Probleme mit MySQL verursacht. Die OpenBSD-Entwickler haben das Problem
behoben, aber seit dem 25. Januar 2001 ist es nur im ``-current''-Zweig
verf�gbar. Die Symptome dieses Thread-Bugs sind langsames Antworten, hohe
Lase, hohe Prozessorauslastung und Abst�rze.


@node BSDI, BSDI2, OpenBSD 2.8, BSD Notes
@c German node BSDI
@subsubsection Anmerkungen zu BSD/OS



@node BSDI2, BSDI3, BSDI, BSD Notes
@c German node <no English equivalent>
@subsubsection Anmerkungen zu BSD/OS Version 2.x

Wenn Sie folgenden Fehler beim Kompilieren von MySQL erhalten, ist Ihr
@code{ulimit}-Wert f�r virtuellen Speicher zu niedrig:

@example
item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)':
item_func.h:28: virtual memory exhausted
make[2]: *** [item_func.o] Error 1
@end example

Versuchen Sie, @code{ulimit -v 80000} zu benutzen, und lassen Sie
@code{make} erneut laufen. Wenn das nicht funktioniert und Sie @code{bash}
benutzen, versuchen Sie, statt dessen @code{csh} oder @code{sh} zu
benutzen. Einige BSDI-Benutzer haben Probleme mit @code{bash} und
@code{ulimit} berichtet.

Wenn Sie @code{gcc} benutzen, m�ssen Sie eventuell auch den
@code{--with-low-memory}-Flag f�r @code{configure} benutzen, um in der Lage
zu sein, @file{sql_yacc.cc} zu kompilieren.

Wenn Sie Probleme mit dem aktuellen Datum in MySQL erhalten, wird das
Setzen der @code{TZ}-Variablen das wahrscheinlich beheben.
@xref{Environment variables}.

@node BSDI3, BSDI4, BSDI2, BSD Notes
@c German node BSDI3
@subsubsection Anmerkungen zu BSD/OS Version 3.x

Aktualisieren Sie auf BSD/OS Version 3.1. Wenn das nicht m�glich ist,
installieren Sie BSDI-Patch M300-038.

Benutzen Sie zur Konfiguration von MySQL folgenden Befehl:

@example
shell> env CXX=shlicc++ CC=shlicc2 \
       ./configure \
           --prefix=/usr/local/mysql \
           --localstatedir=/var/mysql \
           --without-perl \
           --with-unix-socket-path=/var/mysql/mysql.sock
@end example

Folgendes funktioniert bekannterma�en ebenfalls:

@example
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
       ./configure \
           --prefix=/usr/local/mysql \
           --with-unix-socket-path=/var/mysql/mysql.sock
@end example

Wenn Sie wollen, k�nnen Sie die Verzeichnisorte �ndern oder aber die
Vorgabewerte benutzen, indem Sie einfach keine Speicherorte angeben.

Wenn Sie Performance-Probleme unter Hochlast bekommen, versuchen Sie die
@code{--skip-thread-priority}-Option f�r @code{mysqld}! Dies f�hrt alle
Threads mit derselben Priorit�t aus. Auf BSDI-Version 3.1 gibt Ihnen das
bessere Performance (zumindest solange, bis BSDI ihren Thread-Scheduler in
Ordnung bringt).

Wenn Sie beim Kompilieren den Fehler @code{virtual memory exhausted}
erhalten, probieren Sie es mit @code{ulimit -v 80000} und lassen Sie
@code{make} noch einmal laufen. Wenn das nicht funktioniert und Sie
@code{bash} benutzen, versuchen Sie, statt dessen @code{csh} oder @code{sh}
zu benutzen. Einige BSDI-Benutzer haben Probleme mit @code{bash} und
@code{ulimit} berichtet.


@node BSDI4,  , BSDI3, BSD Notes
@c German node BSDI4
@subsubsection Anmerkungen zu BSD/OS Version 4.x

BSDI-Version 4.x hat einige auf Threads bezogene Bugs. Wenn Sie auf dieser
Plattform MySQL benutzen wollen, sollten Sie alle Patches installieren, die
sich auf Threads beziehen. Zumindest M400-023 sollte installiert sein.

Auf einigen Systemen mit BSDI-Version 4.x bekommen Sie vielleicht Probleme
mit gemeinsam verwendeten (shared) Bibliotheken. Das �u�ert sich darin,
dass Sie keinerlei Client-Programme wie @code{mysqladmin} ausf�hren k�nnen.
In diesem Fall m�ssen Sie MySQL so rekonfigurieren, dass keine gemeinsam
genutzten Bibliotheken benutzt werden, indem Sie die
@code{--disable-shared}-Option f�r configure benutzen.

Einige Kunden hatten auf BSDI 4.0.1 Probleme damit, dass die
@code{mysqld}-Bin�rdatei nach einiger Zeit keine Tabellen mehr �ffnen
konnte. Das liegt an einigen Bugs, die sich auf Bibliothek / System
beziehen, und die @code{mysqld} veranlassen, das aktuelle Verzeichnis zu
wechseln, ohne danach gefragt zu haben!

Die L�sung besteht darin, entweder auf 3.23.34 zu aktualisieren oder nach
dem Laufenlassen von @code{configure} die Zeile @code{#define
HAVE_REALPATH} aus @code{config.h} zu entfernen, bevor Sie make laufen
lassen.

Beachten Sie, dass sich aus dem Gesagten ergibt, dass Sie auf BSDI keine
symbolischen Links von Datenbankverzeichnissen zu einem anderen
Datenbankverzeichnis oder symbolische Links von einer Tabelle zu einer
anderen Datenbank herstellen k�nnen! (Ein symbolischer Link auf eine andere
Platte ist okay.)


@node Mac OS X, Other Unix Notes, BSD Notes, Operating System Specific Notes
@c German node Mac OS X
@subsection Anmerkungen zu Mac OS X



@menu
* Mac OS X Public Beta::        
* Mac OS X Server::             
@end menu

@node Mac OS X Public Beta, Mac OS X Server, Mac OS X, Mac OS X
@c German node Mac OS X Public Beta
@subsubsection Mac OS X Public Beta

MySQL sollte ohne jedes Problem auf Mac OS X Public Beta (Darwin) laufen.
Die pThread-Patches f�r dieses Betriebssystem ben�tigen Sie nicht!


@node Mac OS X Server,  , Mac OS X Public Beta, Mac OS X
@c German node Mac OS X Server
@subsubsection Mac OS X Server

Bevor Sie versuchen, MySQL auf Mac OS X Server zu konfigurieren, m�ssen Sie
das pThread-Paket von @uref{http://www.prnet.de/RegEx/mysql.html}
installieren.

Unsere Bin�rdatei f�r Mac OS X wird kompiliert auf Rhapsody 5.5, mit
folgender Konfigurationszeile:

@example
CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql "--with-comment=Official MySQL binary" --with-extra-charsets=complex  --disable-shared
@end example

Wenn Sie der Ressourcen-Datei Ihrer Shell Aliase hinzuf�gen wollen, um auf
@code{mysql} und @code{mysqladmin} von der Kommandozeile aus zuzugreifen,
geben Sie ein:

@example
alias mysql '/usr/local/mysql/bin/mysql'
alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
@end example


@node Other Unix Notes, OS/2, Mac OS X, Operating System Specific Notes
@c German node Andere Unixe
@subsection Anmerkungen zu anderen Unixen



@menu
* Binary notes-HP-UX::          
* HP-UX 10.20::                 
* HP-UX 11.x::                  
* IBM-AIX::                     
* SunOS::                       
* Alpha-DEC-UNIX::              
* Alpha-DEC-OSF1::              
* SGI-Irix::                    
* Caldera::                     
* Caldera Unixware::            
@end menu

@node Binary notes-HP-UX, HP-UX 10.20, Other Unix Notes, Other Unix Notes
@c German node Binary notes-HP-UX
@subsubsection Anmerkungen zu HP-UX Notes f�r Bin�rdistributionen

@cindex HP-UX, Bin�rdistribution
@cindex Bin�rdistributionen, auf HP-UX

Einige Bin�rdistributionen von MySQL f�r HP-UX werden als HP-Depot-Datei
und als Tar-Datei ausgeliefert. Um die Depot-Datei benutzen zu k�nnen,
m�ssen Sie mindestens HP-UX 10.x haben, um auf HP's Software-Depot-Werkzeuge
zugreifen zu k�nnen.

Die HP-Version von MySQL wurde auf einem HP 9000/8xx-Server unter HP-UX
10.20 kompiliert und benutzt MIT-pThreads. Unter dieser Konfiguration
arbeitet sie bekannterma�en gut. MySQL-Version 3.22.26 und neuer kann auch
mit HP's nativem Thread-Paket gebaut werden.

Weitere Konfigurationen, die ebenfalls funktionieren k�nnen:

@itemize @bullet
@item
HP 9000/7xx mit HP-UX 10.20+
@item
HP 9000/8xx mit HP-UX 10.30
@end itemize

Folgende Konfigurationen werden fast mit Sicherheit nicht laufen:

@itemize @bullet
@item
HP 9000/7xx oder 8xx mit HP-UX 10.x, wobei x < 2
@item
HP 9000/7xx oder 8xx mit HP-UX 9.x
@end itemize

Um die Distribution zu installieren, benutzen Sie die unten stehenden
Befehle, wobei @code{/pfad/zum/depot} der volle Pfadname der Depot-Datei
ist:

@itemize @bullet
@item
Um alles inklusive Server, Client- und Entwicklungs-Werkzeuge zu installieren:

@example
shell> /usr/sbin/swinstall -s /pfad/zum/depot mysql.full
@end example

@item
Um nur den Server zu installieren:

@example
shell> /usr/sbin/swinstall -s /pfad/zum/depot mysql.server
@end example

@item
Um nur das Client-Paket zu installieren:

@example
shell> /usr/sbin/swinstall -s /pfad/zum/depot mysql.client
@end example

@item
Um nur die Entwicklungs-Werkzeuge zu installieren:

@example
shell> /usr/sbin/swinstall -s /pfad/zum/depot mysql.developer
@end example
@end itemize

Das Depot speichert Bin�rdateien und Bibliotheken in @file{/opt/mysql} und
Daten in @file{/var/opt/mysql}. Es legt auch die entsprechenden Eintr�ge in
@file{/etc/init.d} und @file{/etc/rc2.d} an, um den Server automatisch beim
Hochfahren zu starten. Das setzt @code{root}-Rechte zum Installieren
voraus.

Um die HP-UX-tar.gz-Distribution zu installieren, m�ssen Sie GNU @code{tar}
haben.


@node HP-UX 10.20, HP-UX 11.x, Binary notes-HP-UX, Other Unix Notes
@c German node HP-UX 10.20
@subsubsection Anmerkungen zu HP-UX Version 10.20

Es gibt einige kleine Probleme, wenn Sie MySQL auf HP-UX kompilieren. Wir
empfehlen, anstelle des nativen HP-UX-Kompilers @code{gcc} zu benutzen,
weil @code{gcc} besseren Code produziert!

Wir empfehlen die Benutzung von gcc 2.95 auf HP-UX. Benutzen Sie keine
hohen Optimierungs-Flags (wie -O6), weil das eventuell f�r HP-UX nicht
sicher ist.

Beachten Sie, dass MIT-pThreads nicht mit dem HP-UX-Kompiler kompiliert
werden k�nnen, weil dieser keine @code{.S}-(Assembler)-Dateien kompilieren
kann.

Folgende Konfigurationszeile sollte funktionieren:

@example
CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pThread --with-named-Thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
@end example

Wenn Sie @code{gcc} 2.95 selbst kompilieren, sollten Sie ihn NICHT mit den
DCE-Bibliotheken (@code{libdce.a} oder @code{libcma.a}) linken, wenn Sie
MySQL mit MIT-pThreads kompilieren wollen. Wenn Sie DCE- und
MIT-pThreads-Pakete mischen, erhalten Sie einen @code{mysqld}, mit dem Sie
sich nicht verbinden k�nnen. Entfernen Sie die DCE-Bibliotheken, w�hrend
Sie @code{gcc} 2.95 kompilieren!


@node HP-UX 11.x, IBM-AIX, HP-UX 10.20, Other Unix Notes
@c German node HP-UX 11.x
@subsubsection Anmerkungen zu HP-UX Version 11.x

F�r HP-UX Version 11.x empfehlen wir MySQL-Version 3.23.15 oder sp�ter.

Wegen einiger kritischer Bugs in den Standard-HP-UX-Bibliotheken sollten
Sie folgende Patches installieren, bevor Sie MySQL auf HP-UX 11.0 laufen
lassen:

@example
PHKL_22840 Streams cumulative
PHNE_22397 ARPA cumulative
@end example

Das l�st das Problem, dass man @code{EWOULDBLOCK} von @code{recv()} 
und @code{EBADF} von @code{accept()} in threaded Applikationen erh�lt.

Wenn Sie @code{gcc} 2.95.1 auf einem nicht-gepatchten HP-UX-11.x-System
benutzen, erhalten Sie den Fehler:

@example
In file included by /usr/include/unistd.h:11,
                 by ../include/global.h:125,
                 by mysql_priv.h:15,
                 by item.cc:19:
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pThread.h:440: previous declaration ...
In file included by item.h:306,
                 by mysql_priv.h:158,
                 by item.cc:19:
@end example

Das Problem liegt darin, dass HP-UX @code{pThreads_atfork()} nicht
konsistent definiert. Es hat konfliktbehaftete Prototypes in
@file{/usr/include/sys/unistd.h}:184 und
@file{/usr/include/sys/pThread.h}:440 (Details weiter unten).

Eine L�sung besteht darin, @file{/usr/include/sys/unistd.h} nach
@file{mysql/include} zu kopieren und @file{unistd.h} zu editieren, wobei es
so abge�ndert wird, dass es der Definition in @file{pThread.h} entspricht.
Hier ist der Diff:

@example
183,184c183,184
<      extern int pThread_atfork(void (*prepare)(), void (*parent)(),
<                                                void (*child)());
---
>      extern int pThread_atfork(void (*prepare)(void), void (*parent)(void),
>                                                void (*child)(void));
@end example

Danach sollte folgende Konfigurationszeile funktionieren:

@example
CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" ./configure --prefix=/usr/local/mysql --disable-shared
@end example

Hier sind ein paar Informationen �ber das Kompilieren von MySQL mit dem
HP-UX:x-Kompiler, die uns ein Benutzer der HP-UX-Version 11.x geschickt
hat:

@example
 Environment:
      proper compilers.
         setenv CC cc
         setenv CXX aCC
      flags
         setenv CFLAGS -D_REENTRANT
         setenv CXXFLAGS -D_REENTRANT
         setenv CPPFLAGS -D_REENTRANT
     % aCC -V
     aCC: HP ANSI C++ B3910B X.03.14.06
     % cc -V /tmp/empty.c
     cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI)
     ccom: HP92453-01 A.11.01.00 HP C Compiler
     cc: "/tmp/empty.c", line 1: warning 501: Empty source file.

  configuration:
     ./configure  --with-pThread        \
     --prefix=/source-control/mysql     \
     --with-named-Thread-libs=-lpThread \
     --with-low-memory

    added '#define _CTYPE_INCLUDED' to include/m_ctype.h. This
    symbol ist the one defined in HP's /usr/include/ctype.h:

     /* Don't include std ctype.h when this is included */
     #define _CTYPE_H
     #define __CTYPE_INCLUDED
     #define _CTYPE_INCLUDED
     #define _CTYPE_USING   /* Don't put names in global namespace. */
@end example

@itemize @bullet
@item
Ich muss den Compile-Time-Flag @code{-D_REENTRANT} benutzen, um den
Kompiler dazu zu bringen, den Prototype f�r @code{localtime_r} zu erkennen.
Alternativ h�tte ich auch den Prototype f�r @code{localtime_r} bereit
stellen k�nnen. Aber ich wollte weitere Bugs abfangen, in die ich sonst
gerannt w�re. Ich war nicht sicher, wo ich es ben�tigen w�rde, daher f�gte
ich es zu allen Flags hinzu.
@item
Die Optimierungs-Flags, die MySQL benutzt (-O3), werden von den
HP-Kompilern nicht erkannt. Ich habe die Flags nicht ge�ndert.
@end itemize

Wenn Sie folgenden Fehler von @code{configure} erhalten:

@example
checking for cc option to accept ANSI C... no
configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the installation chapter in the reference manual.
@end example

�berpr�fen Sie, dass Sie den Pfad zum K&R-Kompiler nicht vor dem Pfad zum
HP-UX-C- und C++-Kompiler haben.


@node IBM-AIX, SunOS, HP-UX 11.x, Other Unix Notes
@c German node IBM-AIX
@subsubsection Anmerkungen zu IBM-AIX

@cindex Probleme, Installation auf IBM-AIX

Automatische Erkennung von @code{xlC} fehlt bei Autoconf, daher wird ein
@code{configure}-Befehl wie folgender ben�tigt, wenn Sie MySQL kompilieren
(dieses Beispiel benutzt den IBM-Kompiler):

@example
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
export CFLAGS="-I /usr/local/include"
export LDLFAGS="-L /usr/local/lib"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS

./configure --prefix=/usr/local \
		--localstatedir=/var/mysql \
		--sysconfdir=/etc/mysql \
		--sbindir='/usr/local/bin' \
		--libexecdir='/usr/local/bin' \
		--enable-thread-safe-client \
		--enable-large-files
@end example

Das sind die Optionen, die benutzt werden, um die MySQL-Distribution zu
kompilieren, die sich auf @uref{http://www-frec.bull.com/} befindet.

Wenn Sie in obiger Konfigurationszeile @code{-O3} zu @code{-O2} �ndern,
m�ssen Sie auch die @code{-qstrict}-Option entfernen (das ist eine
Beschr�nkung im IBM-C-Kompiler).

Wenn Sie @code{gcc} oder @code{egcs} benutzen, um MySQL zu kompilieren,
@strong{M�SSEN} Sie den @code{-fno-exceptions}-Flag benutzen, weil das
Exception-Handling in @code{gcc} / @code{egcs} nicht Thread-sicher ist!
(Das wurde mit @code{egcs} 1.1. getestet.) Es gibt auch ein paar bekannte
Probleme mit dem IBM-Assembler, die dazu f�hren k�nnen, dass schlechter
Code erzeugt wird, wenn er zusammen mit gcc benutzt wird.

Wir empfehlen folgende @code{configure}-Zeile f�r @code{egcs} und
@code{gcc 2.95} auf AIX:

@example
CC="gcc -pipe -mcpu=power -Wa,-many" \
CXX="gcc -pipe -mcpu=power -Wa,-many" \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory
@end example

@code{-Wa,-many} ist notwendig, damit das Kompilieren gelingt. Das Problem
ist IBM bekannt, hat es aber nicht eilig, es zu beheben, weil ein
Workaround verf�gbar ist. Wir wissen nicht, ob @code{-fno-exceptions} f�r
@code{gcc 2.95} erforderlich ist, aber weil MySQL keine Exceptions benutzt
und die obige Option schnelleren Code erzeugt, empfehlen wir, dass Sie
diese Option f�r @code{egcs / gcc} immer benutzen.

Wenn Sie ein Problem mit Assembler-Code bekommen, versuchen Sie, -mcpu=xxx
so anzupassen, dass es zu Ihrem Prozessor passt. Typischerweise wird man
power2, power oder powerpc benutzen, alternativ kann man eventuell 604 oder
604e benutzen. Ich bin nicht ganz sicher, aber ich w�rde sagen, dass
"power" meist sicher sein sollte, selbst auf einer power2-Maschine.

Wenn Sie nicht wissen, welchen Prozessor Sie haben, geben Sie "uname -m"
ein. Das gibt eine Zeichenkette zur�ck, die etwa wie "000514676700"
aussieht, mit dem Format xxyyyyyymmss, wobei xx und ss immer die Nullen
sind (0). yyyyyy ist eine eindeutige System-ID und mm ist die ID des
CPU-Planars. Eine Tabelle dieser Werte liegt auf
@uref{http://www.rs6000.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm}.
Darin finden Sie Maschinentyp und Maschinenmodell, was Sie benutzen k�nnen,
um herauszufinden, welchen Prozessortyp Sie haben.

Wenn Sie Probleme mit Signalen haben (MySQL stirbt unerwartet unter hoher
Last), haben Sie vielleicht einen Betriebssystem-Bug bei Threads und
Signalen gefunden. In diesem Fall k�nnen Sie MySQL anweisen, keine Signale
zu benutzen, indem Sie es wie folgt konfigurieren:

@example
shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
       CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \
       ./configure --prefix=/usr/local/mysql --with-debug --with-low-memory
@end example

Das ber�hrt nicht die Performance von MySQL, hat aber den Nebeneffekt, dass
Sie keine Clients auf einer Verbindung mit @code{mysqladmin kill} oder
@code{mysqladmin shutdown} killen k�nnen, die ``schlafen''. Statt dessen
wird der Client sterben, wenn er den n�chsten Befehl sendet.

Bei einigen Versionen von AIX f�r das Linken mit @code{libbind.a} bei
@code{getservbyname} zu einem Speicherauszug (Core Dump). Das ist ein
AIX-Bug, der IBM berichtet werden sollte.

Bei AIX 4.2.1 und gcc m�ssen Sie folgende �nderungen durchf�hren:

Nach dem Konfigurieren m�ssen Sie @file{config.h} und
@file{include/my_config.h} editieren und die Zeile �ndern, in der steht:

@example
#define HAVE_SNPRINTF 1
@end example

zu

@example
#undef HAVE_SNPRINTF
@end example

Schlie�lich m�ssen Sie in @file{mysqld.cc} einen Prototype f�r initgoups
hinzuf�gen:

@example
#ifdef _AIX41
extern "C" int initgroups(const char *,int);
#endif
@end example


@node SunOS, Alpha-DEC-UNIX, IBM-AIX, Other Unix Notes
@c German node SunOS
@subsubsection Anmerkungen zu SunOS 4

Auf SunOS 4 werden MIT-pThreads ben�tigt, um MySQL zu kompilieren, was
letztlich bedeutet, dass Sie GNU-@code{make} ben�tigen.

Einige SunOS-4-Systeme haben Probleme mit dynamischen Bibliotheken und
@code{libtool}. Sie k�nnen folgende @code{configure}-Zeile benutzen, um das
Problem zu vermeiden:

@example
shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
@end example

Wenn Sie @code{readline} kompilieren, erhalten Sie vielleicht Warnungen
�ber duplizierte Defines. Diese k�nnen ignoriert werden.

Wenn Sie @code{mysqld} kompilieren, gibt es ein paar @code{implicit
declaration of function}-Warnungen. Diese k�nnen ignoriert werden.


@node Alpha-DEC-UNIX, Alpha-DEC-OSF1, SunOS, Other Unix Notes
@c German node Alpha-DEC-UNIX
@subsubsection Anmerkungen zu Alpha-DEC-UNIX (Tru64)

Wenn Sie egcs 1.1.2 auf Digital Unix benutzen, sollten Sie auf gcc 2.95.2
aktualisieren, weil egcs auf DEC einige schwer wiegende Bugs hat!

Wenn Sie threaded Programme unter Digital Unix kompilieren, empfiehlt die
Dokumentation, die @code{-pThread}-Option f�r @code{cc} und @code{cxx} und
die Bibliotheken @code{-lmach -lexc} zu benutzen (zus�tzlich zu
@code{-lpThread}). Sie sollten @code{configure} wie folgt laufen lassen:

@example
CC="cc -pThread" CXX="cxx -pThread -O" \
./configure --with-named-thread-libs="-lpThread -lmach -lexc -lc"
@end example

Wenn Sie @code{mysqld} kompilieren, sehen Sie eventuell eine Reihe von
Warnungen wie die folgende:

@example
mysqld.cc: In function void handle_connections()':
mysqld.cc:626: passing long unsigned int *' as argument 3 of
accept(int,sockadddr *, int *)'
@end example

Sie k�nnen diese Warnungen ignorieren. Sie treten auf, weil
@code{configure} nur Fehler entdecken kann, keine Warnungen.

Wenn Sie den Server direkt von the Kommandozeile starten, haben Sie
vielleicht Probleme, dass er stirbt, wenn Sie sich ausloggen. (Wenn Sie
sich ausloggen, erhalten Ihre offenen Prozesse ein @code{SIGHUP}-Signal.)
Wenn das der Fall ist, starten Sie den Server wie folgt:

@example
shell> nohup mysqld [options] &
@end example

@code{nohup} bewirkt, dass der folgende Befehl jegliche
@code{SIGHUP}-Signale, die vom Terminal gesendet werden, ignoriert.
Alternativ starten Sie den Server mit @code{safe_mysqld}, was @code{mysqld}
mit @code{nohup} f�r Sie aufruft.
@xref{safe_mysqld, , @code{safe_mysqld}}.

Wenn Sie ein Problem beim Kompilieren von mysys/get_opt.c bekommen,
entfernen Sie einfach die Zeile #define _NO_PROTO am Anfang dieser Datei!

Wenn Sie den CC-Kompiler von Compaq benutzen, sollte die folgende
Konfigurationszeile funktionieren:

@example
CC="cc -pThread"
CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
CXX="cxx -pThread"
CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
export CC CFLAGS CXX CXXFLAGS
./configure \
--prefix=/usr/local/mysql \
--with-low-memory \
--enable-large-files \
--enable-shared=yes \
--with-named-Thread-libs="-lpThread -lmach -lexc -lc"
gnumake
@end example

Wenn Sie ein Problem mit libtool beim Kompilieren mit gemeinsam genutzten
(shared) Bibliotheken bekommen wie oben, wenn Sie @code{mysql} linken,
sollten Sie dies folgenderma�en umgehen k�nnen:

@example
cd mysql
/bin/sh ../libtool --mode=link cxx -pThread  -O3 -DDBUG_OFF \
-O4 -ansi_alias -ansi_args -fast -inline speed \
-speculate all \ -arch host  -DUNDEF_HAVE_GETHOSTBYNAME_R \
-o mysql  mysql.o readline.o sql_string.o completion_hash.o \
../readline/libreadline.a -lcurses \
../libmysql/.libs/libmysqlclient.so  -lm
cd ..
gnumake
gnumake install
Skripts/mysql_install_db
@end example


@node Alpha-DEC-OSF1, SGI-Irix, Alpha-DEC-UNIX, Other Unix Notes
@c German node Alpha-DEC-OSF1
@subsubsection Anmerkungen zu Alpha-DEC-OSF1

Wenn Sie Probleme beim Kompilieren haben und DEC @code{CC} und @code{gcc}
installiert sind, versuchen Sie, @code{configure} wie folgt laufen zu
lassen:

@example
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql
@end example

Wenn Sie Probleme mit der @file{c_asm.h}-Datei bekommen, k�nnen Sie wie
folgt eine 'dummy'-@file{c_asm.h}-Datei erzeugen und benutzen:

@example
touch include/c_asm.h
CC=gcc CFLAGS=-I./include \
CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql
@end example

Beachten Sie, dass die im Folgenden beschriebenen Probleme mit dem
@code{ld}-Programm behoben werden k�nnen, indem Sie das neueste
DEC-(Compaq)-Patch-Kit herunterladen, und zwar von folgender Seite:
@uref{http://ftp.Support.compaq.com/public/unix/}.

Auf OSF1 V4.0D und Kompiler "DEC C V5.6-071 auf Digital Unix V4.0 (Rev.
878)" zeigt der Kompiler einige seltsame Verhaltensweisen (undefinierte
@code{asm}-Symbole). Ausserdem scheint @code{/bin/ld} besch�digt zu sein
(Probleme mit @code{_exit undefined}-Fehlern, die auftreten, wenn Sie
@code{mysqld} linken). Auf diesem System konnten wir MySQL mit folgender
@code{configure}-Zeile kompilieren, nachdem wir @code{/bin/ld} mit der
Version von OSF 4.0C ersetzt haben:

@example
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
@end example

Beim Digital-Kompiler "C++ V6.1-029" sollte folgendes funktionieren:

@example
CC=cc -pThread
CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host
CXX=cxx -pThread
CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -noexceptions -nortti
export CC CFLAGS CXX CXXFLAGS
./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc"
@end example

In einigen Versionen von OSF1 ist die @code{alloca()}-Funktion besch�digt.
Beheben Sie dies, indem Sie die Zeile in @file{config.h} entfernen, die
@code{'HAVE_ALLOCA'} definiert.

Die @code{alloca()}-Funktion kann ebenfalls einen falschen Prototyp in
@code{/usr/include/alloca.h} haben. Die Warnung, die hieraus resultiert,
kann ignoriert werden.

@code{configure} benutzt automatisch folgenden Thread-Bibliotheken:
@code{--with-named-thread-libs="-lpThread -lmach -lexc -lc"}.

Wenn Sie @code{gcc} benutzen, k�nnen Sie auch versuchen, @code{configure}
wie folgt laufen zu lassen:

@example
shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
@end example

Wenn Sie Probleme mit Signalen haben (MySQL stirbt unerwartet unter
Hochlast), haben Sie vielleicht einen Betriebssystem-Bug bei Threads und
Signalen gefunden. In diesem Fall k�nnen Sie MySQL anweisen, keine Signale
zu benutzen, indem Sie es wie folgt konfigurieren:

@example
shell> CFLAGS=-DDONT_USE_THR_ALARM \
       CXXFLAGS=-DDONT_USE_THR_ALARM \
       ./configure ...
@end example

Das ber�hrt nicht die Performance von MySQL, hat aber den Nebeneffekt, dass
Sie keine Clients auf einer Verbindung mit @code{mysqladmin kill} oder
@code{mysqladmin shutdown} killen k�nnen, die ``schlafen''. Statt dessen
wird der Client sterben, wenn er den n�chsten Befehl sendet.

Bei @code{gcc} 2.95.2 erhalten Sie wahrscheinlich folgenden
Kompilierfehler:

@example
sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566
Please submit a full bug report.
@end example

Um das zu beheben, wechseln Sie ins @code{sql}-Verzeichnis und machen ein
``Kopieren und Einf�gen'' der letzten @code{gcc}-Zeile, �ndern aber
@code{-O3} zu @code{-O0} (oder f�gen @code{-O0} unmittelbar nach @code{gcc}
hinzu, falls Sie keine @code{-O}-Option auf Ihrer Kompilierzeile haben.)
Danach wechseln Sie einfach direkt zur�ck in oberste Verzeichnis und lassen
@code{make} noch einmal laufen.


@node SGI-Irix, Caldera, Alpha-DEC-OSF1, Other Unix Notes
@c German node SGI-Irix
@subsubsection Anmerkungen zu SGI Irix

Wenn Sie Irix-Version 6.5.3 oder neuer benutzen, kann @code{mysqld} nur
dann Threads erzeugen, wenn Sie ihn als Benutzer mit
@code{CAP_SCHED_MGT}-Zugriffsrechten (wie @code{root}) laufen lassen oder
dem @code{mysqld}-Server dieses Recht mit dem folgenden Befehl geben:

@example
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
@end example

Sie m�ssen eventuell in @file{config.h} einige Dinge umdefinieren, nachdem
Sie @code{configure} laufen gelassen haben und vor dem Kompilieren.

In einigen Irix-Implementationen ist die @code{alloca()}-Funktion
besch�digt. Wenn der @code{mysqld}-Server bei manchen
@code{SELECT}-Statements stirbt, entfernen Sie die Zeilen aus
@file{config.h}, die @code{HAVE_ALLOC} und @code{HAVE_ALLOCA_H} definieren.
Wenn @code{mysqladmin create} nicht funktioniert, entfernen Sie die Zeile
aus @file{config.h}, die @code{HAVE_READDIR_R} definiert. Eventuell m�ssen
Sie auch die @code{HAVE_TERM_H}-Zeile entfernen.

SGI empfiehlt, dass Sie alle Patches auf dieser Seite auf einmal
installieren:
http://Support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html

Als absolutes Minimum sollten Sie das letzte Kernel-Rollup installieren,
das letzte @code{rld}-Rollup und das letzte @code{libc}-Rollup.

In jedem Fall brauchen Sie f�r die pThread-Unterst�tzung alle POSIX-Patches
auf dieser Seite:

@uref{http://Support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html}

Wenn Sie beim Kompilieren von @file{mysql.cc} etwa folgenden Fehler
erhalten:

@example
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
@end example

Geben Sie folgendes im obersten Verzeichnis Ihres MySQL-Source-Trees ein:

@example
shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
shell> make
@end example

Es wurden ausserdem Scheduling-Probleme berichtet. Wenn nur ein Thread
l�uft, l�uft alles recht langsam. Das k�nnen Sie vermeiden, indem Sie einen
weiteren Client-Starten. Daraus kann sich eine zwei- bis zehnfache
Geschwindigkeitssteigerung f�r den anderen Thread ergeben. Das liegt an
einem Problem mit Irix-Threads, das kaum zu verstehen ist. Eventuell m�ssen
Sie improvisieren, um eine L�sung zu finden, bis dies behoben ist.

Wenn Sie mit @code{gcc} kompilieren, k�nnen Sie folgenden
@code{configure}-Befehl benutzen:

@example
CC=gcc CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql --enable-thread-safe-client --with-named-thread-libs=-lpThread
@end example

Auf Irix 6.5.11 mit nativen Irix-C- und C++-Kompilern der Version 7.3.1.2
soll auch folgendes funktionieren:

@example
CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \
-L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \
-I/usr/local/include -L/usr/local/lib' ./configure --prefix=/usr/local/mysql \
--with-berkeley-db --with-innodb \
--with-libwrap=/usr/local --with-named-curses-libs=/usr/local/lib/libncurses.a
@end example


@node Caldera, Caldera Unixware, SGI-Irix, Other Unix Notes
@c German node SCO
@subsubsection Anmerkungen zu Caldera
@c German fixup: 2002-03-22 monty changed SCO -> Caldera in English manual

Die aktuelle Portierung wird auf ``sco3.2v5.0.4''-
und-``sco3.2v5.0.5''-Systemen getestet. Die Portierung auf ``sco 3.2v4.2''
ist ebenfalls weit fortgeschritten.

Momentan ist der empfohlene Kompiler auf OpenServer gcc 2.95.2. Damit
sollten Sie in der Lage sein, MySQL einfach durch folgendes zu kompilieren:

@example
CC=gcc CXX=gcc ./configure ... (options)
@end example

@enumerate
@item
Bei OpenServer 5.0.X m�ssen Sie GDS in Skunkware 95 (95q4c) benutzen. Das
ist deshalb notwendig, weil GNU-@code{gcc} 2.7.2 in Skunkware 97 kein
GNU-@code{as} hat. Sie k�nnen auch @code{egcs} 1.1.2 oder neuer benutzen
@uref{http://www.egcs.com/}. Wenn Sie @code{egcs} 1.1.2 benutzen, m�ssen
Sie folgenden Befehl eingeben:

@example
shell> cp -p /usr/include/pThread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pThread/
@end example

@item
Sie brauchen die Portierung von GCC 2.5.x f�r dieses Produkt und das
Entwicklungssystem. Sie werden auf dieser Version von Caldera (SCO) Unix ben�tigt.
Sie k�nnen nicht lediglich das GCC-Dev-System benutzen.

@item
Sie sollten zuerst das FSU-PThreads-Paket holen und installieren. Dieses
finden Sie auf
@uref{http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-Threads.tar.gz}.
Sie finden ein vorkompiliertes Paket auf
@uref{http://www.mysql.com/downloads/SCO/FSU-Threads-3.5c.tar.gz}.

@item
FSU-PThreads kann mit SCO Unix 4.2 mit TCP/IP kompiliert werden. Oder mit
OpenServer 3.0 oder Open Desktop 3.0 (OS 3.0 ODT 3.0), mit installiertem
Caldera (SCO) Entwicklungssystem unter Benutzung einer guten Portierung von GCC 2.5.x
ODT oder OS 3.0. Hierbei brauchen Sie eine gute Portierung von GCC 2.5.x.
Ohne gute Portierung gibt es eine Menge Probleme. Die Portierung f�r dieses
Produkt erfordert das Caldera (SCO) Unix-Entwicklungssystem. Ohne dieses fehlen die
Bibliotheken und der Linker, die ben�tigt werden.

@item
Um FSU-PThreads auf Ihrem System zu bauen, tun Sie folgendes:

@enumerate a
@item
Lassen Sie @code{./configure} im @file{Threads/src}-Verzeichnis laufen und
w�hlen Sie die SCO-OpenServer-Option. Dieser Befehl kopiert
@file{Makefile.SCO5} nach @file{Makefile}.

@item
Lassen Sie @code{make} laufen.

@item
Um in das vorgabem��ige @file{/usr/include}-Verzeichnis zu installieren,
loggen Sie sich als Root ein und wechseln (@code{cd}) Sie in das
@file{thread/src}-Verzeichnis. F�hren Sie dann @code{make install} aus.
@end enumerate

@item
Denken Sie daran, GNU @code{make} zu benutzen, wenn Sie MySQL machen.

@item
Wenn Sie @code{safe_mysqld} nicht als Root starten, erhalten Sie
wahrscheinlich nur die 110 offenen Dateien pro Prozess. @code{mysqld} macht
dar�ber in der Log-Datei einen Eintrag.

@item
Bei SCO 3.2V5.0.5 sollten Sie FSU-PThreads-Version 3.5c oder neuer
benutzen. Ausserdem sollten Sie gcc 2.95.2 oder neuer benutzen!

Folgender @code{configure}-Befehl sollte funktionieren:

@example
shell> ./configure --prefix=/usr/local/mysql --disable-shared
@end example

@item
Bei SCO 3.2V4.2 sollten Sie FSU-PThreads-Version 3.5c oder neuer benutzen.
Folgender @code{configure}-Befehl sollte funktionieren:

@example
shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
       ./configure \
           --prefix=/usr/local/mysql \
           --with-named-thread-libs="-lgThreads -lsocket -lgen -lgThreads" \
           --with-named-curses-libs="-lcurses"
@end example

M�glicherweise bekommen Sie Probleme mit einigen Include-Dateien. In diesem
Fall finden Sie neue, SCO-spezifische Include-Dateien auf
@uref{http://www.mysql.com/downloads/SCO/SCO-3.2v4.2-includes.tar.gz}.
Entpacken Sie diese Datei ins @file{include}-Verzeichnis Ihres
MySQL-Source-Trees.
@end enumerate

Anmerkungen zur Caldera (SCO) Entwicklung:

@itemize @bullet
@item
MySQL kann FSU-PThreads automatisch erkennen und @code{mysqld} mit
@code{-lgThreads -lsocket -lgThreads} linken.

@item
@c Question: Good translation for "re-entrant"?
Die Caldera (SCO) Entwicklungsbibliotheken sind re-entrant in FSU-PThreads. Caldera
behauptet, dass seine Bibliotheken-Funktionen re-entrant sind, daher m�ssen
sie mit FSU-PThreads re-entrant sein. FSU-PThreads auf OpenServer versucht,
das SCO-Scheme zu benutzen, um Bibliotheken re-entrant zu machen.

@item
FSU-PThreads (zumindest die Version auf @uref{http://www.mysql.com/}) wird
mit gelinktem GNU-@code{malloc} ausgeliefert. Wenn Sie Problemen mit der
Speicherbenutzung begegnen, stellen Sie sicher, dass @file{gmalloc.o} in
@file{libgThreads.a} und @file{libgThreads.so} beinhaltet ist.

@item
In FSU-PThreads achten folgende Systemaufrufe auf pThreads: @code{read()},
@code{write()}, @code{getmsg()}, @code{connect()}, @code{accept()},
@code{select()} und @code{wait()}.
@end itemize

Wenn Sie DBI auf Caldera (SCO) installieren wollen, m�ssen Sie @file{Makefile} in
DBI-xxx und jedem Unterverzeichnis editieren.

Beachten Sie, dass folgendes gcc 2.95.2 oder neuer voraussetzt:

@example
ALT:                                  NEU:
CC = cc                               CC = gcc
CCCDLFLAGS = -KPIC -W1,-Bexport       CCCDLFLAGS = -fpic
CCDLFLAGS = -wl,-Bexport              CCDLFLAGS =

LD = ld                               LD = gcc -G -fpic
LDDLFLAGS = -G -L/usr/local/lib       LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib      LDFLAGS = -L/usr/local/lib

LD = ld                               LD = gcc -G -fpic
OPTIMISE = -Od                        OPTIMISE = -O1

OLD:
CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include

NEW:
CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
@end example

Das liegt daran, dass der Perl-dynaloader keine @code{DBI}-Module l�dt, die
mit @code{icc} oder @code{cc} kompiliert wurden.

Perl funktioniert am besten, wenn es mit @code{cc} kompiliert wird.


@node Caldera Unixware,  , Caldera, Other Unix Notes
@c German node SCO Unixware
@subsubsection Anmerkungen zu Caldera Unixware Version 7.0
@c German fixup: 2002-03-22 monty changed SCO -> Caldera in English manual

Sie ben�tigen mindestens MySQL-Version 3.22.13, weil diese Version einige
Portabilit�tsprobleme unter Unixware behebt.

Wir waren in der Lage, MySQL mit folgendem @code{configure}-Befehl auf
Unixware Version 7.0.1 zu kompilieren:

@example
CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
@end example

Wenn Sie @code{gcc} benutzen wollen, m�ssen Sie @code{gcc} 2.95.2 oder
neuer benutzen.




@node OS/2, BeOS, Other Unix Notes, Operating System Specific Notes
@c German node OS/2
@subsection Anmerkungen zu OS/2

MySQL benutzt eine ganze Menge offener Dateien. Deswegen sollten Sie Ihrer
@file{CONFIG.SYS}-Datei folgendes hinzuf�gen:

@example
SET EMXOPT=-c -n -h1024
@end example

Wenn Sie das nicht tun, erhalten Sie wahrscheinlich folgenden Fehler:

@example
File 'xxxx' not found (Errcode: 24)
@end example

Wenn Sie MySQL auf OS/2 Warp 3 einsetzen, wird FixPack 29 oder h�her
ben�tigt. Bei OS/2 Warp 4 wird FixPack 4 oder h�her ben�tigt. Das erfordert
die PThreads-Bibliothek. MySQL muss auf einer Partition installiert werden,
die lange Dateinamen unterst�tzt, also zum Beispiel HPFS, FAT32 usw.

Das @file{INSTALL.CMD}-Skript muss von OS/2's eigener @file{CMD.EXE} aus
laufen gelassen werden und funktioniert eventuell nicht mit Ersatz-Shells
wie @file{4OS2.EXE}.

Das @file{scripts/mysql-install-db}-Skript wurde umbenannt. Es hei�t jetzt
@file{install.cmd} und ist ein REXX-Skript, welches die vorgabem��igen
MySQL-Sicherheitseinstellungen einstellt und die WorkPlace-Shell-Icons f�r
MySQL erstellt.

Unterst�tzung f�r dynamische Module wird einkompiliert, ist aber noch nicht
komplett durchgetestet. Dynamische Module sollten unter Benutzung der
PThreads-Runtime-Bibliothek kompiliert werden.

@example
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
    -o example udf_example.cc -L../lib -lmysqlclient udf_example.def
mv example.dll example.udf
@end example

@strong{Beachten Sie:} Aufgrund von Beschr�nkungen in OS/2 d�rfen
UDF-module-name-stems nicht l�nger als 8 Zeichen sein. Module werden im
@file{/mysql2/udf}-Verzeichnis gespeichert; das
@code{safe-mysqld.cmd}-Skript tr�gt dieses Verzeichnis in die
@code{BEGINLIBPATH}-Umgebungsvariable ein. Wenn Sie UDF-Module benutzen,
werden festgelegte Erweiterungen ignoriert - es wird nicht angenommen, dass
sie @file{.udf} sind.
Unter Unix zum Beispiel k�nnte das gemeinsam genutzte (shared) Module
@file{example.so} benannt sein. Sie w�rden daraus eine Funktion wie folgt
laden:

@example
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
@end example

Unter OS/2 w�rde das Modul @file{example.udf} hei�en, aber Sie w�rden
nicht die Modul-Erweiterung angeben:

@example
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
@end example


@node BeOS, Novell Netware, OS/2, Operating System Specific Notes
@c German node BeOS
@subsection Anmerkungen zu BeOS

Wir sind sehr daran interessiert, MySQL auf BeOS ans Laufen zu bringen,
aber leider kennen wir niemanden, der sich mit BeOS auskennt oder Zeit hat,
eine Portierung durchzuf�hren.

Wir sind daran interessiert, jemanden f�r eine Portierung zu finden, und
wir werden ihn / sie bei allen technischen Fragen helfen, die bei einer
Portierung auftreten k�nnen.

Wir haben vor einiger Zeit mit einigen BeOS-Entwicklern gesprochen, die uns
sagten, dass MySQL zu 80% auf BeOS portiert ist, aber wir haben schon eine
Weile nichts von ihnen geh�rt.


@node Novell Netware,  , BeOS, Operating System Specific Notes
@c German node Novell Netware
@subsection Anmerkungen zu Novell Netware

Wir sind sehr daran interessiert, MySQL auf Netware ans Laufen zu bringen,
aber leider kennen wir niemanden, der sich mit Netware auskennt oder Zeit hat,
eine Portierung durchzuf�hren.

Wir sind daran interessiert, jemanden f�r eine Portierung zu finden, und
wir werden ihn / sie bei allen technischen Fragen helfen, die bei einer
Portierung auftreten k�nnen.

@node Perl support,  , Operating System Specific Notes, Installing
@c German node Perl-Unterst�tzung
@section Anmerkungen zur Perl-Installation

@cindex Perl, Installation
@cindex Installation, Perl

@code{DBI}/@code{DBD}-Schnittstelle


@menu
* Perl installation::           
* ActiveState Perl::            
* Windows Perl::                
* Perl support problems::       
@end menu

@node Perl installation, ActiveState Perl, Perl support, Perl support
@c German node Perl-Installation
@subsection Installation von Perl unter Unix

Perl-Unterst�tzung f�r MySQL wird durch die @code{DBI}/@code{DBD}-
Client-Schnittstelle zur Verf�gung gestellt. @xref{Perl}. Der Perl-
@code{DBD}/@code{DBI}-Client-Code erfordert Perl Version 5.004 oder
sp�ter. Die Schnittstelle @strong{funktioniert nicht}, wenn Sie eine
�ltere Version von Perl haben.

MySQL-Perl-Unterst�tzung erfordert ausserdem, dass Sie MySQL-Client-
Programmierunterst�tzung installiert haben. Wenn Sie MySQL von RPM-
Dateien installiert haben, sind Client-Programme im Client-RPM
enthalten, aber Client-Programmierunterst�tzung ist im Entwickler-RPM.
Stellen Sie sicher, dass Sie auch das letztgenannte RPM installiert
haben.

Ab Version 3.22.8 wird Perl-Unterst�tzung getrennt von der Haupt-MySQL-
Unterst�tzung ausgeliefert. Wenn Sie Perl-Unterst�tzung installieren
wollen, k�nnen Sie die ben�tigten Dateien von
@uref{http://www.mysql.com/Downloads/Contrib/} herunter laden.

Die Perl-Distributionen werden als komprimierte @code{tar}-Archive zur
Verf�gung gestellt und haben Namen wie @file{MODULE-VERSION.tar.gz},
wobei @code{MODULE} der Modulname und @code{VERSION} die Versionsnummer
ist. Sie sollten die @code{Data-Dumper}-, @code{DBI}- und @code{Msql-
Mysql-modules}-Distributionen laden und sie in dieser Reihenfolge
installieren. Die Installationsprozedur ist unten dargestellt. Das
Beispiel gilt f�r das @code{Data-Dumper}-Modul, ist aber f�r alle drei
Distributionen dieselbe:

@enumerate
@item
Entpacken Sie die Distribution ins aktuelle Verzeichnis.
@example
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -
@end example
Dieser Befehl erzeugt ein Verzeichnis namens @file{Data-Dumper-
VERSION}.

@item
Wechseln Sie ins oberste Verzeichnis der entpackten Distribution:
@example
shell> cd Data-Dumper-VERSION
@end example

@item
Bauen Sie die Distribution und kompilieren Sie alles:
@example
shell> perl Makefile.PL
shell> make
shell> make test
shell> make install
@end example
@end enumerate

Der @code{make test}-Befehl ist wichtig, weil er sicherstellt, dass die
Module funktionieren. Beachten Sie, dass der MySQL-Server w�hrend der
Befehlsausf�hrung bei der @code{Msql-Mysql-modules}-Installation laufen
muss, um den Schnittstellen-Code auszuf�hren, den ansonsten schl�gt der
Test fehl.

Es ist eine gute Idee, die @code{Msql-Mysql-modules}-Distribution neu zu
kompilieren und zu installieren, wenn Sie ein neues Release von MySQL
installieren, insbesondere, wenn Sie Symptome feststellen wie dass alle
Ihre @code{DBI}-Skripte einen Coredump liefern, nachdem Sie auf eine
h�here Version von MySQL aktualisiert haben.

Wenn Sie keine Rechte haben, die Perl-Module im Systemverzeichnis zu
installieren, oder wenn Sie lokale Perl-Module installieren wollen,
k�nnte Ihnen der folgende Link helfen:

@example
@uref{http://www.iserver.com/support/contrib/perl5/modules.html}
@end example

Suchen Sie nach der �berschrift
@code{Installing New Modules that Require Locally Installed Modules}.


@node ActiveState Perl, Windows Perl, Perl installation, Perl support
@c German node ActiveState-Perl
@subsection Installation von ActiveState-Perl unter Windows

@cindex Installation, Perl unter Windows
@cindex Perl, Installation unter Windows
@cindex ActiveState-Perl

Um das MySQL-@code{DBD}-Modul mit ActiveState-Perl unter Windows zu
installieren, gehen Sie wie folgt vor:

@itemize @bullet
@item 
Laden Sie ActiveState-Perl von 
@uref{http://www.activestate.com/Products/ActivePerl/}
und installieren Sie es.

@item
�ffnen Sie eine MS-DOS-Eingabeaufforderung.

@item 
Setzen Sie - falls erforderlich - die HTTP_proxy-Variable, zum Beispiel
wie folgt:

@example
set HTTP_proxy=my.proxy.com:3128
@end example

@item
Starten Sie das PPM-Programm: 

@example
C:\> c:\perl\bin\ppm.pl
@end example

@item
Falls noch nicht geschehen, installieren Sie @code{DBI}:

@example
ppm> install DBI
@end example

@item
Wenn das erfolgreich verlief, f�hren Sie folgenden Befehl aus:

@example
install
ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
@end example
@end itemize

Das sollte zumindest bei ActiveState-Perl Version 5.6 funktionieren.

Wenn Sie es nicht schaffen, dass oben Genanntes funktioniert, sollten
Sie statt dessen den @strong{MyODBC}-Treiber installieren und sich mit
dem MySQL-Server �ber ODBC verbinden:

@example
use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") ||
  die "Fehler $DBI::errstr beim Verbinden mit $dsn\n";
@end example


@node Windows Perl, Perl support problems, ActiveState Perl, Perl support
@c German node Windows-Perl
@subsection Installation der MySQL-Perl-Distribution unter Windows

Die MySQL-Perl-Distribution enth�lt @code{DBI},
@code{DBD:MySQL} und @code{DBD:ODBC}.

@itemize @bullet
@item 
Laden Sie die Perl-Distribution f�r Windows von
@uref{http://www.mysql.com/download.html}.

@item
Entpacken Sie die Distribution in @code{C:}, so dass Sie ein
@file{C:\PERL}-Verzeichnis erhalten.

@item
F�gen Sie Ihrem Pfad @file{C:\PERL\BIN} hinzu.

@item
F�gen Sie Ihrem Pfad das Verzeichnis @file{C:\PERL\BIN\MSWIN32-x86-
thread} oder @file{C:\PERL\BIN\MSWIN32-x86} hinzu.

@item
Testen Sie, ob @code{perl} funktioniert, indem Sie @code{perl -v} in
einer MS-DOS-Eingabeaufforderung ausf�hren.
@end itemize


@node Perl support problems,  , Windows Perl, Perl support
@c German node Perl-Unterst�tzung Probleme
@subsection Probleme bei der Benutzung von Perl @code{DBI}/@code{DBD}-Schnittstelle

@cindex Probleme, Installation von Perl
@cindex Perl DBI/DBD, Installationsprobleme

Wenn Perl ausgibt, dass es das @file{../mysql/mysql.so}-Modul nicht
finden kann, liegt das Problem wahrscheinlich darin, dass Perl die
gemeinsam genutzte @file{libmysqlclient.so} nicht findet.

Das k�nnen Sie mit einer der folgenden Methoden beheben:

@itemize @bullet
@item
Kompilieren Sie die @code{Msql-Mysql-modules}-Distribution mit
@code{perl Makefile.PL -static -config} statt mit @code{perl
Makefile.PL}.

@item
Kopieren Sie @code{libmysqlclient.so} in das Verzeichnis, in dem Ihre
anderen gemeinsam genutzten Bibliotheken liegen (wahrscheinlich
@file{/usr/lib} oder @file{/lib}).

@item
Unter Linux k�nnen Sie der @file{/etc/ld.so.conf}-Datei den Pfadnamen
des Verzeichnisses hinzuf�gen, in dem @file{libmysqlclient.so} liegt.

@tindex LD_RUN_PATH-Umgebungsvariable
@tindex Umgebungsvariable, LD_RUN_PATH
@item
F�gen Sie der @code{LD_RUN_PATH}-Umgebungsvariablen den Pfadnamen des
Verzeichnisses hinzu, in dem @file{libmysqlclient.so} liegt.
@end itemize

Wenn Sie folgende Fehler von @code{DBD-mysql} erhalten, benutzen Sie
wahrscheinlich @code{gcc} (oder eine alte Bin�rdatei, die mit @code{gcc}
kompiliert wurde):

@example
/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'
@end example

F�gen Sie @code{-L/usr/lib/gcc-lib/... -lgcc} zum Link-Befehl hinzu,
wenn die @file{mysql.so}-Bibliothek gebaut wird (�berpr�fen Sie die
Ausgabe von @code{make} nach @file{mysql.so}, wenn Sie den Perl-Client
kompilieren). Die @code{-L}-Option sollte den Pfadnamen des
Verzeichnisses angeben, in dem @file{libgcc.a} auf Ihrem System liegt.

Ein weiterer Grund f�r dieses Problem kann sein, dass Perl und MySQL
nicht beide mit @code{gcc} kompiliert wurden. In diesem Fall k�nnen Sie
die fehlende �bereinstimmung (Mismatch) durch Kompilieren von beiden mit
@code{gcc} aufheben.

Wenn Sie folgende Fehler von @code{Msql-Mysql-modules} erhalten, wenn
Sie die Tests laufen lassen:

@example
t/00base............install_driver(mysql) failed: Can't load
'../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at
/usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
@end example

Bedeutet das, dass Sie die Kompressionsbibliothek (-lz) in die Link-
Zeile einschlie�en m�ssen. Das kann man durch folgende �nderung in der
Datei @file{lib/DBD/mysql/Install.pm} tun:

@example
$sysliblist .= " -lm";

�ndern in

$sysliblist .= " -lm -lz";
@end example

Danach @strong{m�ssen} Sie 'make realclean' laufen lassen und danach mit
der Installation von Anfang an beginnen.

Wenn Sie das Perl-Modul auf einem System laufen lassen wollen, das
dynamisches Linken nicht unterst�tzt (wie Caldera/SCO), k�nnen Sie eine
statische Version von Perl erzeugen, die @code{DBI} und @code{DBD-mysql}
enth�lt. Das bringt man zum Laufen, indem man eine Version von Perl
erzeugt, in der der @code{DBI}-Code eingelinkt ist, und diese �ber das
aktuelle Perls installiert. Dann benutzen Sie diese, um eine Version von
Perl zu bauen, die zus�tzlich den @code{DBD}-Code eingelinkt hat, und
installieren diese.

Unter Caldera (SCO) m�ssen folgende Umgebungsvariablen gesetzt sein:

@example
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
or
shell>
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell>
LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell>
MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:
@end example

Erzeugen Sie zuerst ein Perl, das ein statisch gelinktes @code{DBI}
enth�lt, indem Sie diese Befehle im Verzeichnis ausf�hren, in dem Ihre
@code{DBI}-Distribution liegt:

@example
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
@end example

Dann m�ssen Sie das neue Perl installieren. Die Ausgabe von @code{make
perl} zeigt den genauen @code{make}-Befehl an, den Sie f�r die
Installation ausf�hren m�ssen. Unter Caldera (SCO) ist das @code{make -f
Makefile.aperl inst_perl MAP_TARGET=perl}.

Benutzen Sie als n�chstes dieses soeben erzeugte Perl, um ein weiteres
Perl zu erzeugen, dass auch ein statisch gelinktes @code{DBD::mysql}
enth�lt, indem Sie diese Befehle im Verzeichnis ausf�hren, in dem Ihre
@code{Msql-Mysql-modules}-Distribution liegt:

@example
shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl
@end example

Zum Schluss m�ssen Sie dieses neue Perl installieren. Hierbei zeigt die
Ausgabe von @code{make perl} wiederum, welcher Befehl benutzt werden
muss.

@node Tutorial, MySQL Database Administration, Installing, Top
@c German node Tutorial
@chapter Einf�hrung in MySQL: Ein MySQL-Tutorial

@cindex Tutorial
@c Question: Uh - what's a defined terminal monitor?
@cindex terminal monitor, defined
@c Question: Uh - what's that for the index?
@cindex monitor, terminal
@cindex Optionen, von MySQL


Dieses Kapitel enth�lt eine Einf�hrung in MySQL in Form eines Tutorials.
Datei wird gezeigt, wie Sie das @code{mysql}-Client-Programm benutzen, um
eine einfache Datenbank zu erzeugen und zu benutzen. @code{mysql} (auch
``Terminal-Monitor'' oder einfach ``Monitor'' genannt) ist ein interaktives
Programm, mit dem Sie sich mit einem MySQL-Server verbinden, Anfragen
(Queries) absetzen und die Ergebnisse ansehen k�nnen. @code{mysql} kann
auch im Stapelbetrieb (Batch Mode) benutzt werden: Sie schreiben Ihre
Anfragen zuerst in eine Datei und veranlassen dann @code{mysql}, die
Inhalte dieser Datei auszuf�hren. Hier werden beide M�glichkeiten
beschrieben, @code{mysql} zu benutzen.

Sie k�nnen @code{mysql} mit der @code{--help}-Option aufrufen, um eine
Liste der Optionen zu sehen:

@example
shell> mysql --help
@end example

Dieses Kapitel setzt voraus, dass @code{mysql} auf Ihrer Maschine
installiert ist und dass ein MySQL-Server verf�gbar ist, mit dem Sie sich
verbinden k�nnen. Wenn das nicht der Fall sein sollte, setzen Sie sich mit
Ihrem MySQL-Administrator in Verbindung. (Wenn @emph{Sie} der Administrator
sind, m�ssen Sie in anderen Abschnitten des Handbuchs nachsehen.)

Dieses Kapitel beschreibt den gesamten Prozess der Einrichtung und
Benutzung einer Datenbank. Wenn Sie lediglich wissen wollen, wie man auf
eine bereits existierende Datenbank zugreift, k�nnen Sie die Abschnitte
�berspringen, die beschreiben, wie man eine Datenbank und die Tabellen, die
sie enth�lt, erzeugt.

Weil dieses Kapitel ein Tutorial ist, wurden notwendigerweise viele Details
ausgelassen. Sehen Sie in den relevanten Abschnitten dieses Handbuchs nach,
wenn Sie weitere Informationen zu den Themen suchen, die hier besprochen
werden.


@menu
* Connecting-disconnecting::    
* Entering queries::            
* Database use::                
* Getting information::         
* Examples::                    
* Batch mode::                  
* Twin::                        
* Apache::                      
@end menu

@node Connecting-disconnecting, Entering queries, Tutorial, Tutorial
@c German node Verbinden und Trennen
@section Verbindung zum Server herstellen und trennen

@cindex Verbinden, mit dem Server
@cindex Verbindung trennen, mit dem Server
@cindex Server, verbinden
@cindex Server, Verbindung trennen

Um sich zum Server zu verbinden, m�ssen Sie beim Aufruf von @code{mysql} in
der Regel einen MySQL-Benutzernamen und �blicherweise auch ein Passwort
angeben. Wenn der Server auf einer anderen Maschine als der l�uft, von der
Sie sich einloggen, m�ssen Sie auch einen Hostnamen angeben. Setzen Sie
sich mit Ihrem Administrator in Verbindung, um herauszubekommen, welche
Verbindungsparameter Sie benutzen sollten (das hei�t welchen Host,
welchen Benutzername und welches Passwort Sie verwenden sollen). Wenn Sie
die richtigen Parameter kennen, sollten Sie sich wie folgt verbinden
k�nnen:

@example
shell> mysql -h host -u user -p
Enter password: ********
@end example

@code{********} steht f�r Ihr Passwort. Geben Sie es ein, wenn @code{mysql}
@code{Enter password:} anzeigt.

Wenn das funktioniert hat, sehen Sie ein paar einf�hrende Informationen,
gefolgt von der @code{mysql>}-Eingabeaufforderung:


@example
shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end mit ; or \g.
Your MySQL connection id ist 459 to server version: 3.22.20a-log

Type 'help' for help.

mysql>
@end example

Die Eingabeaufforderung sagt Ihnen, dass @code{mysql} bereit f�r die
Eingabe von Befehlen ist.

Einige
Einige MySQL-Installationen erlauben Benutzern, sich als anonyme
(unbenannte) Benutzer mit dem Server auf dem lokalen Host zu verbinden.
Wenn das auf Ihrer Maschine der Fall ist, k�nnen Sie sich mit diesem Server
verbinden, indem Sie @code{mysql} ohne irgend welche Optionen aufrufen:

@example
shell> mysql
@end example

Nachdem Sie sich erfolgreich verbunden haben, k�nnen Sie die Verbindung
jederzeit trennen, indem Sie @code{QUIT} an der
@code{mysql>}-Eingabeaufforderung eingeben.

@example
mysql> QUIT
Bye
@end example

Sie k�nnen die Verbindung auch trennen, indem Sie STRG+D eingeben.

Die meisten Beispiele der folgenden Abschnitte setzen voraus, dass Sie mit
dem Server verbunden sind. Das wird durch @code{mysql>} angezeigt.


@node Entering queries, Database use, Connecting-disconnecting, Tutorial
@c German node Anfragen eingeben
@section Anfragen eingeben

@cindex Absetzen, Anfragen
@cindex Anfragen, absetzen
@cindex Eingeben, Anfragen

Stellen Sie sicher, dass Sie mit dem Server verbunden sind, wie im
vorherigen Abschnitt er�rtert. Dadurch wird noch keine Datenbank
ausgew�hlt, mit der Sie arbeiten k�nnen, aber das ist in Ordnung. Hier ist
es erst einmal wichtiger, herauszufinden, wie Sie Anfragen (Queries)
absetzen, als direkt mit dem Erzeugen von Tabellen, dem Einladen von Daten
in diese und der Abfrage von Daten aus diesen zu beginnen. Dieser Abschnitt
beschreibt die grundlegenden Prinzipien der Befehlseingabe, indem etliche
Anfragen gezeigt werden, die Sie ausprobieren k�nnen, um sich mit der
Arbeitsweise von @code{mysql} vertraut zu machen.

Hier ist ein einfacher Befehl, der den Server bittet, Ihnen seine
Versionsnummer und das aktuelle Datum mitzuteilen. Geben Sie folgendes an
der @code{mysql>}-Eingabeaufforderung ein und dr�cken Sie die Eingabetaste:

@example
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
@end example

Diese Anfrage erl�utert verschiedene Dinge �ber @code{mysql}:

@itemize @bullet
@item
Ein Befehl besteht normalerweise aus einem SQL-Statement, gefolgt von einem
Semikolon. (Es gibt ein paar Ausnahmen, bei denen das Semikolon nicht
ben�tigt wird. @code{QUIT}, das vorher erw�hnt wurde, stellt eine solche
Ausnahme dar. Wir kommen sp�ter noch zu anderen Ausnahmen.)

@item
Wenn Sie einen Befehl absetzen, sendet @code{mysql} ihn zum Server, der ihn
ausf�hrt, und zeigt die Ergebnisse an. Danach wird eine neue
@code{mysql>}-Eingabeaufforderung angezeigt, um klar zu machen, dass es f�r
einen weiteren Befehl bereit ist.

@item
@code{mysql} zeigt die Ausgabe der Anfrage in Tabellenform an (Zeilen und
Spalten). Die erste Zeile enth�lt Spalten�berschriften. Die folgenden
Zeilen sind die Ergebnisse der Anfrage. Normalerweise sind die
Spalten�berschriften die Spaltennamen der Tabellen, die Sie abfragen. Wenn
Sie statt der Spaltennamen den Wert eines Ausdrucks abfragen (wie im
gezeigten Beispiel), beschriftet @code{mysql} die Spalten�berschrift mit
dem Ausdruck selbst.

@item
@code{mysql} zeigt, wie viele Zeilen zur�ck gegeben wurden und wie lang die
Ausf�hrung der Anfrage dauerte, was ihnen eine grobe Einsch�tzung der
Server-Performance erm�glicht. Diese Werte sind ungenau, weil sie die
Wanduhrzeit repr�sentieren (und nicht die Prozessor- oder Maschinenzeit),
und weil sie von Faktoren wie der Serverlast und der Netzwerk-Wartezeit
beeinflusst werden. (Um uns kurz zu fassen, zeigen wir die ``rows in
set''-Zeile in den weiteren Beispielen dieses Kapitels nicht mehr an.)
@end itemize

Schl�sselw�rter k�nnen in beliebiger Schreibweise (Gro� und klein)
eingegeben werden. Folgende Anfragen sind gleichwertig:

@example
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
@end example

Hier kommt eine weitere Anfrage. Sie zeigt, wie Sie @code{mysql} als
einfachen Rechner benutzen k�nnen:

@example
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+
@end example

Die bislang gezeigten Befehle sind relativ kurze, einzeilige Statements.
Sie k�nnen allerdings auch mehrfache Statements auf einer einzelnen Zeile
eingeben. Beenden Sie einfach jedes davon mit einem Semikolon:

@example
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+

+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
@end example

Ein Befehl muss nicht auf einer einzelnen Zeile eingegeben werden, so dass
l�ngere Befehle, die mehrere Zeilen erfordern, kein Problem darstellen.
@code{mysql} stellt anhand des beendenden Semikolons fest, wo Ihr Statement
endet, und nicht etwa anhand des Zeilenendes. (Mit anderen Worten
akzeptiert @code{mysql} Freiformat-Eingaben: Es sammelt Eingabezeilen,
f�hrt sie aber solange nicht aus, bis es das Semikolon sieht.)

Hier ist ein einfaches Statement, auf mehrere Zeilen verteilt:

@example
mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@@localhost | 1999-03-18   |
+--------------------+--------------+
@end example

Sehen Sie, wie sich die Eingabeaufforderung von @code{mysql>} zu @code{->}
�ndert, nachdem Sie die erste Zeile der Mehrzeilen-Anfrage eingegeben
haben. Auf diese Weise zeigt @code{mysql} an, dass es noch nicht das
komplette Statement gesehen hat und auf den Rest wartet. Die
Eingabeaufforderung ist Ihr Freund, denn sie stellt wertvolle R�ckmeldungen
zur Verf�gung. Wenn Sie diese R�ckmeldungen nutzen, werden Sie immer dessen
gewahr sein, worauf @code{mysql} wartet.

Wenn Sie den Befehl, den Sie gerade eingeben, nicht ausf�hren wollen,
k�nnen Sie ihn mit @code{\c} abbrechen:

@example
mysql> SELECT
    -> USER()
    -> \c
mysql>
@end example

Beachten Sie auch hierbei die Eingabeaufforderung. Sie �ndert sich zur�ck
zu @code{mysql>}, nachdem Sie @code{\c} eingegeben haben, und diese
R�ckmeldung bedeutet, dass @code{mysql} f�r einen weiteren Befehl bereit
ist.

Folgende Tabelle zeigt alle Eingabeaufforderungen, denen Sie begegnen
k�nnen, und fasst zusammen, was sie �ber den Zustand von @code{mysql}
aussagen:

@cindex Eingabeaufforderungen, Bedeutungen
@multitable @columnfractions .10 .9
@item @strong{Eingabeaufforderung} @tab @strong{Bedeutung}
@item @code{mysql>}                @tab Bereit f�r den n�chsten Befehl.
@item @code{@ @ @ @ ->}            @tab Wartet auf die n�chste Zeile eines
mehrzeiligen Befehls.
@item @code{@ @ @ @ '>}            @tab Wartet auf die n�chste Zeile und
fasst eine Zeichenkette zusammen, die mit einem Apostroph (@samp{'})
beginnt.
@item @code{@ @ @ @ ">}            @tab Wartet auf die n�chste Zeile und
fasst eine Zeichenkette zusammen, die mit Anf�hrungszeichen (@samp{"})
beginnt.
@end multitable

Mehrzeilige Statements passieren h�ufig aus Versehen, wenn Sie vorhaben,
einen Befehl auf einer einzelnen Zeile abzusetzen, aber das beendende
Semikolon vergessen. In diesem Fall wartet @code{mysql} auf weitere
Eingaben:

@example
mysql> SELECT USER()
    ->
@end example

Wenn so etwas passiert (Sie dachten, Sie h�tten ein Statement eingegeben,
aber die einzige Antwort ist die @code{->}-Eingabeaufforderung), wartet
@code{mysql} h�chstwahrscheinlich auf das Semikolon. Wenn Sie nicht darauf
achten, was Ihnen die Eingabeaufforderung mitteilen will, k�nnten Sie eine
ganze Weile herum sitzen, bevor Sie feststellen, was Sie tun m�ssen. Geben
Sie ein Semikolon ein, um das Statement zu vollenden, und @code{mysql} wird
es ausf�hren:

@example
mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@@localhost |
+--------------------+
@end example

Die @code{'>}- und @code{">}-Eingabeaufforderungen kommen bei der Sammlung
von Zeichenketten vor. In MySQL k�nnen Sie Zeichenketten wahlweise in
@samp{'}- oder @samp{"}-Zeichen eingeschlossen eingeben (zum Beispiel
@code{'hallo'} oder @code{"tsch��"}), und @code{mysql} l��t Sie auch
Zeichenketten eingeben, die sich �ber mehrere Zeilen erstrecken. Wenn Sie
eine @code{'>}- oder @code{">}-Eingabeaufforderung sehen, hei�t das, dass
Sie eine Zeile eingegeben haben, die eine Zeichenkette enth�lt, die mit
@samp{'} oder @samp{"} beginnt, dass Sie aber noch nicht das entsprechende
beendende Zeichen (ebenfalls @samp{'} oder @samp{"}) eingegeben haben. Das
ist in Ordnung, wenn Sie tats�chlich eine mehrzeilige Zeichenkette
eingeben, aber wie wahrscheinlich ist das? Nicht sehr wahrscheinlich.
Wahrscheinlicher ist, dass die @code{'>}- und
@code{">}-Eingabeaufforderungen anzeigen, dass Sie versehentlich ein
@samp{'}- oder @samp{"}-Zeichen ausgelassen haben. Beispiel:

@example
mysql> SELECT * FROM meine_tabelle WHERE name = "Schmidt AND age < 30;
    ">
@end example

Wenn Sie dieses @code{SELECT}-Statement eingeben, dann EINGABE dr�cken und
auf das Ergebnis warten, wird nichts passieren. Statt sich zu fragen, warum
diese Anfrage so lange dauert, beachten Sie des R�tsels L�sung, die die
@code{">}-Eingabeaufforderung anzeigt. Sie sagt Ihnen, dass @code{mysql}
auf den Rest einer nicht beendeten Zeichenkette wartet. (Sehen Sie den
Fehler im Statement? Der Zeichenkette @code{"Schmidt} fehlt das zweite
Anf�hrungszeichen.)

Was machen Sie in diesem Fall? Das einfachste ist, den Befehl abzubrechen.
Sie k�nnen jetzt allerdings nicht einfach @code{\c} eingeben, weil
@code{mysql} es als Teil der Zeichenkette interpretieren w�rde, die es
gerade sammelt! Geben Sie daher zuerst das schlie�ende Anf�hrungszeichen
ein, damit @code{mysql} wei�, dass die Zeichenkette zuende ist, und erst
danach @code{\c}:

@example
mysql> SELECT * FROM meine_tabelle WHERE name = "Schmidt AND age < 30;
    "> "\c
mysql>
@end example

Die Eingabeaufforderung �ndert sich wieder zu @code{mysql>} und zeigt damit
an, dass @code{mysql} f�r einen weiteren Befehl bereit ist.

Es ist wichtig, die Bedeutung der @code{'>}- und
@code{">}-Eingabeaufforderungen zu kennen, denn wenn Sie versehentlich
eine nicht beendete Zeichenkette eingeben, werden alle folgenden Zeilen,
die Sie eingeben, von @code{mysql} ignoriert - inklusive einer Zeile, die
@code{QUIT} enth�lt! Das kann recht verwirrend sein, besonders dann, wenn
Sie nicht wissen, dass Sie das schlie�ende Anf�hrungszeichen eingeben
m�ssen, bevor Sie den aktuellen Befehl abbrechen k�nnen.


@node Database use, Getting information, Entering queries, Tutorial
@c German node Datenbankbenutzung
@section Eine Datenbank erzeugen und benutzen

@cindex Datenbanken, erzeugen
@cindex Datenbanken, benutzen
@cindex Erzeugen, Datenbanken


Jetzt, wo Sie wissen, wie Sie Befehle eingeben, ist es Zeit, auf eine
Datenbank zuzugreifen.

Nehmen wir an, Sie haben zuhause mehrere Haustiere (Ihre Menagerie) und Sie
wollen unterschiedliche Arten von Information �ber sie im �berblick
behalten. Das k�nnen Sie tun, indem Sie Tabellen erzeugen, die Ihre Daten
beinhalten, und die Sie mit den gew�nschten Informationen f�llen. Dann
k�nnen Sie verschiedene Arten von Fragen �ber Ihre Haustiere beantworten,
indem Sie Daten aus den Tabellen abrufen. Dieser Abschnitt zeigt Ihnen:

@itemize @bullet
@item
Wie Sie eine Datenbank erzeugen
@item
Wie Sie eine Tabelle anlegen
@item
Wie Sie Daten in die Tabelle laden
@item
Wie Sie auf unterschiedliche Weise Daten aus der Tabelle abfragen
@item
Wie Sie mehrere Tabellen benutzen
@end itemize

Die Menagerie-Datenbank wird (bewusst) einfach sein, aber man kann sich
leicht Situationen im echten Leben vorstellen, in denen ein �hnlicher Typ
von Datenbank benutzt werden k�nnte. Beispielsweise k�nnte ein Bauer eine
solche Datenbankbenutzung, um den �berblick �ber sein Vieh zu behalten,
oder ein Tierarzt, um seine Patientendaten im Griff zu haben. Sie finden
eine Menagerie-Distribution, die einige der benutzten Anfragen und
Beispielsdaten enth�lt, auf der MySQL-Website.
Sie finden die Distribution entweder unter
@uref{http://www.mysql.com/downloads/Contrib/Examples/menagerie.tar.gz,komprimiertes @code{tar}-Format}
oder unter
@uref{http://www.mysql.com/downloads/Contrib/Beispiele/menagerie.zip,Zip-Format}.

Benutzen Sie das @code{SHOW}-Statement, um herauszufinden, welche
Datenbanken zur Zeit auf dem Server existieren:

@example
mysql> SHOW DATABASES;
+----------+
| database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+
@end example

Die Liste der Datenbanken weicht wahrscheinlich von derjenigen auf Ihrer
Maschine ab, aber wahrscheinlich befinden sich die @code{mysql}- und
@code{test}-Datenbanken darunter. Die @code{mysql}-Datenbank ist notwendig,
weil darin die Zugriffsrechte f�r Benutzer gespeichert sind. Die
@code{test}-Datenbank ist meist als Arbeitsbereich zum Ausprobieren dabei.

Wenn die @code{test}-Datenbank existiert, versuchen Sie, darauf
zuzugreifen:

@example
mysql> USE test
database changed
@end example

Beachten Sie, dass @code{USE} - wie @code{QUIT} - kein Semikolon erfordert.
(Sie k�nnen solche Statements mit einem Semikolon beenden, wenn Sie wollen,
es schadet nicht.) Das @code{USE}-Statement ist auch auf andere Art
besonders: Es muss auf einer einzigen Zeile eingegeben werden.

Sie k�nnen die @code{test}-Datenbank f�r die folgenden Beispiele benutzen
(wenn Sie Zugriff darauf haben), aber alles, was Sie dort anlegen, kann von
jedem sonstigen, der Zugriff darauf hat, entfernt werden. Aus diesem Grund
sollten Sie besser Ihren MySQL-Administrator um Erlaubnis bitten, eine
eigene Datenbankbenutzung zu k�nnen. Nehmen wir an, Sie wollen Ihre
Datenbank @code{menagerie} nennen. Daf�r muss der Administrator folgenden
Befehl eingeben:

@example
mysql> GRANT ALL ON menagerie.* TO ihr_mysql_name;
@end example

Wobei @code{ihr_mysql_name} der MySQL-Benutzername ist, der Ihnen
zugewiesen wurde.


@menu
* Creating database::           
* Creating tables::             
* Loading tables::              
* Retrieving data::             
@end menu

@node Creating database, Creating tables, Database use, Database use
@c German node Datenbank erzeugen
@subsection Eine Datenbank erzeugen und ausw�hlen

@cindex Ausw�hlen, Datenbanken
@cindex Datenbanken, ausw�hlen

Wenn der Administrator f�r Sie eine Datenbank erzeugt, wenn er Ihre
Zugriffsrechte eintr�gt, k�nnen Sie sie unmittelbar benutzen. Ansonsten
m�ssen Sie sie selbst anlegen:

@example
mysql> CREATE DATABASE menagerie;
@end example

Unter Unix sind Datenbanknamen abh�ngig von der Gro�-/Kleinschreibung (im
Gegensatz zu SQL-Schl�sselw�rtern), daher m�ssen Sie sich auf Ihre
Datenbank immer mit @code{menagerie} beziehen, nicht mit @code{Menagerie},
@code{MENAGERIE} oder irgend einer anderen Variante. Dasselbe gilt f�r
Tabellennamen. (Unter Windows trifft diese Beschr�nkung nicht zu. Dennoch
muss man sich bei einer gegebenen Anfrage auf Datenbanken und Tabellen in
derselben Schreibweise beziehen.)

Das Erzeugen einer Datenbank w�hlt diese nicht zur Benutzung aus. Das
m�ssen Sie explizit tun. Um @code{menagerie} zur aktuell ausgew�hlten
Datenbank zu machen, benutzen Sie folgenden Befehl:

@example
mysql> USE menagerie
database changed
@end example

Ihre Datenbank muss nur einmal erzeugt werden, aber Sie m�ssen sie jedes
Mal zur Benutzung ausw�hlen, wenn Sie eine @code{mysql}-Sitzung beginnen.
Das k�nnen Sie durch die Eingabe eines @code{USE}-Statements wie oben
beschrieben tun. Alternativ k�nnen Sie die Datenbank auf der Kommandozeile
ausw�hlen, wenn Sie @code{mysql} aufrufen. Geben Sie einfach ihren Namen
nach den Verbindungsparametern ein, die Sie ansonsten eingeben m�ssen.
Beispiel:

@example
shell> mysql -h host -u user -p menagerie
Enter password: ********
@end example

Beachten Sie, dass @code{menagerie} auf der gezeigten Kommandozeile nicht
Ihr Passwort ist! Wenn Sie Ihr Passwort auf der Kommandozeile nach der
@code{-p}-Option eingeben wollen, m�ssen Sie das ohne Leerzeichen
dazwischen machen (beispielsweise als @code{-pmeinpasswort}, nicht als
@code{-p meinpasswort}). Es wird allerdings nicht empfohlen, das Passwort
auf der Kommandozeile einzugeben, denn dann kann es durch andere Benutzer,
die auf Ihrer Maschine eingeloggt sind, ausspioniert werden.


@node Creating tables, Loading tables, Creating database, Database use
@c German node Tabellen erzeugen
@subsection Eine Tabelle erzeugen

@cindex Tabellen, erzeugen
@cindex Erzeugen, Tabellen
Die Datenbank zu erzeugen ist leicht, aber bis jetzt ist sie noch leer, wie
Ihnen @code{SHOW TABLES} zeigt:

@example
mysql> SHOW TABLES;
Empty set (0.00 sec)
@end example

Der schwierigere Teil besteht darin, sich zu entscheiden, wie die Struktur
Ihrer Datenbank sein sollte: Welche Tabellen Sie ben�tigen und welche
Spalten in jeder Tabelle enthalten sein sollen.

Sie brauchen eine Tabelle, die f�r jedes Ihrer Haustiere einen Datensatz
enth�lt. Diese kann @code{pet}-Tabelle genannt werden, und sie sollte
zumindest den Namen jedes Tiers enthalten. Weil lediglich der Name nicht
besonders interessant ist, sollte die Tabelle weitere Informationen
enthalten. Wenn zum Beispiel mehr als eine Person in Ihrer Familie ein
Haustier h�lt, w�rden Sie den Namen des Besitzers jedes Haustiers auflisten
wollen. Ausserdem wollen Sie vielleicht ein paar grundlegende Informationen
wie Art und Geschlecht einf�gen.

Was ist mit dem Alter? Diese Information k�nnte interessant sein, aber es
ist keine gute Idee, sie in der Datenbank zu speichern. Das Alter �ndert
sich, wenn die Zeit vergeht, was bedeutet, dass Sie Ihre Datens�tze oft
aktualisieren m�ssen. Statt dessen ist es besser, einen festen Wert wie das
Geburtsdatum zu speichern. Immer, wenn Sie dann das Alter ben�tigen,
berechnen Sie es als Differenz zwischen dem aktuellen Datum und dem
Geburtstag. MySQL stellt Funktionen f�r Datumsberechnungen zur Verf�gung,
daher ist so etwas nicht schwer. Ausserdem hat die Speicherung von
Geburtsdaten anstelle von Alter weitere Vorteile:

@itemize @bullet
@item
Sie k�nnen die Datenbank f�r Aufgaben wie die Erzeugung einer Liste
bevorstehender Tier-Geburtstage benutzen. (Wenn Sie das etwas albern
finden, bedenken Sie, dass sich dieselbe Frage zum Beispiel bei einer
Gesch�ftsdatenbank stellt, um Kunden herauszufinden, denen Sie in K�rze
Geburtstagsw�nsche schicken wollen, also f�r die Computer-unterst�tzte
pers�nliche Note.)

@item
Sie k�nnen Altersberechnungen mit anderen Bezugsdaten als dem aktuellen
Datum durchf�hren. Wenn Sie das Sterbedatum speichern, k�nnen Sie zum
Beispiel leicht errechnen, wie alt ein Haustier war, als es starb.
@end itemize

Wahrscheinlich fallen Ihnen weitere Informationen ein, die sinnvoller Weise
in der @code{pet}-Tabelle gespeichert werden k�nnten. F�r unser Beispiel
sollen die bisher identifizierten Informationen f�rs Erste ausreichen:
Name, Besitzer, Art, Geschlecht, Geburtstag und Sterbetag.

Legen Sie mit einem @code{CREATE TABLE}-Statement das Layout Ihrer Tabelle
fest:

@example
mysql> CREATE TABLE pet (name VARCHAR(20), besitzer VARCHAR(20),
    -> art VARCHAR(20), geschlecht CHAR(1), geburtstag DATE, sterbetag DATE);
@end example

@code{VARCHAR} ist f�r die @code{name}-, @code{besitzer}- und
@code{art}-Spalten eine gute Wahl, weil die Spaltenwerte in der L�nge
variieren werden. Diese Spalten m�ssen auch nicht alle gleich sein, also
@code{20} Zeichen lang. Sie k�nnen jede beliebige L�nge zwischen @code{1}
und @code{255} w�hlen, was immer Ihnen vern�nftig erscheint. (Wenn Sie eine
schlechte Wahl getroffen haben und sich sp�ter herausstellt, dass Sie eine
l�ngere Spalte brauchen, stellt MySQL ein @code{ALTER TABLE}-Statement zur
Verf�gung.)

Das Geschlecht der Tiere kann vielf�ltig dargestellt werden, zum Beispiel
als @code{"m"} und @code{"w"}, oder auch als @code{"m�nnlich"} und
@code{"weiblich"}. Am einfachsten ist es, hierf�r einzelne Zeichen wie
@code{"m"} und @code{"w"} zu verwenden.

Der @code{DATE}-Datentyp f�r @code{geburtstag} und @code{sterbetag} liegt
auf der Hand.

Nachdem Sie eine Tabelle angelegt haben, sollte @code{SHOW TABLES} auch
etwas zeigen:

@example
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet                 |
+---------------------+
@end example

Um sicherzustellen, dass Ihre Tabelle so wie erwartet angelegt wurde,
benutzen Sie das @code{DESCRIBE}-Statement:

@example
mysql> DESCRIBE pet;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name       | varchar(20) | YES  |     | NULL    |       |
| besitzer   | varchar(20) | YES  |     | NULL    |       |
| art        | varchar(20) | YES  |     | NULL    |       |
| geschlecht | char(1)     | YES  |     | NULL    |       |
| geburtstag | date        | YES  |     | NULL    |       |
| sterbetag  | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
@end example

Sie k�nnen @code{DESCRIBE} jederzeit benutzen, zum Beispiel, wenn Sie die
Namen der Spalten Ihrer Tabelle vergessen haben oder von welchem Datentyp
sie sind.


@node Loading tables, Retrieving data, Creating tables, Database use
@c German node Tabellen f�llen
@subsection Daten in Tabellen einladen

@cindex Einladen, Tabellen
@cindex Tabellen, Daten einladen
@cindex Daten, in Tabellen laden

Nachdem Sie Ihre Tabelle erzeugt haben, m�ssen Sie sie mit Daten f�llen.
Hierf�r sind die @code{LOAD DATA}- und @code{INSERT}-Statements n�tzlich.

Nehmen wir an, Sie haben Haustiere wie unten aufgef�hrt. (Achten Sie bei
den Datumsangaben bitte darauf, dass MySQL Daten im
@code{YYYY-MM-DD}-Format erwartet, was von dem Format abweichen kann, an
das Sie gewohnt sind.)

@multitable @columnfractions .16 .16 .16 .16 .16 .16
@item @strong{name} @tab @strong{besitzer} @tab @strong{art} @tab @strong{geschlecht} @tab @strong{geburtstag} @tab @strong{sterbetag}
@item Fluffy @tab Harold @tab Katze @tab w @tab 1993-02-04 @tab
@item Claws @tab Gwen @tab Katze @tab m @tab 1994-03-17 @tab
@item Buffy @tab Harold @tab Hund @tab w @tab 1989-05-13 @tab
@item Fang @tab Benny @tab Hund @tab m @tab 1990-08-27 @tab
@item Bowser @tab Diane @tab Hund @tab m @tab 1998-08-31 @tab 1995-07-29
@item Chirpy @tab Gwen @tab Vogel @tab w @tab 1998-09-11 @tab
@item Whistler @tab Gwen @tab Vogel @tab @tab 1997-12-09 @tab
@item Slim @tab Benny @tab Schlange @tab m @tab 1996-04-29 @tab
@end multitable

Weil Sie mit einer leeren Tabelle beginnen, ist eine einfache M�glichkeit,
diese mit Daten zu f�llen, dass Sie eine Textdatei erzeugen, die eine Zeile
f�r jedes Ihrer Tiere enth�lt, und die Inhalte dieser Datei dann mit einem
einzigen Statement in die Tabelle laden.

Erzeugen Sie also eine Textdatei @file{pet.txt}, die einen Datensatz pro
Zeile enth�lt, mit Werten, die durch TAB-Zeichen getrennt sind, und zwar in
der Reihenfolge, in der die Spalten im @code{CREATE TABLE}-Statement
aufgef�hrt waren. Fehlende Werte (wie unbekanntes Geschlecht oder
Sterbedaten f�r Tiere, die noch leben) ersetzen Sie mit @code{NULL}-Werten.
Um das in Ihrer Textdatei darzustellen, nehmen Sie @code{\N}. Der Datensatz
f�r den Vogel Whistler zum Beispiel sieht wie folgt aus (wobei der Leerraum
zwischen den Werten ein einzelnes TAB-Zeichen darstellt):

@multitable @columnfractions .15 .15 .15 .15 .25 .15
@item @code{Whistler} @tab @code{Gwen} @tab @code{Vogel} @tab @code{\N} @tab @code{1997-12-09} @tab @code{\N}
@end multitable

Um die Textdatei @file{pet.txt} in die @code{pet}-Tabelle zu laden,
benutzen Sie folgenden Befehl:

@example
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
@end example

Sie k�nnen das Trennzeichen f�r die Spalten und das Zeichen f�r Zeilenende
im @code{LOAD DATA}-Statement explizit festlegen, wenn Sie wollen, aber
vorgabem��ig sind das das TAB-Zeichen und das Zeilenvorschub-Zeichen. Das
reicht f�r das Statement aus, um die Datei @file{pet.txt} korrekt
einzulesen.

Wenn Sie einzeln neue Datens�tze hinzuf�gen wollen, ist das
@code{INSERT}-Statement n�tzlich. In seiner einfachsten Form geben Sie f�r
jede Spalte Werte an, in genau der Reihenfolge, in der die Spalten im
@code{CREATE TABLE}-Statement aufgef�hrt wurden. Nehmen wir an, dass Diane
einen neuen Hamster namens Puffball bekommt. Sie f�gen einen neuen
Datensatz mittels @code{INSERT}-Statement wie folgt hinzu:

@example
mysql> INSERT INTO pet
    -> VALUES ('Puffball','Diane','Hamster','w','1999-03-30',NULL);
@end example

Beachten Sie, dass hierbei Zeichenketten- und Datumswerte in
Anf�hrungszeichen stehen. Mit @code{INSERT} k�nnen Sie auch direkt
@code{NULL} einf�gen, um einen fehlenden Wert darzustellen. Sie k�nnen
daf�r nicht @code{\N} wie bei @code{LOAD DATA} verwenden.

Diesem Beispiel k�nnen Sie auch entnehmen, dass es einiger Tipparbeit
bedurft h�tte, die anf�nglichen Datens�tze mit mehreren
@code{INSERT}-Statements einzuf�gen, statt hierf�r ein einziges @code{LOAD
DATA}-Statement zu verwenden.


@node Retrieving data,  , Loading tables, Database use
@c German node Daten abrufen
@subsection Informationen aus einer Tabelle abfragen

@cindex Daten, abrufen
@cindex Tabellen, Daten abrufen
@cindex Abrufen, Daten aus Tabellen
@cindex Entladen, Tabellen


Das @code{SELECT}-Statement wird benutzt, um Informationen aus einer
Tabelle herauszuziehen. Die allgemeine Form des Statements ist:

@example
SELECT auszuw�hlende_spalten
FROM tabelle
WHERE gew�nschte_bedingungen
@end example

@code{auszuw�hlende_spalten} bezeichnet, was Sie sehen wollen. Das kann
entweder eine Liste von Spalten sein oder @code{*}, um ``alle Spalten'' zu
bezeichnen. @code{tabelle} kennzeichnet die Tabelle, aus der Sie Spalten
abfragen wollen. Die @code{WHERE}-Klausel ist optional. Wenn sie vorhanden
ist, kennzeichnet @code{gew�nschte_bedingungen} die Bedingungen, mit denen
die Zeilen �bereinstimmen m�ssen, damit sie abgefragt werden.


@menu
* Selecting all::               
* Selecting rows::              
* Selecting columns::           
* Sorting rows::                
* Date calculations::           
* Working with NULL::           
* Pattern matching::            
* Counting rows::               
* Multiple tables::             
@end menu

@node Selecting all, Selecting rows, Retrieving data, Retrieving data
@c German node Alles ausw�hlen
@subsubsection Alle Daten ausw�hlen

Die einfachste Form von @code{SELECT} fragt alles aus einer Tabelle ab:

@example
mysql> SELECT * FROM pet;
+----------+----------+----------+------------+------------+------------+
| name     | besitzer | art      | geschlecht | geburtstag | sterbetag  |
+----------+----------+----------+------------+------------+------------+
| Fluffy   | Harold   | Katze    | w          | 1993-02-04 | NULL       |
| Claws    | Gwen     | Katze    | m          | 1994-03-17 | NULL       |
| Buffy    | Harold   | Hund     | w          | 1989-05-13 | NULL       |
| Fang     | Benny    | Hund     | m          | 1990-08-27 | NULL       |
| Bowser   | Diane    | Hund     | m          | 1998-08-31 | 1995-07-29 |
| Chirpy   | Gwen     | Vogel    | w          | 1998-09-11 | NULL       |
| Whistler | Gwen     | Vogel    | NULL       | 1997-12-09 | NULL       |
| Slim     | Benny    | Schlange | m          | 1996-04-29 | NULL       |
| Puffball | Diane    | Hamster  | w          | 1999-03-30 | NULL       |
+----------+----------+----------+------------+------------+------------+
@end example

Diese Form von @code{SELECT} ist n�tzlich, wenn Sie Ihre gesamte Tabelle
abfragen wollen, zum Beispiel, wenn Sie sich gerade mit einem anf�nglichen
Satz Daten geladen haben. Wie das so passiert, zeigt die Ausgabe einen
Fehler auf: Bowser scheint gestorben zu sein, bevor er geboren wurde! In
den Original-Stammbaum-Papieren finden Sie, dass das korrekte Geburtsjahr
1989 ist, nicht 1998.

Es gibt eine ganze Reihe M�glichkeiten, das zu beheben:

@itemize @bullet
@item
Editieren Sie die Datei @file{pet.txt} und beheben Sie den Fehler. Leeren
Sie dann die Tabelle und laden Sie erneut Daten hinein, indem Sie zuerst
@code{DELETE} und dann @code{LOAD DATA} benutzen:

@example
mysql> SET AUTOCOMMIT=1;  # F�r schnelles Neuerzeugen der Tabelle
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
@end example

Wenn Sie das jedoch tun, m�ssen Sie die Daten f�r Puffball erneut eingeben.

@item
Den fehlerhaften Datensatz mit einem @code{UPDATE}-Statement in Ordnung
bringen:

@example
mysql> UPDATE pet SET geburtstag = "1989-08-31" WHERE name = "Bowser";
@end example
@end itemize

Wie gezeigt ist es einfach, eine ganze Tabelle abzufragen. Aber
typischerweise wird das selten gew�nscht sein, besonders, wenn die Tabelle
Gro� wird. Statt dessen werden Sie an der Antwort auf bestimmte Fragen
interessiert sein, wobei Sie ein paar Beschr�nkungen in Bezug auf die
Informationen, die Sie wollen, festlegen. Schauen wir uns einige
Auswahl-Anfragen an, hinsichtlich der Fragen in Bezug auf Ihre Haustiere,
die sie beantworten.


@node Selecting rows, Selecting columns, Selecting all, Retrieving data
@c German node Zeilen ausw�hlen
@subsubsection Bestimmte Zeilen ausw�hlen

@cindex Zeilen, ausw�hlen
@cindex Tabellen, Zeilen ausw�hlen

Sie k�nnen nur bestimmte Zeilen Ihrer Tabelle ausw�hlen. Wenn Sie zum
Beispiel die Geburtstags-�nderung von Bowser �berpr�fen wollen, w�hlen Sie
Bowsers Datensatz wie folgt aus:

@example
mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+----------+---------+-------------+------------+------------+
| name   | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+--------+----------+---------+-------------+------------+------------+
| Bowser | Diane    | dog     | m           | 1989-08-31 | 1995-07-29 |
+--------+----------+---------+-------------+------------+------------+
@end example


Die Ausgabe best�tigt, dass das Jahr inzwischen korrekt als 1989, nicht
1998, eingetragen ist.

Vergleiche von Zeichenketten achten normalerweise nicht auf
Gro�-/Kleinschreibung, daher k�nnen Sie den Namen als @code{"bowser"},
@code{"BOWSER"} usw. angeben. Das Anfrageergebnis wird dasselbe bleiben.

Sie k�nnen f�r jede Spalte Bedingungen festlegen, nicht nur f�r
@code{name}. Wenn Sie zum Beispiel wissen wollen, welche Tiere nach 1998
geboren wurden, formulieren Sie eine Bedingung f�r die
@code{geburtstag}-Spalte:

@example
mysql> SELECT * FROM pet WHERE geburtstag >= "1998-1-1";
+----------+----------+---------+-------------+------------+-----------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+----------+----------+---------+-------------+------------+-----------+
| Chirpy   | Gwen     | Vogel   | w           | 1998-09-11 | NULL      |
| Puffball | Diane    | Hamster | w           | 1999-03-30 | NULL      |
+----------+----------+---------+-------------+------------+-----------+
@end example

Sie k�nnen Bedingungen kombinieren, um zum Beispiel weibliche Hunde
festzustellen:

@example
mysql> SELECT * FROM pet WHERE art = "Hund" AND geschlecht = "w";
+-------+-----------+---------+------------+------------+-----------+
| name  | besitzer  | art     | geschlecht | geburtstag | sterbetag |
+-------+-----------+---------+------------+------------+-----------+
| Buffy | Harold    | Hund    | w          | 1989-05-13 | NULL      |
+-------+-----------+---------+------------+------------+-----------+
@end example

Die vorherige Anfrage benutzt den logischen Operator @code{AND}. Es gibt
auch einen @code{OR}-Operator:

@example
mysql> SELECT * FROM pet WHERE art = "Schlange" OR art = "Vogel";
+----------+----------+---------+-------------+------------+-----------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+----------+----------+---------+-------------+------------+-----------+
| Chirpy   | Gwen     | Vogel   | w           | 1998-09-11 | NULL      |
| Whistler | Gwen     | Vogel   | NULL        | 1997-12-09 | NULL      |
| Slim     | Benny    | Schlange| m           | 1996-04-29 | NULL      |
+----------+----------+---------+-------------+------------+-----------+
@end example

@code{AND} und @code{OR} k�nnen gemischt werden. Wenn Sie das tun, ist es
eine gute Idee, Klammern zu verwenden, um anzuzeigen, wie die Bedingungen
gruppiert werden sollen:

@example
mysql> SELECT * FROM pet WHERE (art = "Katze" AND geschlecht = "m")
    -> OR (art = "Hund" AND geschlecht = "w");
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+
@end example


@node Selecting columns, Sorting rows, Selecting rows, Retrieving data
@c German node Spalten ausw�hlen
@subsubsection Bestimmte Spalten ausw�hlen

@cindex Spalten, ausw�hlen
@cindex Tabellen, Spalten ausw�hlen

Wenn Sie nicht ganze Zeilen Ihrer Tabelle sehen wollen, geben Sie einfach
die Spalten an, an denen Sie interessiert sind, getrennt durch Kommas. Wenn
Sie zum Beispiel wissen wollen, wann Ihre Tiere geboren wurden, w�hlen Sie
die @code{name}- und @code{geburtstag}-Spalten aus:

@example
mysql> SELECT name, geburtstag FROM pet;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
@end example

Um herauszufinden, wem welches Haustier geh�rt, benutzen Sie diese Anfrage:

@example
mysql> SELECT besitzer FROM pet;
+----------+
| besitzer |
+----------+
| Harold   |
| Gwen     |
| Harold   |
| Benny    |
| Diane    |
| Gwen     |
| Gwen     |
| Benny    |
| Diane    |
+----------+
@end example

@findex DISTINCT
Beachten Sie jedoch, dass diese Anfrage einfach die @code{besitzer}-Spalte
jedes Datensatzes abfragt, wodurch mehrere von ihnen mehrfach erscheinen.
Um die Ausgabe zu minimieren, fragen Sie jeden eindeutigen Datensatz nur
einmal ab, indem Sie das Schl�sselwort @code{DISTINCT} verwenden:

@example
mysql> SELECT DISTINCT besitzer FROM pet;
+-----------+
| besitzer  |
+-----------+
| Benny     |
| Diane     |
| Gwen      |
| Harold    |
+-----------+
@end example

Sie k�nnen eine @code{WHERE}-Klausel verwenden, um die Auswahl von Zeilen
mit der Auswahl von Spalten zu kombinieren. Um zum Beispiel nur die
Geburtstage von Hunden und Katzen zu erhalten, benutzen Sie diese Anfrage:

@example
mysql> SELECT name, art, geburtstag FROM pet
    -> WHERE art = "Hund" OR art = "Katze";
+--------+---------+------------+
| name   | art     | geburtstag |
+--------+---------+------------+
| Fluffy | Katze   | 1993-02-04 |
| Claws  | Katze   | 1994-03-17 |
| Buffy  | Hund    | 1989-05-13 |
| Fang   | Hund    | 1990-08-27 |
| Bowser | Hund    | 1989-08-31 |
+--------+---------+------------+
@end example


@node Sorting rows, Date calculations, Selecting columns, Retrieving data
@c German node Zeilen sortieren
@subsubsection Zeilen sortieren

@cindex Zeilen, sortieren
@cindex sortieren, Tabellenzeilen
@cindex sortieren, Daten
@cindex Tabellen, Zeilen sortieren

Sie haben bei den vorherigen Beispielen vielleicht bemerkt, dass die
Ergebniszeilen in keiner bestimmten Reihenfolge angezeigt werden. H�ufig
ist es jedoch einfacher, die Ausgabe der Anfrage zu �berpr�fen, wenn die
Zeilen auf sinnvolle Art sortiert werden. Um ein Ergebnis zu sortieren,
benutzen Sie die @code{ORDER BY}-Klausel.

Hier sind die Geburtstage der Haustiere, sortiert nach Geburtstag:

@example
mysql> SELECT name, geburtstag FROM pet ORDER BY geburtstag;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
@end example

Um in umgekehrter Reihenfolge zu sortieren, f�gen Sie das @code{DESC}-
(descending) Schl�sselwort zum Namen der Spalte, die Sie sortieren wollen,
hinzu:

@example
mysql> SELECT name, geburtstag FROM pet ORDER BY geburtstag DESC;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+
@end example

Sie k�nnen �ber mehrere Spalten sortieren. Um beispielsweise zuerst nach
der Art des Tieres und dann nach dem Geburtsdatum innerhalb der Tierart zu
sortieren (die j�ngsten Tiere zuerst), benutzen Sie folgende Anfrage:

@example
mysql> SELECT name, art, geburtstag FROM pet ORDER BY art, geburtstag DESC;
+----------+----------+------------+
| name     | art      | geburtstag |
+----------+----------+------------+
| Chirpy   | Vogel    | 1998-09-11 |
| Whistler | Vogel    | 1997-12-09 |
| Claws    | Katze    | 1994-03-17 |
| Fluffy   | Katze    | 1993-02-04 |
| Fang     | Hund     | 1990-08-27 |
| Bowser   | Hund     | 1989-08-31 |
| Buffy    | Hund     | 1989-05-13 |
| Puffball | Hamster  | 1999-03-30 |
| Slim     | Schlange | 1996-04-29 |
+----------+----------+------------+
@end example

Beachten Sie, dass sich das @code{DESC}-Schl�sselwort nur auf die Spalte
bezieht, die unmittelbar davor steht (@code{geburtstag}). @code{art}-Werte
werden nach wie vor in aufsteigender Reihenfolge sortiert.


@node Date calculations, Working with NULL, Sorting rows, Retrieving data
@c German node Datumsberechnungen
@subsubsection Datumsberechnungen

@cindex Datumsberechnungen
@cindex Berechnungen, Datumswerte
@cindex Extrahieren, Datumswerte
@cindex Alter, berechnen

MySQL stellt etliche Funktionen zur Verf�gung, mit denen Sie
Datumsberechnungen wie Altersberechnungen oder das Extrahieren von
Datumsteilen durchf�hren k�nnen.

Um festzustellen, wie alt jedes Ihrer Haustiere ist, berechnen Sie die
Differenz im Jahresanteil des aktuellen Datums und des Geburtstags und
subtrahieren eins, wenn das aktuelle Datum fr�her im Kalender erscheint als
das Geburtsdatum. Folgende Anfrage zeigt f�r jedes Haustier das
Geburtsdatum, das aktuelle Datum und das Alter in Jahren:

@example
mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
+----------+------------+--------------+------+
@end example

Hier zieht @code{YEAR()} den Jahresanteil eines Datums heraus.
@code{RIGHT()} zieht die rechts stehenden f�nf Zeichen heraus, die f�r den
@code{MM-DD}-Teil des Datums stehen. Der Teil in dem Ausdruck, der die
@code{MM-DD}-Werte vergleicht, wird zu 1 oder 0 ausgewertet, was die
Jahresdifferenz ein Jahr nach unten anpasst, wenn @code{CURRENT_DATE}
fr�her im Jahr erscheint als @code{geburtstag}. Der gesamte Ausdruck ist
als �berschrift etwas plump, daher wir ein Alias (@code{age}) benutzt, um
die Spalten�berschrift etwas lesbarer zu machen.

Die Anfrage funktioniert, aber das Ergebnis k�nnte leichter �berblickt
werden, wenn die Zeilen in einer bestimmten Reihenfolge angezeigt w�rden.
Das kann man erreichen, indem man eine @code{ORDER BY name}-Klausel
hinzuf�gt, um die Ausgabe nach Namen zu sortieren:

@example
mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet ORDER BY name;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
+----------+------------+--------------+------+
@end example

Um die Ausgabe nach Alter (@code{age}) statt nach @code{name} zu sortieren,
benutzen Sie einfach eine andere @code{ORDER BY}-Klausel:

@example
mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet ORDER BY age;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
+----------+------------+--------------+------+
@end example


Eine �hnliche Anfrage kann benutzt werden, um das Alter am Sterbetag bei
Tieren festzustellen, die gestorben sind. Das k�nnen Sie feststellen, indem
Sie �berpr�fen, ob der @code{sterbetag}-Wert @code{NULL} ist. Dann
berechnen Sie f�r diejenigen Tiere mit Nicht-@code{NULL}-Werten den
Unterschied zwischen @code{sterbetag}- und @code{geburtstag}-Werten:

@example
mysql> SELECT name, geburtstag, sterbetag,
    -> (YEAR(sterbetag)-YEAR(geburtstag)) - (RIGHT(sterbetag,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet WHERE sterbetag IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | geburtstag | sterbetag  | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+
@end example

Die Anfrage benutzt @code{sterbetag IS NOT NULL} statt @code{sterbetag !=
NULL}, weil @code{NULL} ein spezieller Wert ist. Das wird sp�ter erkl�rt.
@xref{Working with NULL,  , Mit @code{NULL}-Werten arbeiten}.

Was ist, wenn Sie wissen wollen, welche Tiere n�chsten Monat Geburtstag
haben? F�r diese Art von Berechnung sind Jahre und Tage irrelevant. Sie
wollen lediglich den Monatsanteil der @code{geburtstag}-Spalte extrahieren.
MySQL bietet etliche Funktionen f�r die Extraktion von Datumsanteilen, wie
@code{YEAR()}, @code{MONTH()} und @code{DAYOFMONTH()}. @code{MONTH()} ist
hier die richtige Funktion. Um festzustellen, wie sie funktioniert, geben
Sie eine Anfrage ein, die sowohl die Werte von @code{geburtstag} als auch
die von @code{MONTH(geburtstag)} ausgibt:

@example
mysql> SELECT name, geburtstag, MONTH(geburtstag) FROM pet;
+----------+------------+-------------------+
| name     | geburtstag | MONTH(geburtstag) |
+----------+------------+-------------------+
| Fluffy   | 1993-02-04 |                 2 |
| Claws    | 1994-03-17 |                 3 |
| Buffy    | 1989-05-13 |                 5 |
| Fang     | 1990-08-27 |                 8 |
| Bowser   | 1989-08-31 |                 8 |
| Chirpy   | 1998-09-11 |                 9 |
| Whistler | 1997-12-09 |                12 |
| Slim     | 1996-04-29 |                 4 |
| Puffball | 1999-03-30 |                 3 |
+----------+------------+-------------------+
@end example

Tiere mit Geburtstagen im kommenden Monat zu finden ist ebenfalls leicht.
Nehmen wir an, der aktuelle Monat ist April. Dann ist der Monatswert
@code{4} und Sie suchen nach Tieren, die im Mai (Monat 5) geboren sind, wie
folgt:

@example
mysql> SELECT name, geburtstag FROM pet WHERE MONTH(geburtstag) = 5;
+-------+------------+
| name  | geburtstag |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+
@end example

Ein bisschen komplizierter ist es, wenn der aktuelle Monat Dezember ist.
Hier k�nnen Sie nicht einfach eins zur Monatszahl (@code{12}) hinzuf�gen,
weil es keinen 13. Monat gibt. Statt dessen suchen Sie nach Tieren, die im
Januar (Monat 1) geboren sind.

Sie k�nnen die Anfrage sogar so schreiben, dass sie unabh�ngig davon
funktioniert, was der aktuelle Monat ist. Auf diese Art brauchen Sie keine
bestimmte Monatszahl in der Anfrage benutzen. @code{DATE_ADD()} erlaubt
Ihnen, einem gegebenen Datum ein Zeitintervall hinzuzuf�gen. Wenn Sie dem
Wert von @code{NOW()} einen Monat hinzuf�gen und dann den Monatsanteil mit
@code{MONTH()} extrahieren, ergibt das den Monat, der die kommenden
Geburtstage enth�lt:

@example
mysql> SELECT name, geburtstag FROM pet
    -> WHERE MONTH(geburtstag) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
@end example

Eine andere M�glichkeit, diese Aufgabe zu erf�llen, ist, @code{1} zu
addieren, um den n�chsten Monat nach dem aktuellen zu erhalten (nach
Gebrauch der Modulo-Funktion (@code{MOD}), um den Monatswert auf @code{0}
zu stellen, falls er aktuell @code{12}) ist:

@example
mysql> SELECT name, geburtstag FROM pet
    -> WHERE MONTH(geburtstag) = MOD(MONTH(NOW()), 12) + 1;
@end example

@code{MONTH} gibt eine Zahl zwischen 1 und 12 zur�ck.
@code{MOD(irgendwas,12)} gibt eine Zahl zwischen 0 und 11 zur�ck. Daher
muss die Addition nach @code{MOD()} erfolgen, weil wir ansonsten von
November (11) bis Januar (1) gehen w�rden.


@node Working with NULL, Pattern matching, Date calculations, Retrieving data
@c German node Mit NULL arbeiten
@subsubsection Mit @code{NULL}-Werten arbeiten

@findex NULL
@cindex NULL-Wert

Der @code{NULL}-Wert birgt �berraschungen, bis Sie mit ihm vertraut sind.
Konzeptionell bedeutet @code{NULL} einen fehlenden oder unbekannten Wert.
Er wird in einiger Hinsicht anders als andere Werte behandelt. Um auf
@code{NULL} zu testen, k�nnen Sie nicht die arithmetischen
Vergleichoperatoren wie @code{=}, @code{<} oder @code{!=} verwenden. Um
sich das zu veranschaulichen, probieren Sie folgenden Anfrage:

@example
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+
@end example

Wie man sieht, erh�lt man aus diesen Vergleichen keine sinnvollen
Ergebnisse. Benutzen Sie statt dessen die @code{IS NULL}- und @code{IS NOT
NULL}-Operatoren:

@example
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+
@end example

In MySQL bedeutet 0 oder @code{NULL} logisch Falsch und alles sonstige
bedeutet logisch Wahr. Der vorgabem��ige Wahrheitswert einer Boolschen
Operation ist 1.

Diese besondere Behandlung von @code{NULL} ist der Grund, warum es im
vorherigen Abschnitt notwendig war, mit @code{sterbetag IS NOT NULL}
anstelle von @code{sterbetag != NULL} festzustellen, welche Tiere nicht
mehr leben.


@node Pattern matching, Counting rows, Working with NULL, Retrieving data
@c German node Suchmuster
@subsubsection �bereinstimmende Suchmuster

@cindex �bereinstimmende Suchmuster
@cindex �bereinstimmung, Suchmuster
@cindex Ausdr�cke, erweitert

MySQL stellt Standard-SQL-Suchmuster-�bereinstimmung zur Verf�gung, ebenso
wie eine Art der Suchmuster-�bereinstimmung, die auf regul�ren Ausdr�cken
basiert, die denen �hnlich sind, die von Unix-Hilfsprogrammen wie
@code{vi}, @code{grep} und @code{sed} benutzt werden.

SQL-Suchmuster-�bereinstimmung gestattet Ihnen, @samp{_} zu benutzen, um
ein einzelnes Zeichen und @samp{%}, um eine beliebige Anzahl von Zeichen
(inklusive des 0-Zeichens) zu finden. In den MySQL-SQL-Suchmustern spielt
die Gro�-/Kleinschreibung vorgabem��ig keine Rolle. Einige Beispiele sind
unten dargestellt. Beachten Sie, dass Sie @code{=} oder @code{!=} nicht
benutzen k�nnen, wenn Sie SQL-Suchmuster benutzen. Stattdessen m�ssen Sie
die @code{LIKE}- oder @code{NOT LIKE}-Vergleichsoperatoren benutzen.

So finden Sie Namen, die mit @samp{b} anfangen:

@example
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+----------+------+------------+------------+------------+
| name   | besitzer | art  | geschlecht | geburtstag | sterbetag  |
+--------+----------+------+------------+------------+------------+
| Buffy  | Harold   | Hund | w          | 1989-05-13 | NULL       |
| Bowser | Diane    | Hund | m          | 1989-08-31 | 1995-07-29 |
+--------+----------+------+------------+------------+------------+
@end example

So finden Sie Namen, die auf @samp{fy} enden:

@example
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+----------+-------+------------+------------+-----------+
| name   | besitzer | art   | geschlecht | geburtstag | sterbetag |
+--------+----------+-------+------------+------------+-----------+
| Fluffy | Harold   | Katze | w          | 1993-02-04 | NULL      |
| Buffy  | Harold   | Hund  | w          | 1989-05-13 | NULL      |
+--------+----------+-------+------------+------------+-----------+
@end example

So finden Sie Namen, die @samp{w} enthalten:

@example
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+----------+---------+-------------+------------+------------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+----------+----------+---------+-------------+------------+------------+
| Claws    | Gwen     | Katze   | m           | 1994-03-17 | NULL       |
| Bowser   | Diane    | Hund    | m           | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen     | bird    | NULL        | 1997-12-09 | NULL       |
+----------+----------+---------+-------------+------------+------------+
@end example

Um Namen zu finden, die genau f�nf Zeichen enthalten, benutzen Sie das
@samp{_}-Suchmuster-Zeichen:

@example
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+----------+---------+-------------+------------+-----------+
| name  | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+-------+----------+---------+-------------+------------+-----------+
| Claws | Gwen     | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold   | Hund    | w           | 1989-05-13 | NULL      |
+-------+----------+---------+-------------+------------+-----------+
@end example

Die andere Art von Suchmuster-�bereinstimmung benutzt erweiterte regul�re
Ausdr�cke. Wenn Sie bei dieser Art von Suchmuster auf �bereinstimmung
pr�fen, benutzen Sie die @code{REGEXP}- und @code{NOT REGEXP}-Operatoren
(oder @code{RLIKE} und @code{NOT RLIKE}, die synonym sind).

Einige Charakteristika erweiterter regul�rer Ausdr�cke sind:

@itemize @bullet
@item
@samp{.} findet jedes beliebige Zeichen.

@item
Eine Zeichenklasse @samp{[...]} findet jedes Zeichen innerhalb der
eckigen Klammern. So stimmt zum Beispiel @samp{[abc]} mit @samp{a},
@samp{b} oder @samp{c} �berein. Um einen Bereich von Zeichen zu benennen,
benutzen Sie einen Bindestrich. @samp{[a-z]} stimmt mit jedem Buchstaben in
Kleinschreibung �berein, wohingegen @samp{[0-9]} mit jeder Ziffer
�bereinstimmt.

@item
@samp{*} stimmt mit null oder mehr Instanzen der Sache �berein, die ihm
voransteht. @samp{x*} zum Beispiel stimmt mit einer beliebigen Anzahl von
@samp{x}-Zeichen �berein. @samp{[0-9]*} stimmt mit einer beliebigen Anzahl
von Ziffern �berein, und @samp{.*} mit jeder Anzahl von irgendetwas.

@item
Regul�re Ausdr�cke achten auf Gro�-/Kleinschreibung, aber Sie k�nnen eine
Zeichenklasse benutzen, um beide Schreibungen zu finden, wenn Sie wollen.
@samp{[aA]} zum Beispiel stimmt mit @samp{a} in Gro�- und Kleinschreibung
�berein und @samp{[a-zA-Z]} mit jedem Buchstaben in Gro�- und
Kleinschreibung.

@item
Das Suchmuster stimmt �berein, wenn es irgendwo in dem Wert auftaucht, der
�berpr�ft wird. (SQL-Suchmuster stimmen nur �berein, wenn sie mit dem
gesamten Wert �bereinstimmen.)

@item
Um ein Suchmuster so zu verankern, dass er mit dem Anfang oder dem Ende des
�berpr�ften Werts �bereinstimmen muss, benutzen Sie @samp{^} am Anfang oder
@samp{$} am Ende des Suchmusters.
@end itemize

Um darzustellen, wie erweiterte regul�re Ausdr�cke funktionieren, werden
die @code{LIKE}-Anfragen von oben noch einmal mit @code{REGEXP} gezeigt.

Um Namen zu finden, die mit @samp{b} anfangen, benutzen Sie @samp{^}, um
auf �bereinstimmung am Anfang des Namens zu pr�fen:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+-----------+---------+-------------+------------+------------+
| name   | besitzer  | art     | geschlecht  | geburtstag | sterbetag  |
+--------+-----------+---------+-------------+------------+------------+
| Buffy  | Harold    | Hund    | w           | 1989-05-13 | NULL       |
| Bowser | Diane     | Hund    | m           | 1989-08-31 | 1995-07-29 |
+--------+-----------+---------+-------------+------------+------------+
@end example

Vor MySQL-Version 3.23.4 achtet @code{REGEXP} auf Gro�-/Kleinschreibung.
Daher gibt diese Anfrage ein Ergebnis ohne Zeilen zur�ck. Um sowohl Gro�-
als auch Kleinschreibung von @samp{b} zu finden, benutzen Sie statt dessen
folgende Anfrage:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
@end example

Ab MySQL 3.23.4 m�ssen Sie, um die Beachtung der Gro�-/Kleinschreibung in
einem @code{REGEXP}-Vergleich zu erzwingen, das @code{BINARY}-Schl�sselwort
verwenden, um eine der Zeichenketten zu einer bin�ren Zeichenkette zu
machen. Diese Anfrage stimmt nur mit @samp{b} in Kleinschreibung am Anfang
eines Namens �berein:

@example
mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
@end example

Um Namen zu finden, die auf @samp{fy} enden, benutzen Sie @samp{$}, um
�bereinstimmung am Ende des Namens zu finden:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+-----------+---------+-------------+------------+-----------+
| name   | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+--------+-----------+---------+-------------+------------+-----------+
| Fluffy | Harold    | Katze   | w           | 1993-02-04 | NULL      |
| Buffy  | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+--------+-----------+---------+-------------+------------+-----------+
@end example

Um Namen zu finden, die @samp{w} in Gro�- oder Kleinschreibung enthalten,
benutzen Sie diese Anfrage:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+----------+---------+-------------+------------+------------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+----------+----------+---------+-------------+------------+------------+
| Claws    | Gwen     | Katze   | m           | 1994-03-17 | NULL       |
| Bowser   | Diane    | Hund    | m           | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen     | bird    | NULL        | 1997-12-09 | NULL       |
+----------+----------+---------+-------------+------------+------------+
@end example

Weil ein Suchmuster mit regul�ren Ausdr�cken an beliebiger Stelle im Wert
gefunden wird, ist es bei der vorherigen Anfrage nicht notwendig, ein
Jokerzeichen (Wildcard) auf irgendeine Seite des Suchmusters zu setzen, um
nach �bereinstimmung im gesamten Wert zu suchen, wie es bei SQL-Suchmustern
der Fall sein m�sste.

Um Namen zu finden, die genau f�nf Zeichen enthalten, benutzen Sie @samp{^}
und @samp{$}, um mit Anfang und Ende des Namens �bereinstimmung zu finden,
und f�nf Instanzen von @samp{.} dazwischen:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+
@end example

Sie k�nnten die vorherige Anfrage auch unter Verwendung des @samp{@{n@}}-
``wiederhole-@code{n}-mal''-Operators schreiben:

@example
mysql> SELECT * FROM pet WHERE name REGEXP "^.@{5@}$";
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+
@end example


@node Counting rows, Multiple tables, Pattern matching, Retrieving data
@c German node Zeilen z�hlen
@subsubsection Zeilen z�hlen

@cindex Zeilen, z�hlen
@cindex Tabellen, Zeilen z�hlen
@cindex z�hlen, Tabellenzeilen

Datenbanken werden oft benutzt, um die Frage zu beantworten, wie oft eine
bestimmte Art von Daten in einer Tabelle erscheint. Sie wollen
beispielsweise wissen, wie viele Haustiere Sie haben, oder wie viele
Haustiere jeder Besitzer hat, oder Sie wollen verschiedene Arten von
Z�hlungen Ihrer Tiere durchf�hren.

Die Gesamtzahl der Tiere z�hlen, die Sie haben, ist dieselbe Frage wie
``Wie viele Zeilen sind in der @code{pet}-Tabelle?'', denn es gibt einen
Datensatz pro Haustier. Die @code{COUNT()}-Funktion z�hlt die Anzahl von
Nicht-@code{NULL}-Ergebnissen, daher lautet die Anfrage, um Ihre Tiere zu
z�hlen, wie folgt:

@example
mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+
@end example

Sie haben vorher schon einmal die Namen der Leute abgefragt, die Haustiere
besitzen. Sie k�nnen @code{COUNT()} benutzen, wenn Sie herausfinden wollen,
wie viele Tiere jeder Besitzer hat:

@example
mysql> SELECT besitzer, COUNT(*) FROM pet GROUP BY besitzer;
+-----------+----------+
| besitzer  | COUNT(*) |
+-----------+----------+
| Benny     |        2 |
| Diane     |        2 |
| Gwen      |        3 |
| Harold    |        2 |
+-----------+----------+
@end example

Beachten Sie die Benutzung von @code{GROUP BY}, um alle Datens�tze f�r
jeden @code{besitzer} zu gruppieren. Ohne das erhalten Sie eine
Fehlermeldung:

@example
mysql> SELECT besitzer, COUNT(besitzer) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
@end example

@code{COUNT()} und @code{GROUP BY} sind n�tzlich, um Ihre Daten auf
verschiedene Weise zu charakterisieren. Die folgenden Beispiele zeigen
verschiedene M�glichkeiten, um Z�hlungen Ihrer Tiere durchzuf�hren.

Anzahl der Tiere pro Art:

@example
mysql> SELECT art, COUNT(*) FROM pet GROUP BY art;
+---------+----------+
| art     | COUNT(*) |
+---------+----------+
| Vogel   |        2 |
| Katze   |        2 |
| Hund    |        3 |
| Hamster |        1 |
| Schlange|        1 |
+---------+----------+
@end example

Anzahl der Tiere pro Geschlecht:

@example
mysql> SELECT geschlecht, COUNT(*) FROM pet GROUP BY geschlecht;
+-------------+----------+
| geschlecht  | COUNT(*) |
+-------------+----------+
| NULL        |        1 |
| w           |        4 |
| m           |        4 |
+-------------+----------+
@end example

(In dieser Ausgabe zeigt @code{NULL} an, dass das Geschlecht unbekannt
ist.)

Anzahl der Tiere pro Kombination von Art und Geschlecht:

@example
mysql> SELECT art, geschlecht, COUNT(*) FROM pet GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Vogel   | NULL        |        1 |
| Vogel   | w           |        1 |
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
| Hamster | w           |        1 |
| Schlange| m           |        1 |
+---------+-------------+----------+
@end example

Sie m�ssen nicht die gesamte Tabelle abfragen, wenn Sie @code{COUNT()}
benutzen. Die vorherige Anfrage beispielsweise sieht lediglich f�r Hunde
und Katzen wie folgt aus:

@example
mysql> SELECT art, geschlecht, COUNT(*) FROM pet
    -> WHERE art = "Hund" OR art = "Katze"
    -> GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
+---------+-------------+----------+
@end example

Oder wenn Sie die Anzahl von Tieren pro Geschlecht wissen wollen,
beschr�nkt auf die Tiere, deren Geschlecht bekannt ist:

@example
mysql> SELECT art, geschlecht, COUNT(*) FROM pet
    -> WHERE geschlecht IS NOT NULL
    -> GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Vogel   | w           |        1 |
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
| Hamster | w           |        1 |
| Schlange| m           |        1 |
+---------+-------------+----------+
@end example


@node Multiple tables,  , Counting rows, Retrieving data
@c German node Mehrere Tabellen
@subsubsection Mehr als eine Tabelle benutzen

@cindex Tabellen, mehrere

In der @code{pet}-Tabelle behalten Sie die �bersicht �ber Ihre Haustiere.
Wenn Sie weitere Informationen �ber sie aufzeichnen wollen, beispielsweise
Ereignisse in ihrem Leben wie Besuche beim Tierarzt oder wenn Nachwuchs zur
Welt kommt, brauchen Sie eine weitere Tabelle. Wie sollte diese aussehen?
Sie ben�tigt:

@itemize @bullet
@item
Den Namen des Haustiers, damit Sie wissen, auf welches Tier sich jedes
Ereignis bezieht.

@item
Ein Datum, damit Sie wissen, wann sich das Ereignis zugetragen hat.

@item
Ein Feld, um das Ereignis zu beschreiben.

@item
Ein Feld f�r den Typ des Ereignisses, wenn Sie in der Lage sein wollen,
Ereignisse zu kategorisieren.
@end itemize

Nach diesen Vor�berlegungen k�nnte das @code{CREATE TABLE}-Statement f�r
die @code{ereignis}-Tabelle wie folgt aussehen:

@example
mysql> CREATE TABLE ereignis (name VARCHAR(20), datum DATE,
    -> typ VARCHAR(15), bemerkung VARCHAR(255));
@end example

Wie bei der @code{pet}-Tabelle ist es am einfachsten, die anf�nglichen
Datens�tze mit Hilfe einer TAB-getrennten Textdatei einzuladen, die
folgende Informationen enth�lt:

@multitable @columnfractions .15 .15 .15 .55
@item Fluffy @tab 1995-05-15 @tab Nachwuchs @tab 4 K�tzchen, 3 weiblich, 1 m�nnlich
@item Buffy @tab 1993-06-23 @tab Nachwuchs @tab 5 H�ndchen, 2 weiblich, 3 m�nnlich
@item Buffy @tab 1994-06-19 @tab Nachwuchs @tab 3 H�ndchen, 3 weiblich
@item Chirpy @tab 1999-03-21 @tab Tierarzt @tab Schnabel gerade gebogen
@item Slim @tab 1997-08-03 @tab Tierarzt @tab Gebrochene Rippe
@item Bowser @tab 1991-10-12 @tab Zwinger
@item Fang @tab 1991-10-12 @tab Zwinger
@item Fang @tab 1998-08-28 @tab Geburtstag @tab Geschenk: neues Kauspielzeug
@item Claws @tab 1998-03-17 @tab Geburtstag @tab Geschenk: neues Flohhalsband
@item Whistler @tab 1998-12-09 @tab Geburtstag @tab Erster Geburtstag
@end multitable

Laden Sie die Datens�tze wie folgt ein:

@example
mysql> LOAD DATA LOCAL INFILE "ereignis.txt" INTO TABLE ereignis;
@end example

Auf der Grundlage dessen, was Sie durch die Abfragen der @code{pet}-Tabelle
gelernt haben, sollten sie in der Lage sein, Abfragen der Datens�tze der
@code{ereignis}-Tabelle durchzuf�hren, was prinzipiell dasselbe ist. Aber
wann ist die @code{ereignis}-Tabelle allein nicht ausreichend, um Fragen zu
beantworten, die Sie stellen k�nnten?

Nehmen wir an, Sie wollen herausfinden, wie alt jedes Haustier war, als es
Nachwuchs bekam. In der @code{ereignis}-Tabelle steht, wann das geschah,
aber um das Alter der Mutter auszurechnen, wird ihr Geburtstag ben�tigt.
Weil dieser in der @code{pet}-Tabelle steht, brauchen Sie f�r diese Anfrage
beide Tabellen:

@example
mysql> SELECT pet.name, (TO_DAYS(datum) - TO_DAYS(geburtstag))/365 AS age,anmerkung
    -> FROM pet, ereignis
    -> WHERE pet.name = ereignis.name AND typ = "Nachwuchs";
+--------+------+------------------------------------+
| name   | age  | anmerkung                          |
+--------+------+------------------------------------+
| Fluffy | 2.27 | 4 k�tzchen, 3 weiblich, 1 m�nnlich |
| Buffy  | 4.12 | 5 h�ndchen, 2 weiblich, 3 m�nnlich |
| Buffy  | 5.10 | 3 h�ndchen, 3 weiblich             |
+--------+------+------------------------------------+
@end example

Zu dieser Anfrage gibt es einiges anzumerken:

@itemize @bullet
@item
In der @code{FROM}-Klausel stehen zwei Tabellen, weil die Anfrage aus
beiden Tabellen Informationen herausziehen muss.

@item
Wenn Sie Informationen aus mehreren Tabellen verbinden (englisch: join),
m�ssen Sie angeben, wie Datens�tze in der einen Tabelle mit solchen in der
anderen Tabelle in �bereinstimmung gebracht werden k�nnen. Das ist einfach,
weil beide eine @code{name}-Spalte haben. Die Anfrage benutzt die
@code{WHERE}-Klausel, um Datens�tze beider Tabellen basierend auf den
@code{name}-Werten in �bereinstimmung zu bringen.

@item
Weil die @code{name}-Spalte in beiden Tabellen vorkommt, m�ssen Sie
angeben, welche Tabelle Sie meinen, wenn Sie auf die Spalte verweisen. Das
wird gemacht, indem dem Spaltennamen der Tabellenname voran gestellt wird.
@end itemize

Sie m�ssen nicht unbedingt zwei verschiedene Tabellen haben, um eine
Verkn�pfung (Join) durchzuf�hren. Manchmal ist es n�tzlich, eine Tabelle
mit sich selbst zu verkn�pfen, wenn Sie n�mlich Datens�tze in einer Tabelle
mit Datens�tze in derselben Tabelle vergleichen wollen. Um zum Beispiel
Zuchtpaare unter Ihren Haustieren zu finden, k�nnen Sie die
@code{pet}-Tabelle mit sich selbst verkn�pfen, um Paare von m�nnlichen und
weiblichen Tieren derselben Art zusammen zu bringen:

@example
mysql> SELECT p1.name, p1.geschlecht, p2.name, p2.geschlecht, p1.art
    -> FROM pet AS p1, pet AS p2
    -> WHERE p1.art = p2.art AND p1.geschlecht = "w" AND p2.geschlecht = "m";
+--------+-------------+--------+-------------+---------+
| name   | geschlecht  | name   | geschlecht  | art     |
+--------+-------------+--------+-------------+---------+
| Fluffy | w           | Claws  | m           | Katze   |
| Buffy  | w           | Fang   | m           | Hund    |
| Buffy  | w           | Bowser | m           | Hund    |
+--------+-------------+--------+-------------+---------+
@end example

In dieser Anfrage legen wir Aliase f�r den Tabellennamen fest, um auf die
Spalten verweisen zu k�nnen und um auseinander zu halten, auf welche
Instanz der Tabelle sich jede Spaltenreferenz bezieht.


@node Getting information, Examples, Database use, Tutorial
@c German node Informationen bekommen
@section Informationen �ber Datenbanken und Tabellen

@cindex Datenbanken, Informationen �ber
@cindex Tabellen, Informationen �ber
@findex DESCRIBE

Was ist, wenn Sie den Namen einer Datenbank oder Tabelle vergessen haben
oder f�r eine gegebene Tabelle die Struktur nicht mehr kennen (wie zum
Beispiel die Spalten hei�en)? MySQL l�st solcherlei Probleme mit diversen
Statements, die Informationen �ber die Datenbanken und Tabellen
bereitstellen, die es unterst�tzt.

@code{SHOW DATABASES} kennen Sie schon. Dieses listet die Datenbanken auf,
die vom Server verwaltet werden. Um herauszufinden, welche Datenbank
aktuell ausgew�hlt ist, benutzen Sie die @code{DATABASE()}-Funktion:

@example
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+
@end example

Wenn Sie noch keine Datenbank ausgew�hlt haben, ist das Ergebnis leer.

Um herauszufinden, welche Tabellen die aktuelle Datenbank enth�lt (wenn Sie
sich zum Beispiel �ber den Namen einer Tabelle nicht sicher sind), benutzen
Sie folgenden Befehl:

@example
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| ereignis            |
| pet                 |
+---------------------+
@end example

Wenn Sie die Struktur einer Tabelle sehen wollen, ist der
@code{DESCRIBE}-Befehl n�tzlich. Er zeigt Informationen �ber jede
Tabellenspalte an:

@example
mysql> DESCRIBE pet;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name       | varchar(20) | YES  |     | NULL    |       |
| besitzer   | varchar(20) | YES  |     | NULL    |       |
| art        | varchar(20) | YES  |     | NULL    |       |
| geschlecht | char(1)     | YES  |     | NULL    |       |
| geburtstag | date        | YES  |     | NULL    |       |
| sterbetag  | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
@end example

@code{Field} zeigt den Spaltennamen, @code{Type} ist der Datentyp der
Spalte, @code{Null} zeigt an, ob die Spalte @code{NULL}-Werte enthalten darf
oder nicht, @code{Key} zeigt an, ob die Spalte indiziert ist oder nicht und
@code{Default} legt den Vorgabewert der Spalte fest.

Wenn Sie Indexe auf eine Tabelle haben, zeigt Ihnen @code{SHOW INDEX FROM
tabelle} Informationen �ber diese an.


@node Examples, Batch mode, Getting information, Tutorial
@c German node Beispiele
@section Beispiele gebr�uchlicher Anfragen (Queries)

@cindex Anfragen, Beispiele
@cindex Beispiele, Anfragen

Hier finden sich Beispiele, wie gel�ufige Probleme mit MySQL gel�st werden
k�nnen.

Einige der Beispiele benutzen die Tabelle @code{shop}, die den St�ckpreis
f�r jeden Artikel f�r bestimmte H�ndler enth�lt. Unter der Annahme, dass
jeder H�ndler einen einzelnen fest Preis pro Artikel hat, ist
(@code{artikel}, @code{haendler}) der Prim�rschl�ssel f�r diese Datens�tze.

Starten Sie das Kommandozeilen-Werkzeug @code{mysql} und w�hlen Sie eine
Datenbank aus:

@example
mysql ihr-datenbank-name
@end example

(Bei den meisten MySQL-Installationen k�nnen Sie die Datenbank 'test'
ausw�hlen.)

Erzeugen Sie die Beispiel-Tabelle wie folgt:

@example
CREATE TABLE shop (
 artikel  INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
 haendler CHAR(20)                 DEFAULT ''     NOT NULL,
 preis    DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
 PRIMARY KEY(artikel, dealer));

INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);
@end example

Die Beispieldaten sehen jetzt so aus:

@example
mysql> SELECT * FROM shop;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0001 | A       |  3.45 |
|    0001 | B       |  3.99 |
|    0002 | A       | 10.99 |
|    0003 | B       |  1.45 |
|    0003 | C       |  1.69 |
|    0003 | D       |  1.25 |
|    0004 | D       | 19.95 |
+---------+---------+-------+
@end example



@menu
* example-Maximum-column::      
* example-Maximum-row::         
* example-Maximum-column-group::  
* example-Maximum-column-group-row::  
* example-user-variables::      
* example-Foreign keys::        
* Searching on two keys::       
* Calculating days::            
@end menu

@node example-Maximum-column, example-Maximum-row, Examples, Examples
@c German node Beispiel Maximum-Spalte
@subsection Der h�chste Wert einer Spalte

``Was ist die h�chste Artikelnummer?''

@example
SELECT MAX(artikel) AS artikel FROM shop

+---------+
| artikel |
+---------+
|       4 |
+---------+
@end example


@node example-Maximum-row, example-Maximum-column-group, example-Maximum-column, Examples
@c German node Beispiel Maximum-Zeile
@subsection Die Zeile, die den h�chsten Wert einer bestimmten Spalte enth�lt

``Suche Artikelnummer, H�ndler und Preis des teuersten Artikels.''

In ANSI-SQL wird das mit einer Unterabfrage (Sub-Query) durchgef�hrt:

@example
SELECT artikel, haendler, preis
FROM   shop
WHERE  preis=(SELECT MAX(preis) FROM shop)
@end example

In MySQL (was noch keine Unterabfragen hat) f�hren Sie das in zwei
Schritten durch:

@enumerate
@item
Mit einem @code{SELECT}-Statement ermitteln Sie den h�chsten Preis in der
Tabelle.
@item
Mit diesem Wert stellen Sie die aktuelle Anfrage zusammen:
@example
SELECT artikel, haendler, preis
FROM   shop
WHERE  preis=19.95
@end example
@end enumerate

Eine andere L�sung besteht darin, alle Zeilen absteigend nach Preis zu
sortieren und nur die erste Zeile zu nehmen, indem Sie die
MySQL-spezifische @code{LIMIT}-Klausel benutzen:

@example
SELECT artikel, haendler, preis
FROM   shop
ORDER BY preis DESC
LIMIT 1
@end example

@strong{ACHTUNG}: Wenn es mehrere teuerste Artikel gibt (die zum Beispiel
alle 19.95 kosten), zeigt die @code{LIMIT}-L�sung nur einen davon!


@node example-Maximum-column-group, example-Maximum-column-group-row, example-Maximum-row, Examples
@c German node Beispiel Maximum-Spalte-Gruppe
@subsection H�chster Wert einer Spalte pro Gruppe

``Was ist der h�chste Preis pro Artikel?''

@example
SELECT artikel, MAX(preis) AS preis
FROM   shop
GROUP BY artikel

+---------+-------+
| artikel | preis |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+
@end example


@node example-Maximum-column-group-row, example-user-variables, example-Maximum-column-group, Examples
@c German node Beispiel Maximum-Spalte-Gruppe-Zeile
@subsection Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten

``Suche f�r jeden Artikel den oder die H�ndler mit den teuersten Preisen.''

In ANSI-SQL w�rden Sie das wie folgt mit einer Unterabfrage erledigen:

@example
SELECT artikel, haendler, preis
FROM   shop s1
WHERE  preis=(SELECT MAX(s2.preis)
              FROM shop s2
              WHERE s1.artikel = s2.artikel);
@end example

In MySQL macht man das am besten in mehreren Schritten:

@enumerate
@item
Die Liste (artikel,maxpreis) holen.
@item
F�r jeden Artikel die korrespondierenden Zeilen holen, die den h�chsten
Preis gespeichert haben.
@end enumerate

Das kann auf einfache Weise mit einer tempor�ren Tabelle geschehen:

@example
CREATE TEMPORARY TABLE tmp (
        artikel INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
        preis   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);

LOCK TABLES shop read;

INSERT INTO tmp SELECT artikel, MAX(preis) FROM shop GROUP BY artikel;

SELECT shop.artikel, haendler, shop.preis FROM shop, tmp
WHERE shop.artikel=tmp.artikel AND shop.preis=tmp.preis;

UNLOCK TABLES;

DROP TABLE tmp;
@end example

Wenn Sie keine @code{TEMPORARY}-Tabelle benutzen, m�ssen Sie zus�tzlich die
'tmp'-Tabelle sperren.

``Kann das mit einer einzigen Anfrage durchgef�hrt werden?''

Ja, aber nur unter Verwendung eines recht ineffizienten Tricks, den wir den
``MAX-CONCAT-Trick'' nennen:

@example
SELECT artikel,
       SUBSTRING( MAX( CONCAT(LPAD(preis,6,'0'),haendler) ), 7) AS haendler,
  0.00+LEFT(      MAX( CONCAT(LPAD(preis,6,'0'),haendler) ), 6) AS preis
FROM   shop
GROUP BY artikel;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0001 | B       |  3.99 |
|    0002 | A       | 10.99 |
|    0003 | C       |  1.69 |
|    0004 | D       | 19.95 |
+---------+---------+-------+
@end example

Das letzte Beispiel kann etwas effizienter gemacht werden, wenn man das
Aufteilen der verketteten Spalte im Client durchf�hrt.


@node example-user-variables, example-Foreign keys, example-Maximum-column-group-row, Examples
@c German node Beispiel Benutzer-Variablen
@subsection Wie Benutzer-Variablen verwendet werden

Sie k�nnen MySQL-Benutzer-Variablen verwenden, um Ergebnisse
zwischenzuspeichern, ohne sie in tempor�re Variablen im Client speichern zu
m�ssen.
@xref{Variables}.

Um zum Beispiel die Artikel mit dem h�chsten und dem niedrigsten Preis
herauszufinden, k�nnen Sie folgendes machen:

@example
select @@min_preis:=min(preis),@@max_preis:=max(preis) from shop;
select * from shop where preis=@@min_preis or preis=@@max_preis;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0003 | D       |  1.25 |
|    0004 | D       | 19.95 |
+---------+---------+-------+
@end example


@node example-Foreign keys, Searching on two keys, example-user-variables, Examples
@c German node Beispiel Fremdschl�ssel
@subsection Wie Fremdschl�ssel (Foreign Keys) verwendet werden

@cindex Fremdschl�ssel
@cindex Schl�ssel, Fremdschl�ssel

Sie brauchen keine Fremdschl�ssel, um zwei Tabellen zu verkn�pfen.

Das einzige, was MySQL nicht durchf�hrt, ist der @code{CHECK}, um
sicherzustellen, dass die Schl�ssel, die Sie benutzen, in der oder den
Tabelle(n) existieren, auf die Sie verweisen, und es l�scht auch nicht
automatisch Zeilen aus einer Tabelle mit einer Fremdschl�ssel-Definition.
Wenn Sie Ihre Schl�ssel wie gew�hnlich benutzen, funktioniert das gut:


@example
CREATE TABLE personen (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE hemden (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    stil ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    farbe ENUM('rot', 'blau', 'orange', 'wei�', 'schwarz') NOT NULL,
    besitzer SMALLINT UNSIGNED NOT NULL references personen,
    PRIMARY KEY (id)
);


INSERT INTO personen VALUES (NULL, 'Antonio Paz');

INSERT INTO hemden VALUES
(NULL, 'polo', 'blau', LAST_INSERT_ID()),
(NULL, 'dress', 'wei�', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blau', LAST_INSERT_ID());


INSERT INTO personen VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO hemden VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'rot', LAST_INSERT_ID()),
(NULL, 'dress', 'blau', LAST_INSERT_ID()),
(NULL, 't-shirt', 'wei�', LAST_INSERT_ID());


SELECT * FROM personen;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM hemden;
+----+---------+--------+----------+
| id | stil    | farbe  | besitzer |
+----+---------+--------+----------+
|  1 | polo    | blau   |     1    |
|  2 | dress   | wei�  |     1    |
|  3 | t-shirt | blau   |     1    |
|  4 | dress   | orange |     2    |
|  5 | polo    | rot    |     2    |
|  6 | dress   | blau   |     2    |
|  7 | t-shirt | wei�  |     2    |
+----+---------+--------+----------+


SELECT h.* FROM personen p, hemden h
 WHERE p.name LIKE 'Lilliana%'
   AND h.besitzer = p.id
   AND h.farbe <> 'wei�';

+----+-------+--------+----------+
| id | stil  | farbe  | besitzer |
+----+-------+--------+----------+
|  4 | dress | orange |     2    |
|  5 | polo  | rot    |     2    |
|  6 | dress | blau   |     2    |
+----+-------+--------+----------+
@end example


@node Searching on two keys, Calculating days, example-Foreign keys, Examples
@c German node Suche �ber zwei Schl�ssel
@subsection �ber zwei Schl�ssel suchen

@findex UNION
@cindex Suchen, zwei Schl�ssel
@cindex Schl�ssel, suchen �ber zwei
MySQL optimiert derzeit noch nicht, wenn Sie �ber zwei unterschiedliche
Schl�ssel suchen, die mit @code{OR} kombiniert werden (eine Suche mit einem
Schl�ssel mit verschiedenen @code{OR}-Teilen wird recht gut optimiert):

@example
SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld1_index = '1'
OR feld2_index = '1'
@end example

Der Grund liegt darin, dass wir bislang noch keine Zeit hatten, hierf�r
eine effiziente M�glichkeit zu implementieren, die das f�r allgemeine F�lle
abhandelt. (Die @code{AND}-Handhabung ist im Vergleich jetzt komplett
allgemein und funktioniert sehr gut.)

In der Zwischenzeit k�nnen Sie dieses Problem sehr effizient l�sen, indem
Sie eine @code{TEMPORARY}-Tabelle verwenden. Diese Art der Optimierung ist
ebenfalls sehr gut, wenn Sie sehr komplizierte Anfragen verwenden, bei
denen der SQL-Server die Optimierungen in falscher Reihenfolge durchf�hrt.

@example
CREATE TEMPORARY TABLE tmp
SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld1_index = '1';
INSERT INTO tmp
SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;
@end example

Diese M�glichkeit der Anfrage ist im Endeffekt ein @code{UNION} von zwei
Anfragen.


@node Calculating days,  , Searching on two keys, Examples
@c German node Tage berechnen
@subsection Besuche pro Tag berechnen

@findex BIT_OR
@findex BIT_COUNT
@findex <<
@cindex Bit_Funktionen, Beispiel

Folgendes zeigt, wie Sie die Bit-Gruppen-Funktionen benutzen k�nnen, um die
Anzahl der Tage pro Monat zu z�hlen, in denen ein Benutzer eine Web-Seite
besucht hat.

@example
CREATE TABLE t1 (jahr YEAR(4), monat INT(2) UNSIGNED ZEROFILL, tag INT(2) UNSIGNED ZEROFILL);                                                            
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000,2,23);

SELECT jahr,monat,BIT_COUNT(BIT_OR(1<<tag)) AS tage FROM t1 GROUP BY jahr,monat;

Das gibt folgendes Ergebnis zur�ck:

+------+-------+------+
| jahr | monat | tage |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+
@end example

Dies berechnet, wie viele verschiedene Tage f�r eine gegebene
Jahr-Monats-Kombination benutzt wurden, bei automatischer Entfernung
doppelter Eintr�ge (Duplikate).


@node Batch mode, Twin, Examples, Tutorial
@c German node Stapelbetrieb
@section @code{mysql} im Stapelbetrieb (Batch Mode)

@cindex Modi, Stapel
@cindex Stapelbetrieb
@cindex Laufenlassen, Stapelbetrieb
@cindex Skript-Dateien
@cindex Dateien, Skript

In den vorherigen Abschnitten haben Sie @code{mysql} interaktiv benutzt, um
Anfragen einzugeben und die Ergebnisse zu betrachten. Sie k�nnen
@code{mysql} auch im Stapelbetrieb benutzen. Daf�r schreiben Sie dei
Befehle, die Sie ausf�hren wollen, in eine Datei, und teilen @code{mysql}
dann mit, seine Eingaben aus dieser Datei zu lesen:

@example
shell> mysql < stapel-datei
@end example

Wenn Sie auf der Kommandozeile Verbindungsparameter angeben m�ssen, k�nnte
der Befehl wie folgt aussehen:

@example
shell> mysql -h host -u user -p < stapel-datei
Enter password: ********
@end example

Wenn Sie @code{mysql} auf diese Weise benutzen, erzeugen Sie eine
Skript-Datei und f�hren dann das Skript aus.

Warum sollten Sie ein Skript benutzen? Hier sind ein paar Gr�nde:

@itemize @bullet
@item
Wenn Sie eine Anfrage wiederholt ausf�hren (sagen wir jeden Tag oder jede
Woche), vermeiden Sie mit einem Skript, dass Sie sie jedes Mal zur
Ausf�hrung erneut eintippen m�ssen.

@item
Sie k�nnen aus existierenden Anfragen neue Anfragen erzeugen, die �hnlich
sind, indem Sie die Skript-Dateien kopieren und editieren.

@item
Der Stapelbetrieb kann auch f�r die Entwicklung einer Anfrage n�tzlich
sein, insbesondere, wenn Sie mehrzeilige Befehle oder Befehlssequenzen aus
mehreren Statements entwickeln. Wenn Sie einen Fehler machen, m�ssen Sie
nicht alles noch einmal tippen, sondern editieren einfach Ihr Skript, um
den Fehler zu beheben, und weisen @code{mysql} an, es erneut auszuf�hren.

@item
Wenn Sie eine Anfrage haben, die eine gr��ere Ausgabe erzeugt, k�nnen Sie
die Ausgabe durch einen Pager laufen lassen, statt zuzusehen, wie Sie �ber
den Bildschirm flimmert:

@example
shell> mysql < stapel-datei | more
@end example

@item
F�r weitere Verarbeitung k�nnen Sie die Ausgabe auch in eine Datei lenken:

@example
shell> mysql < stapel-datei > mysql.ausgabe
@end example

@item
Sie k�nnen Ihr Skript an andere Leute verteilen, so dass auch sie die
Befehle laufen lassen k�nnen.

@item
In einigen Situationen ist interaktive Benutzung nicht angebracht, zum
Beispiel dann, wenn Sie eine Anfrage durch einen @code{cron}-Job ausf�hren
lassen. In diesem Fall brauchen Sie Stapelbetrieb.
@end itemize

Das Standard-Ausgabeformat ist anders (pr�ziser), wenn Sie @code{mysql} im
Stapelbetrieb laufen lassen, als wenn Sie es interaktiv nutzen. Die Ausgabe
von @code{SELECT DISTINCT art FROM pet} zum Beispiel sieht so aus, wenn Sie
sie interaktiv laufen lassen:

@example
+---------+
| art     |
+---------+
| Vogel   |
| Katze   |
| Hund    |
| Hamster |
| Schlange|
+---------+
@end example

Aber wie folgt, wenn sie im Stapelbetrieb l�uft:

@example
art
Vogel
Katze
Hund
Hamster
Schlange
@end example

Wenn Sie im Stapelbetrieb das interaktive Ausgabeformat haben wollen,
benutzen Sie @code{mysql -t}. Um die Befehle auszugeben, die ausgef�hrt
werden, benutzen Sie @code{mysql -vvv}.


@node Twin, Apache, Batch mode, Tutorial
@c German node Twin
@section Anfragen aus dem Zwillings-Projekt

@cindex Zwillingsforschung, Anfragen
@cindex Anfragen, Zwillingsforschungs-Projekt

Bei Analytikerna und Lentus haben wir die Systeme und die Feldarbeit f�r
ein gro�es Forschungsprojekt gemacht. Dieses Projekt ist eine
Zusammenarbeit zwischen dem Institut f�r Umweltmedizin des Karolinska
Institutes, Stockholm, und der Abteilung f�r klinische Forschung bei
Altersprozessen und Psychologie der University of Southern California.

Das Projekt beinhaltet einen Screening-Teil, bei dem alle Zwillinge in
Schweden, die �lter als 65 Jahre sind, per Telefon interviewt wurden.
Zwillinge, die bestimmte Kriterien erf�llen, werden im n�chsten Schritt
weiter untersucht. In diesem sp�teren Stadium werden Zwillinge, die
teilnehmen wollen, von einem Arzt-Schwester-Team besucht. Einige
Untersuchungen beinhalten physische und neuropsychologische Untersuchungen,
Labortests, Neuroimaging, Bewertungen des psychischen Zustands und eine
Sammlung der Familiengeschichten. Zus�tzlich werden Daten �ber medizinische
und umweltbedingte Risikofaktoren gesammelt.

Weitere Informationen zu den Zwillingsstudien finden Sie hier:

@example
@url{http://www.imm.ki.se/TWIN/TWINGREATBRITAINW.HTM}
@end example

Der sp�tere Teil des Projekts wird mit einer Web-Schnittstelle verwaltet,
die Perl und MySQL benutzt.

Jeden Abend werden alle Daten der Interviews in eine MySQL-Datenbank
verschoben.



@menu
* Twin pool::                   
* Twin event::                  
@end menu

@node Twin pool, Twin event, Twin, Twin
@c German node Twin-Pool
@subsection Alle nicht verteilten Zwillinge finden

Mit folgender Anfrage wird festgelegt, wer in den zweiten Teil des Projekts
geht:

@example
select
        concat(p1.id, p1.tvab) + 0 as tvid,
        concat(p1.christian_name, " ", p1.surname) as Name,
        p1.postal_code as Code,
        p1.city as City,
        pg.abrev as Area,
        if(td.participation = "Aborted", "A", " ") as A,
        p1.dead as dead1,
        l.event as event1,
        td.suspect as tsuspect1,
        id.suspect as isuspect1,
        td.severe as tsevere1,
        id.severe as isevere1,
        p2.dead as dead2,
        l2.event as event2,
        h2.nurse as nurse2,
        h2.doctor as doctor2,
        td2.suspect as tsuspect2,
        id2.suspect as isuspect2,
        td2.severe as tsevere2,
        id2.severe as isevere2,
        l.finish_date
from
        twin_project as tp
        /* For Twin 1 */
        left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
        left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
        left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
        left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
        /* For Twin 2 */
        left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
        left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
        left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
        left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
        person_data as p1,
        person_data as p2,
        postal_groups as pg
where
        /* p1 gets main twin and p2 gets his/her twin. */
        /* ptvab is a field inverted by tvab */
        p1.id = tp.id and p1.tvab = tp.tvab and
        p2.id = p1.id and p2.ptvab = p1.tvab and
        /* Just the sceening survey */
        tp.survey_no = 5 and
        /* Skip if partner died before 65 but allow emigration (dead=9) */
        (p2.dead = 0 or p2.dead = 9 or
         (p2.dead = 1 and
          (p2.sterbetag_date = 0 or
           (((to_days(p2.sterbetag_date) - to_days(p2.geburtstagday)) / 365)
            >= 65))))
        and
        (
        /* Twin is suspect */
        (td.future_contact = 'Yes' and td.suspect = 2) or
        /* Twin is suspect - Informant is Blessed */
        (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
        /* No twin - Informant is Blessed */
        (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - Informant is Blessed */
        (td.participation = 'Aborted'
         and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - No inform - Have partner */
        (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
        and
        l.event = 'Finished'
        /* Get at area code */
        and substring(p1.postal_code, 1, 2) = pg.code
        /* Not already distributed */
        and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
        /* Has not refused or been aborted */
        and not (h.status = 'Refused' or h.status = 'Aborted'
        or h.status = 'Died' or h.status = 'Other')
order by
        tvid;
@end example

Einige Erl�uterungen:
@table @asis
@item @code{concat(p1.id, p1.tvab) + 0 as tvid}
Wir wollen nach den verketteten @code{id} und @code{tvab} in numerischer
Reihenfolge sortieren. Indem wir @code{0} hinzuf�gen, bringen wir MySQL
dazu, das Ergebnis als Zahl zu behandeln.
@item Spalte @code{id}
Diese identifiziert ein Zwillingspaar. Sie ist in allen Tabellen Schl�ssel.
@item Spalte @code{tvab}
Diese identifiziert ein Zwillingspaar. Sie hat einen Wert von @code{1} oder
@code{2}.
@item Spalte @code{ptvab}
Sie ist die Umkehrung von @code{tvab}. Wenn @code{tvab} @code{1} ist, ist
sie @code{2}, und umgekehrt. Sie ist daf�r da, MySQL die Optimierung der
Anfrage zu erleichtern.
@end table
Diese Anfrage demonstriert unter anderem, wie man ein Nachschlagen (Lookup)
in einer Tabelle von derselben Tabelle aus mit einem Join durchf�hrt
(@code{p1} und @code{p2}). In dem Beispiel wird das dazu benutzt, um
festzustellen, ob der Partner eines Zwillings vor Erreichen des 65.
Lebensjahrs starb. Wenn das der Fall ist, wird die Zeile nicht
zur�ckgegeben.

Das Geschilderte existiert in allen Tabellen mit zwillingsbezogenen
Informationen. Wir haben einen Schl�ssel auf beide @code{id,tvab} (alle
Tabellen), und auf @code{id,ptvab} (@code{person_data}), um Anfragen
schneller zu machen.

Auf unserer Produktionsmaschine (einer 200MHz-UltraSPARC) gibt diese
Anfrage etwa 150 bis 200 Zeilen zur�ck und ben�tigt weniger als eine
Sekunde.

Die aktuelle Anzahl von Datens�tzen in den oben benutzten Tabellen:
@multitable @columnfractions .3 .5
@item @strong{Tabelle}          @tab @strong{Zeilen}
@item @code{person_data}        @tab 71074
@item @code{lentus}		@tab 5291
@item @code{twin_project}       @tab 5286
@item @code{twin_data}		@tab 2012
@item @code{informant_data}	@tab 663
@item @code{harmony}		@tab 381
@item @code{postal_groups}	@tab 100
@end multitable


@node Twin event,  , Twin pool, Twin
@c German node Twin-Ereignis
@subsection Eine Tabelle �ber den Zustand von Zwillingspaaren zeigen

Jedes Interview endet mit einem Statuscode, genannt @code{ereignis}. Die
unten stehende Anfrage wird benutzt, um eine Tabelle �ber alle
Zwillingspaare anzuzeigen, kombiniert mit dem Ereignis. Das zeigt an, wie
viele Paare beider Zwillingen im Zustand beendet sind, bei wie vielen
Paaren ein Zwilling im Zustand beendet ist, welche ein Interview abgelehnt
haben usw.

@example
select
        t1.event,
        t2.event,
        count(*)
from
        lentus as t1,
        lentus as t2,
        twin_project as tp
where
        /* We are looking at one pair at a time */
        t1.id = tp.id
        and t1.tvab=tp.tvab
        and t1.id = t2.id
        /* Just the sceening survey */
        and tp.survey_no = 5
        /* This makes each pair only appear once */
        and t1.tvab='1' and t2.tvab='2'
group by
        t1.event, t2.event;
@end example


@node Apache,  , Twin, Tutorial
@c German node Apache
@section MySQL mit Apache benutzen

@cindex Apache




Der Contrib-Abschnitt beinhaltet Programme, mit denen Sie Ihre Benutzer
durch eine MySQL-Datenbank authentifizieren k�nnen, und mit denen Sie Ihre
Logdateien in eine MySQL-Tabelle schreiben k�nnen. @xref{Contrib}.

Sie k�nnen das Log-Format von Apache so �ndern, dass es durch MySQL leicht
gelesen werden kann, indem Sie folgendes in die Apache-Konfigurationsdatei
schreiben:

@example
LogFormat \
        "\"%h\",%@{%Y%m%d%H%M%S@}t,%>s,\"%b\",\"%@{Content-Type@}o\",  \
        \"%U\",\"%@{Referer@}i\",\"%@{User-Agent@}i\""
@end example

In MySQL k�nnen Sie dann etwas wie das hier tun:

@example
LOAD DATA INFILE '/local/access_log' INTO TABLE tabelle
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
@end example


@node MySQL Database Administration, MySQL Optimisation, Tutorial, Top
@c German node MySQL-Datenbankadministration
@chapter MySQL-Datenbankadministration



@menu
* Configuring MySQL::           
* Privilege system::            
* User Account Management::     
* Disaster Prevention::         
* Database Administration::     
* Localisation::                
* Server-Side Scripts::         
* Client-Side Scripts::         
* Log Files::                   
* Replication::                 
@end menu

@node Configuring MySQL, Privilege system, MySQL Database Administration, MySQL Database Administration
@c German node MySQL konfigurieren
@section MySQL konfigurieren




@menu
* Command-line options::        
* Option files::                
* Installing many servers::     
* Multiple servers::            
@end menu

@node Command-line options, Option files, Configuring MySQL, Configuring MySQL
@c German node Kommandozeilenoptionen
@subsection mysqld-Kommandozeilenoptionen

@findex Kommandozeilenoptionen
@cindex Optionen, Kommandozeile
@cindex mysqld-Optionen

@code{mysqld} akzeptiert folgende Kommandozeilenoptionen:

@table @code
@item --ansi
ANSI-SQL-Syntax anstelle von MySQL-Syntax benutzen. @xref{ANSI mode}.

@item -b, --basedir=path
Pfad zum Installationsverzeichnis. Gew�hnlich werden alle Pfade relativ zu
diesem aufgel�st.

@item --big-tables
gro�e Ergebnismengen zulassen, indem alle tempor�ren Mengen in eine Datei
gesichert werden. Das l�st die meisten 'table full'-Fehler, verlangsamt
aber in den F�llen Anfragen, in denen Tabellen im Speicher ausreichen
w�rden. Ab Version 3.23.2 ist MySQL in der Lage, das automatisch zu l�sen,
indem f�r kleine tempor�re Tabellen der Arbeitsspeicher benutzt wird und
auf Festplatten-Tabellen umgeschaltet wird, wenn das n�tig ist.

@item --bind-address=IP
IP-Adresse zum Anbinden (bind).

@item --character-sets-dir=path
Verzeichnis, wo Zeichens�tze sind.  @xref{Character sets}.

@item --chroot=path
Chroot den @code{mysqld}-Daemon beim Start. Empfohlene
Sicherheitsma�nahme. Wird allerdings @code{LOAD DATA INFILE} und
@code{SELECT ... INTO OUTFILE} etwas einschr�nken.

@item --core-file
Schreibt eine Core-Datei, wenn @code{mysqld} stirbt. Auf manchen Systemen
m�ssen Sie zus�tzliche @code{--core-file-size} f�r @code{safe_mysqld}
angeben. @xref{safe_mysqld, ,@code{safe_mysqld}}.

@item -h, --datadir=path
Pfad zum Datenbank-Wurzelverzeichnis.

@item --default-character-set=charset
Setzt den vorgabem��igen Zeichensatz.  @xref{Character sets}.

@item --default-table-type=type
Setzt den vorgabem��igen Tabellentyp f�r Tabellen. @xref{Table types}.

@item --debug[...]=
Wenn MySQL mit @code{--with-debug} konfiguriert ist, k�nnen Sie diese
Option benutzen, um eine Trace-Datei dar�ber zu erhalten, was @code{mysqld}
tut. @xref{Making trace files}.

@item --delay-key-write-for-all-tables
Schl�sselpuffer (Key Buffer) f�r jegliche @code{MyISAM}-Tabellen nicht
leeren (flush).
@xref{Server parameters}.

@item --enable-locking
System-Sperren einschalten. Beachten Sie, dass Sie bei der Benutzung dieser
Option auf Systemen, die kein voll funktionsf�higes lockd() besitzen (wie
Linux), mysqld leicht zum Deadlock bringen k�nnen.

@item -T, --exit-info
Eine Bit-Maske verschiedener Flags, mit denen man den mysqld-Server
debuggen kann. Man sollte diese Option nicht benutzen, wenn man nicht ganz
genau wei�, was sie tut!

@item --flush
Alle �nderungen nach jedem SQL-Befehl auf Platte zur�ckschreiben (flush).
Normalerweise schreibt MySQL alle �nderungen nach jedem SQL-Befehl auf
Platte und l��t das Betriebssystem sich um das Synchronisieren auf Platte
k�mmern.
@xref{Crashing}.

@item -?, --help
Kurze Hilfe ausgeben und beenden.

@item --init-file=file
Beim Start SQL-Befehle aus dieser Datei lesen.

@item -L, --language=...
Client-Fehlermeldungen in der angegebenen Sprache. Kann als voller Pfad
angegeben werden. @xref{Languages}.

@item -l, --log[=datei]
Loggt Verbindungen und Anfragen in datei. @xref{Query log}.

@item --log-isam[=datei]
Loggt alle ISAM- / MyISAM-�nderungen in datei (wird nur benutzt, um ISAM /
MyISAM zu debuggen).

@item --log-slow-queries[=datei]
Loggt alle Anfragen, die l�nger als @code{long_query_time} Sekunden f�r die
Ausf�hrung ben�tigt haben, in datei. @xref{Slow query log}.

@item --log-update[=datei]
Loggt Updates in @code{datei.#}, wobei @code{#} eine eindeutige Zahl ist,
falls nicht vorgegeben.
@xref{Update log}.

@item --log-long-format
Loggt einige zus�tzliche Informationen ins Update-Log. Wenn Sie
@code{--log-slow-queries} benutzen, werden Anfragen, die keine Indexe
benutzen, in die Langsame-Anfragen-Log-Datei geloggt.

@item --low-priority-updates
Operationen, die Tabellen �ndern
(@code{INSERT}/@code{DELETE}/@code{UPDATE}), haben geringere Priorit�t als
Selects. Das kann auch mit @code{@{INSERT | REPLACE | UPDATE | DELETE@}
LOW_PRIORITY ...} durchgef�hrt werden, um lediglich die Priorit�t einer
einzelnen Anfrage zu verringern, oder mit @code{SET OPTION
SQL_LOW_PRIORITY_UPDATES=1}, um die Priorit�t in einem Thread zu �ndern.
@xref{Table locking}.

@item --memlock
Sperrt den @code{mysqld}-Prozess in den Arbeitsspeicher. Das funktioniert
nur, wenn Ihr System den @code{mlockall()}-Systemaufruf versteht (wie
Solaris). Das kann helfen, wenn Sie Probleme damit haben, dass Ihr
Betriebssystem @code{mysqld} veranlasst, auf Platte zu swappen.

@item --myisam-recover [=option[,option...]]], wobei option eine
Kombination von @code{DEFAULT}, @code{BACKUP}, @code{FORCE} oder
@code{QUICK} ist. Sie k�nnen sie auch explizit auf @code{""} setzen, wenn
Sie diese Option ausschalten wollen. Wenn die Option benutzt wird,
�berpr�ft @code{mysqld} beim �ffnen, ob die Tabelle als zerst�rt markiert
ist oder ob die Tabelle nicht ordnungsgem�� geschlossen wurde. (Die letzte
Option funktioniert nur, wenn Sie mysqld mit @code{--skip-locking} laufen
lassen). Wenn das der Fall ist, l��t @code{mysqld} eine �berpr�fung der
Tabelle laufen. Wenn die Tabelle besch�digt war, versucht @code{mysqld},
sie zu reparieren.

Folgende Optionen beeinflussen, wie repair funktioniert.

@multitable @columnfractions .3 .7
@item DEFAULT  @tab Dasselbe, als w�rde man f�r @code{--myisam-recover}
                    keine Option angeben.
@item BACKUP   @tab Wenn die Tabelle w�hrend der Wiederherstellung ge�ndert
                    wurde, eine Datensicherung der @file{tabelle.MYD}-Datendatei als
                    @file{tabelle-datetime.BAK} speichern.
@item FORCE    @tab Eine Wiederherstellung selbst dann laufen lassen, wenn
                    man mehr als eine Zeile aus der .MYD-Datei verlieren wird.
@item QUICK    @tab Die Zeilen der Tabelle nicht �berpr�fen, wenn es keine
                    gel�schten Blocks gibt.
@end multitable

Bevor eine Tabelle automatisch repariert wird, f�gt MySQL dar�ber eine
Bemerkung in das Fehler-Log. Wenn Sie in der Lage sein wollen, die meisten
Sachen ohne Benutzer-Intervention zu beheben, sollten Sie die Optionen
@code{BACKUP,FORCE} benutzen. Das erzwingt ein Reparieren einer Tabelle,
selbst wenn dabei einige Zeilen gel�scht w�rden, erh�lt aber die alte
Datendatei als Datensicherung, so dass Sie sp�ter herausfinden k�nnen, was
passiert ist.

@item --pid-file=pfad
Pfad zur pid-Datei, die von @code{safe_mysqld} benutzt wird.

@item -P, --port=...
Port-Nummer, um auf TCP/IP-Verbindungen zu warten (listen).

@item -o, --old-protocol
Das 3.20-Protokoll f�r Kompatibilit�t mit einigen sehr alten Clients
benutzen.

@item --one-thread
Nur einen Thread benutzen (zum Debuggen unter Linux). @xref{Debugging server}.

@item -O, --set-variable var=option
Weist einer Variablen einen Wert zu. @code{--help} listet Variablen auf.
Sie finden eine komplette Beschreibung aller Variablen im @code{SHOW
VARIABLES}-Abschnitt dieses Handbuchs. @xref{SHOW VARIABLES}. Der Abschnitt
�ber das Tunen der Serverparameter enth�lt Informationen dar�ber, wie man
diese optimiert. @xref{Server parameters}.

@item --safe-mode
Einige Optimierungsschritte �berspringen. Setzt
@code{--skip-delay-key-write} voraus.

@item --safe-show-database
Keine Datenbanken anzeigen, f�r die der Benutzer keine Zugriffsrechte hat.

@item --safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem
GRANT-Befehl anlegen, wenn der Benutzer kein @code{INSERT}-Zugriffsrecht
auf die @code{mysql.user}-Tabelle oder irgend welche Spalten dieser Tabelle
hat.

@item --skip-concurrent-insert
Die F�higkeit abschalten, gleichzeitig auf @code{MyISAM}-Tabellen
auszuw�hlen (select) und einzuf�gen (insert). (Sollte nur benutzt werden,
wenn Sie der Meinung sind, ein Bug in diesem Feature gefunden zu haben.)

@item --skip-delay-key-write
Die @code{delay_key_write}-Option f�r alle Tabellen ignorieren.
@xref{Server parameters}.

@item --skip-grant-tables
Diese Option veranlasst den Server, das Zugriffsrechte-System �berhaupt
nicht zu benutzen. Das gibt jedem @emph{vollen Zugriff} auf alle
Datenbanken! (Einen laufenden Server k�nnen Sie anweisen, die
Berechtigungstabellen erneut zu verwenden, indem Sie @code{mysqladmin
flush-privileges} oder @code{mysqladmin reload} ausf�hren.)

@item --skip-host-cache
Nie den Host-Name-Cache f�r schnellere Name-IP-Aufl�sung benutzen, sondern
statt dessen bei jeder Verbindung beim DNS-Server anfragen. @xref{DNS}.

@item --skip-locking
System-Sperren nicht benutzen. Um @code{isamchk} oder @code{myisamchk}
auszuf�hren, m�ssen Sie den Server herunter fahren. @xref{Stability}.
Beachten Sie, dass Sie in MySQL-Version 3.23 @code{REPAIR} und @code{CHECK}
benutzen k�nnen, um @code{MyISAM}-Tabellen zu reparieren / zu pr�fen.

@item --skip-name-resolve
Hostnamen werden nicht aufgel�st. Alle @code{Host}-Spaltenwerte in den
Berechtigungstabellen m�ssen IP-Nummern oder @code{localhost} sein.
@xref{DNS}.

@item --skip-networking
Auf �berhaupt keine TCP/IP-Verbindungen warten (listen). Jede Interaktion
mit @code{mysqld} muss �ber Unix-Sockets erfolgen. Diese Option wird
ausdr�cklich empfohlen f�r Systeme, auf denen nur lokale Anfragen
(Requests) erlaubt sind. @xref{DNS}.

@item --skip-new
Keine neuen, m�glicherweise falschen Routinen benutzen. Setzt
@code{--skip-delay-key-write} voraus. Setzt ausserdem den vorgabem��igen
Tabellentyp auf @code{ISAM}. @xref{ISAM}.

@item --skip-symlink
Keine Dateien l�schen oder umbenennen, auf die eine mit Symlink verkn�pfte
Datei im Daten-Verzeichnis zeigt.

@item --skip-safemalloc
Wenn MySQL mit @code{--with-debug=full} konfiguriert wird, �berpr�fen alle
Programme den Arbeitsspeicher auf �berlauf, bei jeder Speicher-Allokation
und -Freigabe. Da dieses Pr�fen sehr langsam ist, k�nnen Sie es vermeiden,
wenn Sie keine Arbeitsspeicherpr�fung ben�tigten, indem Sie diese Option
benutzen.

@item --skip-show-database
Keine 'SHOW DATABASE'-Befehle zulassen, wenn der Benutzer keine
@strong{process}-Berechtigung hat.

@item --skip-stack-trace
Keine Stack-Traces schreiben. Diese Option ist n�tzlich, wenn Sie
@code{mysqld} unter einem Debugger laufen lassen. @xref{Debugging server}.

@item --skip-thread-priority
Benutzung von Thread-Priorit�ten abschalten, um schnellere Antwortzeiten zu
erzielen.

@item --socket=pfad
Socket-Datei, die anstelle des vorgabem��igen @code{/tmp/mysql.sock} f�r
lokale Verbindungen benutzt wird.

@item --sql-mode=option[,option[,option...]]
Option kann jede beliebige Kombination von @code{REAL_AS_FLOAT},
@code{PIPES_AS_CONCAT}, @code{ANSI_QUOTES}, @code{IGNORE_SPACE},
@code{SERIALIZE} und @code{ONLY_FULL_GROUP_BY} sein. Sie kann auch leer
sein (@code{""}), wenn Sie dies zur�cksetzen wollen.

Alle oben angegebenen Optionen festlegen ist dasselbe wie --ansi benutzen.
Mit dieser Option kann man nur ben�tigte SQL-Modi anschalten.
@xref{ANSI mode}.

@item transaction-isolation= @{ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE @}
Setzt das vorgabem��ige Transaktions-Isolations-Level.
@c German FIX unsplit @xref
@xref{SET TRANSACTION}.

@item -t, --tmpdir=pfad
Pfad f�r tempor�re Dateien. Es kann n�tzlich sein, wenn Ihr vorgabem��iges
@code{/tmp}-Verzeichnis auf einer Partition liegt, die zu klein ist, um
tempor�re Tabellen zu speichern.

@item -u, --user=benutzername
Den @code{mysqld}-Daemon unter dem Benutzer @code{benutzername} laufen
lassen. Diese Option ist @emph{zwingend notwendig}, wenn @code{mysqld} als
Root gestartet wird.

@item -V, --version
Versionsinformationen ausgeben und beenden.

@item -W, --warnings
Warnmeldungen wie @code{Aborted connection...} in die @code{.err}-Datei
ausgeben. @xref{Communication errors}.
@end table


@node Option files, Installing many servers, Command-line options, Configuring MySQL
@c German node Optionsdateien
@subsection my.cnf-Optionsdateien

@cindex Vorgabem��ige Optionen
@cindex Optionsdateien
@cindex Erzeugen, vorgabem��ige Startoptionen
@cindex Startoptionen, vorgabem��ige

Seit Version 3.22 kann MySQL vorgabem��ige Startoptionen f�r den Server
und f�r Clients aus Optionsdateien lesen.

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Unix:

@tindex .my.cnf-Datei
@multitable @columnfractions .3 .7
@item @strong{Dateiname} @tab @strong{Zweck}
@item @code{/etc/my.cnf} @tab Globale Optionen
@item @code{DATADIR/my.cnf} @tab Server-spezifische Optionen
@item @code{defaults-extra-file} @tab Die Datei, die mit --defaults-extra-file=# festgelegt wird
@item @code{~/.my.cnf} @tab Benutzerspezifische Optionen
@end multitable

@code{DATADIR} ist das MySQL-Daten-Verzeichnis (typischerweise
@file{/usr/local/mysql/data} bei einer Bin�rinstallation oder
@file{/usr/local/var} bei einer Quellinstallation). Beachten Sie, dass das
das Verzeichnis ist, das zur Konfigurationszeit festgelegt wurde, nicht
das, das mit @code{--datadir} festgelegt wird, wenn @code{mysqld} startet!
(@code{--datadir} hat keinen Einfluss darauf, wo der Server nach
Optionsdateien sucht, denn er sucht nach ihnen, bevor er irgend welche
Kommandozeilenargumente verarbeitet.)

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Windows:

@multitable @columnfractions .3 .7
@item @strong{Dateiname} @tab @strong{Zweck}
@item @code{Windows-System-Verzeichnis\my.ini} @tab Globale Optionen
@item @code{C:\my.cnf} @tab Globale Optionen
@item @code{C:\mysql\data\my.cnf} @tab Server-spezifische Optionen
@end multitable

Beachten Sie, dass Sie unter Windows alle Pfade mit @code{/} statt mit
@code{\} angeben sollten. Wenn Sie @code{\} benutzen, m�ssen Sie das
doppelt (@code{\\}) tun, weil @code{\} in MySQL das Fluchtzeichen
(Escape-Character) ist.

@cindex Umgebungsvariablen
MySQL versucht, Optionsdateien in der oben angegebenen Reihenfolge zu
lesen. Wenn es mehrere Optionsdateien gibt, erlangt eine Option, die in
einer Datei festgelegt wird, die sp�ter gelesen wird, Vorrang �ber dieselbe
Option, die in einer sonstigen Optionsdatei festgelegt wurde. Optionen, die
auf der Kommandozeile festgelegt werden, erlangen Vorrang vor Optionen in
jeglichen Optionsdateien. Einige Optionen k�nnen durch Umgebungsvariablen
festgelegt werden. Optionen, die auf der Kommandozeile oder in
Optionsdateien festgelegt werden, haben Vorrang vor Werten in
Umgebungsvariablen. @xref{Environment variables}.
Folgende Programme unterst�tzen Optionsdateien:  @code{mysql},
@code{mysqladmin}, @code{mysqld}, @code{mysqldump}, @code{mysqlimport},
@code{mysql.server}, @code{myisamchk} und @code{myisampack}.

Sie k�nnen Optionsdateien benutzen, um jede beliebig lange Option
festzulegen, die ein Programm unterst�tzt! Starten Sie das Programm mit
@code{--help}, um eine Liste der verf�gbaren Optionen zu erhalten.

Eine Optionsdatei kann Zeilen der folgenden Formate enthalten:

@table @code
@item #Kommentar
Kommentarzeilen fangen mit @samp{#} oder @samp{;} an. Leere Zeilen werden
ignoriert.

@item [group]
@code{group} ist der Name des Programms oder der Gruppe, f�r das oder die
Sie Optionen setzen wollen. Nach einer Gruppen-Zeile beziehen sich alle
@code{option}- oder @code{set-variable}-Zeilen auf die benannte Gruppe, bis
zum Ende der Optionsdatei oder bis eine andere Gruppe angegeben wird.

@item option
Das ist �quivalent zu @code{--option} auf der Kommandozeile.

@item option=value
Das ist �quivalent zu @code{--option=value} auf der Kommandozeile.

@item set-variable = variable=value
Das ist �quivalent zu @code{--set-variable variable=value} auf der Kommandozeile.
Diese Syntax muss verwendet werden, um eine @code{mysqld}-Variable zu
setzen.
@end table

Die @code{client}-Gruppe gestattet Ihnen, Optionen anzugeben, die sich auf
alle MySQL-Clients (nicht auf @code{mysqld}) beziehen. Diese Gruppe eignet
sich bestens daf�r, das Passwort festzulegen, das Sie benutzen, um sich mit
dem Server zu verbinden. (Stellen Sie jedoch sicher, dass die Optionsdatei
nur f�r Sie les- und schreibbar ist.)

Beachten Sie, dass bei Optionen und Werten alle f�hrenden Leerzeichen und
solche am Zeilenende automatisch entfernt werden. Sie k�nnen in der
Zeichenkette f�r den Wert die Escape-Sequenzen @samp{\b}, @samp{\t},
@samp{\n}, @samp{\r}, @samp{\\} und @samp{\s} benutzen (@samp{\s} ist das
Leerzeichen).

Hier ist eine typische globale Optionsdatei:

@example
[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer_size=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick
@end example

Hier ist eine typische Benutzer-Optionsdatei:

@example
[client]
# Folgendes Passwort wird an alle Standard-MySQL-Clients geschickt:
password=mein_password

[mysql]
no-auto-rehash
set-variable = connect_timeout=2

[mysqlhotcopy]
interactive-timeout

@end example

@tindex .my.cnf Datei
Wenn Sie eine Quelldistribution haben, finden Sie Beispielkonfigurationen
in den Dateien mit Namen @file{my-xxxx.cnf} im
@file{Support-files}-Verzeichnis. Wenn Sie eine Bin�rdistribution haben,
suchen Sie im @file{DIR/support-files}-Verzeichnis, wobei @code{DIR} der
Pfadname zum MySQL-Installationsverzeichnis ist (typischerweise
@file{/usr/local/mysql}). Aktuell finden Sie dort beispielhafte
Konfigurationsdateien f�r kleine, mittlere, gro�e und sehr gro�e Systeme.
Sie k�nnen @file{my-xxxx.cnf} in Ihr Heimatverzeichnis kopieren, um damit
zu experimentieren (benennen Sie die Kopie in @file{.my.cnf} um).

Alle MySQL-Clients, die Optionsdateien unterst�tzen, unterst�tzen folgende
Optionen:

@multitable @columnfractions .40 .60
@item --no-defaults @tab Keine Optionsdateien einlesen.
@item --print-defaults @tab Den Programmnamen und alle Optionen, die das Programm erhalten wird, ausgeben.
@item --defaults-file=voller-pfad-zur-vorgabe-datei @tab Nur die angegebene Konfigurationsdatei benutzen.
@item --defaults-extra-file=voller-pfad-zur-vorgabe-datei @tab Diese Konfigurationsdatei nach der globalen Konfigurationsdatei einlesen, aber vor der Benutzer-Konfigurationsdatei.
@end multitable

Beachten Sie, dass die oben aufgef�hrten Optionen auf der Kommandozeile
zuerst angegeben werden m�ssen, damit sie funktionieren!
@code{--print-defaults} kann jedoch direkt nach den
@code{--defaults-xxx-file}-Befehlen angegeben werden.

Hinweis f�r Entwickler: Optionsdatei-Handhabung ist schlicht dadurch
implementiert, dass alle �bereinstimmenden Optionen verarbeitet werden
(das hei�t, Optionen in der entsprechenden Gruppe), vor jeglichen
Kommandozeilen-Argumenten. Das funktioniert sehr gut bei Programmen, die
die letzte Instanz einer Option benutzen, die mehrfach festgelegt wurde.
Wenn Sie ein altes Programm benutzen, das mehrfach festgelegte Optionen auf
diese Art handhabt, aber keine Optionsdateien liest, m�ssen Sie nur zwei
Zeilen hinzuf�gen, um diese F�higkeit hinzuzuf�gen. Sehen Sie im Quellcode
irgend eines Standard-MySQL-Clients nach, wie das gemacht wird.

In Shellskripts k�nnen Sie den @file{my_print_defaults}-Befehl benutzen, um
die Konfigurationsdateien zu parsen:

@example

shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash
@end example

Die Ausgabe enth�lt alle Optionen f�r die Gruppen 'client' und 'mysql'.


@node Installing many servers, Multiple servers, Option files, Configuring MySQL
@c German node Viele Server installieren
@subsection Viele Server auf derselben Maschine installieren

@cindex Nach der Installation, mehrere Server
@cindex Mehrere Server installieren
@cindex Mehrere Server starten

In einigen F�llen brauchen Sie vielleicht viele verschiedene
@code{mysqld}-Daemons (Server), die auf derselben Maschine laufen.
Beispielsweise wollen Sie eine neue MySQL-Version zum Testen benutzen,
w�hrend gleichzeitig eine alte Version f�r die Produktion l�uft, oder Sie
wollen verschiedenen Benutzern Zugriff auf verschiedene
@code{mysqld}-Server geben, die sie selbst verwalten.

Eine M�glichkeit, einen neuen Server laufen zu lassen, besteht darin, ihn
mit einem anderen Socket und einem anderen Port wie folgt zu starten:

@tindex @code{MYSQL_UNIX_PORT}-Umgebungsvariable
@tindex @code{MYSQL_TCP_PORT}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_UNIX_PORT}
@tindex Umgebungsvariable, @code{MYSQL_TCP_PORT}
@example
shell> MYSQL_UNIX_PORT=/tmp/mysqld-neu.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &
@end example

Der Umgebungsvariablen-Appendix beinhaltet eine Liste anderer
Umgebungsvariablen, die Sie benutzen k�nnen, um @code{mysqld} zu steuern.
@xref{Environment variables}.

Der oben gezeigte Weg ist die 'schnelle und schmutzige' L�sung, die man
�blicherweise zum Testen benutzt. Das nette daran ist, dass alle
Verbindungen, die Sie in obiger Shell aufbauen, automatisch an den neuen
laufenden Server weiter geleitet werden!

Wenn Sie dasselbe dauerhafter durchf�hren wollen, sollten Sie f�r jeden
Server eine Optionsdatei erzeugen. @xref{Option files}. In Ihrem
Startskript, das beim Hochfahren ausgef�hrt wird (mysql.server?) sollten
Sie f�r beide Server folgendes festlegen:

@code{safe_mysqld --default-file=pfad-zur-optionsdatei}

Zumindest folgende Optionen sollten f�r jeden Server unterschiedlich sein:

@table @code
@item port=#
@item socket=pfad
@item pid-file=pfad
@end table

Folgende Optionen sollten unterschiedlich sein, wenn sie benutzt werden:

@table @code
@item log=pfad
@item log-bin=pfad
@item log-update=pfad
@item log-isam=pfad
@item bdb-logdir=pfad
@end table

Wenn Sie mehr Performance erreichen wollen, k�nnen Sie auch folgendes
unterschiedlich festlegen:

@table @code
@item tmpdir=pfad
@item bdb-tmpdir=pfad
@end table

@xref{Command-line options}.

Wenn Sie bin�re MySQL-Versionen installieren (.tar-Dateien) und sie mit
@code{./bin/safe_mysqld} starten, m�ssen Sie in den meisten F�llen
lediglich die @code{socket}- und @code{port}-Argumente in
@code{safe_mysqld} hinzuf�gen / �ndern.




@node Multiple servers,  , Installing many servers, Configuring MySQL
@c German node Mehrere Server
@subsection Viele MySQL-Server auf derselben Maschine laufen lassen

@cindex Mehrere Server
@cindex Servers, mehrere
@cindex Laufen lassen, mehrere Server

Unter bestimmten Umst�nden wollen Sie vielleicht mehrere Server auf
derselben Maschine laufen lassen. Beispielsweise wollen Sie ein neues
MySQL-Release testen, Ihre bestehende Produktionseinrichtung aber
unangetastet lassen. Oder Sie sind ein Internet-Service-Provider, der
unabh�ngige MySQL-Installationen f�r verschiedene Kunden hat.

Wenn Sie mehrere Server laufen lassen wollen, ist es am einfachsten, die
Server mit unterschiedlichen TCP/IP-Ports und Socket-Dateien laufen zu
lassen, damit sie nicht beide auf demselben TCP/IP-Port oder derselben
Socket-Datei auf Verbindungen warten. @xref{mysqld_multi, ,
@code{mysqld_multi}}.

Nehmen wir einen existierenden Server an, der auf die existierende
Port-Nummer und Socket-Datei konfiguriert ist. Sie konfigurieren einen
neuen Server mit einem @code{configure}-Befehl, etwa wie folgt:

@example
shell> ./configure  --with-tcp-port=port_nummer \
             --with-unix-socket-path=datei \
             --prefix=/usr/local/mysql-3.22.9
@end example

Hier m�ssen @code{port_nummer} und @code{datei} anders als die
vorgabem��igen Werte sein. Der @code{--prefix}-Wert sollte ein
Installationsverzeichnis festlegen, das anders ist als dasjenige, unter dem
die existierende MySQL-Installation liegt.

Sie k�nnen den Socket, der vom aktuell laufenden MySQL-Server benutzt wird,
mit folgendem Befehl feststellen:

@example
shell> mysqladmin -h hostname --port=port_nummer variables
@end example

Wenn Sie ``@code{localhost}'' als Hostnamen festlegen, benutzt
@code{mysqladmin} Unix-Sockets anstelle von TCP/IP.

Wenn Sie einen MySQL-Server auf dem Port laufen haben, den Sie benutzt
haben, bekommen Sie eine Liste der wichtigsten konfigurierbaren Variablen
in MySQL, inklusive des Socketnamens.

Sie m�ssen keinen neuen MySQL-Server kompilieren, nur um ihn mit einem
anderen Port und Socket zu starten. Sie k�nnen Port und Socket zur Laufzeit
als Optionen von @code{safe_mysqld} festlegen:

@example
shell> /pfad/zu/safe_mysqld --socket=datei --port=port_nummer
@end example

@code{mysqld_multi} kann ebenfalls @code{safe_mysqld} (oder @code{mysqld})
als Argument nehmen und die Optionen von einer Konfigurationsdatei an
@code{safe_mysqld} und weiter an @code{mysqld} durchreichen.

Wenn Sie den neuen Server mit demselben Datenbankverzeichnis laufen lassen
und Loggen angeschaltet haben, sollten Sie auch den Namen der Logdateien
f�r @code{safe_mysqld} mit @code{--log}, @code{--log-update} oder
@code{--log-slow-queries} festlegen. Ansonsten versuchen beide Server, in
dieselbe Logdatei zu schreiben.

@strong{ACHTUNG}: Normalerweise sollten Sie nie zulassen, dass zwei Server
Daten in derselben Datenbank aktualisieren! Wenn Ihr Betriebssystem kein
fehlerfreies System-Sperren (System Locking) unterst�tzt, f�hrt das zu
unliebsamen �berraschungen!

Wenn Sie f�r den zweiten Server ein anderes Datenbankverzeichnis benutzen
wollen, k�nnen Sie das mit der @code{--datadir=path}-Option f�r
@code{safe_mysqld} angeben.

@strong{HINWEIS:} Mehrere MySQL-Server (@code{mysqld}) auf verschiedenen
Maschinen laufen lassen, die auf ein gemeinsames Datenverzeichnis �ber
@code{NFS} zugreifen, ist generell eine @strong{SCHLECHTE IDEE}! Das
Problem liegt darin, dass @code{NFS} zum Flaschenhals in Punkto
Geschwindigkeit wird, denn es ist nicht f�r solche Zwecke gedacht. Und
letztlich m�ssten Sie immer noch eine L�sung daf�r finden, dass sich zwei
oder mehr @code{mysqlds} nicht in die Quere kommen. Momentan gibt es keine
Plattform, die mit 100%-iger Zuverl�ssigkeit Datei-Sperren (File Locking,
gew�hnlich mit dem @code{lockd}-Daemon) in jeder Situation durchf�hrt.
Dennoch stellt @code{NFS} ein weiteres m�gliches Risiko dar, denn es macht
es dem @code{lockd}-Daemon noch schwieriger, Datei-Sperren zu handhaben.
Machen Sie es sich also leicht und vergessen Sie diese Idee! Die
funktionierende L�sung ist, einen Computer mit einem Betriebssystem
einzusetzen, dass Threads effizient handhabt und mehrere Prozessoren hat.

Wenn Sie sich mit einem MySQL-Server verbinden wollen, der mit einem
anderen Port l�uft als mit dem, der in Ihren Client kompiliert ist, k�nnen
Sie folgende Methoden benutzen:

@itemize @bullet
@item
Starten Sie den Client mit @code{--host 'hostname' --port=port_nummer}, um
sich �ber TCP/IP zu verbinden, oder mit @code{[--host localhost]
--socket=datei}, um sich �ber ein Unix-Socket zu verbinden.

@item
In Ihren C- oder Perl-Programmen k�nnen Sie die Port- oder Socket-Argumente
angeben, wenn Sie sich mit dem MySQL-Server verbinden.

@item
Wenn Sie das Perl-@code{DBD::mysql}-Modul benutzen, k�nnen Sie die Optionen
aus den MySQL-Optionsdateien lesen. @xref{Option files}.

@example
$dsn = "DBI:mysql:test;mysql_read_default_group=client;mysql_read_default_file=/usr/local/mysql/data/my.cnf"
$dbh = DBI->connect($dsn, $user, $password);
@end example

@item
@tindex MYSQL_UNIX_PORT-Umgebungsvariable
@tindex MYSQL_TCP_PORT-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_UNIX_PORT
@tindex Umgebungsvariable, MYSQL_TCP_PORT
Setzen Sie die @code{MYSQL_UNIX_PORT}- und
@code{MYSQL_TCP_PORT}-Umgebungsvariablen, so dass sie auf den Unix-Socket
und TCP/IP-Port zeigen, bevor Sie Ihre Clients starten. Wenn Sie
normalerweise eine speziellen Socket oder Port benutzen, sollten Sie die
Befehle zum Setzen dieser Umgebungsvariablen in Ihrer @file{.login}-Datei
unterbringen.
@xref{Environment variables}.

@item
@tindex .my.cnf Datei
Legen Sie den vorgabem��igen Socket und TCP/IP-Port in der
@file{.my.cnf}-Datei in Ihrem Heimatverzeichnis fest.
@xref{Option files}.
@end itemize


@node Privilege system, User Account Management, Configuring MySQL, MySQL Database Administration
@c German node Berechtigungssystem
@section Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem

@cindex System, Sicherheit
@cindex Zugriffsberechtigungen
@cindex Berechtigungen, Zugriff
@cindex Sicherheitssystem
@cindex ACLs

MySQL hat ein fortgeschrittenes, aber nicht standardisiertes Sicherheits-
bzw. Berechtigungssystem. Dieser Abschnitt beschreibt, wie es funktioniert.



@menu
* General security::            
* Security::                    
* Privileges options::          
* What Privileges::             
* Privileges::                  
* Privileges provided::         
* Connecting::                  
* Connection access::           
* Request access::              
* Access denied::               
@end menu

@node General security, Security, Privilege system, Privilege system
@c German node Allgemeine Sicherheitsrichtlinien
@subsection Allgemeine Sicherheitsrichtlinien

Jeder, der MySQL auf einem Computer benutzt, der mit dem Internet verbunden
ist, sollte diesen Abschnitt lesen, um die gebr�uchlichsten
Sicherheitsfehler zu vermeiden.

Wenn wir �ber Sicherheit sprechen, unterstreichen wir die Notwendigkeit,
den gesamten Server-Host (und nicht nur den MySQL-Server) gegen alle Arten
m�glicher Angriffe abzusichern: Lauschangriffe, �nderungen (Altering),
Playback und Dienstverweigerung (Denial of Service). Dieser Abschnitt deckt
nicht alle Aspekte von Verf�gbarkeit und Fehlertoleranz ab.

MySQL benutzt ein Sicherheitssystem, das auf Zugriffssteuerungslisten
(Access Control Lists, ACLs) f�r alle Verbindungen, Anfragen und sonstige
Operationen basiert, die ein Benutzer durchf�hren kann. Zus�tzlich gibt es
einige Unterst�tzung f�r SSL-verschl�sselte Verbindungen zwischen
MySQL-Clients und -Servern. Viele der hier geschilderten Konzepte sind
�berhaupt nicht spezifisch f�r MySQL, sondern beziehen sich auf fast alle
Applikationen.

Wenn Sie MySQL laufen lassen, sollten Sie m�glichst immer folgende
Richtlinien beachten:

@itemize @bullet
@item
GEBEN SIE NIEMALS JEMANDEM AUSSER DEM MySQL-ROOT-BENUTZER ZUGRIFF AUF DIE
@code{user}-TABELLE IN DER @code{mysql}-DATENBANK! Das verschl�sselte
Passwort ist das echte Passwort in MySQL. Wenn Sie das in der the
@code{user}-Tabelle aufgef�hrte Passwort f�r einen gegebenen Benutzer
kennen, k�nnen Sie sich leicht als dieser Benutzer einloggen, wenn Sie
Zugriff auf den Host haben, der f�r dieses Benutzerkonto aufgef�hrt ist.

@item
Lernen Sie das MySQL-Zugriffsberechtigungssystem. Die @code{GRANT}- und 
@code{REVOKE}-Befehle werden benutzt, um den Zugriff auf MySQL zu steuern.
Gew�hren Sie nicht mehr Zugriffsrechte als notwendig. Gew�hren Sie niemals
Zugriffsrechte f�r alle Hosts.

Checkliste:
@itemize @minus
@item
Probieren Sie @code{mysql -u root}. Wenn es Ihnen gelingt, sich erfolgreich
mit dem Server zu verbinden, ohne nach einem Passwort gefragt zu werden,
haben Sie ein Problem, denn jeder kann sich als MySQL-@code{root}-Benutzer
mit dem Server verbinden und hat volle Berechtigungen! Lesen Sie in diesem
Fall noch einmal die MySQL-Installationsanweisungen durch und achten Sie
insbesondere auf den Teil, der sich mit dem Setzen des
@code{root}-Passworts besch�ftigt.
@item
Benutzen Sie den Befehl @code{SHOW GRANTS} und pr�fen Sie nach, wer Zugriff
auf was hat. Entfernen Sie die Berechtigungen, die nicht notwendig sind,
indem Sie den @code{REVOKE}-Befehl benutzen.
@end itemize
@item
Halten Sie keine Klartext-Passw�rter in Ihrer Datenbank. Wenn Ihr Computer
kompromittiert wird, kann der Einbrecher die gesamte Liste von Passw�rtern
nehmen und benutzen. Benutzen Sie statt dessen @code{MD5()} oder eine
andere Einweg-Hash-Funktion.
@item
Benutzen Sie keine Passw�rter aus Lexika. Es gibt spezielle Programme, um
diese zu knacken. Selbst Passw�rter wie ``xfish98'' sind sehr schlecht.
Viel besser ist ``duag98'', was dasselbe Wort ``fish'' enth�lt, aber um
eine Taste nach links auf einer QUERTZ-Tastatur verschoben. Eine weitere
Methode ist, etwas wie ``Mhall'' zu benutzen, was die ersten Buchstaben des
Satzes ``Mary had a little lamb'' enth�lt. Das l��t sich leicht merken und
eintippen, aber schwierig durch jemanden erraten, der es nicht kennt.
@item
Investieren Sie in eine Firewall. Diese sch�tzt sie vor mindestens 50%
aller Exploits in jeglicher Software. Installieren Sie MySQL hinter einer
Firewall oder in einer entmilitarisierten Zone (Demilitarized Zone, DMZ).

Checkliste:
@itemize @minus
@item
Versuchen Sie, Ihre Ports vom Internet aus zu scannen, indem Sie ein Werkzeug
wie @code{nmap} benutzen. MySQL benutzt vorgabem��ig Port 3306. Dieser
Port sollte von nicht vertrauensw�rdigen Hosts aus unerreichbar sein. Eine
weitere einfache Methode, um zu �berpr�fen, ob Ihr MySQL-Port offen ist
oder nicht, ist, den folgenden Befehl von einer entfernten Maschine aus zu
benutzen, wobei @code{server_host} der Hostname Ihres MySQL-Servers ist:

@example
shell> telnet server_host 3306
@end example

Wenn Sie eine Verbindung und einige sinnlose Zeichen erhalten, ist der Port
offen und sollte auf Ihrer Firewall oder Ihrem Router geschlossen werden,
sofern Sie nicht einen wirklich guten Grund haben, ihn offen zu halten.
Wenn @code{telnet} einfach h�ngt oder die Verbindung abgelehnt wird, ist
alles in Ordnung, der Port ist blockiert.
@end itemize

@item
Trauen Sie keinen Daten, die von Benutzern eingegeben werden. Sie k�nnen
versuchen, Ihren Code auszutricksen, indem Sie spezielle oder escapete
Zeichenfolgen in Web-Formulare, URLs oder sonstige Applikationen, die Sie
hergestellt haben, eingeben. Stellen Sie sicher, dass Ihre Applikation
sicher bleibt, wenn ein Benutzer etwas wie ``@code{; DROP DATABASE
mysql;}'' eingibt. Das ist ein extremes Beispiel, aber gro�e
Sicherheitsl�cken und Datenverlust k�nnen eintreten, wenn ein Hacker
�hnliche Techniken benutzt und Sie nicht darauf vorbereitet sind.

Denken Sie auch daran, numerische Daten zu �berpr�fen. Ein h�ufiger Fehler
besteht darin, nur Zeichenketten zu sch�tzen. Manchmal denken Leute, dass
eine Datenbank, die nur �ffentlich zug�ngliche Daten enth�lt, nicht
gesch�tzt werden muss. Das stimmt nicht. Auf solche Datenbanken k�nnen
zumindest Dienstverweigerungsangriffe (Denial-of-Service-Attacken)
durchgef�hrt werden. Die einfachste Art, sich vor dieser Art von Angriffen
zu sch�tzen, ist, Apostrophe um numerische Konstanten herum zu benutzen:
@code{SELECT * FROM tabelle WHERE ID='234'} statt @code{SELECT * FROM
tabelle WHERE ID=234}. MySQL wandelt diese Zeichenkette automatisch in eine
Zahl um und entfernt alle nicht-numerischen Zeichen aus ihr.

Checkliste:
@itemize @minus
@item
Alle Web-Applikationen:
@itemize @bullet
@item
Versuchen Sie, @samp{'} und @samp{"} in alle Ihr Web-Formulare einzugeben.
Wenn Sie irgend welche MySQL-Fehler erhalten, untersuchen Sie das Problem
unverz�glich!
@item
Versuchen Sie, jedwede dynamischen URLs zu �ndern, indem Sie @code{%22}
(@samp{"}), @code{%23} (@samp{#}) und @code{%27} (@samp{'}) zu den URLs
hinzuf�gen.
@item
Versuchen Sie, Datentypen in dynamischen URLs von numerischen zu
Zeichentypen zu �ndern, die Zeichen aus den vorherigen Beispielen
enthalten. Ihre Applikation sollte gegen solche und �hnliche Angriffe
sicher sein.
@item
Versuchen Sie Buchstaben, Leerzeichen und Sonderzeichen anstelle von Zahlen
in numerische Felder einzugeben. Ihre Applikation sollte diese entfernen,
bevor sie sie MySQL �bergibt, und Ihre Applikation sollte einen Fehler
erzeugen. Es ist sehr gef�hrlich, nicht gepr�fte Werte an MySQL zu
�bergeben!
@item
�berpr�fen Sie Datengr��en, bevor Sie sie an MySQL �bergeben.
@item
�berlegen Sie, ob es sinnvoll ist, dass sich Ihre Applikation mit einem
anderen Benutzernamen mit der Datenbank verbindet als mit dem, den Sie f�r
Verwaltungszwecke benutzen. Geben Sie Applikationen nicht mehr
Zugriffsberechtigungen als sie brauchen.
@end itemize
@item
Benutzer von PHP:
@itemize @bullet
@item Sehen Sie sich die @code{addslashes()}-Funktion an.
Ab PHP 4.0.3 ist eine @code{mysql_escape_string()}-Funktion verf�gbar, die
auf der Funktion mit demselben Namen in der MySQL-C-API basiert.
@end itemize
@item
Benutzer der MySQL-C-API:
@itemize @bullet
@item Sehen Sie sich den @code{mysql_escape_string()}-API-Aufruf an.
@end itemize
@item
Benutzer von MySQL++:
@itemize @bullet
@item Sehen Sie sich die @code{escape}- und @code{quote}-Modifier f�r
Query-Streams an.
@end itemize
@item
Benutzer der Perl-DBI:
@itemize @bullet
@item Sehen Sie sich die @code{quote()}-Methode an oder benutzen Sie
Platzhalter.
@end itemize
@item
Benutzer von Java-JDBC:
@itemize @bullet
@item Benutzen Sie ein @code{PreparedStatement}-Objekt und Platzhalter.
@end itemize
@end itemize

@item
�bermitteln Sie keine Klartextdaten (unverschl�sselte Daten) �ber das
Internet. Diese Daten sind f�r jeden zug�nglich, der Zeit und M�glichkeit
hat, sie abzuh�ren und sie f�r die eigenen Zwecke zu benutzen. Benutzen Sie
statt dessen ein verschl�sseltes Protokoll wie SSL oder SSH. MySQL
unterst�tzt ab Version 4.0.0 interne SSL-Verbindungen.
SSH-Port-Forwarding kann benutzt werden, um einen verschl�sselten (und
komprimierten) Kommunikationstunnel zu erzeugen.
@item
Lernen Sie die Benutzung der @code{tcpdump}- und @code{strings}-Utilities.
In den meisten F�llen k�nnen Sie mit einem Befehl wie dem folgenden
feststellen, ob MySQL-Datenstr�me verschl�sselt sind oder nicht:

@example
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
@end example

(Das funktioniert unter Linux und sollte mit kleineren �nderungen auf
anderen Systemen funktionieren.) Achtung: Wenn Sie keine Daten sehen,
hei�t das nicht immer, dass sie verschl�sselt sind. Wenn Sie hohe
Sicherheit ben�tigen, sollten Sie sich mit einem Sicherheitsexperten in
Verbindung setzen.
@end itemize


@node Security, Privileges options, General security, Privilege system
@c German node Sicherheit
@subsection Wie Sie MySQL gegen Cracker sicher machen

@cindex Cracker, Sicherheit gegen
@cindex Sicherheit, gegen Cracker

Wenn Sie sich mit einem MySQL-Server verbinden, sollten Sie normalerweise
ein Passwort benutzen. Das Passwort wird nicht als Klartext �ber die
Verbindung �bermittelt. Allerdings ist der Verschl�sselungsalgorithmus
nicht sehr stark, so dass ein cleverer Angreifer mit einiger M�he das
Passwort knacken kann, wenn er in der Lage ist, den Verkehr zwischen Client
und Server abzuh�ren. Wenn die Verbindung zwischen Client und Server �ber
ein nicht vertrauensw�rdiges Netzwerk geht, sollten Sie einen SSH-Tunnel
benutzen, um die Kommunikation zu verschl�sseln.

Jede sonstige Information wird als Klartext �bermittelt, die von jedem
gelesen werden kann, der in der Lage ist, die Verbindung abzuh�ren. Wenn
Sie das beunruhigt, k�nnen Sie das komprimierte Protokoll benutzen (ab
MySQL-Version 3.22), um so etwas zu erschweren. Um die Dinge noch sicherer
zu machen, sollten Sie @code{ssh} benutzen. Sie finden einen Open-Source-
@code{ssh}-Client auf @uref{http://www.openssh.org} und einen kommerziellen
@code{ssh}-Client auf @uref{http://www.ssh.com}. Mit diesen erhalten Sie
eine verschl�sselte TCP/IP-Verbindung zwischen einem MySQL-Server und einem
MySQL-Client.

Um ein MySQL-System sicher zu machen, sollten Sie auf jeden Fall folgende
Vorschl�ge in Betracht ziehen:

@itemize @bullet
@item
Benutzen Sie Passw�rter f�r alle MySQL-Benutzer. Bedenken Sie, dass sich
jeder beliebige als andere Person einloggen kann, und zwar so einfach wie
@code{mysql -u anderer_benutzer db_name}, wenn @code{anderer_benutzer} kein
Passwort hat. Es ist ein normales Verhalten bei
Client-Server-Applikationen, dass der Client einen beliebigen Benutzernamen
angeben kann. Sie k�nnen das Passwort f�r alle Benutzer �ndern, indem Sie
das @code{mysql_install_db}-Skript editieren, bevor Sie es laufen lassen,
oder nur das Passwort f�r den MySQL-@code{root}-Benutzer, wie folgt:

@example
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('neues_passwort')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;
@end example

@item
Lassen Sie den MySQL-Daemon nicht als Unix-@code{root}-Benutzer laufen. Das
ist sehr gef�hrlich, denn jeder Benutzer mit @code{FILE}-Berechtigung ist
dann in der Lage, Dateien als @code{root} zu erzeugen (zum Beispiel
@code{~root/.bashrc}). Um das zu verhindern, weigert sich @code{mysqld},
als @code{root} zu laufen, es sei denn, das wird direkt durch die
@code{--user=root}-Option angegeben.

@code{mysqld} kann unter einem gew�hnlichen Benutzer ohne besondere Rechte
laufen. Sie k�nnen auch einen neuen Unix-Benutzer @code{mysql} anlegen, um
alles noch sicherer zu machen. Wenn Sie @code{mysqld} als ein anderer
Unix-Benutzer laufen lassen, m�ssen Sie nicht den @code{root}-Benutzernamen
in der @code{user}-Tabelle �ndern, denn MySQL-Benutzernamen haben nichts
mit den Unix-Benutzernamen zu tun. Um @code{mysqld} als anderer
Unix-Benutzer zu starten, f�gen Sie eine @code{user}-Zeile hinzu, die den
Benutzernamen zur @code{[mysqld]}-Gruppe der
@file{/etc/my.cnf}-Optionsdatei oder der @file{my.cnf}-Optionsdatei im
Daten-Verzeichnis des Servers hinzuf�gt. Beispiel:

@example
[mysqld]
user=mysql
@end example

Das bewirkt, dass der Server als der festgelegte Benutzer gestartet wird,
egal ob Sie ihn manuell oder mit @code{safe_mysqld} oder
@code{mysql.server} starten. Weitere Details finden Sie unter @ref{Privilege changes, , MySQL-Benutzer �ndern}.

@item
Unterst�tzen Sie keine Symlinks auf Tabellen (das kann mit der
@code{--skip-symlink}-Option abgeschaltet werden). Das ist insbesondere
wichtig, wenn Sie @code{mysqld} als Root laufen lassen, weil jeder, der
Schreibzugriff auf das mysqld-Daten-Verzeichnis hat, dann jede Datei im
System zerst�ren k�nnte!
@xref{Symbolic links to tables}.

@item
�berpr�fen Sie, dass der Unix-Benutzer, der @code{mysqld} laufen l��t, der
einzige Benutzer mit Lese-/Schreibzugriffen auf die Datenbankverzeichnisse
ist.

@item
Geben Sie nicht allen Benutzern das @strong{process}-Zugriffsrecht. Die
Ausgabe von @code{mysqladmin processlist} zeigt den Text der aktuell
ausgef�hrten Anfragen, so dass jeder, der diesen Befehl ausf�hren darf, in
der Lage w�re, eine Anfrage eines anderen Benutzers wie @code{UPDATE user
SET password=PASSWORD('not_secure')} einzusehen.

@code{mysqld} reserviert eine zus�tzliche Verbindung f�r Benutzer, die das
@strong{process}-Zugriffsrecht haben, so dass sich ein
MySQL-@code{root}-Benutzer einloggen und Dinge �berpr�fen kann, selbst wenn
alle normalen Verbindungen in Benutzung sind.

@item
Geben Sie nicht allen Benutzern das @strong{file}-Zugriffsrecht. Jeder
Benutzer, der dieses Zugriffsrecht hat, kann irgendwo im Dateisystem
Dateien mit den Rechten des the @code{mysqld}-Daemons schreiben! Um das
etwas sicherer zu machen, sind alle Dateien, die mit @code{SELECT ... INTO
OUTFILE} erzeugt werden, f�r jeden lesbar und k�nnen keine existierenden
Dateien �berschreiben.

@tindex /etc/passwd
Das @strong{file}-Zugriffsrecht kann auch benutzt werden, um jede Datei zu
lesen, auf die der Unix-Benutzer Zugriff hat, als der der Server l�uft. Das
k�nnte zum Beispiel durch Benutzung von @code{LOAD DATA} missbraucht
werden, um @file{/etc/passwd} in eine Tabelle zu laden, die anschlie�end
mit @code{SELECT} gelesen wird.

@item
Wenn Sie Ihrem DNS nicht trauen, sollten Sie IP-Nummern anstelle von
Hostnamen in den Berechtigungstabellen verwenden. In jedem Fall sollten Sie
sehr vorsichtig damit sein, Eintr�ge in Berechtigungstabellen vorzunehmen,
die Hostnamen mit Platzhaltern (Wildcards) verwenden!

@item
Wenn Sie die Anzahl der Verbindungen f�r einen einzelnen Benutzer
beschr�nken wollen, k�nnen Sie das tun, indem Sie die
@code{max_user_Verbindungen}-Variable in @code{mysqld} setzen.
@end itemize



@node Privileges options, What Privileges, Security, Privilege system
@c German node Berechtigungsoptionen
@subsection Startoptionen f�r @code{mysqld} in Bezug auf Sicherheit

Folgende @code{mysqld}-Optionen ber�hren Sicherheitsaspekte:

@table @code
@item --safe-show-database
Mit dieser Option gibt @code{SHOW DATABASES} nur die Datenbanken zur�ck,
f�r die der Benutzer irgend welche Rechte hat.

@item --safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem
@code{GRANT}-Befehl anlegen, wenn der kein @code{INSERT}-Zugriffsrecht auf
die @code{mysql.user}-Tabelle hat. Wenn Sie dem Benutzer nur das Recht
geben wollen, neue Benutzer mit den Berechtigungen anzulegen, die er
vergeben darf, sollten Sie ihm folgende Berechtigung geben:

@example
GRANT INSERT(benutzer) on mysql.user to 'benutzer'@'hostname';
@end example

Das stellt sicher, dass der Benutzer keine Berechtigungsspalten direkt
�ndern kann, sondern daf�r den @code{GRANT}-Befehl benutzen muss.

@item --skip-grant-tables
Diese Option veranlasst den Server, das Berechtigungssystem �berhaupt nicht
zu benutzen. Das gibt jedem @emph{vollen Zugriff} auf alle Datenbanken!
(Einen laufenden Server k�nnen Sie veranlassen, die Berechtigungstabellen
erneut zu verwenden, indem Sie @code{mysqladmin flush-privileges} oder
@code{mysqladmin reload} ausf�hren.)

@item --skip-name-resolve
Hostnamen werden nicht aufgel�st. Alle @code{Host}-Spaltenwerte in den
Berechtigungstabellen m�ssen IP-Nummern oder @code{localhost} sein.

@item --skip-networking
Keine TCP/IP-Verbindungen �ber das Netzwerk zulassen. Alle Verbindungen zu
@code{mysqld} m�ssen �ber Unix-Sockets gemacht werden. Diese Option ist
ungeeignet f�r Systeme, die MIT-pThreads benutzen, weil das
MIT-pThreads-Paket keine Unix-Sockets unterst�tzt.

@item --skip-show-database
Mit dieser Option gibt das @code{SHOW DATABASES}-Statement nichts zur�ck.

@end table


@node What Privileges, Privileges, Privileges options, Privilege system
@c German node Welche Berechtigungen
@subsection Was das Berechtigungssystem macht

@cindex System, Berechtigungen
@cindex Berechtigungssystem
@cindex Passw�rter, Sicherheit

Die prim�re Funktion des MySQL-Berechtigungssystem ist, einen Benutzer zu
authentifizieren, der sich von einem gegebenen Host aus verbindet, und
diesen Benutzer Berechtigungen auf eine Datenbank zuzuordnen, wie
@strong{select}, @strong{insert}, @strong{update} und @strong{delete}.

Zus�tzliche Funktionalit�t beinhaltet die M�glichkeit, einen anonymen
Benutzer anzulegen und Berechtigungen f�r MySQL-spezifische Funktionen wie
@code{LOAD DATA INFILE} und f�r administrative Operationen zu gew�hren.


@node Privileges, Privileges provided, What Privileges, Privilege system
@c German node Berechtigungen
@subsection Wie das Berechtigungssystem funktioniert

@cindex Berechtigungssystem, Beschreibung

Das MySQL-Berechtigungssystem stellt sicher, dass alle Benutzer nur genau
die Dinge tun d�rfen, zu denen sie berechtigt sind. Wenn Sie sich mit einem
MySQL-Server verbinden, wird Ihre Identit�t @strong{durch den Host, von dem
Sie sich aus verbinden,} festgelegt und @strong{durch den Benutzernamen,
den Sie angeben}. Das System gew�hrt Berechtigungen gem�� Ihrer Identit�t
und gem�� dem, @strong{was Sie tun wollen}.

MySQL zieht sowohl Hostnamen als auch Benutzernamen heran, um Sie zu
identifizieren, weil es kaum Grund gibt anzunehmen, dass ein gegebener
Benutzername derselben Person woanders auf dem Internet geh�rt. So muss zum
Beispiel der Benutzer @code{bill}, der sich von @code{whitehouse.gov} aus
verbindet, nicht notwendigerweise dieselbe Person sein, die sich als
Benutzer @code{bill} von @code{microsoft.com} aus verbindet.
MySQL erlaubt Ihnen deshalb, Benutzer auf unterschiedlichen Hosts
auseinander zu halten, die zuf�llig denselben Namen haben: Sie k�nnen
@code{bill} einen Satz von Berechtigungen f�r Verbindungen von
@code{whitehouse.gov} und einen anderen Satz von Berechtigungen f�r
Verbindungen von @code{microsoft.com} aus gew�hren.

Die MySQL-Zugriffskontrolle l�uft in zwei Phasen ab:

@itemize @bullet
@item
Phase 1: Der Server �berpr�ft, ob Sie das Recht haben, sich verbinden zu
k�nnen.

@item
Phase 2: Angenommen, Sie haben das Recht, sich zu verbinden, dann �berpr�ft
der Server jede Anfrage, die Sie absetzen, um festzustellen, ob Sie
ausreichende Rechte haben, um diese auszuf�hren. Wenn Sie zum Beispiel
Zeilen aus einer Tabellen in einer Datenbank ausw�hlen oder eine Tabelle in
einer Datenbank l�schen, stellt der Server sicher, dass Sie die
@strong{select}-Berechtigung f�r die Tabelle bzw. die
@strong{drop}-Berechtigung f�r die Datenbank haben.
@end itemize

Der Server benutzt die @code{user}-, @code{db}- und @code{host}-Tabellen in
der @code{mysql}-Datenbank in beiden Phasen der Zugriffskontrolle. Die
Felder in diesen Berechtigungstabellen sind unten dargestellt:

@multitable @columnfractions .2 .25 .25 .25
@item @strong{Tabellenname} @tab @code{user} @tab @code{db} @tab @code{host}

@item @strong{Geltungsbereichs-Felder} @tab @code{Host}          @tab @code{Host}        @tab @code{Host}
@item @tab @code{User}          @tab @code{Db}          @tab @code{Db}
@item @tab @code{Password}      @tab @code{User}        @tab

@item @strong{Berechtigungs-Felder} @tab @code{Select_priv} @tab @code{Select_priv} @tab @code{Select_priv}
@item @tab @code{Insert_priv}   @tab @code{Insert_priv} @tab @code{Insert_priv}
@item @tab @code{Update_priv}   @tab @code{Update_priv} @tab @code{Update_priv}
@item @tab @code{Delete_priv}   @tab @code{Delete_priv} @tab @code{Delete_priv}
@item @tab @code{Index_priv}    @tab @code{Index_priv}  @tab @code{Index_priv}
@item @tab @code{Alter_priv}    @tab @code{Alter_priv}  @tab @code{Alter_priv}
@item @tab @code{Create_priv}   @tab @code{Create_priv} @tab @code{Create_priv}
@item @tab @code{Drop_priv}     @tab @code{Drop_priv}   @tab @code{Drop_priv}
@item @tab @code{Grant_priv}    @tab @code{Grant_priv}  @tab @code{Grant_priv}
@item @tab @code{References_priv} @tab                  @tab
@item @tab @code{Reload_priv}   @tab                    @tab
@item @tab @code{Shutdown_priv} @tab                    @tab
@item @tab @code{Process_priv}  @tab                    @tab
@item @tab @code{File_priv}     @tab                    @tab
@end multitable

In der zweiten Phase der Zugriffskontrolle (Anfrage-Verifikation), zieht
der Server gegebenenfalls zus�tzlich die @code{tables_priv}- und
@code{columns_priv}-Tabellen heran, falls Ihre Anfrage Tabellen betrifft.
Die Felder in diesen Tabellen sind unten dargestellt:

@multitable @columnfractions .2 .25 .25
@item @strong{Tabellenname}   @tab @code{tables_priv} @tab @code{columns_priv}

@item @strong{Geltungsbereichs-Felder} @tab @code{Host}        @tab @code{Host}
@item                       @tab @code{Db}          @tab @code{Db}
@item                       @tab @code{User}        @tab @code{User}
@item                       @tab @code{Table_name}  @tab @code{Table_name}
@item                       @tab                    @tab @code{Column_name}

@item @strong{Berechtigungs-Felder} @tab @code{Table_priv}   @tab @code{Column_priv}
@item                           @tab @code{Column_priv}  @tab

@item @strong{Sonstige Felder} @tab @code{Timestamp}   @tab @code{Timestamp}
@item                       @tab @code{Grantor}     @tab
@end multitable

Jede Berechtigungstabelle enth�lt Geltungsbereichsfelder und
Berechtigungsfelder.

Geltungsbereichsfelder legen den Geltungsbereich jedes Eintrags in den
Tabellen fest, das hei�t, der Kontext, f�r den der Eintrag gilt. So w�rde
zum Beispiel ein @code{user}-Tabelleneintrag mit @code{Host}- und
@code{User}-Werten von @code{'thomas.loc.gov'} und @code{'bob'} benutzt
werden, um Verbindungen zum Server zu authentifizieren, die von @code{bob}
vom Host @code{thomas.loc.gov} gemacht werden. In �hnlicher Weise bewirkt
ein @code{db}-Tabelleneintrag in die Felder @code{Host}, @code{User} und
@code{Db} mit @code{'thomas.loc.gov'}, @code{'bob'} und @code{'reports'},
dass diese benutzt werden, wenn sich @code{bob} vom Host
@code{thomas.loc.gov} verbindet und auf die @code{reports}-Datenbank zugreift. 
Die @code{tables_priv}- und @code{columns_priv}-Tabellen enthalten
Geltungsbereichsfelder, die Tabellen oder Tabellen-Spalten-Kombinationen
angeben, auf die sich der jeweilige Eintrag bezieht.

@cindex Gro�-/Kleinschreibung, bei der Zugriffspr�fung
F�r Zwecke der Zugriffspr�fung sind Vergleiche von @code{Host}-Werten
unabh�ngig von der verwendeten Gro�-/Kleinschreibung. @code{User},
@code{Password}, @code{Db} und @code{Table_name}-Werte sind abh�ngig von
der verwendeten Gro�-/Kleinschreibung. @code{Column_name}-Werte sind ab
MySQL-Version 3.22.12 unabh�ngig von der verwendeten
Gro�-/Kleinschreibung.

Berechtigungsfelder zeigen die Berechtigungen an, die durch den
Tabelleneintrag gew�hrt werden, das hei�t, welche Operationen durchgef�hrt
werden k�nnen. Der Server kombiniert die Informationen in den verschiedenen
Berechtigungstabellen, um daraus eine komplette Beschreibung der
Berechtigungen des Benutzers zu formulieren. Die Regeln, nach denen hierbei
vorgegangen wird, sind in @ref{Request access} beschrieben.

Geltungsbereichsfelder sind Zeichenketten, die wie unten dargestellt
deklariert werden. Der Vorgabewert f�r jedes Feld ist die leere
Zeichenkette:

@multitable @columnfractions .15 .15 .7
@item @strong{Feldname} @tab @strong{Typ}
@item @code{Host}         @tab @code{CHAR(60)}
@item @code{User}         @tab @code{CHAR(16)}
@item @code{Password}     @tab @code{CHAR(16)}
@item @code{Db}           @tab @code{CHAR(64)} @tab (@code{CHAR(60)} f�r
die @code{tables_priv}- und @code{columns_priv}-Tabellen)
@item @code{Table_name}   @tab @code{CHAR(60)}
@item @code{Column_name}  @tab @code{CHAR(60)}
@end multitable

In den @code{user}-, @code{db}- und @code{host}-Tabellen werden alle Felder
als @code{ENUM('N','Y')} deklariert. Jedes Feld kann einen Wert von
@code{'N'} oder @code{'Y'} haben. Der Vorgabewert ist @code{'N'}.

In den @code{tables_priv}- und @code{columns_priv}-Tabellen werden Felder
als @code{SET}-Felder deklariert:

@multitable @columnfractions .2 .2 .6
@item @strong{Tabellenname} @tab @strong{Feldname} @tab @strong{M�gliche Set-Elemente}
@item @code{tables_priv} @tab @code{Table_priv} @tab @code{'Select', 'Insert',
'Update', 'Delete', 'Create', 'Drop', 'Grant', 'Referenzs', 'Index', 'Alter'}
@item @code{tables_priv} @tab @code{Column_priv} @tab @code{'Select', 'Insert',
'Update', 'References'}
@item @code{columns_priv} @tab @code{Column_priv} @tab @code{'Select', 'Insert',
'Update', 'References'}
@end multitable

Kurz gesagt benutzt der Server die Berechtigungstabellen wie folgt:

@itemize @bullet
@item
Das @code{user}-Tabellenbereichsfeld legt fest, ob eingehende Verbindungen
zugelassen oder abgewiesen werden. Bei zugelassenen Verbindungen zeigen
Berechtigungen, die in der @code{user}-Tabelle vergeben sind, die globalen
(Superuser-) Rechte des Benutzers an. Diese Berechtigungen treffen auf
@strong{alle} Datenbanken auf dem Server zu.

@item
Die @code{db}- und @code{host}-Tabellen werden zusammen benutzt:

@itemize @minus
@item
Die Geltungsbereichsfelder der @code{db}-Tabelle legen fest, welche
Benutzer auf welche Datenbanken von welchen Hosts aus zugreifen k�nnen. Die
Berechtigungsfelder legen fest, welche Operationen zugelassen sind.

@item
Die @code{host}-Tabelle wird als Erweiterung der @code{db}-Tabelle benutzt,
wenn Sie wollen, dass ein gegebener @code{db}-Tabelleneintrag auf
verschiedene Hosts zutrifft. Wenn Sie zum Beispiel wollen, dass ein
Benutzer eine Datenbank von mehreren Hosts in Ihrem Netzwerk aus benutzen
kann, lassen Sie den @code{Host}-Wert in der @code{db}-Tabelle des
Benutzers leer, und f�llen dann die @code{host}-Tabelle mit einem Eintrag
f�r jeden dieser Hosts. Dieser Mechanismus ist ausf�hrlicher in
@ref{Request access} beschrieben.
@end itemize

@item
Die @code{tables_priv}- und @code{columns_priv}-Tabellen sind der
@code{db}-Tabelle �hnlich, aber feink�rniger: Sie beziehen sich auf
Tabellen- und Spaltenebenen und nicht auf Datenbankebene.
@end itemize

Beachten Sie, dass die Verwaltungsberechtigungen (@strong{reload},
@strong{shutdown} usw.) nur in der @code{user}-Tabelle festgelegt werden.
Das liegt daran, dass Verwaltungsoperationen Operationen auf dem Server
selbst sind und nicht Datenbank-spezifisch, so dass es keinen Grund gibt,
solche Berechtigungen in den anderen Berechtigungstabellen aufzuf�hren. So
muss nur die @code{user}-Tabelle untersucht werden um festzustellen, ob man
Verwaltungsoperationen durchf�hren kann oder nicht.

Das @strong{file}-Zugriffsrecht wird auch nur in der @code{user}-Tabelle
festgelegt. Es ist als solches keine Verwaltungsberechtigung, aber Ihre
M�glichkeit, Dateien auf dem Server zu lesen oder zu schreiben, ist
unabh�ngig von der Datenbank, auf die Sie zugreifen.

Der @code{mysqld}-Server liest die Inhalte der Berechtigungstabellen
einmal, und zwar beim Start. �nderungen in den Berechtigungstabellen werden
wirksam wie in @ref{Privilege changes} geschildert.

Wenn Sie die Inhalte der Berechtigungstabellen �ndern, sollten Sie
sicherstellen, dass Ihre �nderungen Berechtigungen einf�hren, die Sie so
haben wollen. Hilfe bei der Diagnose von Problemen finden Sie unter
@ref{Access denied}. Hinweise zu Sicherheitsthemen finden Sie unter
@pxref{Security}.

Ein n�tzliches Diagnosetool ist das @code{mysqlaccess}-Skript, das Yves
Carlier f�r die MySQL-Distribution bereit gestellt hat. Rufen Sie
@code{mysqlaccess} mit der @code{--help}-Option auf, um herauszufinden, wie
es funktioniert. Beachten Sie, dass @code{mysqlaccess} den Zugriff nur
anhand der @code{user}-, @code{db}- und @code{host}-Tabellen �berpr�ft. Es
�berpr�ft keine Tabellen- oder Spaltenebenen-Berechtigungen.


@node Privileges provided, Connecting, Privileges, Privilege system
@c German node Zur Verf�gung gestellte Berechtigungen
@subsection Von MySQL zur Verf�gung gestellte Berechtigungen

@cindex Berechtigungsinformation, Speicherort

Informationen �ber Benutzerberechtigungen sind in den @code{user}-,
@code{db}-, @code{host}-, @code{tables_priv}- und
@code{columns_priv}-Tabellen in der @code{mysql}-Datenbank gespeichert (das
hei�t in der Datenbank, die @code{mysql} hei�t). Der MySQL-Server liest
die Inhalte dieser Tabellen, wenn er startet, und in den F�llen, die unter
@ref{Privilege changes} geschildert sind.

Die Namen, die in diesem Handbuch benutzt werden, um auf die Berechtigungen
zu verweisen, die MySQL zur Verf�gung stellt, sind unten dargestellt,
zusammen mit den Tabellenspaltennamen, die jeder Berechtigung in the
Berechtigungstabellen zugeordnet sind, und dem Kontext, auf den die
Berechtigung zutrifft.

@multitable @columnfractions .15 .25 .6
@item @strong{Berechtigung}   @tab @strong{Spalte}   @tab @strong{Kontext}
@item @strong{select}      @tab @code{Select_priv}   @tab Tabellen
@item @strong{insert}      @tab @code{Insert_priv}   @tab Tabellen
@item @strong{update}      @tab @code{Update_priv}   @tab Tabellen
@item @strong{delete}      @tab @code{Delete_priv}   @tab Tabellen
@item @strong{index}       @tab @code{Index_priv}    @tab Tabellen
@item @strong{alter}       @tab @code{Alter_priv}    @tab Tabellen
@item @strong{create}      @tab @code{Create_priv}   @tab Datenbanken, Tabellen oder Indexe
@item @strong{drop}        @tab @code{Drop_priv}     @tab Datenbanken oder Tabellen
@item @strong{grant}       @tab @code{Grant_priv}    @tab Datenbanken oder Tabellen
@item @strong{References}  @tab @code{References_priv} @tab Datenbanken oder Tabellen
@item @strong{reload}      @tab @code{Reload_priv}   @tab Serververwaltung
@item @strong{shutdown}    @tab @code{Shutdown_priv} @tab Serververwaltung
@item @strong{process}     @tab @code{Process_priv}  @tab Serververwaltung
@item @strong{file}        @tab @code{File_priv}     @tab Dateizugriff auf den Server
@end multitable

Die @strong{select}-, @strong{insert}-, @strong{update}- und
@strong{delete}-Berechtigungen erlauben Ihnen, Operationen auf Zeilen in
existierenden Tabellen in einer Datenbank durchzuf�hren.

@code{SELECT}-Statements erfordern die @strong{select}-Berechtigung nur
dann, wenn tats�chlich Zeilen aus einer Tabelle abgerufen werden. Sie
k�nnen bestimmte @code{SELECT}-Statements selbst ohne Berechtigung
durchf�hren, um auf jede der Datenbanken auf dem Server zuzugreifen.
Beispielsweise k�nnten Sie den @code{mysql}-Client als einfachen
Taschenrechner benutzen:

@example
mysql> SELECT 1+1;
mysql> SELECT PI()*2;
@end example

Die @strong{index}-Berechtigung erlaubt Ihnen, Indexe zu erzeugen oder zu
entfernen.

Die @strong{alter}-Berechtigung erlaubt Ihnen, @code{ALTER TABLE} zu
benutzen.

Die @strong{create}- und @strong{drop}-Berechtigungen erlauben Ihnen, neue
Datenbanken und Tabellen zu erzeugen oder bestehende Datenbanken und
Tabellen zu entfernen.

Denken Sie daran, dass ein Benutzer, dem Sie die @strong{drop}-Berechtigung
f�r die @code{mysql}-Datenbank gew�hren, in der Lage ist, die Datenbank zu
l�schen, in der die MySQL-Zugriffsberechtigungen gespeichert sind!

Die @strong{grant}-Berechtigung erlaubt Ihnen, die Berechtigungen, die Sie
selbst besitzen, an andere Benutzer zu vergeben.

Die @strong{file}-Berechtigung erlaubt Ihnen, Dateien auf dem Server zu
lesen und zu schreiben, wenn Sie die @code{LOAD DATA INFILE}- und
@code{SELECT ... INTO OUTFILE}-Statements benutzen. Jeder Benutzer, dem
diese Berechtigung gew�hrt wurde, kann jedwede Datei lesen oder schreiben,
die der MySQL-Server lesen oder schreiben darf.

Die restlichen Berechtigungen werden f�r Verwaltungsoperationen benutzt,
die mit dem @code{mysqladmin}-Programm durchgef�hrt werden. Die unten
stehende Tabelle zeigt, welche @code{mysqladmin}-Befehle mit jeder
Verwaltungsberechtigung ausgef�hrt werden k�nnen:

@multitable @columnfractions .15 .85
@item @strong{Berechtigung}  @tab @strong{Befehle, die dem Berechtigten erlaubt sind}
@item @strong{reload}     @tab @code{reload}, @code{refresh},
@code{flush-privileges}, @code{flush-hosts}, @code{flush-logs} und
@code{flush-tables}
@item @strong{shutdown}   @tab @code{shutdown}
@item @strong{process}    @tab @code{processlist}, @code{kill}
@end multitable

Der @code{reload}-Befehl weist den Server an, die Berechtigungstabellen neu
einzulesen. Der @code{refresh}-Befehl schreibt alle Tabellen auf Platte
(flush) und �ffnet und schlie�t die Log-Dateien. @code{flush-privileges}
ist ein Synonym f�r @code{reload}. Die anderen @code{flush-*}-Befehle
f�hren Funktionen aus, die @code{refresh} �hnlich sind, aber im Umfang
beschr�nkter und daher in einigen F�llen zu bevorzugen. Wenn Sie zum
Beispiel nur die Log-Dateien flushen wollen, ist @code{flush-logs}
@code{refresh} vorzuziehen.

Der @code{shutdown}-Befehl f�hrt den Server herunter.

Der @code{processlist}-Befehl zeigt Informationen �ber die Threads an, die
im Server ausgef�hrt werden. Der @code{kill}-Befehl killt Server-Threads.
Ihre eigenen Threads k�nnen Sie jederzeit anzeigen oder killen, aber Sie
brauchen die @strong{process}-Berechtigung, um Threads anzuzeigen oder zu
killen, die von anderen Benutzern initiiert wurden. @xref{KILL}.

Es ist generell eine gute Idee, Berechtigungen nur den Nutzern zu gew�hren,
die diese tats�chlich brauchen, aber speziell bei folgenden Berechtigungen
sollten Sie besondere Vorsicht walten lassen:

@itemize @bullet
@item
Die @strong{grant}-Berechtigung erlaubt Benutzern, Ihre Berechtigungen an
andere Benutzer zu �bertragen. Zwei Benutzer mit unterschiedlichen
Berechtigungen und mit der @strong{grant}-Berechtigung sind in der Lage,
Ihre Berechtigungen zu kombinieren.

@item
Die @strong{alter}-Berechtigung kann benutzt werden, um das
Berechtigungssystem zu unterlaufen, indem Tabellen umbenannt werden.

@item
Die @strong{file}-Berechtigung kann missbraucht werden, um jede �ffentlich
lesbare Datei auf dem Server in eine Datenbanktabelle einzulesen, auf deren
Inhalte dann mit @code{SELECT} zugegriffen werden kann. Das beinhaltet die
Inhalte aller Datenbanken, die vom Server gehostet werden!

@item
Die @strong{shutdown}-Berechtigung kann missbraucht werden, um andere
Benutzer komplett vom Server auszuschlie�en, indem der Server beendet
wird.

@item
Die @strong{process}-Berechtigung kann benutzt werden, um den Klartext von
momentan ablaufenden Anfragen einzusehen, inklusive Anfragen, die
Passw�rter setzen oder �ndern.

@item
Zugriffsrechte auf die @code{mysql}-Datenbank k�nnen benutzt werden, um
Passw�rter zu �ndern und auf sonstige Berechtigungsinformationen
zuzugreifen. (Passw�rter werden verschl�sselt gespeichert, daher kann ein
b�swilliger Benutzer sie nicht einfach lesen und anschlie�end die
Klartext-Passw�rter kennen.) Wenn man auf die
@code{mysql.user}-Passwort-Spalte zugreifen kann, kann man das nutzen, um
sich als beliebiger Benutzer am MySQL-Server anzumelden. (Mit ausreichenden
Rechten kann derselbe Benutzer dann Passw�rter durch eigene ersetzen.)
@end itemize

Es gibt einige Dinge, die Sie mit dem MySQL-Berechtigungssystem nicht tun
k�nnen:

@itemize @bullet
@item
Sie k�nnen nicht ausdr�cklich festlegen, dass ein bestimmter Benutzer
keinen Zugriff haben soll. Das hei�t, Sie k�nnen nicht explizit mit einem
bestimmten Benutzer vergleichen und dann die Verbindung ablehnen.

@item
Sie k�nnen nicht festlegen, dass ein Benutzer das Recht hat, Tabellen in
einer Datenbank zu erzeugen oder zu l�schen, aber nicht die Datenbank
selbst zu erzeugen oder zu l�schen.
@end itemize


@node Connecting, Connection access, Privileges provided, Privilege system
@c German node Verbinden
@subsection Verbinden mit dem MySQL-Server

@cindex Verbinden, mit dem MySQL-Server
@cindex Vorgabem��iger Hostname
@cindex Hostname, Vorgabe
@cindex Server, verbinden

MySQL-Client-Programme erfordern im Allgemeinen, dass Sie
Verbindungsparameter festlegen, wenn Sie sich mit einem MySQL-Server
verbinden wollen: Der Host, mit dem Sie sich verbinden wollen, Ihr
Benutzername und Ihr Passwort. Beispielsweise kann der @code{mysql}-Client
wie folgt gestartet werden (optionale Argumente sind in @samp{[} und
@samp{]} eingeschlossen):

@example
shell> mysql [-h hostname] [-u benutzername] [-pihr_passwort]
@end example

Alternative Formen der @code{-h}-, @code{-u}- und @code{-p}-Optionen sind
@code{--host=hostname}, @code{--user=benutzername} und
@code{--password=ihr_passwort}. Beachten Sie, dass zwischen @code{-p} oder
@code{--password=} und dem folgenden Passwort @emph{kein Leerzeichen}
steht!

@strong{ACHTUNG:} Ein Passwort auf der Kommandozeile anzugeben ist nicht
sicher! Jeder Benutzer auf Ihrem System kann dann Ihr Passwort
herausfinden, indem er einen Befehl wie @code{ps auxww} eingibt.
@xref{Option files}.

@code{mysql} benutzt Vorgabewerte f�r Verbindungsparameter, die auf der
Kommandozeile nicht angegeben sind:

@itemize @bullet
@item
Der vorgabem��ige Hostname ist @code{localhost}.

@item
Der vorgabem��ige Benutzername ist Ihr Unix-Loginname.

@item
Es wird kein Passwort �bergeben, wenn @code{-p} fehlt.
@end itemize

F�r einen Unix-Benutzer @code{joe} sind daher folgende Befehle
gleichbedeutend:

@example
shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql
@end example

Andere MySQL-Clients verhalten sich �hnlich.

Auf Unix-Systemen k�nnen Sie andere Vorgabewerte festlegen, die benutzt
werden, wenn Sie eine Verbindung aufmachen, so dass Sie diese nicht jedes
Mal auf der Kommandozeile eingeben m�ssen, wenn Sie ein Client-Programm
aufrufen. Das kann auf verschiedene Weise gemacht werden:

@itemize @bullet
@item
@tindex .my.cnf-Datei
Sie k�nnen Verbindungsparameter im @code{[client]}-Abschnitt der
@file{.my.cnf}-Konfigurationsdatei in Ihrem Heimatverzeichnis festlegen.
Der relevante Abschnitt der Datei sieht etwa wie folgt aus:

@example
[client]
host=hostname
user=benutzername
password=ihr_passwort
@end example

@xref{Option files}.

@item
@tindex @code{MYSQL_HOST}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_HOST}
@tindex @code{MYSQL_PWD}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_PWD}
@tindex @code{USER}-Umgebungsvariable
@tindex Umgebungsvariable, @code{USER}
Sie k�nnen Verbindungsparameter festlegen, indem Sie Umgebungsvariablen
benutzen. Der Host kann f�r @code{mysql} festgelegt werden, indem
@code{MYSQL_HOST} benutzt wird. Der MySQL-Benutzername kann mit @code{USER}
festgelegt werden (nur f�r Windows). Das Passwort kann mit @code{MYSQL_PWD}
festgelegt werden (aber das ist unsicher, siehe n�chster Abschnitt).
@xref{Environment variables}.
@end itemize


@node Connection access, Request access, Connecting, Privilege system
@c German node Verbindungszugriff
@subsection Zugriffskontrolle, Phase 1: Verbindungs�berpr�fung

@cindex Zugriffskontrolle
@cindex Kontrolle �ber den Zugriff
@cindex Verbindung, �berpr�fung
@cindex Testen, Verbindung mit dem Server

Wenn Sie versuchen, sich mit einem MySQL-Server zu verbinden, akzeptiert
der Server die Verbindung oder weist sie zur�ck, abh�ngig von Ihrer
Identit�t und davon, ob Sie diese mit dem korrekten Passwort verifizieren
k�nnen. Falls nicht, lehnt der Server den Zugriff vollst�ndig ab. Ansonsten
akzeptiert der Server die Verbindung, geht dann in Phase 2 und wartet auf
Anfragen.

Ihre Identit�t basiert auf zwei Informationsbestandteilen:

@itemize @bullet
@item
Dem Host, von dem Sie sich verbinden

@item
Ihrem MySQL-Benutzernamen
@end itemize

Die Identit�ts�berpr�fung wird anhand der drei Geltungsbereichs-Felder der
@code{user}-Tabelle, n�mlich (@code{Host}, @code{User} und @code{Password})
durchgef�hrt. Der Server akzeptiert die Verbindung nur, wenn ein
@code{user}-Tabelleneintrag mit Ihrem Hostnamen und Benutzernamen
�bereinstimmt und Sie das korrekte Passwort angeben k�nnen.

Werte in den Geltungsbereichs-Feldern der @code{user}-Tabelle k�nnen wie folgt
festgelegt werden:

@itemize @bullet
@item
Ein @code{Host}-Wert kann ein Hostname oder eine IP-Nummer sein, oder
@code{'localhost'}, was die lokale Maschine angibt.

@item
@cindex Platzhalter (Wildcards), in der @code{mysql.user}-Tabelle
Sie k�nnen die Platzhalterzeichen @samp{%} und @samp{_} im @code{Host}-Feld
benutzen.

@item
Ein @code{Host}-Wert @code{'%'} stimmt mit jedem Hostnamen �berein.

@item
Ein leerer @code{Host}-Wert bedeutet, dass die Berechtigung zusammen mit
dem Eintrag in der @code{host}-Tabelle gilt, der mit dem angegebenen
Hostnamen �bereinstimmt. Weitere Informationen hierzu finden Sie im
n�chsten Kapitel.

@cindex Netmask-Notation, in der @code{mysql.user}-Tabelle
@item
Ab MySQL-Version 3.23 k�nnen @code{Host}-Werte als IP-Nummern festgelegt
werden, und Sie k�nnen eine Netmask festlegen, die angibt, wie viele
Adress-Bits f�r die Netzwerknummer benutzt werden. Beispiel:

@example
GRANT ALL PRIVILEGES on db.* to david@@'192.58.197.0/255.255.255.0';
@end example

Das erlaubt jedem, sich von einer IP zu verbinden, bei der folgendes gilt:

@example
benutzer_ip & netmask = host_ip.
@end example

Im obigen Beispiel k�nnen sich alle IP's im Intervall zwischen 192.58.197.0
bis 192.58.197.255 mit dem MySQL-Server verbinden.

@item
@cindex anonymer Benutzer
Platzhalterzeichen sind im @code{User}-Feld nicht erlaubt. Sie k�nnen aber
einen leeren Wert angeben, der mit jedem Namen �bereinstimmt. Wenn der
Eintrag in der @code{user}-Tabelle, der mit einer hereinkommenden
Verbindung �bereinstimmt, einen leeren Benutzernamen hat, wird angenommen,
dass der Benutzer der anonyme Benutzer ist (der Benutzer ohne Namen), und
nicht der Name, den der Client tats�chlich angegeben hat. Das bedeutet,
dass ein leerer Benutzername f�r alle weiteren Zugriffs�berpr�fungen
w�hrend der laufenden Verbindung benutzt wird (also w�hrend Phase 2).

@item
Das @code{Password}-Feld kann leer sein. Das bedeutet nicht, dass jedes
Passwort �bereinstimmt, sondern dass der Benutzer sich ohne Angabe eines
Passworts verbinden muss.
@end itemize

@findex PASSWORD()
Nicht-leere @code{Password}-Werte repr�sentieren verschl�sselte Passw�rter.
MySQL speichert Passw�rter nicht im Klartext, so dass jeder sie sehen
k�nnte. Statt dessen wird das Passwort eines Benutzers, der sich zu
verbinden versucht, verschl�sselt (unter Benutzung der
@code{PASSWORD()}-Funktion). Das verschl�sselte Passwort wird dann benutzt,
wenn Client / Server pr�fen, ob das Passwort korrekt ist (das geschieht,
ohne dass das verschl�sselte Passwort jemals �ber die Verbindung �bertragen
wird). Beachten Sie, dass aus der Sicht von MySQL das verschl�sselte
Passwort das ECHTE Passwort ist, daher sollten Sie niemandem Zugriff darauf
geben! Insbesondere sollten Sie keinem normalen Benutzer Lesezugriff auf
die Tabellen der @code{mysql}-Datenbank geben!

Die unten stehenden Beispiele zeigen, wie unterschiedliche Kombinationen
von @code{Host}- und-@code{User}-Werten in den
@code{user}-Tabelleneintr�gen auf hereinkommende Verbindungen zutreffen:

@multitable @columnfractions .25 .15 .60
@item @code{Host} @strong{Wert} @tab @code{User} @strong{Wert} @tab @strong{Verbindungen, die mit dem Eintrag �bereinstimmen}
@item @code{'thomas.loc.gov'} @tab @code{'fred'} @tab @code{fred}, der sich von @code{thomas.loc.gov} aus verbindet
@item @code{'thomas.loc.gov'} @tab @code{''} @tab Jeder Benutzer, der sich von @code{thomas.loc.gov} aus verbindet
@item  @code{'%'} @tab @code{'fred'} @tab @code{fred}, der sich von jedem Host aus verbindet
@item @code{'%'} @tab  @code{''} @tab Jeder Benutzer, der sich von jedem Host aus verbindet
@item @code{'%.loc.gov'} @tab @code{'fred'} @tab @code{fred}, der sich von jedem beliebigen Host in der @code{loc.gov}-Dom�ne aus verbindet
@item @code{'x.y.%'} @tab @code{'fred'} @tab @code{fred}, der sich von @code{x.y.net}, @code{x.y.com}, @code{x.y.edu} usw. aus verbindet (wahrscheinlich eher unsinnig)
@item @code{'144.155.166.177'} @tab @code{'fred'} @tab @code{fred}, der sich vom Host mit der IP-Adresse @code{144.155.166.177} aus verbindet
@item @code{'144.155.166.%'} @tab @code{'fred'} @tab @code{fred}, der sich von jedem beliebigen Host im Class-C-Subnet @code{144.155.166} aus verbindet
@item @code{'144.155.166.0/255.255.255.0'} @tab @code{'fred'} @tab Dasselbe wie im vorherigen Beispiel
@end multitable

Weil Sie im @code{Host}-Feld IP-Platzhalterwerte verwenden k�nnen
(beispielsweise @code{'144.155.166.%'}, was mit jedem Host in einem Subnet
�bereinstimmt), besteht die M�glichkeit, dass jemand diese F�higkeit
ausbeutet, indem er einen Host zum Beispiel
@code{144.155.166.somewhere.com} nennt. Um solche Versuche zu vereiteln,
verbietet MySQL den Vergleich mit Hostnamen, die mit Ziffern und einem
Punkt �bereinstimmen. Wenn Sie daher einen Host haben, der so wie
@code{1.2.foo.com} benannt ist, wird sein Name nie mit der
@code{Host}-Spalte der Berechtigungstabellen �bereinstimmen. Nur eine
IP-Nummer kann mit dem IP-Platzhalterwert �bereinstimmen.

Eine hereinkommende Verbindung kann mit mehr als einem Eintrag in der
@code{user}-Tabelle �bereinstimmen. Beispielsweise w�rde eine Verbindung
von @code{thomas.loc.gov} aus durch @code{fred} mit mehreren der oben
genannten Eintr�ge �bereinstimmen. Wie entscheidet der Server, welcher der
Eintr�ge benutzt werden soll, wenn mehrere zutreffen? Der Server l�st
dieses Problem, indem er die @code{user}-Tabelle nach dem Einlesen beim
Start sortiert, und danach die Eintr�ge in sortierter Form durchsieht, wenn
ein Benutzer versucht, sich zu verbinden. Der erste �bereinstimmende
Eintrag ist der, der benutzt wird.

Das Sortieren der @code{user}-Tabelle funktioniert wie folgt. Nehmen Sie
an, dass die @code{user}-Tabelle so aussieht:

@example
+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-
@end example

Wenn der Server die Tabelle liest, ordnet er die Eintr�ge mit den
spezifischsten Eintr�gen f�r die @code{Host}-Werte zuerst ein (@code{'%'}
in der @code{Host}-Spalte bedeutet ``jeder Host'' und ist am
unspezifischsten). Eintr�ge mit denselben @code{Host}-Werten werden mit den
spezifischsten @code{User}-Werten zuerst geordnet (ein leerer
@code{User}-Wert bedeutet ``jeder Benutzer'' und ist am
unspezifischsten). Die daraus resultierende sortierte @code{user}-Tabelle
sieht wie folgt aus:

@example
+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-
@end example

@cindex Berechtigungstabellen, sortieren
@cindex sortieren, Berechtigungstabellen
@cindex @code{user}-Tabelle, sortieren
Beim Versuch einer Verbindung durchsucht der Server die sortierten Eintr�ge
und benutzt die ersten �bereinstimmenden. Bei einer Verbindung von
@code{localhost} aus durch @code{jeffrey} stimmen die Werte zuerst mit den
Eintr�gen von @code{'localhost'} in der @code{Host}-Spalte �berein. Hiervon
stimmt der Eintrag mit dem leeren Benutzernamen sowohl mit dem verbindenden
Host als auch mit dem Benutzernamen �berein. (@code{'%'/'jeffrey'} h�tte
auch �bereingestimmt, aber er ist nicht der erste Tabelleneintrag, der
gefunden wird.)

Hier ist ein weiteres Beispiel. Nehmen Sie an, die @code{user}-Tabelle
sieht wie folgt aus:

@example
+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-
@end example

Die sortierte Tabelle sieht wie folgt aus:

@example
+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-
@end example

Eine Verbindung von @code{thomas.loc.gov} aus durch @code{jeffrey} stimmt
mit dem ersten Eintrag �berein, wohingegen eine Verbindung von
@code{whitehouse.gov} aus durch @code{jeffrey} mit dem zweiten Eintrag
�bereinstimmt.

Ein h�ufiges Missverst�ndnis besteht darin zu denken, dass bei einem
angegebenen Benutzernamen alle Eintr�ge, die explizit den Benutzer nennen,
zuerst benutzt werden, wenn der Server versucht, eine �bereinstimmung f�r
die Verbindung zu finden. Das stimmt schlicht nicht. Das vorherige Beispiel
stellt das dar, wobei eine Verbindung von @code{thomas.loc.gov} aus durch
@code{jeffrey} zuerst gerade nicht mit dem Eintrag �bereinstimmt, der
@code{'jeffrey'} als @code{User}-Feldwert enth�lt, sondern mit dem Eintrag,
der keinen Benutzernamen enth�lt!

Wenn Sie Probleme haben, sich mit dem Server zu verbinden, geben Sie die
@code{user}-Tabelle aus und sortieren Sie sich von Hand, um zu sehen, wo
die erste �bereinstimmung stattfindet.


@node Request access, Access denied, Connection access, Privilege system
@c German node Anfragezugriff
@subsection Zugriffskontrolle, Phase 2: Anfrage�berpr�fung

Wenn Sie erst einmal eine Verbindung hergestellt haben, geht der Server in
Phase 2. Bei jeder Anfrage, die �ber diese Verbindung hereinkommt, pr�ft
der Server, ob Sie ausreichende Berechtigungen haben, sie auszuf�hren,
wobei es auf die Operation ankommt, die Sie ausf�hren wollen. Hier kommen
die Berechtigungsfelder der Berechtigungstabellen ins Spiel. Diese
Berechtigungen k�nnen aus jeder der @code{user}-, @code{db}-,
@code{host}-, @code{tables_priv}- oder @code{columns_priv}-Tabellen
stammen. Die Berechtigungstabellen werden mit @code{GRANT}- und
@code{REVOKE}-Befehlen ver�ndert. @xref{GRANT, , @code{GRANT}}. (Hilfreich
sind die Ausf�hrungen unter @ref{Privileges}, wo die Felder aufgelistet
sind, die sich in jeder der Berechtigungstabellen finden.)

Die @code{user}-Tabelle gew�hrt Berechtigungen, die Ihnen auf globaler
Ebene zugeordnet sind und die unabh�ngig von der gerade aktuellen Datenbank
zutreffen. Wenn beispielsweise die @code{user}-Tabelle Ihnen die
@strong{delete}-Berechtigung gew�hrt, k�nnen Sie Zeilen aus jeder Datenbank
auf dem Server-Host l�schen! Mit anderen Worten: Berechtigungen in der
@code{user}-Tabelle sind Superuser-Berechtigungen. Es ist klug,
Berechtigungen in der @code{user}-Tabelle nur Superusern wie Server- oder
Datenbankverwaltern zu gew�hren. Bei anderen Benutzern sollten Sie
Berechtigungen in der @code{user}-Tabelle auf @code{'N'} gesetzt lassen und
Berechtigungen nur auf Datenbank-Ebene gew�hren, indem Sie die @code{db}-
und @code{host}-Tabellen benutzen.

@cindex anonymer Benutzer
@cindex Platzhalter, in @code{mysql.db}-Tabelle
@cindex Platzhalter, in @code{mysql.host}-Tabelle
Die @code{db}- und @code{host}-Tabellen gew�hren Datenbank-spezifische
Berechtigungen. Werte in den Geltungsbereichs-Feldern k�nnen wie folgt
festgelegt werden:

@itemize @bullet
@item
Die Platzhalterzeichen @samp{%} und @samp{_} k�nnen in den @code{Host}- und
@code{Db}-Feldern jeder Tabelle benutzt werden.

@item
Ein @code{'%'}-@code{Host}-Wert in der @code{db}-Tabelle bedeutet ``jeder
Host.'' Ein leerer @code{Host}-Wert in der @code{db}-Tabelle bedeutet
``sieh in der @code{host}-Tabelle wegen weiterer Informationen nach''.

@item
Ein @code{'%'}- oder leerer @code{Host}-Wert in der @code{host}-Tabelle
bedeutet ``jeder Host''.

@item
Ein @code{'%'}- oder leerer @code{Db}-Wert in einer der Tabellen bedeutet
``jede Datenbank''.

@item
Ein leerer @code{User}-Wert in einer der Tabellen entspricht dem anonymen
Benutzer.
@end itemize

@cindex Berechtigungstabellen, sortieren
@cindex sortieren, Berechtigungstabellen
@cindex @code{db}-Tabelle, sortieren
@cindex @code{host}-Tabelle, sortieren
Die @code{db}- und @code{host}-Tabellen werden eingelesen und sortiert,
wenn der Server hoch f�hrt (zur gleichen Zeit, wenn er die
@code{user}-Tabelle einliest). Die @code{db}-Tabelle wird nach den
Geltungsbereichs-Feldern @code{Host}, @code{Db} und @code{User} sortiert.
Die @code{host}-Tabelle wird nach den Geltungsbereichs-Feldern @code{Host}
und @code{Db} sortiert. Bei der @code{user}-Tabelle werden die
spezifischsten Werte zuerst und die unspezifischsten Werte zuletzt
einsortiert, und wenn der Server nach �bereinstimmenden Eintr�gen sucht,
benutzt er die erste �bereinstimmung, die er findet.


@cindex Platzhalter, in @code{mysql.tables_priv}-Tabelle
@cindex Platzhalter, in @code{mysql.columns_priv}-Tabelle
Die @code{tables_priv}- und @code{columns_priv}-Tabellen gew�hren Tabellen-
und Spalten-spezifische Berechtigungen. Werte in der
Geltungsbereichs-Feldern k�nnen wie folgt festgelegt werden:

@itemize @bullet
@item
Die Platzhalterzeichen @samp{%} und @samp{_} k�nnen im @code{Host}-Feld
beider Tabellen benutzt werden.

@item
Ein @code{'%'}- oder leerer @code{Host}-Wert in jeder der beiden Tabellen bedeutet ``jeder Host.''

@item
Die @code{Db}-, @code{Table_name}- und @code{Column_name}-Felder d�rfen in
beiden Tabellen keine Platzhalter enthalten oder leer sein.
@end itemize

Die @code{tables_priv}- und @code{columns_priv}-Tabellen werden nach den
@code{Host}-, @code{Db}- und @code{User}-Feldern sortiert. Das geschieht
�hnlich wie das Sortieren der @code{db}-Tabelle, wenngleich das Sortieren
einfacher ist, weil nur das @code{Host}-Feld Platzhalter enthalten darf.

Der Prozess der Anfragen�berpr�fung ist weiter unten beschrieben. (Wenn Sie
mit dem Quelltext f�r die Zugangs�berpr�fung vertraut sind, werden Sie
feststellen, dass die Beschreibung hier leicht vom im Code verwendeten
Algorithmus abweicht. Die Beschreibung stellt dar, was der Code tats�chlich
tut; sie weicht nur deshalb ab, um die Erkl�rung zu erleichtern.)

Bei Verwaltungsanfragen (@strong{shutdown}, @strong{reload} usw.) pr�ft der
Server nur den @code{user}-Tabelleneintrag, weil das die einzige Tabelle
ist, die Verwaltungsberechtigungen festlegt. Zugriff wird gew�hrt, wenn der
Eintrag die verlangte Operation erlaubt, ansonsten wird er verweigert. Wenn
Sie zum Beispiel @code{mysqladmin shutdown} ausf�hren wollen, aber Ihr
@code{user}-Tabelleneintrag Ihnen nicht die @strong{shutdown}-Berechtigung
gew�hrt, wird der Zugriff verweigert, ohne dass die @code{db}- oder
@code{host}-Tabellen gepr�ft werden. (Sie enthalten keine
@code{Shutdown_priv}-Spalte, daher gibt es keinen Grund, sie zur Pr�fung
heranzuziehen.)

Bei Datenbank-bezogenen Anfragen (@strong{insert}, @strong{update} usw.)
pr�ft der Server zuerst die globalen (superuser-) Berechtigungen, indem er
im @code{user}-Tabelleneintrag nachsieht. Wenn der Eintrag die verlangte
Operation erlaubt, wird der Zugriff gew�hrt. Wenn die globalen
Berechtigungen in der @code{user}-Tabelle unzureichend sind, stellt der
Server die Datenbank-spezifischen Berechtigungen des Benutzers fest, indem
er die @code{db}- und @code{host}-Tabellen pr�ft:

@enumerate
@item
Der Server sieht in der @code{db}-Tabelle nach einer �bereinstimmung in den
@code{Host}-, @code{Db}- und @code{User}-Feldern nach. In den @code{Host}-
und @code{User}-Feldern wird nach �bereinstimmung mit dem Hostnamen
gesucht, von dem aus sich der Benutzer verbindet, und nach �bereinstimmung
mit dem MySQL-Benutzernamen. Im @code{Db}-Feld wird nach �bereinstimmung
mit der Datenbank gesucht, mit der sich der Benutzer verbinden will. Wenn
es keinen Eintrag f�r @code{Host} und @code{User} gibt, wird der Zugriff
verweigert.

@item
Wenn es keinen �bereinstimmenden @code{db}-Tabelleneintrag gibt und das
@code{Host}-Feld nicht leer ist, bestimmt dieser Eintrag die
Datenbank-spezifischen Berechtigungen des Benutzers.

@item
Wenn das @code{Host}-Feld des �bereinstimmenden @code{db}-Tabelleneintrags
leer ist, bedeutet das, dass die @code{host}-Tabelle festlegt, welchen
Hosts Zugriff auf die Datenbank erlaubt werden soll. In diesem Fall schl�gt
der Server weiter in der @code{host}-Tabelle nach, um eine �bereinstimmung
in den @code{Host}- und @code{Db}-Feldern zu finden. Wenn kein
@code{host}-Tabelleneintrag passt, wird der Zugriff verweigert. Bei einer
�bereinstimmung werden die Datenbank-spezifischen Berechtigungen des
Benutzers als Schnittmenge (@emph{nicht} Vereinigungsmenge!) der
Berechtigungen in den @code{db}- und @code{host}-Tabelleneintr�gen
berechnet, was die Berechtigungen ergibt, die in beiden Eintr�gen
@code{'Y'} sind. (Auf diese Weise k�nnen Sie allgemeine Berechtigungen in
den @code{db}-Tabelleneintr�gen vergeben und diese dann fallweise von Host
zu Host beschr�nken, indem Sie die @code{host}-Tabelleneintr�ge benutzen.)
@end enumerate

Nachdem die Datenbank-spezifischen Berechtigungen festgestellt wurden, die
durch die @code{db}- und @code{host}-Tabelleneintr�ge gew�hrt werden, f�gt
der Server diese zu den globalen Berechtigungen in der @code{user}-Tabelle
hinzu. Wenn das Ergebnis die verlangte Operation erlaubt, wird der Zugriff
gew�hrt. Ansonsten pr�ft der Server die Tabellen- und
Spalten-Berechtigungen des Benutzers in den @code{tables_priv}- und
@code{columns_priv}-Tabellen und f�gt diese zu den Benutzerberechtigungen
hinzu. Aus dem Ergebnis ergibt sich, ob der Zugriff erlaubt oder verweigert
wird.

Als Boole'scher Term ausgedr�ckt kann die vorstehende Beschreibung der
Berechnung der Benutzerrechte wie folgt zusammengefasst werden:

@example
globale Berechtigungen
ODER (Datenbankberechtigungen UND Hostberechtigungen)
ODER Tabellenberechtigungen
ODER Spaltenberechtigungen
@end example

Vielleicht ist es nicht offensichtlich, warum der Server bei anf�nglich als
unzureichend herausgefundenen globalen @code{user}-Eintragsberechtigungen
f�r die verlangte Operation diese Berechtigungen anschlie�end zu den
Datenbank-, Tabellen- und Spalten-spezifischen Berechtigungen hinzuz�hlt.
Der Grund liegt darin, dass eine Anfrage m�glicherweise mehr als eine Sorte
von Berechtigungen erfordert. Wenn Sie beispielsweise ein @code{INSERT ...
SELECT}-Statement ausf�hren, brauchen Sie eventuell sowohl die
@strong{insert}- als auch die @strong{select}-Berechtigung. Ihre
Berechtigungen m�gen so sein, dass der @code{user}-Tabelleneintrag eine
Berechtigung enth�lt und der @code{db}-Tabelleneintrag die andere. In
diesem Fall haben Sie die notwendigen Berechtigungen, die Anfrage
auszuf�hren, aber das Server kann das nicht aus nur einer der beiden
Tabellen heraus erkennen, sondern muss daf�r die Eintr�ge beider Tabellen
kombinieren.

@cindex @code{host}-Tabelle
@cindex Tabellen, @code{host}

Die @code{host}-Tabelle kann benutzt werden, um eine Liste sicherer Server
zu pflegen.

Bei TcX enth�lt die @code{host}-Tabelle eine Liste aller Maschine des
lokalen Netzwerks. Diesen werden alle Berechtigungen gew�hrt.

Sie k�nnen die @code{host}-Tabelle auch dazu benutzen, die Host
aufzuf�hren, die @emph{nicht} sicher sind. Nehmen Sie an, Sie haben eine
Maschine @code{oeffentlich.ihre.domaene}, die an einem �ffentlichen Ort
ist, den Sie als nicht sicher erachten. Sie k�nnen allen Hosts in Ihrem
Netzwerk Zugriff gew�hren ausser dieser Maschine, indem Sie die
@code{host}-Tabelleneintr�ge wie folgt benutzen:

@example
+--------------------------+----+-
| Host                     | Db | ...
+--------------------------+----+-
| oeffentlich.ihre.domane  | %  | ... (alle Berechtigungen auf 'N' gesetzt)
| %.ihre.domaene           | %  | ... (alle Berechtigungen auf 'Y' gesetzt)
+--------------------------+----+-
@end example

@cindex Berechtigungen, �nderungen
@cindex �nderungen der Berechtigungen
@cindex Tabellen, gew�hren
@cindex Berechtigungstabellen

Nat�rlich sollten Sie Ihre Eintr�ge in die Berechtigungstabellen immer
testen (indem Sie zum Beispiel @code{mysqlaccess} benutzen), um
sicherzustellen, dass Ihre Zugriffsberechtigungen tats�chlich so gesetzt
sind, wie Sie denken.


@node Access denied,  , Request access, Privilege system
@c German node Zugriff verweigert
@subsection Gr�nde f�r @code{Access denied}-Fehler

Wenn Sie beim Verbindungsversuch zu einem MySQL-Server @code{Access
denied}-Fehler bekommen, gibt Ihnen die folgende Liste ein paar Hinweise,
das Problem zu beheben:

@itemize @bullet
@item
Haben Sie nach der Installation von MySQL das
@code{mysql_install_db}-Skript laufen lassen, um die anf�nglichen
Berechtigungstabelleninhalte zu konfigurieren? Wenn nicht, tun Sie das!
@xref{Default privileges}. Testen Sie die anf�nglichen
Berechtigungen, indem Sie folgenden Befehl ausf�hren:

@example
shell> mysql -u root test
@end example

Der Server sollte die Verbindung ohne Fehlermeldung zulassen. Stellen Sie
auch sicher, dass Sie eine Datei @file{user.MYD} im
MySQL-Datenbankverzeichnis haben. �blicherweise ist das
@file{PFAD/var/mysql/user.MYD}, wobei @code{PFAD} der Pfadname zum
MySQL-Installationsverzeichnis ist.

@item
Nach einer gerade durchgef�hrten Installation sollten Sie sich mit dem
Server verbinden und Ihre Benutzer und deren Zugriffsberechtigungen
einrichten:

@example
shell> mysql -u root mysql
@end example

Der Server sollte die Verbindung zulassen, weil der
MySQL-@code{root}-Benutzer anf�nglich kein Passwort hat. Das ist ein
Sicherheitsrisiko, daher sollten Sie das @code{root}-Passwort einrichten,
w�hrend Sie Ihre anderen MySQL-Benutzer einrichten.

Wenn Sie versuchen, sich als @code{root} zu verbinden, und folgenden Fehler
erhalten:

@example
Access denied for user: '@@unknown' to database mysql
@end example

hei�t das, dass Sie in der @code{user}-Tabelle keinen Eintrag
@code{'root'} im @code{User}-Spaltenwert haben und dass @code{mysqld} den
Hostnamen f�r Ihren Client nicht aufl�sen kann. In diesem Fall m�ssen Sie
den Server mit der @code{--skip-grant-tables}-Option neu starten und Ihrer
@file{/etc/hosts}- oder @file{\windows\hosts}-Datei einen Eintrag f�r Ihren
Host hinzuf�gen.

@item
Wenn Sie einen Fehler wie folgt erhalten:

@example
shell> mysqladmin -u root -pxxxx ver
Access denied for user: 'root@@localhost' (Using password: YES)
@end example

bedeutet das, dass Sie ein falsches Passwort benutzen. @xref{Passwords}.

Wenn Sie das Root-Passwort vergessen haben, k�nnen Sie @code{mysqld} mit
@code{--skip-grant-tables} neu starten, um das Passwort zu �ndern. Diese
Option wird weiter hinten im Handbuch ausf�hrlicher beschrieben.

Wenn Sie den obigen Fehler erhalten, obwohl Sie kein Passwort angegeben
haben, bedeutet das, dass in einer der @code{my.ini}-Dateien ein falsches
Passwort steht. @xref{Option files}. Sie k�nnen die Benutzung der
Optionsdateien mit der @code{--no-defaults}-Option wie folgt verhindern:

@example
shell> mysqladmin --no-defaults -u root ver
@end example

@item
@cindex @code{mysql_fix_privilege_tables}
Wenn Sie eine bestehende MySQL-Installation von einer Version vor 3.22.11
auf Version 3.22.11 oder sp�ter aktualisiert haben, haben Sie das
@code{mysql_fix_privilege_tables}-Skript ausgef�hrt? Falls nicht, tun Sie
das! Die Struktur der Berechtigungstabellen hat sich ab MySQL-Version
3.22.11 ge�ndert, als das @code{GRANT}-Statement mit Funktion erf�llt
wurde.

@item
Falls es aussieht, als h�tten sich Ihre Berechtigungen mitten in einer
Sitzung ge�ndert, kann es sein, dass ein Superuser sie ge�ndert hat. Das
Neuladen der Berechtigungstabellen betrifft neue
Client-Verbindungen, aber auch bestehende Verbindungen, wie in
@ref{Privilege changes} beschrieben.

@item
Wenn Sie es nicht schaffen, dass Ihr Passwort funktioniert, denken Sie
daran, dass Sie die @code{PASSWORD()}-Funktion benutzen m�ssen, wenn Sie
das Passwort mit den @code{INSERT}-, @code{UPDATE}- oder @code{SET
PASSWORD}-Statements setzen. Die @code{PASSWORD()}-Funktion wird nicht
ben�tigt, wenn Sie das Passwort mit dem @code{GRANT ... INDENTIFIED
BY}-Statement oder dem @code{mysqladmin password}-Befehl setzen.
@xref{Passwords}.

@item
@code{localhost} ist ein Synonym f�r Ihren lokalen Hostnamen und
gleichzeitig der vorgabem��ige Host, mit dem sich Clients versuchen zu
verbinden, wenn Sie nicht explizit einen Hostnamen angeben. Verbindungen zu
@code{localhost} funktionieren jedoch nicht, wenn Sie auf einem System
arbeiten, das MIT-pThreads benutzt (@code{localhost}-Verbindungen werden
�ber Unix-Sockets hergestellt, die von MIT-pThreads nicht unterst�tzt
werden). Um auf solchen Systemen Probleme zu vermeiden, sollten Sie die
@code{--host}-Option zu benutzen, um den Serverhost explizit anzugeben. Das
stellt eine TCP/IP-Verbindung zum @code{mysqld}-Server her. In diesem Fall
muss Ihr echter Hostname in den @code{user}-Tabelleneintr�gen auf dem
Server-Host stehen. (Das gilt sogar dann, wenn Sie ein Client-Programm auf
demselben Host fahren, wo der Server l�uft.)

@item
Wenn Sie beim Versuch, sich mit @code{mysql -u user_name db_name} mit einer
Datenbank zu verbinden, einen @code{Access denied}-Fehler erhalten, gibt es
eventuell ein Problem mit der @code{user}-Tabelle. Das k�nnen Sie
�berpr�fen, indem Sie @code{mysql -u root mysql} und folgendes
SQL-Statement absetzen:

@example
mysql> SELECT * FROM user;
@end example

Das Ergebnis sollte einen Eintrag enthalten, in dem die @code{Host}- und
@code{User}-Spalten mit dem Hostnamen Ihres Computers und Ihrem
MySQL-Benutzernamen �bereinstimmen.

@item
Die @code{Access denied}-Fehlermeldung sagt Ihnen, als wer Sie sich
versuchen einzuloggen, den Host, von dem aus Sie versuchen, sich zu
verbinden, und ob Sie ein Passwort benutzen oder nicht. Normalerweise
sollten Sie in der @code{user}-Tabelle einen Eintrag haben, der exakt mit
Ihrem Hostnamen und Ihrem Benutzernamen �bereinstimmt, die in der
Fehlermeldung ausgegeben wurden. Wenn Sie zum Beispiel eine Fehlermeldung
erhalten, die @code{Using password: NO} enth�lt, bedeutet das, dass Sie
versuchen sich einzuloggen, ohne ein Passwort anzugeben.

@item
Wenn Sie folgenden Fehler erhalten, wenn Sie sich von einem anderen Host
als dem, auf dem der MySQL-Server l�uft, zu verbinden, gibt es keine Zeile
in der @code{user}-Tabelle, die mit Ihrem Host �bereinstimmt:

@example
Host ... is not allowed to connect to this MySQL server
@end example

Das k�nnen Sie mit dem Kommandozeilentool @code{mysql} beheben (auf dem
Serverhost!) und eine Zeile zur @code{user}-, @code{db}- oder
@code{host}-Tabelle hinzuf�gen, die eine Benutzername-/Hostname-Kombination
enth�lt, von wo aus Sie sich verbinden wollen; danach f�hren Sie
@code{mysqladmin flush-privileges} aus. Wenn Sie nicht MySQL-Version 3.22
laufen lassen und die IP-Nummer oder den Hostnamen der Maschine nicht
kennen, von der aus Sie sich verbinden, sollten Sie einen Eintrag mit
@code{'%'} als @code{Host}-Spaltenwert in die @code{user}-Tabelle einf�gen
und @code{mysqld} mit der @code{--log}-Option auf der Servermaschine neu
starten. Nach dem Verbinden von der Client-Maschine aus zeigt die
Information im MySQL-Log an, wie Sie sich wirklich verbunden haben.
(Ersetzen Sie danach @code{'%'} im @code{user}-Tabelleneintrag durch den
tats�chlichen Hostnamen, der im Log steht. Ansonsten erhalten Sie ein
System, das unsicher ist.)

Ein weiterer Grund f�r diesen Fehler unter Linux kann sein, dass Sie eine
Bin�rversion von MySQL benutzen, die mit einer anderen glibc-Version
kompiliert wurde als die, die Sie benutzen. In diesem Fall sollten Sie
entweder die glibc Ihres Betriebssystems aktualisieren oder die
Quellversion von MySQL herunter laden und sie selbst kompilieren. Ein
Quell-RPM l��t sich normalerweise sehr einfach kompilieren und
installieren, daher stellt dies kein gro�es Problem dar.

@item
Wenn Sie eine Fehlermeldung erhalten, in der der Hostname nicht angezeigt
wird oder eine IP-Nummer ist, obwohl Sie sich mit einem Hostnamen versuchen
zu verbinden:

@example
shell> mysqladmin -u root -pxxxx -h ein-hostname ver
Access denied f�r user: 'root@' (Using password: YES)
@end example

bedeutet das, dass MySQL einen Fehler beim Aufl�sen der IP zu einem
Hostnamen erhielt. In diesem Fall k�nnen Sie @code{mysqladmin flush-hosts}
ausf�hren, um den internen DNS-Cache zu flushen. @xref{DNS}.

Einige dauerhafte L�sungen sind:

@itemize @minus
@item
Versuchen Sie herauszufinden, was mit Ihrem DNS-Server nicht funktioniert,
und beheben Sie das Problem.

@item
Geben Sie in den MySQL-Berechtigungstabellen IP-Nummern statt Hostnamen an.

@item
Starten Sie @code{mysqld} mit @code{--skip-name-resolve}.

@item
Starten Sie @code{mysqld} mit @code{--skip-host-cache}.

@item
Verbinden Sie sich zu @code{localhost} wenn Sie Server und Client auf
derselben Maschine laufen lassen.

@item
Tragen Sie die Client-Maschinennamen in @code{/etc/hosts} ein.
@end itemize

@item
Wenn @code{mysql -u root test} funktioniert, aber @code{mysql -h
your_hostname -u root test} zu @code{Access denied} f�hrt, haben Sie
eventuell nicht den korrekten Namen Ihres Hosts in der @code{user}-Tabelle.
Ein h�ufiges Problem hierbei ist, dass der @code{Host}-Wert im
@code{user}-Tabelleneintrag einen unqualifizierten Hostnamen festlegt, die
Namensaufl�sungsroutinen Ihres Systems aber einen voll qualifizierten
Dom�nennamen zur�ckgeben (oder umgekehrt). Wenn Sie zum Beispiel einen
Eintrag mit dem Host @code{'tcx'} in der @code{user}-Tabelle haben, Ihr DNS
MySQL aber mitteilt, dass Ihr Hostname @code{'tcx.subnet.se'} ist,
funktioniert der Eintrag nicht. F�gen Sie der @code{user}-Tabelle einen
Eintrag hinzu, der die IP-Nummer Ihres Hosts als @code{Host}-Spaltenwert
enth�lt. (Alternativ k�nnten Sie der @code{user}-Tabelle einen Eintrag mit
einem @code{Host}-Wert hinzuf�gen, der einen Platzhalter enth�lt, zum
Beispiel @code{'tcx.%'}. Allerdings ist die Benutzung von
Hostnamensendungen mit @samp{%} @emph{unsicher} und wird daher @emph{nicht}
empfohlen!)

@item
Wenn @code{mysql -u benutzername test} funktioniert, aber @code{mysql -u
benutzername andere_datenbank} nicht, haben Sie wahrscheinlich keinen
Eintrag f�r @code{andere_datenbank} in der @code{db}-Tabelle.

@item
Wenn @code{mysql -u benutzername datenbankname} funktioniert, wenn es auf
der Servermaschine ausgef�hrt wird, aber @code{mysql -u hostname -u
benutzername datenbankname} nicht, wenn es auf einer anderen Clientmaschine
ausgef�hrt wird, ist die Clientmaschine wahrscheinlich nicht in der
@code{user}-Tabelle oder der @code{db}-Tabelle aufgef�hrt.

@item
Wenn Sie gar nicht herausfinden k�nnen, warum Sie @code{Access denied}
erhalten, entfernen Sie aus der @code{user}-Tabelle alle Eintr�ge, die
@code{Host}-Werte haben, die Platzhalter enthalten (Eintr�ge, die @samp{%}
oder @samp{_} enthalten). Ein sehr h�ufiger Fehler besteht darin, einen
neuen Eintrag mit @code{Host}=@code{'%'} und
@code{User}=@code{'irgendein_benutzer'} in der Annahme hinzuzuf�gen, dass
einem das erlaubt, @code{localhost} anzugeben, um sich von derselben
Maschine aus zu verbinden. Der Grund, warum das nicht funktioniert, ist,
dass die vorgabem��igen Berechtigungen einen Eintrag mit
@code{Host}=@code{'localhost'} und @code{User}=@code{''} enthalten. Weil
dieser Eintrag einen @code{Host}-Wert @code{'localhost'} hat, der
spezifischer ist als @code{'%'}, wird er vorrangig vor dem neuen Eintrag
benutzt, wenn man sich von @code{localhost} verbindet! Das korrekte
Vorgehen ist, einen zweiten Eintrag mit @code{Host}=@code{'localhost'} und
@code{User}=@code{'irgendein_benutzer'} hinzuzuf�gen, oder den Eintrag mit
@code{Host}=@code{'localhost'} und @code{User}=@code{''} zu entfernen.

@item
Wenn Sie den folgenden Fehler erhalten, gibt es eventuell Probleme mit der
@code{db}- oder der @code{host}-Tabelle:

@example
Access to database denied
@end example

Wenn der aus der @code{db}-Tabelle ausgew�hlte Eintrag einen leeren Wert in
der @code{Host}-Spalte hat, stellen Sie sicher, dass es einen oder mehrere
korrespondierende Eintr�ge in der @code{host}-Tabelle gibt, die festlegen,
auf welche Hosts der @code{db}-Tabelleneintrag zutrifft.

Wenn Sie bei der Benutzung der SQL-Befehle @code{SELECT ... INTO OUTFILE}
oder @code{LOAD DATA INFILE} einen Fehler erhalten, enth�lt Ihr Eintrag in
der @code{user}-Tabelle wahrscheinlich keine angeschaltete
@strong{file}-Berechtigung.

@item
@cindex Konfigurationsdateien
@cindex Umgebungsvariablen
@tindex .my.cnf-Datei
Denken Sie daran, dass Client-Programme Verbindungsparameter benutzen, die
in Konfigurationsdateien oder Umgebungsvariablen festgelegt sind.
@xref{Environment variables}. Wenn ein Client anscheinend falsche
vorgabem��ige Verbindungsparameter sendet, wenn Sie diese nicht auf der
Kommandozeile angeben, �berpr�fen Sie Ihre Umgebung und die
@file{.my.cnf}-Datei in Ihrem Heimatverzeichnis. �berpr�fen Sie
gegebenenfalls auch systemweite MySQL-Konfigurationsdateien, obwohl es sehr
viel unwahrscheinlicher ist, dass Client-Verbindungsparameter in diesen
festgelegt werden. @xref{Option files}. Wenn Sie beim Laufenlassen eines
Clients ohne irgend welche Optionen @code{Access denied} erhalten, stellen
Sie sicher, dass Sie kein altes Passwort in irgendeiner Optionsdatei
angegeben haben! @xref{Option files}.

@item
Wenn Sie in den Berechtigungstabellen direkte �nderungen vornehmen (indem
Sie ein @code{INSERT}- oder @code{UPDATE}-Statement benutzen) und Ihre
�nderungen anscheinend ignoriert werden, denken Sie daran, dass sie ein
@code{FLUSH PRIVILEGES}-Statement absetzen m�ssen oder einen
@code{mysqladmin flush-privileges}-Befehl ausf�hren, um den Server zu
veranlassen, die Berechtigungstabellen neu einzulesen. Ansonsten haben Ihre
�nderungen keine Auswirkung, bis der Server das n�chste Mal gestartet wird.
Denken Sie auch daran, wenn Sie ein @code{root}-Passwort mit einem
@code{UPDATE}-Befehl festgelegt haben, dass Sie dieses solange nicht
angeben m�ssen, bis Sie die Berechtigungen flushen, weil der Server vorher
nicht wei�, dass Sie Ihr Passwort ge�ndert haben!

@item
Wenn Sie Zugriffsprobleme mit einem Perl-, PHP-, Python- oder ODBC-Programm
haben, versuchen Sie, sich mit @code{mysql -u benutzername datenbankname}
oder @code{mysql -u benutzername -pihr_passwort datenbankname} zu
verbinden. Wenn es Ihnen gelingt, sich mittels des @code{mysql}-Clients zu
verbinden, gibt es ein Problem mit Ihrem Programm und nicht mit den
Zugriffsberechtigungen. (Beachten Sie, dass zwischen @code{-p} und dem
Passwort kein Leerzeichen steht; alternativ k�nnen Sie auch die
@code{--password=ihr_passwort}-Syntax benutzen, um Ihr Passwort anzugeben.
Wenn Sie die @code{-p}-Option allein benutzen, wird MySQL eine
Eingabeaufforderung f�r das Passwort anzeigen.)

@item
Zum Testen starten Sie den @code{mysqld}-Daemon mit der
@code{--skip-grant-tables}-Option. Anschlie�end k�nnen Sie die
MySQL-Berechtigungstabellen �ndern und das @code{mysqlaccess}-Skript
benutzen, um zu sehen, ob Ihre �nderungen den gew�nschten Effekt haben oder
nicht. Wenn Sie mit Ihren �nderungen zufrieden sind, f�hren Sie
@code{mysqladmin flush-privileges} aus, um @code{mysqld} mitzuteilen, die
neuen Berechtigungstabellen zu benutzen.  @strong{Beachten Sie:} Das
Neuladen der Berechtigungstabellen �berschreibt die
@code{--skip-grant-tables}-Option. Das erlaubt Ihnen, den Server zu
veranlassen, die Berechtigungstabellen wieder zu benutzen, ohne ihn
herunter und dann wieder herauf fahren zu m�ssen.

@item
Wenn alles andere fehlschl�gt, starten Sie den @code{mysqld}-Daemon mit
einer Debugging-Option (zum Beispiel @code{--debug=d,general,query}). Das
gibt Host- und Benutzerinformationen �ber Verbindungsversuche aus sowie
Informationen �ber jeden abgesetzten Befehl. @xref{Making trace files}.

@item
Wenn Sie irgend welche anderen Probleme mit den MySQL-Berechtigungstabellen
haben und meinen, das Problem der Mailing-Liste mitteilen zu m�ssen,
stellen Sie immer einen Auszug Ihrer MySQL-Berechtigungstabellen zur
Verf�gung. Sie k�nnen einen Auszug der Tabellen mit dem @code{mysqldump
mysql}-Befehl erzeugen. Berichten Sie Ihr Problem - wie immer - unter
Benutzung des @code{mysqlbug}-Skripts. @xref{Bug reports}. In einigen
F�llen m�ssen Sie vielleicht @code{mysqld} mit @code{--skip-grant-tables}
neu starten, um @code{mysqldump} benutzen zu k�nnen.
@end itemize


@node User Account Management, Disaster Prevention, Privilege system, MySQL Database Administration
@c German node Benutzerkontenverwaltung
@section MySQL-Benutzerkonten-Verwaltung



@menu
* GRANT::                       
* User names::                  
* Privilege changes::           
* Default privileges::          
* Adding users::                
* Passwords::                   
* Password security::           
@end menu

@node GRANT, User names, User Account Management, User Account Management
@c German node GRANT
@subsection @code{GRANT}- und @code{REVOKE}-Syntax

@findex GRANT
@findex REVOKE

@cindex Berechtigungen, gew�hren
@cindex Berechtigungen, entziehen
@cindex global Berechtigungen
@cindex entziehen, Berechtigungen
@cindex gew�hren, Berechtigungen

@example
GRANT berechtigung_art [(spalten_liste)] [, berechtigung_art [(spalten_liste)] ...]
    ON @{tabelle | * | *.* | datenbank.*@}
    TO benutzername [IDENTIFIED BY 'passwort']
        [, benutzername [IDENTIFIED BY 'passwort'] ...]
    [REQUIRE 
    	[@{SSL| X509@}] 
	[CIPHER cipher [AND]] 
	[ISSUER issuer [AND]] 
	[SUBJECT subject]]
    [WITH GRANT OPTION]

REVOKE berechtigung_art [(spalten_liste)] [, berechtigung_art [(spalten_liste)] ...]
    ON @{tabelle | * | *.* | datenbank.*@}
    FROM benutzername [, benutzername ...]
@end example

@code{GRANT} ist implementiert ab MySQL Version 3.22.11. Bei fr�heren
MySQL-Versionen bewirkt das @code{GRANT}-Statement nichts.

Die @code{GRANT}- und @code{REVOKE}-Befehle erlauben Systemverwaltern,
Benutzer anzulegen und MySQL-Benutzern Rechte auf vier Berechtigungsebenen
zu gew�hren und zu entziehen:

@table @strong
@item Globale Ebene
Globale Berechtigungen betreffen alle Datenbanken auf einem gegebenen
Server. Diese Berechtigungen werden in der @code{mysql.user}-Tabelle
gespeichert.

@item Datenbank-Ebene
Datenbank-Berechtigungen betreffen alle Tabellen in einer gegebenen
Datenbank. Diese Berechtigungen werden in den @code{mysql.db}- und
@code{mysql.host}-Tabellen gespeichert.

@item Tabellen-Ebene
Tabellen-Berechtigungen betreffen alle Spalten in einer gegebenen Tabelle.
Diese Berechtigungen werden in der @code{mysql.tables_priv}-Tabelle
gespeichert.

@item Spalten-Ebene
Spalten-Berechtigungen betreffen einzelne Spalten in einer gegebenen
Tabelle. Diese Berechtigungen werden in der
@code{mysql.columns_priv}-Tabelle gespeichert.
@end table

Wenn Sie ein @code{GRANT} f�r einen Benutzer angeben, den es nicht gibt,
wird dieser Benutzer erzeugt. Beispiele, wie @code{GRANT} funktioniert,
finden Sie unter @ref{Adding users}.

Bei @code{GRANT} und @code{REVOKE}-Statements kann @code{berechtigung_art}
wie folgt angegeben werden:

@example
ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE
@end example

@code{ALL} ist ein Synonym f�r @code{ALL PRIVILEGES}. @code{REFERENCES} ist
noch nicht implementiert. @code{USAGE} ist momentan ein Synonym f�r ``keine
Berechtigungen''. Es kann benutzt werden, um einen Benutzer zu erzeugen,
der keine Berechtigungen hat.

Um einem Benutzer die @strong{grant}-Berechtigung zu entziehen, benutzen
Sie einen @code{berechtigung_art}-Wert @code{GRANT OPTION}:

@example
REVOKE GRANT OPTION ON ... FROM ...;
@end example

Die einzigen @code{berechtigung_art}-Werte, die Sie f�r eine Tabelle
festlegen k�nnen, sind @code{SELECT}, @code{INSERT}, @code{UPDATE},
@code{DELETE}, @code{CREATE}, @code{DROP}, @code{GRANT}, @code{INDEX} und
@code{ALTER}.

Die einzigen @code{berechtigung_art}-Werte, die Sie f�r eine Spalte
festlegen k�nnen (im Falle, dass Sie eine @code{spalten_liste}-Klausel
benutzen), sind @code{SELECT}, @code{INSERT} und @code{UPDATE}.

Sie k�nnen globale Berechtigungen setzen, indem Sie die @code{ON
*.*}-Syntax benutzen. Datenbank-Berechtigungen setzen Sie mit der @code{ON
datenbank.*}-Syntax. Wenn Sie @code{ON *} setzen und eine aktuelle
Datenbank ausgew�hlt haben, setzen Sie die Berechtigungen f�r diese
Datenbank. (@strong{ACHTUNG:} Wenn Sie @code{ON *} festlegen und
@emph{keine} aktuelle Datenbank ausgew�hlt haben, betrifft das die globalen
Berechtigungen!)

Um die Rechtegew�hrung f�r Benutzer von uneindeutigen Hosts aus zu
erm�glichen, unterst�tzt MySQL den @code{benutzername}-Wert in der Form
@code{benutzer@@host}. Wenn Sie eine @code{user}-Zeichenkette festlegen
wollen, die Sonderzeichen enth�lt (wie @samp{-}), oder eine
@code{host}-Zeichenkette, die Sonderzeichen oder Platzhalterzeichen enth�lt
(wie @samp{%}), k�nnen Sie Benutzernamen oder Hostnamen in
Anf�hrungszeichen setzen (beispielsweise @code{'test-benutzer'@@'test-hostname'}).

Sie k�nnen im Hostnamen Platzhalter angeben. @code{benutzer@@"%.loc.gov"}
zum Beispiel trifft auf @code{benutzer} f�r jeden Host in der Dom�ne
@code{loc.gov} zu. @code{benutzer@@"144.155.166.%"} trifft auf
@code{benutzer} f�r jeden Host im @code{144.155.166}-Class-C-Subnetz zu.

Die einfache Form @code{benutzer} ist ein Synonym f�r
@code{benutzer@@"%"}. @strong{ACHTUNG:} Wenn Sie anonymen Benutzern
erlauben, sich mit dem MySQL-Server zu verbinden (was vorgabem��ig der
Fall ist), sollten Sie auch alle lokalen Benutzer als
@code{benutzer@@localhost} hinzuf�gen, weil ansonsten der Eintrag f�r den
anonymen Benutzer f�r den lokalen Host in der @code{mysql.user}-Tabelle
benutzt wird, wenn der Benutzer versucht, sich von der lokalen Maschine in
den MySQL-Server einzuloggen! Anonyme Benutzer werden definiert, indem
Eintr�ge mit @code{User=''} in die @code{mysql.user}-Tabelle eingef�gt
werden. Das k�nnen Sie mit folgender Anfrage �berpr�fen:

@example
mysql> SELECT Host,User FROM mysql.user WHERE User='';
@end example

Momentan unterst�tzt @code{GRANT} nur Host-, Datenbank-, Tabellen- und
Spaltennamen mit maximal 60 Zeichen. Ein Benutzername kann bis zu 16
Zeichen lang sein.

Die Berechtigungen f�r eine Tabelle oder Spalte werden durch ein logisches
ODER der Berechtigungen auf jeder der vier Berechtigungsebenen zusammen
gesetzt. Wenn die @code{mysql.user}-Tabelle beispielsweise festlegt, dass
ein Benutzer eine globalen @strong{select}-Berechtigung hat, kann diese
nicht durch Eintr�ge auf Datenbank-, Tabellen- oder Spaltenebene widerrufen
werden.

Die Berechtigungen f�r eine Spalte k�nnen wie folgt berechnet werden:

@example
Globale Berechtigungen
ODER (Datenbank-Berechtigungen UND Host-Berechtigungen)
ODER Tabellen-Berechtigungen
ODER Spalten-Berechtigungen
@end example

In den meisten F�llen k�nnen Sie einem Benutzer Rechte auf lediglich einer
der Berechtigungsebenen gew�hren, wodurch das Leben nicht so kompliziert
ist wie oben dargestellt. Die Details der Prozedur zur �berpr�fung der
Berechtigungen sind in @ref{Privilege system} dargestellt.

Wenn Sie Berechtigungen f�r eine Benutzer-/Hostname-Kombination gew�hren,
die in der @code{mysql.user}-Tabelle nicht existiert, wird ein Eintrag
hinzugef�gt und verbleibt dort, bis der mit einem @code{DELETE}-Befehl
gel�scht wird. Mit anderen Worten: @code{GRANT} kann eventuell
@code{user}-Tabelleneintr�ge erzeugen, aber @code{REVOKE} entfernt diese
nicht, sondern Sie m�ssen das explizit mit @code{DELETE} machen.

@cindex Passw�rter, setzen
Ab MySQL-Version 3.22.12 wird, wenn ein neuer Benutzer erzeugt wird oder
wenn Sie globale Grant-Berechtigungen haben, das Passwort des Benutzers
durch die @code{IDENTIFIED BY}-Klausel festgelegt, wenn eine angegeben
wird. Wenn der Benutzer bereits ein Passwort hat, wird es durch das neue
ersetzt.

@strong{ACHTUNG:} Wenn Sie einen neuen Benutzer anlegen, aber keine
@code{IDENTIFIED BY}-Klausel angeben, hat der neue Benutzer kein Passwort.
Das ist unsicher.

Passw�rter k�nnen auch mit dem @code{SET PASSWORD}-Befehl gesetzt werden.
@xref{SET OPTION, , @code{SET OPTION}}.

Wenn Sie Berechtigungen f�r eine Datenbank gew�hren, wird ein Eintrag in
der @code{mysql.db}-Tabellen erzeugt, falls notwendig. Wenn alle
Berechtigungen f�r die Datenbank mit @code{REVOKE} widerrufen wurden, wird
dieser Eintrag gel�scht.

Wenn ein Benutzer �berhaupt keine Berechtigungen auf eine Tabelle hat, wird
die Tabelle nicht angezeigt, wenn der Benutzer nach einer Liste von
Tabellen anfragt (zum Beispiel mit einem @code{SHOW TABLES}-Statement).

Die @code{mit GRANT OPTION}-Klausel gibt dem Benutzer die M�glichkeit,
anderen Benutzern jegliche der Berechtigungen zu vergeben, die der Benutzer
auf der angegebenen Berechtigungsebene hat. Sie sollten vorsichtig damit
sein, wem Sie die @strong{grant}-Berechtigung geben, denn zwei Benutzer mit
unterschiedlichen Berechtigungen k�nnen in der Lage sein, Ihre
Berechtigungen zu addieren!

Sie k�nnen einem Benutzer keine Berechtigung gew�hren, die Sie selbst nicht
haben; die @strong{grant}-Berechtigung erlaubt Ihnen nur, die
Berechtigungen zu vergeben, die Sie selbst besitzen.

Wenn Sie einem Benutzer die @strong{grant}-Berechtigung auf einer
bestimmten Berechtigungsebene geben, denken Sie daran, dass der Benutzer
jegliche Berechtigungen, die der Benutzer schon besitzt (oder die ihm in
Zukunft gew�hrt werden!), auf dieser Ebene auch an andere Benutzer gew�hrt
werden k�nnen. Nehmen Sie an, Sie gew�hren einem Benutzer die
@strong{insert}-Berechtigung auf eine Datenbank. Wenn Sie danach die
@strong{select}-Berechtigung auf die Datenbank mit @code{WITH GRANT OPTION}
gew�hren, kann der Benutzer nicht nur die @strong{select}-Berechtigung
weiter geben, sondern auch @strong{insert}. Wenn Sie dem Benutzer danach
die @strong{update}-Berechtigung auf die Datenbank gew�hren, kann der
Benutzer insgesamt @strong{insert}, @strong{select} und @strong{update}
weiter geben.

Sie sollten einem normalen Benutzer keine @strong{alter}-Berechtigung
gew�hren. Wenn Sie das tun, kann der Benutzer versuchen, das
Berechtigungssystem zu unterlaufen, indem er Tabellen umbenennt!

Beachten Sie: Wenn Sie Tabellen- oder Spalten-Berechtigungen auch nur f�r
einen Benutzer gew�hren, untersucht der Server Tabellen- und
Spalten-Berechtigungen f�r alle Benutzer. Dadurch wird MySQL etwas
langsamer.

Wenn @code{mysqld} startet, werden alle Berechtigungen in den Speicher
eingelesen. Datenbank-, Tabellen- und Spalten-Berechtigungen werden sofort
wirksam. Berechtigungen auf Benutzerebene werden wirksam, wenn sich der
Benutzer das n�chste Mal verbindet. �nderungen in den
Berechtigungstabellen, die Sie mit @code{GRANT} oder @code{REVOKE}
durchf�hren, werden vom Server sofort bemerkt. Wenn Sie
Berechtigungstabellen manuell �ndern (mit @code{INSERT}, @code{UPDATE}
usw.), m�ssen Sie ein @code{FLUSH PRIVILEGES}-Statement ausf�hren oder
@code{mysqladmin flush-privileges} laufen lassen, um den Server zu
veranlassen, die Berechtigungstabellen neu zu laden.
@xref{Privilege changes}.

@cindex ANSI SQL, Unterschiede zu
Die gr��ten Unterschiede zwischen ANSI SQL und MySQL-Versionen von
@code{GRANT} sind:

@itemize @bullet
@item
In MySQL werden Berechtigungen f�r eine Benutzername-/Hostname-Kombination
vergeben und nicht nur f�r einen Benutzernamen.

@item
ANSI SQL hat keine globalen oder Datenbankebene-Berechtigungen und
unterst�tzt nicht alle Berechtigungsarten, die MySQL unterst�tzt. MySQL
unterst�tzt nicht die ANSI-SQL-@code{TRIGGER}-, @code{EXECUTE}- oder
@code{UNDER}-Berechtigungen.

@item
ANSI-SQL-Berechtigungen werden auf hierarchische Art strukturiert. Wenn Sie
einen Benutzer entfernen, werden alle Berechtigungen, die dieser Benutzer
gew�hrt hat, widerrufen. In MySQL werden die gew�hrten Berechtigungen nicht
automatisch widerrufen, sondern Sie m�ssen das selbst tun.

@item
Wenn Sie in MySQL das @code{INSERT}-Recht nur f�r Teile der Spalten einer
Tabelle haben, k�nnen Sie dennoch @code{INSERT}-Statements auf der Tabelle
ausf�hren. Die Spalten, f�r die Sie keine @code{INSERT}-Berechtigung haben,
werden auf ihre Vorgabewerte gesetzt. ANSI SQL erfordert, dass Sie die
@code{INSERT}-Berechtigung auf alle Spalten haben.

@item
Wenn Sie eine Tabelle in ANSI SQL l�schen, werden alle Berechtigungen f�r
die Tabelle widerrufen. Wenn Sie eine Berechtigung in ANSI SQL widerrufen,
werden alle Berechtigungen, die auf dieser Berechtigung basierend gew�hrt
wurden, widerrufen. In MySQL k�nnen Berechtigungen nur explizit mit
@code{REVOKE}-Befehlen oder durch die Manipulation der
MySQL-Berechtigungstabellen widerrufen werden.
@end itemize

-----------
@cindex SSL- und X509-Grundlagen
MySQL unterst�tzt SSL-verschl�sselte Verbindungen. Um zu verstehen, wie
MySQL SSL benutzt, m�ssen wir einige Grundlagen von SSL und X509 erl�utern.
Leute, die damit schon vertraut sind, k�nnen dieses Kapitel �berspringen.

Vorgabem��ig benutzt MySQL unverschl�sselte Verbindungen zwischen Client
und Server. Das hei�t, dass jeder auf dem Weg dazwischen lauschen und Ihre
Daten, die �bertragen werden, mitlesen kann. Dar�ber hinaus k�nnten einige
Leute auch den Inhalt von Daten �ndern, die zwischen Client und Server
ausgetauscht werden. M�glicherweise haben Sie auch wirklich geheime Daten
�ber �ffentliche Netzwerke zu �bertragen, und eine �ffentlichkeit solcher
Art ist unakzeptabel.

SSL ist ein Protokoll, das unterschiedliche Verschl�sselungsalgorithmen
benutzt, um sicherzustellen, dass Daten aus einem �ffentlichen Netzwerk
vertraut werden kann. Es besitzt Mechanismen, um Ver�nderungen, Verlust
oder wiederholtes Abspielen (Replay) von Daten zu entdecken. SSL enth�lt
auch Algorithmen, um die Identit�t zu erkennen und zu �berpr�fen, indem der
X509-Standard benutzt wird.

@cindex Was ist Verschl�sselung
Mittels Verschl�sselung werden jegliche Arten von Daten unlesbar gemacht.
Dar�ber hinaus werden in der heutigen Praxis Verschl�sselungsalgorithmen
viele weitere Elemente hinzugef�gt. Sie sollten vielen Arten bekannter
Angriffe widerstehen, wie dem Herumspielen mit der Reihenfolge
verschl�sselter Nachrichten oder dem doppelten Abspielen (Replay) von
Daten.

@cindex Was ist ein X509-Zertifikat?
X509 ist der Standard, der es erm�glicht, jemanden im Internet zu
identifizieren. Er wird meistens beim E-Commerce �ber das Internet benutzt.
Kurz gesagt sollte es ein Unternehmen namens "Zertifizierungsautorit�t"
geben, die jedem elektronische Zertifikate zuordnet, der diese braucht.
Zertifikate beruhen auf asymmetrischen Verschl�sselungsalgorithmen, die
zwei Verschl�sselungsschl�ssel haben - �ffentlichen und geheimen.
Zertifikatsbesitzer k�nnen ihre Identit�t jeder anderen Seite beweisen.
Zertifikate beinhalten den �ffentlichen Schl�ssel des Besitzers. Alle
Daten, die damit verschl�sselt werden, k�nnen nur vom Besitzer des geheimen
Schl�ssels entschl�sselt werden.

@cindex M�gliche Fragen:
Frage: Warum benutzt MySQL nicht standardm��ig verschl�sselte Verbindungen?
Antwort: Weil es MySQL langsamer macht. Jede zus�tzliche Funktionalit�t
erfordert, dass ein Computer zus�tzliche Arbeit verrichtet, und das
Verschl�sseln von Daten ist eine CPU-intensive Operation, die leicht die
Zeit und Leistung �bertreffen kann, die MySQL selbst verbraucht und
ben�tigt. MySQL ist vorgabem��ig auf Geschwindigkeit optimiert.
Frage: Ich brauche mehr Informationen �ber SSL / X509 / Verschl�sselung
usw.
Antwort: Benutzen Sie Ihre bevorzugte Internet-Suchmaschine und suchen Sie
nach den Schl�sselw�rtern, die Sie interessieren.


@cindex SSL-bezogene Optionen

MySQL kann x509-Zertifikat-Attribute pr�fen, zus�tzlich zum meist benutzten
Benutzername-/Passwort-Schema. Alle gew�hnlich Optionen werden immer noch
ben�tigt (Benutzername, Passw�rter, IP-Adressmaske,
Datenbank-/Tabellenname).

Es gibt verschiedene M�glichkeiten, Verbindungen zu begrenzen:

@itemize @bullet
@item
Ohne jegliche SSL-/X509-Optionen werden alle Arten verschl�sselter und
unverschl�sselter Verbindungen zugelassen, wenn Benutzername und Passwort
g�ltig sind.

@item
Die @code{REQUIRE SSL}-Option erzwingt SSL-verschl�sselte Verbindungen.
Beachten Sie, dass dieses Erfordernis �bergangen werden kann, wenn es
irgend welche weiteren ACL-Datens�tze gibt, die Verbindungen ohne SSL
zulassen.

Beispiel:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" REQUIRE SSL
@end example


@item
* @code{REQUIRE X509} Wenn ein X509-Zertifikat erforderlich ist, bedeutet
das, dass der Client ein g�ltiges Zertifikat haben muss, aber wir k�mmern
uns nicht um das genaue Zertifikat, den Herausgeber (Issuer) oder den
Betreff (Subject). Die einzige Einschr�nkung ist, dass es m�glich sein
sollte, seine Unterschrift (Signature) mit einigen unserer CA-Zertifikate
zu �berpr�fen.

Beispiel:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" REQUIRE X509
@end example

@item
@code{REQUIRE ISSUER issuer} macht Verbindungen restriktiver: Jetzt muss
der Client ein g�ltiges X509-Zertifikat vorlegen, das von einem CA-Issuer
herausgegeben wurde. Die Benutzung von X509-Zertifikaten impliziert immer
Verschl�sselung, daher wird die Option "SSL" nicht mehr ben�tigt.

Beispiel:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" REQUIRE ISSUER "C=FI, ST=Some-State, L=Helsinki, O=MySQL Finnland AB, CN=Tonu Samuel/Email=tonu@@mysql.com"
@end example

@item
@code{REQUIRE SUBJECT betreff} erfordert, dass der Client ein g�ltiges
X509-Zertifikat mit dem Betreff "betreff" darauf hat. Wenn der Client ein
g�ltiges Zertifikat hat, was aber einen anderen Betreff besitzt, wird die
Verbindung nicht zugelassen.

Beispiel:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@@mysql.com"
@end example

@item
@code{REQUIRE CIPHER cipher} wird ben�tigt um sicherzustellen, dass
Chiffrierungen und Schl�ssell�ngen benutzt werden, die stark genug sind.
SSL selbst kann schwach sein, wenn alte Algorithmen mit kurzen
Verschl�sselungsschl�sseln benutzt werden. Wenn diese Option benutzt wird,
k�nnen wir exakte Chiffrierungen anfordern, bevor die Verbindung erlaubt
wird.

Beispiel:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA"
@end example

Es ist erlaubt, die Optionen in Kombination wie folgt zu benutzen:
@example
GRANT ALL PRIVILEGES ON test.* TO root@@localhost IDENTIFIED BY "goodsecret" 
	REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@@mysql.com" 
	AND ISSUER "C=FI, ST=Some-State, L=Helsinki, O=MySQL Finnland AB, CN=Tonu Samuel/Email=tonu@@mysql.com" 
	AND CIPHER "EDH-RSA-DES-CBC3-SHA"
@end example

Es ist aber nicht erlaubt, irgend eine der Optionen doppelt zu benutzen.
Nur unterschiedliche Optionen d�rfen gemischt werden.
@end itemize
-----------

@node User names, Privilege changes, GRANT, User Account Management
@c German node Benutzernamen
@subsection MySQL-Benutzernamen und -Passw�rter

@cindex Benutzernamen und Passw�rter
@cindex Passw�rter, f�r Benutzer

Es gibt mehrere Unterschiede in der Art, wie Benutzernamen und Passw�rter
von MySQL benutzt werden, und der Art, wie sie von Unix oder Windows
benutzt werden:

@itemize @bullet
@item
Benutzernamen, wie sie von MySQL f�r Authentifizierungszwecke benutzt
werden, haben nicht zu tun mit Unix-Benutzernamen (Login-Namen) oder
Windows-Benutzernamen. Die meisten MySQL-Clients versuchen sich zwar
vorgabem��ig einzuloggen, indem sie den aktuellen Unix-Benutzernamen als
den MySQL-Benutzernamen verwenden, aber das geschieht nur aus Gr�nden der
Bequemlichkeit. Client-Programme lassen zu, dass ein anderer Name mit den
@code{-u}- oder @code{--user}-Optionen angegeben wird. Das bedeutet, dass
Sie eine Datenbank nicht auf irgend eine Weise sicher machen k�nnen, wenn
nicht alle MySQL-Benutzernamen Passw�rter haben. Jeder kann versuchen, sich
mit dem Server zu verbinden, indem er irgend einen Namen angibt, und wird
damit Erfolg haben, wenn er einen Namen angibt, der kein Passwort hat.

@item
MySQL-Benutzernamen k�nnen bis zu 16 Zeichen lang sein; Unix-Benutzernamen
sind typischerweise auf 8 Zeichen begrenzt.

@item
MySQL-Passw�rter haben nichts mit Unix-Passw�rtern zu tun. Es gibt keine
notwendige Verbindungen zwischen dem Passwort, das Sie benutzen, um sich an
einer Unix-Maschine anzumelden, und dem Passwort, das Sie benutzen, um auf
eine Datenbank auf dieser Maschine zuzugreifen.

@item
@c German FIX unsplit @ref
MySQL verschl�sselt Passw�rter mit einem anderen Algorithmus als dem, der
w�hrend des Unix-Login-Prozesses benutzt wird, siehe die Beschreibungen der
@code{PASSWORD()}- und @code{ENCRYPT()}-Funktionen in
@ref{Miscellaneous functions}.
Beachten Sie, dass trotz der Tatsache, dass das Passwort
'zerhackt' gespeichert wird, es ausreicht, Ihr 'zerhacktes' Passwort zu
kennen, um sich am MySQL-Server anmelden zu k�nnen!
@end itemize

MySQL-Benutzer und ihre Berechtigungen werden normalerweise mit dem
@code{GRANT}-Befehl erzeugt. @xref{GRANT}.

Wenn Sie sich an einem MySQL-Server mit einem Kommandozeilen-Client
anmelden, sollten Sie das Passwort mit @code{--password=ihr-passwort}
eingeben. @xref{Connecting}.

@example
mysql --user=monty --password=rate_mal datenbankname
@end example

Wenn Sie m�chten, dass der Client eine Eingabeaufforderung f�r das Passwort
pr�sentiert, sollten Sie @code{--password} ohne Argument benutzen.

@example
mysql --user=monty --password datenbankname
@end example

Oder in der kurzen Form:

@example
mysql -u monty -p datenbankname
@end example

Beachten Sie, dass in den letzten Beispielen 'datenbankname' @strong{NICHT}
das Passwort ist.

Wenn Sie die @code{-p}-Option zur Eingabe des Passworts benutzen wollen,
tun Sie das wie folgt:

@example
mysql -u monty -prate_mal datenbankname
@end example

Auf einigen Systemen k�rzt die Bibliothek, die MySQL benutzt, um die
Eingabeaufforderung f�r das Passwort auszugeben, das Passwort auf 8
Zeichen. Intern hat MySQL keine Beschr�nkung hinsichtlich der L�nge des
Passworts.


@node Privilege changes, Default privileges, User names, User Account Management
@c German node Berechtigungs�nderungen
@subsection Wann Berechtigungs�nderungen wirksam werden

Wenn @code{mysqld} startet, werden alle Berechtigungstabelleninhalte in den
Arbeitsspeicher eingelesen und werden zu diesem Zeitpunkt wirksam.

�nderungen in den Berechtigungstabellen, die mit @code{GRANT},
@code{REVOKE} oder @code{SET PASSWORD} durchgef�hrt werden, werden
unmittelbar vom Server bemerkt.

Wenn Sie die Berechtigungstabellen manuell �ndern (mit @code{INSERT},
@code{UPDATE} usw.), m�ssen Sie ein @code{FLUSH PRIVILEGES}-Statement
ausf�hren oder @code{mysqladmin flush-privileges} oder @code{mysqladmin
reload} laufen lassen, um den Server anzuweisen, die Berechtigungstabellen
neu einzulesen. Ansonsten haben Ihre �nderungen @emph{keine Auswirkung},
bis Sie den Server neu starten. Wenn Sie die Berechtigungstabellen manuell
�ndern, aber vergessen, die Berechtigungen neu zu laden, werden Sie sich
wundern, warum trotz Ihrer �nderungen kein Unterschied zu bemerken ist!

Wenn der Server bemerkt, dass sich die Berechtigungstabellen ge�ndert
haben, werden bestehende Client-Verbindungen wie folgt davon betroffen:

@itemize @bullet
@item
Tabellen- und Spalten-Berechtigungs�nderungen werden bei der n�chsten
Anfrage des Clients wirksam.

@item
Datenbank-Berechtigungs�nderungen werden beim n�chsten @code{USE
datenbank}-Befehl wirksam.
@end itemize

Globale Berechtigungs�nderungen und Passwort�nderungen werden beim n�chsten
Mal wirksam, wenn sich der Client verbindet.


@node Default privileges, Adding users, Privilege changes, User Account Management
@c German node Vorgabem��ige Berechtigungen
@subsection Einrichtung der anf�nglichen MySQL-Berechtigungen

@cindex Berechtigungen, vorgabem��ig
@cindex Vorgaben, Berechtigungen
@cindex Root-Passwort
@cindex Superuser
@cindex Benutzer, Root
@cindex anonymer Benutzer
@cindex Passwort, Root-Benutzer

Nach der Installation von MySQL konfigurieren Sie die anf�nglichen
Zugriffsberechtigungen, indem Sie @code{scripts/mysql_install_db} laufen
lassen.
@xref{Quick install}.
Das @code{mysql_install_db}-Skript startet den @code{mysqld}-Server und
initialisiert dann die Berechtigungstabellen, so dass diese folgenden Satz
an Berechtigungen enthalten:

@itemize @bullet
@item
Der MySQL-@code{root}-Benutzer wird als Superuser angelegt, der alles tun
darf. Verbindungen m�ssen vom lokalen Host aus gemacht werden.

@strong{HINWEIS:}
Das anf�ngliche @code{root}-Passwort ist leer, daher kann sich jeder als
@code{root} @emph{ohne Passwort} verbinden und hat alle Berechtigungen.

@item
@cindex anonymer Benutzer
Ein anonymer Benutzer wird erzeugt, der mit Datenbanken, die den Namen
@code{'test'} haben oder mit @code{'test_'} anfangen, alles tun darf.
Verbindungen m�ssen vom lokalen Host aus gemacht werden. Das hei�t, dass
sich jeder lokale Benutzer ohne Passwort verbinden kann und als anonymer
Benutzer behandelt wird.

@item
Andere Berechtigungen werden verweigert. Beispielsweise k�nnen normale
Benutzer nicht @code{mysqladmin shutdown} oder @code{mysqladmin
processlist} benutzen.
@end itemize

@strong{HINWEIS:} Die vorgabem��igen Berechtigungen sind unter Windows
anders.
@xref{Windows running}.

Weil Ihre Installation anfangs weit offen ist, sollten Sie als eins der
ersten Dinge ein Passwort f�r den MySQL-@code{root}-Benutzer anlegen. Das
k�nnen Sie wie folgt tun (beachten Sie, dass das Passwort mit der
@code{PASSWORD()}-Funktion angegeben wird):

@example
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('neues_passwort')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;
@end example

Ab MySQL-Version 3.22 k�nnen Sie das @code{SET PASSWORD}-Statement
benutzen:

@example
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('neues_passwort');
@end example

Eine weitere M�glichkeit, das Passwort zu setzen, besteht in der Benutzung
des @code{mysqladmin}-Befehls:

@example
shell> mysqladmin -u root password neues_passwort
@end example

Nur Benutzer mit Schreib-/Aktualisierungszugriff auf die
@code{mysql}-Datenbank k�nnen das Passwort f�r andere Benutzer �ndern. Alle
normalen Benutzer (nicht anonyme Benutzer) k�nnen nur ihr eigenes Passwort
�ndern, entweder mit einem der obigen Befehle oder mit @code{SET
PASSWORD=PASSWORD('neues_passwort')}.

Denken Sie daran, wenn Sie das Passwort in der @code{user}-Tabelle direkt
mit der ersten Methode �ndern, dass Sie den Server anweisen m�ssen, die
Berechtigungstabellen neu einzulesen (mit @code{FLUSH PRIVILEGES}), weil
die �nderungen ansonsten nicht wahrgenommen werden.

Sobald das @code{root}-Passwort gesetzt wurde, m�ssen Sie in der Folge
immer das Passwort angeben, wenn Sie sich als @code{root} mit dem Server
verbinden.

Eventuell wollen Sie das @code{root}-Passwort leer lassen, damit Sie es f�r
die weitere Konfiguration oder f�r Tests nicht angeben m�ssen. Stellen Sie
jedoch sicher, dass Sie es setzen, bevor Sie Ihre Installation f�r irgend
welche Produktionsaufgaben benutzen.

Sehen Sie im @code{scripts/mysql_install_db}-Skript nach, wie es die
vorgabem��igen Berechtigungen installiert. Sie k�nnen das als Grundlage
f�r das Hinzuf�gen weiterer Benutzer nehmen.

Wenn Sie wollen, dass die anf�nglichen Berechtigungen anders sind als die
gerade beschriebenen, k�nnen Sie @code{mysql_install_db} ab�ndern, bevor
Sie es benutzen.

@cindex Berechtigungstabellen, neu erzeugen
@cindex neu erzeugen, Berechtigungstabellen
Um die Berechtigungstabellen komplett neu zu erzeugen, entfernen Sie alle
@file{.frm}-, @file{.MYI}- und @file{.MYD}-Dateien im Verzeichnis, das die
@code{mysql}-Datenbank enth�lt. (Das ist das Verzeichnis namens
@file{mysql} unter dem Datenbank-Verzeichnis, was aufgelistet wird, wenn
Sie @code{mysqld --help} laufen lassen.) Lassen Sie dann das
@code{mysql_install_db}-Skript laufen, eventuell nachdem Sie es editiert
haben, um die Berechtigungen zu enthalten, die Sie haben wollen.

@strong{HINWEIS:} Bei MySQL-Versionen vor Version 3.22.10 sollten Sie die
@file{.frm}-Dateien NICHT l�schen. Wenn Sie das versehentlich doch tun,
m�ssen Sie sie aus Ihrer MySQL-Distribution zur�ck kopieren, bevor Sie
@code{mysql_install_db} laufen lassen.


@node Adding users, Passwords, Default privileges, User Account Management
@c German node Benutzer hinzuf�gen
@subsection Neue MySQL-Benutzer hinzuf�gen

@findex GRANT-Statement
@findex Statements, GRANT

@cindex Berechtigungen, hinzuf�gen
@cindex hinzuf�gen, neue Benutzerberechtigungen
@cindex Benutzerberechtigungen, hinzuf�gen

Sie k�nnen Benutzer auf zwei Arten hinzuf�gen: Indem Sie
@code{GRANT}-Statements verwenden oder indem Sie die
MySQL-Berechtigungstabellen direkt ver�ndern. Die bevorzugte Methode ist,
@code{GRANT}-Statements zu benutzen, denn sie sind pr�ziser und weniger
fehleranf�llig. @xref{GRANT}.

Ausserdem gibt es eine Menge von Dritten beigesteuerte Programme wie
@code{phpmyadmin}, die benutzt werden k�nnen, um Benutzer zu erzeugen und
zu verwalten. @xref{Contrib}.

Die unten stehenden Beispiele zeigen, wie man den @code{mysql}-Client
benutzt, um neue Benutzer zu erzeugen. Die Beispiele setzen voraus, dass
Berechtigungen mit den Vorgabewerten eingerichtet wurden, die im vorherigen
Abschnitt beschrieben wurden. Um also �nderungen machen zu k�nnen, m�ssen
Sie sich von derselben Maschine aus verbinden, wo @code{mysqld} l�uft, und
Sie m�ssen sich als MySQL-@code{root}-Benutzer verbinden, und der
@code{root}-Benutzer muss die @strong{insert}-Berechtigung f�r die
@code{mysql}-Datenbank und die @strong{reload}-Verwaltungsberechtigung
haben. Wenn Sie bereits das @code{root}-Benutzerpasswort ge�ndert haben,
m�ssen Sie es f�r die unten stehenden @code{mysql}-Befehle eingeben.

Sie f�gen neue Benutzer mit @code{GRANT}-Statements hinzu:

@example
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@@localhost
           IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@@"%"
           IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@@localhost;
mysql> GRANT USAGE ON *.* TO dummy@@localhost;
@end example

Diese @code{GRANT}-Statements richten drei neue Benutzer ein:

@table @code
@item monty
Einen echten Superuser, der sich von irgendwo her mit dem Server verbinden
kann, aber das Passwort @code{'ein_passwort'} daf�r verwenden muss.
Beachten Sie, dass man @code{GRANT}-Statements sowohl f�r
@code{monty@@localhost} als auch f�r @code{monty@@"%"} verwenden muss. Wenn
man keinen Eintrag mit @code{localhost} hinzuf�gt, hat der Eintrag f�r den
anonymen Benutzer f�r @code{localhost} Vorrang, der durch
@code{mysql_install_db} angelegt wird, wenn man sich vom lokalen Host aus
verbindet, weil dieser einen spezifischeren @code{Host}-Feldwert hat und
daher fr�her in der @code{user}-Tabellen-Sortierreihenfolge auftaucht.

@item admin
Ein Benutzer, der sich ohne Passwort von @code{localhost} aus verbinden
kann und der die @strong{reload}- und @strong{process}-
Verwaltungsberechtigungen hat. Das erlaubt dem Benutzt, die
@code{mysqladmin reload}-, @code{mysqladmin refresh}- und @code{mysqladmin
flush-*}-Befehle sowie @code{mysqladmin processlist} auszuf�hren. Es werden
keine Datenbank-bezogenen Berechtigungen gew�hrt. (Diese k�nnen sp�ter
gew�hrt werden, indem zus�tzliche @code{GRANT}-Statements ausgef�hrt
werden.)

@item dummy
Ein Benutzer, der sich ohne Passwort verbinden kann, aber nur vom lokalen
Host aus. Die globalen Berechtigungen sind alle auf @code{'N'} gesetzt -
diese @code{USAGE}-Berechtigung erlaubt Ihnen, einen Benutzer ohne
Berechtigungen anzulegen. Es wird angenommen, dass Sie sp�ter
Datenbank-spezifische Berechtigungen gew�hren.
@end table

@findex INSERT-Statement, Grant-Berechtigungen
@findex Statements, INSERT
Sie k�nnen dieselben Benutzerzugriffsinformationen direkt mittels
@code{INSERT}-Statements eingeben und dann den Server anweisen, die
Berechtigungstabellen neu zu laden:

@example
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('ein_passwort'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('ein_passwort'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
                 Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                        VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
@end example

Abh�ngig von Ihrer MySQL-Version m�ssen Sie oben eventuell eine andere
Anzahl von @code{'Y'}-Werten eingeben (Versionen vor Version 3.22.11 hatten
weniger Berechtigungsspalten). Beim @code{admin}-Benutzer wird die besser
lesbare @code{INSERT}-Syntax benutzt, die ab Version 3.22.11 verf�gbar ist.

Beachten Sie, dass Sie f�r die Einrichtung eines Superusers lediglich einen
@code{user}-Tabelleneintrag mit Berechtigungsfeldern einrichten m�ssen, die
auf @code{'Y'} gesetzt sind. Es sind keine @code{db}- oder
@code{host}-Tabelleneintr�ge n�tig.

The Berechtigungsspalten in der @code{user}-Tabelle wurden im letzten
@code{INSERT}-Statement nicht explizit gesetzt (f�r den Benutzer
@code{dummy}), daher erhalten diese Spalten ihren Vorgabewert von
@code{'N'}. Das ist dasselbe, was @code{GRANT USAGE} macht.

Das folgende Beispiel f�gt einen Benutzer @code{custom} hinzu, der sich von
@code{localhost}, @code{server.domain} und @code{whitehouse.gov} aus
verbinden kann. Er will auf die @code{bankkonto}-Datenbank nur von
@code{localhost} aus zugreifen, auf die @code{spesen}-Datenbank nur von
@code{whitehouse.gov} aus und auf die @code{kunde}-Datenbank von allen drei
Hosts aus. Er will von allen drei Hosts aus das Passwort @code{dumm}
benutzen.

Um die Berechtigungen dieses Benutzers mit @code{GRANT}-Statements
einzurichten, geben Sie folgende Befehle ein:

@example
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON bankkonto.*
           TO custom@@localhost
           IDENTIFIED BY 'dumm';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON spesen.*
           TO custom@@whitehouse.gov
           IDENTIFIED BY 'dumm';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON kunde.*
           TO custom@@'%'
           IDENTIFIED BY 'dumm';
@end example

Der Grund, warum wir Grant-Statements f�r den Benutzer 'custom' eingeben,
ist, dass wir dem Benutzer Zugriff auf MySQL sowohl von der lokalen
Maschine mit Unix-Sockets als auch von der entfernten Maschine
'whitehouse.gov' �ber TCP/IP geben wollen.

Um die Benutzerberechtigungen durch direkte �nderungen an den
Berechtigungstabellen einzugeben, geben Sie folgende Befehle ein (beachten
Sie das @code{FLUSH PRIVILEGES} am Ende):

@example
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('localhost','custom',PASSWORD('dumm'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('server.domain','custom',PASSWORD('dumm'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('whitehouse.gov','custom',PASSWORD('dumm'));
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('localhost','bankkonto','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('whitehouse.gov','spesen','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES('%','kunde','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
@end example

Die ersten drei @code{INSERT}-Statements f�gen @code{user}-Tabelleneintr�ge
hinzu, die dem Benutzer @code{custom} erlauben, sich von den verschiedenen
Hosts aus mit dem gegebenen Passwort zu verbinden, gew�hren ihm aber keine
Berechtigungen (alle Berechtigungen werden auf den Vorgabewert @code{'N'}
gesetzt). Die n�chsten drei @code{INSERT}-Statements f�gen
@code{db}-Tabelleneintr�ge hinzu, die @code{custom} Berechtigungen f�r die
@code{bankkonto}-, @code{spesen}- und @code{kunde}-Datenbanken gew�hren,
aber nur, wenn auf sie von den korrekten Hosts aus zugegriffen wird. Wie
immer, wenn die Berechtigungstabellen direkt ver�ndert werden, muss dem
Server gesagt werden, dass er sie neu laden muss (mit @code{FLUSH
PRIVILEGES}), damit die Berechtigungs�nderungen wirksam werden.

Wenn Sie einem bestimmten Benutzer Zugriff von irgendeiner Maschine in
einer gegebenen Dom�ne geben wollen, k�nnen Sie ein @code{GRANT}-Statement
wie das folgende absetzen:

@example
mysql> GRANT ...
           ON *.*
           TO benutzername@@"%.domaene.de"
           IDENTIFIED BY 'passwort';
@end example

Um dasselbe durch direkte �nderung der Berechtigungstabellen einzugeben,
machen Sie folgendes:

@example
mysql> INSERT INTO user VALUES ('%.domaene.de', 'benutzername',
           PASSWORD('passwort'),...);
mysql> FLUSH PRIVILEGES;
@end example

Sie k�nnen auch @code{xmysqladmin}, @code{mysql_webadmin} und sogar
@code{xmysql} benutzen, um die Werte in den Berechtigungstabellen
einzuf�gen, zu �ndern und zu aktualisieren. Sie finden diese Werkzeuge unter
@uref{http://www.mysql.com/downloads/contrib/,Contrib-Verzeichnis der
MySQL-Website}.


@node Passwords, Password security, Adding users, User Account Management
@c German node Passw�rter
@subsection Passw�rter einrichten

@findex PASSWORD()
@findex SET PASSWORD Statement

@cindex Passw�rter, setzen
@cindex setzen, Passw�rter

In den meisten F�llen sollten Sie @code{GRANT} benutzen, um Ihre Benutzer /
Passw�rter einzurichten, daher trifft das folgende nur f�r fortgeschrittene
Benutzer zu. @xref{GRANT, , @code{GRANT}}.

Die Beispiele in den vorherigen Abschnitten erl�utern ein wichtiges
Prinzip: Wenn Sie ein nicht leeres Passwort mit @code{INSERT}- oder
@code{UPDATE}-Statements setzen, m�ssen Sie die @code{PASSWORD()}-Funktion
benutzen, um es zu verschl�sseln. Das liegt daran, dass die
@code{user}-Tabelle Passw�rter in verschl�sselter Form speichert, nicht als
Klartext. Wenn Sie diese Tatsache vergessen, ist es m�glich, dass sie
Passw�rter wie folgt setzen:

@example
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','heinzholger','keks');
mysql> FLUSH PRIVILEGES;
@end example

Das Ergebnis ist, dass der Klartextwert @code{'keks'} als Passwort in
der @code{user}-Tabelle gespeichert ist. Wenn der Benutzer @code{heinzholger}
versucht, sich mittels dieses Passworts mit dem Server zu verbinden,
verschl�sselt der @code{mysql}-Client es mit @code{PASSWORD()}, erzeugt
damit einen Authentifikationsvektor, der auf dem @strong{verschl�sselten}
Passwort und einer Zufallszahl basiert, die er vom Server erh�lt, und
schickt das Ergebnis zum Server. Der Server benutzt den
@code{password}-Wert in der @code{user}-Tabelle (den @strong{nicht
verschl�sselten} Wert @code{'keks'}), um dieselben Berechnungen
durchzuf�hren, und vergleicht die Ergebnisse. Der Vergleich schl�gt fehl
und der Server verweigert die Verbindung:

@example
shell> mysql -u heinzholger -pkeks test
Access denied
@end example

Passw�rter m�ssen verschl�sselt sein, wenn sie in die @code{user}-Tabelle
eingef�gt werden, daher h�tte das @code{INSERT}-Statement also wie folgt
formuliert sein m�ssen:

@example
mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','heinzholger',PASSWORD('keks'));
@end example

Sie m�ssen die @code{PASSWORD()}-Funktion auch benutzen, wenn Sie @code{SET
PASSWORD}-Statements gebrauchen:

@example
mysql> SET PASSWORD FOR heinzholger@@"%" = PASSWORD('keks');
@end example

Wenn Sie Passw�rter mit dem @code{GRANT ... IDENTIFIED BY}-Statement oder
dem @code{mysqladmin password}-Befehl setzen, wird die
@code{PASSWORD()}-Funktion nicht ben�tigt. Beide sorgen daf�r, dass das
Passwort verschl�sselt wird, daher w�rden Sie ein Passwort @code{'keks'}
wie folgt setzen:

@example
mysql> GRANT USAGE ON *.* TO heinzholger@@"%" IDENTIFIED BY 'keks';
@end example

oder

@example
shell> mysqladmin -u heinzholger password keks
@end example

@strong{NOTE:} @code{PASSWORD()} verschl�sselt Passw�rter nicht auf
dieselbe Art, wie das bei Unix-Passw�rtern der Fall ist. Wenn daher Ihr
Unix-Passwort und Ihr MySQL-Passwort identisch sind, sollten Sie daraus
nicht schlie�en, dass @code{PASSWORD()} denselben Verschl�sselungswert
ergibt wie der, der in der Unix-Passwortdatei gespeichert ist.
@xref{User names}.


@node Password security,  , Passwords, User Account Management
@c German node Passwort-Sicherheit
@subsection Wie Sie Ihre Passw�rter sicher halten

Es ist nicht ratsam, Ihr Passwort so einzugeben, dass es von anderen
Benutzern entdeckt werden kann. Die verschiedenen Methoden, Passw�rter
bei der Benutzung von Client-Programmen einzugeben, sind unten aufgef�hrt,
jeweils mit einer Einsch�tzung des Risikos der Methode:

@itemize @bullet
@item
Geben Sie einem normalen Benutzer nie Zugriff auf die
@code{mysql.user}-Tabelle. Wenn jemand das verschl�sselte Passwort f�r
einen Benutzer kennt, erm�glicht ihm das, sich als dieser Benutzer
einzuloggen. Die Passw�rter sind nur 'zerhackt', so dass niemand das echte
Passwort sehen k�nnen sollte, das Sie benutzen (falls Sie ein �hnliches
Passwort f�r Ihre anderen Applikationen benutzen sollten).

@item
Sie k�nnen auf der Kommandozeile die @code{-pyour_pass}- oder
@code{--password=your_pass}-Option benutzen. Das ist bequem, aber unsicher,
weil Ihr Passwort f�r Systemzustandsprogramme (wie @code{ps}) sichtbar
wird, die m�glicherweise von anderen Benutzer aufgerufen werden, um
Kommandozeilen anzuzeigen. (MySQL-Clients �berschreiben typischerweise die
Kommandozeilenargumente w�hrend der Initialisierungssequenz mit Nullen,
dennoch gibt es einen kurzen Zeitraum, w�hrend dessen der Wert sichtbar
ist.)

@item
Sie k�nnen eine @code{-p}- oder @code{--password}-Option (ohne
@code{ihr_passwort}-Wert) benutzen. In diesem Fall erbittet das
Client-Programm das Passwort vom Terminal:
@findex -p-Option
@findex -password-Option

@example
shell> mysql -u benutzername -p
Enter password: ********
@end example

Die @samp{*}-Zeichen stehen f�r Ihr Passwort.

Es ist sicherer, Ihr Passwort auf diese Art einzugeben statt auf der
Kommandozeile, weil es f�r andere Benutzer nicht sichtbar wird. Diese
Methode ist jedoch nur f�r Programme geeignet, die interaktiv laufen. Wenn
Sie einen Client von einem Skript aus aufrufen wollen, das nicht interaktiv
l�uft, gibt es keine M�glichkeit, das Passwort vom Terminal aus einzugeben.
Auf solchen Systemen kann es sogar vorkommen, dass die erste Zeile Ihres
Skripts gelesen und (f�lschlicherweise) als Ihr Passwort interpretiert
wird!

@item
@tindex .my.cnf-Datei
Sie k�nnen Ihr Passwort in einer Konfigurationsdatei speichern.
Beispielsweise k�nnen Sie Ihr Passwort im @code{[client]}-Abschnitt der
@file{.my.cnf}-Datei in Ihrem Heimatverzeichnis auff�hren:

@example
[client]
password=ihr_passwort
@end example

Wenn Sie Ihr Passwort in @file{.my.cnf} speichern, sollte die Datei nicht
f�r die Gruppe (group) lesbar oder schreibbar sein. Stellen Sie sicher,
dass der Zugriffsmodus der Datei @code{400} oder @code{600} ist.

@xref{Option files}.
@item
Sie k�nnen Ihr Passwort in der @code{MYSQL_PWD}-Umgebungsvariablen
speichern, aber diese Methode wird als extrem unsicher erachtet und sollte
nicht gew�hlt werden. Einige Versionen von @code{ps} beinhalten eine
Option, die Umgebung laufender Prozesse anzeigen zu lassen; Ihr Passwort
w�rde dann f�r alle im Klartext lesbar sein, wenn Sie @code{MYSQL_PWD}
setzen. Selbst auf Systemen ohne eine solche Version von @code{ps} ist es
nicht ratsam, anzunehmen, dass es keine andere Methode gibt,
Prozessumgebungen einzusehen. @xref{Environment variables}.
@end itemize

Alles in allem sind die sichersten Methoden, das Passwort entweder durch
Client-Programm entgegen nehmen zu lassen oder es in einer sauber
abgesicherten @file{.my.cnf}-Datei einzugeben.


@node Disaster Prevention, Database Administration, User Account Management, MySQL Database Administration
@c German node Katastrophenschutz und Wiederherstellung
@section Katastrophenschutz und Wiederherstellung



@menu
* Backup::                      
* BACKUP TABLE::                
* RESTORE TABLE::               
* CHECK TABLE::                 
* REPAIR TABLE::                
* Table maintenance::           
* Maintenance regimen::         
* Table-info::                  
@end menu

@node Backup, BACKUP TABLE, Disaster Prevention, Disaster Prevention
@c German node Datensicherung
@subsection Datenbank-Datensicherungen

@cindex Datenbanken, Datensicherungen
@cindex Datensicherungen

Weil MySQL-Tabellen als Dateien gespeichert werden, ist es leicht, eine
Datensicherung durchzuf�hren. Um eine konsistente Datensicherung zu
erhalten, machen Sie ein @code{LOCK TABLES} auf die relevanten Tabellen,
gefolgt von @code{FLUSH TABLES} f�r die Tabellen.
@xref{LOCK TABLES, , @code{LOCK TABLES}}.
@xref{FLUSH, , @code{FLUSH}}.
Sie brauchen lediglich eine Lesesperre (Read Lock); das erlaubt anderen
Threads, die Tabellen weiterhin abzufragen, w�hrend Sie eine Kopie der
Dateien im Datenbank-Verzeichnis machen. @code{FLUSH TABLE} wird ben�tigt,
um sicherzustellen, dass alle aktiven Indexseiten auf Platte zur�ck
geschrieben werden, bevor Sie die Datensicherung beginnen.

Wenn Sie eine Tabellensicherung auf SQL-Ebene machen wollen, k�nnen Sie
@code{SELECT INTO OUTFILE} oder @code{BACKUP TABLE} benutzen.
@xref{SELECT}. @xref{BACKUP TABLE}.

Eine weitere M�glichkeit, eine Datenbank zu sichern, stellt die Benutzung
des @code{mysqldump}-Programms oder des @code{mysqlhotcopy-Skript}s dar.
@xref{mysqldump, , @code{mysqldump}}. @xref{mysqlhotcopy, ,
@code{mysqlhotcopy}}.

@enumerate
@item
Machen Sie eine komplette Sicherung Ihrer Datenbanken:

@example
shell> mysqldump --tab=/pfad/zum/verzeichnis/ --opt --full

or

shell> mysqlhotcopy Datenbank /pfad/zum/verzeichnis/
@end example

Sie k�nnen auch einfach alle Tabellendateien (@file{*.frm}-, @file{*.MYD}-
und @file{*.MYI}-Dateien) kopieren, solange der Server nicht gerade etwas
aktualisiert. Das Skript @code{mysqlhotcopy} benutzt diese Methode.

@item
@cindex Log-Dateien, Namen
Halten Sie @code{mysqld} an, wenn er l�uft, und starten Sie ihn mit der
@code{--log-update[=datei]}-Option. @xref{Update log}. Die
Update-Log-Datei(en) gibt Ihnen die Information, die Sie daf�r ben�tigen,
um �nderungen an der Datenbank zu replizieren, die ab dem Zeitpunkt
durchgef�hrt wurden, als Sie @code{mysqldump} ausf�hrten.
@end enumerate

Wenn Sie etwas wiederherstellen m�ssen, versuchen Sie zun�chst, Ihre
Tabellen mit @code{REPAIR TABLE} oder @code{myisamchk -r} wieder
herzustellen. Das sollte in 99,9% aller F�lle funktionieren. Wenn
@code{myisamchk} fehlschl�gt, probieren Sie folgende Prozedur (das
funktioniert nur, wenn Sie MySQL mit @code{--log-update} gestartet haben.
@xref{Update log}.):

@enumerate
@item
Stellen Sie die originale @code{mysqldump}-Datensicherung wieder her.
@item
F�hren Sie folgenden Befehl aus, um die Aktualisierungen (Updates) im
Bin�r-Log noch einmal laufen zu lassen:

@example
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
@end example

Wenn Sie das Update-Log benutzen, k�nnen Sie folgendes machen:

@example
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
@end example
@end enumerate

@code{ls} wird benutzt, um alle Update-Log-Dateien in der richtigen
Reihenfolge zu erhalten.

Mit @code{SELECT * INTO OUTFILE 'datei' FROM tabelle} k�nnen Sie auch
selektive Datensicherungen herstellen und diese wieder herstellen mit
@code{LOAD DATA INFILE 'datei' REPLACE ...}. Um Duplikate zu vermeiden,
ben�tigen Sie einen Prim�rschl�ssel (@code{PRIMARY KEY}) oder einen
eindeutigen Schl�ssel (@code{UNIQUE}) in der Tabelle. Das Schl�sselwort
@code{REPLACE} f�hrt dazu, dass alte Datens�tze durch neue ersetzt werden,
wenn ein neuer Datensatz einen alten auf einem eindeutigen Schl�sselwert
duplizieren w�rde.

Wenn Sie bei der Datensicherung auf Ihrem System Performance-Probleme
bekommen, k�nnen Sie diese l�sen, indem Sie Replikation einrichten und die
Datensicherungen auf dem Slave statt auf dem Master durchf�hren.
@xref{Replication Intro}.

Wenn Sie ein Veritas-Dateisystem benutzen, k�nnen Sie folgendes tun:

@enumerate
@item 
F�hren Sie einen Client- (Perl ?) @code{FLUSH TABLES mit READ LOCK} aus.

@item
Forken Sie eine Shell oder f�hren Sie einen anderen Client aus @code{mount
vxfs snapshot}.

@item
F�hren Sie im ersten Client @code{UNLOCK TABLES} aus.

@item
Kopieren Sie die Dateien von snapshot

@item
Unmounten Sie snapshot
@end enumerate


@node BACKUP TABLE, RESTORE TABLE, Backup, Disaster Prevention
@c German node BACKUP TABLE
@subsection @code{BACKUP TABLE}-Syntax

@findex BACKUP TABLE

@cindex Datensicherungen, Datenbank

@example
BACKUP TABLE tabelle[,tabelle...] TO '/pfad/zum/backup/verzeichnis'
@end example

Machen Sie eine Kopie aller Tabellendateien ins Datensicherungsverzeichnis,
was die Mindestanforderung f�r die Wiederherstellung darstellt. Momentan
funktioniert das nur bei @code{MyISAM}-Tabellen. Bei @code{MyISAM}-Tabellen
kopiert man @code{.frm}- (Definition) und @code{.MYD}- (Daten) Dateien. Die
Indexdatei kann aus diesen beiden aufgebaut werden.

@c German FIX changed @xref to @ref
Bevor Sie diesen Befehl ausf�hren, sehen Sie bitte unter
@ref{Backup} nach.

W�hrend der Datensicherung gilt eine Lesesperre (Read Lock) f�r jede
Tabelle, eine nach der anderen, w�hrend sie gesichert werden. Wenn Sie
mehrere Tabellen als Schnappschuss sichern wollen, m�ssen Sie zuerst ein
@code{LOCK TABLES} ausf�hren, das eine Lesesperre f�r jede Tabelle in der
zu sichernden Gruppe enth�lt.

Der Befehl gibt eine Tabelle mit folgenden Spalten zur�ck:

@multitable @columnfractions .35 .65
@item @strong{Spalte} @tab @strong{Wert}
@item Table @tab Tabellenname
@item Op @tab Immer ``backup''
@item Msg_type @tab @code{status}, @code{error}, @code{info} oder @code{warning}.
@item Msg_text @tab Die Meldung.
@end multitable

Beachten Sie, dass @code{BACKUP TABLE} erst ab MySQL 3.23.25 verf�gbar ist.


@node RESTORE TABLE, CHECK TABLE, BACKUP TABLE, Disaster Prevention
@c German node RESTORE TABLE
@subsection @code{RESTORE TABLE}-Syntax

@findex RESTORE TABLE

@example
RESTORE TABLE tabelle[,tabelle...] FROM '/pfad/zum/backup/verzeichnis'
@end example

Stellt die Tabelle(n) aus der Datensicherung her, die mit @code{BACKUP
TABLE} gesichert wurde(n). Bestehende Tabellen werden nicht �berschrieben;
wenn Sie �ber bestehende Tabellen wiederherstellen wollen, erhalten Sie
eine Fehlermeldung. RESTORE ben�tigt l�nger als Datensicherung, weil der Index neu
aufgebaut werden muss. Je mehr Schl�ssel Sie haben, desto l�nger dauert es.
Genau wie @code{BACKUP TABLE} funktioniert RESTORE momentan nur mit
@code{MyISAM}-Tabellen.


Der Befehl gibt eine Tabelle mit folgenden Spalten zur�ck:

@multitable @columnfractions .35 .65
@item @strong{Spalte} @tab @strong{Wert}
@item Table @tab Tabellenname
@item Op @tab Immer ``restore''
@item Msg_type @tab @code{status}, @code{error}, @code{info} oder @code{warning}.
@item Msg_text @tab Die Meldung.
@end multitable


@node CHECK TABLE, REPAIR TABLE, RESTORE TABLE, Disaster Prevention
@c German node CHECK TABLE
@subsection @code{CHECK TABLE}-Syntax

@findex CHECK TABLE

@example
CHECK TABLE tabelle[,tabelle...] [option [option...]]

option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
@end example

@code{CHECK TABLE} funktioniert nur bei @code{MyISAM}-Tabellen. Bei
@code{MyISAM}-Tabellen ist es dasselbe, wie @code{myisamchk -m tabelle}
�ber die Tabelle laufen zu lassen.

Wenn Sie keine Option angeben, wird @code{MEDIUM} benutzt.

Pr�ft die Tabelle(n) auf Fehler. Bei @code{MyISAM}-Tabellen werden die
Schl�ssel-Statistiken aktualisiert. Der Befehl gibt eine Tabelle mit
folgenden Spalten zur�ck:

@multitable @columnfractions .35 .65
@item @strong{Spalte} @tab @strong{Wert}
@item Table    @tab Tabellenname
@item Op       @tab Immer ``check''.
@item Msg_type @tab @code{status}, @code{error}, @code{info} oder @code{warning}.
@item Msg_text @tab Die Meldung.
@end multitable

Beachten Sie, dass Sie viele Zeilen an Information f�r jede gepr�fte
Tabelle erhalten. Die letzte Zeile enth�lt den @code{Msg_type status} und
sollte normalerweise @code{OK} sein. Wenn Sie nicht @code{OK} erhalten, oder @code{Not
checked}, sollten Sie im Normalfall eine Reparatur der Tabelle durchf�hren.
@xref{Table maintenance}. @code{Not checked} bedeutet, dass bei der Tabelle
der angegebene @code{TYPE} MySQL mitgeteilt hat, dass es keinerlei
Notwendigkeit gab, die Tabelle zu pr�fen.

Die unterschiedlichen Pr�foptionen stehen f�r folgendes:

@multitable @columnfractions .20 .80
@item @strong{Option} @tab @strong{Bedeutung}
@item @code{QUICK} @tab Keine Zeilen nach falschen Verkn�pfungen (Links) durchsehen (scannen).
@item @code{FAST}  @tab Nur Tabellen pr�fen, die nicht ordnungsgem�� geschlossen wurden.
@item @code{CHANGED} @tab Nur Tabellen pr�fen, die seit der letzten Pr�fung ge�ndert wurden oder die nicht ordnungsgem�� geschlossen wurden.
@item @code{MEDIUM} @tab Zeilen durchsehen (scannen), um zu best�tigen, dass gel�schte Verkn�pfungen (Links) in Ordnung sind. Diese Option berechnet auch eine Schl�ssel-Pr�fsumme f�r die Zeilen und best�tigt diese mit einer berechneten Pr�fsumme f�r die Schl�ssel.
@item @code{EXTENDED} @tab Schl�gt komplett alle Schl�ssel f�r jede Zeile nach (Lookup). Hierdurch wird sichergestellt, dass die Tabelle 100% konsistent ist, aber das ben�tigt lange Zeit!
@end multitable

Bei @code{MyISAM}-Tabellen dynamischer Gr��e f�hrt eine Pr�fung immer
eine @code{MEDIUM}-Pr�fung durch. Bei Zeilen statischer L�nge wird das
Durchsehen (Scan) der Zeilen durch @code{QUICK} und @code{FAST}
�bersprungen, weil solche Zeilen sehr selten besch�digt sind.

Sie k�nnen Pr�foptionen wie folgt kombinieren:

@example
CHECK TABLE test_tabelle FAST QUICK;
@end example

Das w�rde nur eine QUICK-Pr�fung der Tabelle durchf�hren, wenn diese nicht
ordnungsgem�� geschlossen worden w�re.

@strong{HINWEIS:} In einigen F�llen kann @code{CHECK TABLE} zu einer
�nderung der Tabelle f�hren! Das geschieht, wenn die Tabelle als
'besch�digt' oder 'nicht ordnungsgem�� geschlossen' gekennzeichnet ist,
aber @code{CHECK TABLE} keine Probleme in der Tabelle gefunden hat. In
diesem Fall kennzeichnet @code{CHECK TABLE} die Tabelle als in Ordnung.

Wenn eine Tabelle besch�digt ist, liegt das Problem h�chst wahrscheinlich
in den Indexen und nicht im Daten-Teil. Alle oben genannten Pr�foptionen
pr�fen die Indexe gr�ndlich und sollten daher die meisten Fehler finden.

Wenn Sie lediglich eine Tabelle pr�fen wollen, von der Sie annehmen, dass
sie in Ordnung ist, sollten Sie keine Pr�foptionen oder die
@code{QUICK}-Option angeben. Letztere sollte benutzt werden, wenn Sie es
eilig haben und das sehr geringe Risiko auf sich nehmen k�nnen, dass
@code{QUICK} keinen Fehler in der Daten-Datei findet. (In den meisten F�llen
sollte MySQL bei normalem Gebrauch jeden Fehler in der Daten-Datei finden.
Wenn das geschieht, wird die Tabelle als 'besch�digt' gekennzeichnet, was
bedeutet, dass die Tabelle solange nicht benutzt werden kann, bis sie
repariert ist.)

@code{FAST} und @code{CHANGED} sind in erster Linie f�r die Benutzung durch
ein Skript vorgesehen (zum Beispiel f�r die Ausf�hrung durch cron), wenn
Sie Ihre Tabellen von Zeit zu Zeit pr�fen wollen. F�r die meisten
Anwendungsf�lle sollte man @code{FAST} vor @code{CHANGED} bevorzugen. (Der
einzige Fall, wo das nicht so ist, ist, wenn Sie vermuten, einen Bug im
@code{MyISAM}-Code gefunden zu haben.)

@code{EXTENDED} ist nur f�r den Fall vorgesehen, dass Sie eine normale
Pr�fung haben durchlaufen lassen, aber immer noch seltsame Fehler von einer
Tabelle erhalten, wenn MySQL versucht, eine Zeile zu aktualisieren oder
eine Zeile �ber einen Schl�ssel zu finden (das ist sehr unwahrscheinlich,
wenn eine normale Pr�fung durchgelaufen ist!).

Es wurde berichtet, dass bei der Tabellenpr�fung einige Dinge nicht
automatisch korrigiert werden k�nnen:

@itemize @bullet
@item
@code{Found row where the auto_increment column has the value 0}.

Das bedeutet, dass es in der Tabelle eine Zeile gibt, in der die
@code{auto_increment}-Index-Spalte den Wert 0 enth�lt. (Es ist m�glich,
eine Zeile zu erzeugen, in der die auto_increment-Spalte 0 ist, indem man
die Spalte explizit mit einem @code{UPDATE}-Statement auf 0 setzt.)

Das ist f�r sich genommen kein Fehler, kann aber Probleme verursachen, wenn
Sie die Tabelle dumpen und dann wiederherstellen, oder ein @code{ALTER
TABLE} auf die Tabelle machen. In diesen F�llen �ndert sich der Wert der
auto_increment-Spalte gem�� den Regeln f�r auto_increment-Spalten, was
Probleme wie doppelte Schl�sseleintragsfehler bringen k�nnte.

Um diese Warnmeldung loszuwerden, f�hren Sie einfach ein
@code{UPDATE}-Statement durch und setzen die Spalte auf irgend einen
anderen Wert als 0.
@end itemize


@node REPAIR TABLE, Table maintenance, CHECK TABLE, Disaster Prevention
@c German node REPAIR TABLE
@subsection @code{REPAIR TABLE}-Syntax

@findex REPAIR TABLE

@example
REPAIR TABLE tabelle[,tabelle...] [QUICK] [EXTENDED]
@end example

@code{REPAIR TABLE} funktioniert nur bei @code{MyISAM}-Tabellen und ist
dasselbe, wie @code{myisamchk -r tabelle} auf die Tabelle auszuf�hren.

Normalerweise sollten sie diesen Befehl nie ausf�hren m�ssen, aber wenn ein
Ungl�ck passiert, ist es sehr wahrscheinlich, dass Sie alle Daten einer
MyISAM-Tabelle mit @code{REPAIR TABLE} retten k�nnen. Wenn Ihre Tabellen
h�ufig besch�digt werden, sollten Sie versuchen, den Grund hierf�r
herauszufinden! @xref{Crashing}. @xref{MyISAM table problems}.

@code{REPAIR TABLE} repariert eine m�glicherweise besch�digte Tabelle. Der
Befehl gibt eine Tabelle mit folgenden Spalten zur�ck:

@multitable @columnfractions .35 .65
@item @strong{Spalte} @tab @strong{Wert}
@item Table @tab Tabellenname
@item Op @tab Immer ``repair''
@item Msg_type @tab @code{status}, @code{error}, @code{info} oder @code{warning}.
@item Msg_text @tab Die Meldung.
@end multitable

Beachten Sie, dass Sie viele Zeilen an Informationen f�r jede reparierte
Tabelle erhalten. Die letzte Zeile enth�lt den @code{Msg_type status} und
sollte normalerweise @code{OK} sein. Wenn Sie nicht @code{OK} erhalten,
sollten Sie versuchen, die Tabelle mit @code{myisamchk -o} zu reparieren,
weil @code{REPAIR TABLE} noch nicht alle Optionen von @code{myisamchk}
enth�lt. In naher Zukunft werden wir das flexibler gestalten.

Wenn @code{QUICK} angegeben wird, versucht MySQL lediglich ein
@code{REPAIR} des Indexbaums.

Wenn Sie @code{EXTENDED} benutzen, erzeugt MySQL den Index Zeile f�r Zeile,
anstatt einen Index auf einmal durch Sortieren zu erzeugen. Das kann bei
Schl�sseln fester L�nge besser sein, wenn Sie lange @code{char()}-Schl�ssel
haben, die sich gut komprimieren lassen.


@node Table maintenance, Maintenance regimen, REPAIR TABLE, Disaster Prevention
@c German node Tabellenwartung
@subsection Benutzung von @code{myisamchk} f�r Tabellenwartung und Absturzreparatur

Ab MySQL-Version 3.23.13 k�nnen Sie MyISAM-Tabellen mit dem @code{CHECK
TABLE}-Befehl �berpr�fen. @xref{CHECK TABLE}. Mit dem @code{REPAIR
TABLE}-Befehl k�nnen Sie Tabellen reparieren. @xref{REPAIR TABLE}.

Um MyISAM-Tabellen (@code{.MYI} und @code{.MYD}) zu �berpr�fen und / oder
zu reparieren, sollten sie das @code{myisamchk}-Dienstprogramm benutzen. Um
ISAM-Tabellen (@code{.ISM} und @code{.ISD}) zu �berpr�fen und / oder zu
reparieren, sollten Sie das @code{isamchk}-Dienstprogramm benutzen.
@xref{Table types}.

Der folgende Text behandelt @code{myisamchk}, trifft aber voll umf�nglich
auch auf das alte @code{isamchk} zu.

Sie k�nnen das @code{myisamchk}-Dienstprogramm benutzen, um Informationen �ber
Ihre Datenbanktabellen zu erhalten, sie zu pr�fen und zu reparieren, oder
um sie zu optimieren. Die folgenden Abschnitte beschreiben, wie man
@code{myisamchk} aufruft (inklusive einer Beschreibung seiner Optionen),
wie man einen Wartungsplan f�r Tabellen erstellt und wie die
unterschiedlichen Funktionen von @code{myisamchk} benutzt werden.

In den meisten F�llen k�nnen Sie auch den Befehl @code{OPTIMIZE TABLES}
benutzen, um Tabellen zu optimieren und zu reparieren, aber dieser ist
nicht so schnell und (in Fall wirklich schwerer Fehler) nicht so
zuverl�ssig wie @code{myisamchk}. 
Auf der anderen Seite ist @code{OPTIMIZE TABLE} leichter zu benutzen, und
Sie brauchen sich nicht um das Flushen von Tabellen zu k�mmern.
@xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}.

Obwohl das Reparieren bei @code{myisamchk} recht sicher ist, ist es immer
eine gute Idee, eine Datensicherung zu machen, bevor eine Reparatur
durchgef�hrt wird (oder etwas Sonstiges, das viele �nderungen an einer
Tabelle durchf�hrt).



@menu
* myisamchk syntax::            
* myisamchk general options::   
* myisamchk check options::     
* myisamchk repair options::    
* myisamchk other options::     
* myisamchk memory::            
* Crash recovery::              
* Check::                       
* Repair::                      
* Optimisation::                
@end menu

@node myisamchk syntax, myisamchk general options, Table maintenance, Table maintenance
@c German node myisamchk-Syntax
@subsubsection Aufrufsyntax von @code{myisamchk}

@code{myisamchk} wird wie folgt aufgerufen:

@example
shell> myisamchk [optionen] tabelle
@end example

@code{optionen} legt fest, was @code{myisamchk} tun soll. Die Optionen sind
unten beschrieben. (Sie erhalten eine Liste der Optionen, wenn Sie
@code{myisamchk --help} eingeben.) Ohne Optionen aufgerufen pr�ft
@code{myisamchk} einfach nur Ihre Tabelle. Um mehr Informationen zu
erhalten oder @code{myisamchk} anzuweisen, korrigierende Aktionen
durchzuf�hren, geben Sie Optionen wie unten und in den folgenden
Abschnitten beschrieben an.

@code{tabelle} ist die Datenbanktabelle, die Sie pr�fen oder reparieren
wollen. Wenn Sie @code{myisamchk} anderswo als im Datenbank-Verzeichnis
ausf�hren, m�ssen Sie den Pfad zur Datei angeben, denn @code{myisamchk}
wei� nicht, wo Ihre Datenbank liegt. In der Tat k�mmert sich
@code{myisamchk} nicht darum, ob die Dateien, die es bearbeiten soll, in
einem Datenbank-Verzeichnis liegen oder nicht; sie k�nnen diese Dateien
daher an eine andere Stelle kopieren und die Wiederherstellungsoperationen
dort durchf�hren.

Sie k�nnen in der @code{myisamchk}-Befehlszeile mehrere Tabellen angeben,
wenn Sie wollen. Sie k�nnen auch einen Namen als Indexdateinamen angeben
(mit dem Suffix @file{.MYI}), was Ihnen gestattet, alle Tabellen in einem
Verzeichnis anzugeben, indem Sie das Muster @file{*.MYI} benutzen. Wenn Sie
zum Beispiel in einem Datenbank-Verzeichnis sind, k�nnen Sie alle Tabellen
im Verzeichnis wie folgt pr�fen:

@example
shell> myisamchk *.MYI
@end example

Wenn Sie nicht im Datenbank-Verzeichnis sind, k�nnen Sie alle dortigen
Tabellen pr�fen, indem Sie den Pfad zum Verzeichnis angeben:

@example
shell> myisamchk /pfad/zum/datenbank_verzeichnis/*.MYI
@end example

Sie k�nnen sogar alle Tabellen in allen Datenbanken pr�fen, indem Sie einen
Platzhalter im Pfad zum MySQL-Daten-Verzeichnis angeben:

@example
shell> myisamchk /pfad/zum/datadir/*/*.MYI
@end example

Um schnell alle Tabellen zu pr�fen, wird folgender Befehl empfohlen:

@example
myisamchk --silent --fast /pfad/zum/datadir/*/*.MYI
isamchk --silent /pfad/zum/datadir/*/*.ISM
@end example

Wenn Sie alle Tabellen pr�fen und alle Tabellen reparieren wollen, die
besch�digt sind, k�nnen Sie folgende Kommandozeile eingeben:

@example
myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.ISM
@end example

Hierbei wird angenommen, dass Sie mehr als 64 MB Arbeitsspeicher frei
haben.

Wenn Sie einen Fehler wie den folgenden erhalten:

@example
myisamchk: warning: 1 clients is using oder hasn't closed the table properly
@end example

Bedeutet das, dass Sie versuchen, eine Tabelle zu �berpr�fen, die durch ein
anderes Programm aktualisiert wurde (wie dem @code{mysqld}-Server), das die
Datei noch nicht geschlossen hat oder das abgest�rzt ist, ohne die Datei
ordnungsgem�� zu schlie�en.

Wenn @code{mysqld} l�uft, m�ssen Sie ein Sync/Schlie�en aller Tabellen mit
@code{FLUSH TABLES} erzwingen und sicherstellen, dass niemand die Tabellen
benutzt, w�hrend Sie @code{myisamchk} laufen lassen. In MySQL-Version 3.23
ist die einfachste M�glichkeit, dieses Problem zu vermeiden, die Benutzung
von @code{CHECK TABLE} anstelle von @code{myisamchk}.



@node myisamchk general options, myisamchk check options, myisamchk syntax, Table maintenance
@c German node Allgemeine Optionen f�r myisamchk
@subsubsection Allgemeine Optionen f�r @code{myisamchk}

@cindex Optionen, @code{myisamchk}
@cindex @code{myisamchk}, Optionen

@code{myisamchk} unterst�tzt folgende Optionen:

@table @code
@item -# oder --debug=debug_optionen
Ausgabe eines Debug-Logs. Die Zeichenkette @code{debug_optionen} ist h�ufig
@code{'d:t:o,dateiname'}.
@item -? oder --help
Hilfetext ausgeben und beenden.
@item -O var=option, --set-variable var=option
Setzt den Wert einer Variablen. M�gliche Variablen und ihre Vorgabewerte
f�r myisamchk k�nnen mit @code{myisamchk --help} herausgefunden werden:
@multitable @columnfractions .3 .7
@item key_buffer_size @tab 523264
@item read_buffer_size @tab 262136
@item write_buffer_size @tab 262136
@item sort_buffer_size @tab 2097144
@item sort_key_blocks @tab 16
@item decode_bits @tab 9
@end multitable

@code{sort_buffer_size} wird benutzt, wenn Schl�ssel repariert werden,
indem Schl�ssel sortiert werden, was der Normalfall ist, wenn Sie
@code{--recover} benutzen.

@code{key_buffer_size} wird benutzt, wenn Sie die Tabelle mit
@code{--extended-check} pr�fen oder wenn die Schl�ssel repariert werden,
indem Schl�ssel Zeile f�r Zeile in die Tabelle eingef�gt werden (als wenn
normale Einf�geoperationen (Insert) durchgef�hrt werden). Eine Reparatur
mittels Key-Buffer (Schl�sselpuffer) wird in folgenden F�llen benutzt:

@itemize @bullet
@item
Wenn Sie @code{--safe-recover} benutzen.
@item
Wenn die tempor�ren Dateien, die ben�tigt werden, um die Schl�ssel zu
sortieren, mehr als zweimal so Gro� werden w�rden, als wenn die
Schl�sseldatei direkt erzeugt w�rde. Das ist oft dann der Fall, wenn Sie
gro�e @code{CHAR}-, @code{VARCHAR}- oder @code{TEXT}-Schl�ssel haben, weil
das Sortieren die gesamten Schl�ssel w�hrend des Sortierens speichern muss.
Wenn Sie viel tempor�ren Platz haben und @code{myisamchk} zwingen k�nnen,
mittels Sortieren zu reparieren, k�nnen Sie die
@code{--sort-recover}-Option benutzen.
@end itemize

Die Reparatur durch den Key-Buffer (Schl�sselpuffer) nimmt weit weniger
Plattenplatz in Anspruch als wenn Sortieren benutzt wird, ist aber auch
viel langsamer.

Wenn Sie eine schnellere Reparatur wollen, setzen Sie die obigen Variablen
auf ungef�hr 1/4 Ihres verf�gbaren Arbeitsspeichers. Sie k�nnen beide
Variablen auf gro�e Werte setzen, weil nur einer der oben aufgef�hrten
Puffer zur gleichen Zeit benutzt wird.

@item -s oder --silent
Schweigsamer Modus. Ausgaben erfolgen nur im Fehlerfall. Sie k�nnen
@code{-s} doppelt benutzen (@code{-ss}), um @code{myisamchk} sehr
schweigsam zu machen.
@item -v oder --verbose
Geschw�tziger Modus. Es werden mehr Informationen ausgegeben. Dies kann
auch bei @code{-d} und @code{-e} benutzt werden. Benutzen Sie @code{-v}
mehrfach (@code{-vv}, @code{-vvv}), um noch ausf�hrlichere Meldungen
auszugeben!
@item -V oder --version
Die aktuelle Version von @code{myisamchk} ausgeben und beenden.
@item -w or, --wait
Statt einen Fehler auszugeben, wenn die Tabelle gesperrt ist, warten, bis
die Tabelle entsperrt ist, bevor fortgefahren wird. Beachten Sie: Wenn Sie
@code{mysqld} auf der Tabelle mit @code{--skip-locking} laufen lassen, kann
die Tabelle nur mit einem weiteren @code{myisamchk}-Befehl gesperrt werden.
@end table


@node myisamchk check options, myisamchk repair options, myisamchk general options, Table maintenance
@c German node Pr�foptionen f�r myisamchk
@subsubsection Pr�foptionen f�r @code{myisamchk}

@cindex Pr�foptionen, myisamchk
@cindex Tabellen, pr�fen

@table @code
@item -c oder --check
Tabelle auf Fehler �berpr�fen. Das ist die vorgabem��ige Operation, wenn
Sie @code{myisamchk} keine sonstigen Optionen angeben, die dies
�berschreiben.

@item -e oder --extend-check
Tabelle SEHR gr�ndlich pr�fen (was recht langsam ist, wenn Sie viele Indexe
haben). Diese Option sollte nur in Extremf�llen benutzt werden.
Normalerweise sollten @code{myisamchk} oder @code{myisamchk --medium-check}
in fast allen F�llen in der Lage sein, herauszufinden, ob es in der Tabelle
irgend welche Fehler gibt.

Wenn Sie @code{--extended-check} benutzen und viel Arbeitsspeicher haben,
setzen Sie den Wert von @code{key_buffer_size} um etliches herauf!

@item -F oder --fast
Nur Tabellen pr�fen, die nicht ordnungsgem�� geschlossen wurden.
@item -C oder --check-only-changed
Nur Tabellen pr�fen, die seit der letzten Pr�fung ge�ndert wurden.
@item -f oder --force
@code{myisamchk} mit @code{-r} (repair) auf die Tabelle neu starten, wenn
@code{myisamchk} in der Tabelle irgend welche Fehler findet.
@item -i oder --information
Statistische Informationen �ber die Tabelle, die gepr�ft wird, ausgeben.
@item -m oder --medium-check
Schneller als extended-check, findet aber nur 99,99% aller Fehler. Das
sollte allerdings in den meisten F�llen ausreichen.
@item -U oder --update-state
In der @file{.MYI}-Datei speichern, wann die Tabelle gepr�ft wurde und ob
die Tabelle besch�digt wurde. Das sollte benutzt werden, um vollen Nutzen
aus der @code{--check-only-changed}-Option ziehen zu k�nnen. Sie sollten
diese Option nicht benutzen, wenn der @code{mysqld}-Server die Tabelle
benutzt und Sie ihn mit @code{--skip-locking} laufen lassen.
@item -T oder --read-only
Die Tabelle nicht als gepr�ft kennzeichnen. Das ist hilfreich, wenn Sie
@code{myisamchk} benutzen, um eine Tabelle zu pr�fen, die von irgend einer
anderen Applikation benutzt wird, die kein Sperren durchf�hrt (wie
@code{mysqld --skip-locking}).
@end table


@node myisamchk repair options, myisamchk other options, myisamchk check options, Table maintenance
@c German node Reparaturoptionen f�r myisamchk
@subsubsection Reparaturoptionen f�r @code{myisamchk}

@cindex Reparaturoptionen, myisamchk
@cindex Dateien, reparieren

Folgende Optionen werden benutzt, wenn Sie @code{myisamchk} mit @code{-r}
oder @code{-o} starten:

@table @code
@item -D # oder --data-file-length=#
Maximale L�nge der Daten-Datei (wenn die Daten-Datei neu erzeugt wird, wenn
sie 'voll' ist).
@item -e oder --extend-check
Es wird versucht, jede m�gliche Zeile der Daten-Datei wiederherzustellen.
Normalerweise wird dies auch eine Menge Zeilen-'M�ll' finden. Benutzen Sie
diese Option nur dann, wenn Sie v�llig verzweifelt sind.
@item -f oder --force
Alte tempor�re Dateien (@code{tabelle.TMD}) werden �berschrieben, anstatt
abzubrechen.
@item -k # oder keys-used=#
Wenn Sie ISAM benutzen, weist das den ISAM-Tabellen-Handler an, nur die
ersten @code{#}-Indexe zu benutzen. Wenn Sie @code{MyISAM} benutzen, sagt
es dem Handler, welche Schl�ssel benutzt werden sollen, wobei jedes
Bin�rbit f�r einen Schl�ssel steht (der erste Schl�ssel ist Bit 0). Das
kann benutzt werden, um schnelleres Einf�gen (Insert) zu erreichen!
Deaktivierte Indexe k�nnen reaktiviert werden, indem man @code{myisamchk
-r} benutzt.
@item -l oder --no-symlinks
Symbolischen Links wird nicht gefolgt. Normalerweise repariert
@code{myisamchk} die Tabelle, auf die ein Symlink verweist. Diese Option
gibt es in MySQL 4.0 nicht, weil MySQL 4.0 w�hrend der Reparatur keine
Symlinks entfernt.
@item -r oder --recover
Kann fast alles reparieren, ausser eindeutige Schl�ssel, die nicht
eindeutig sind (was ein extrem unwahrscheinlicher Fehler bei ISAM- /
MyISAM-Tabellen ist). Wenn Sie eine Tabelle wiederherstellen wollen,
sollten Sie zuerst diese Option ausprobieren. Nur wenn myisamchk berichtet,
dass die Tabelle mit @code{-r} nicht wiederhergestellt werden kann, sollten
Sie @code{-o} probieren. (Hinweis: Im unwahrscheinlichen Fall, dass
@code{-r} fehlschl�gt, ist die Daten-Datei immer noch intakt.) Wenn Sie
viel Arbeitsspeicher haben, sollten Sie die Gr��e von
@code{sort_buffer_size} herauf setzen!
@item  -o oder --safe-recover
Benutzt eine alte Wiederherstellungsmethode (liest alle Zeilen der Reihe
nach und aktualisiert alle Indexb�ume, basierend auf den gefundenen
Zeilen); das ist sehr viel langsamer als @code{-r}, kann aber eine Reihe
sehr unwahrscheinlicher F�lle behandeln, die @code{-r} nicht behandeln
kann. Diese Wiederherstellungsmethode benutzt viel weniger Plattenspeicher
als @code{-r}. Normalerweise sollte man immer zuerst versuchen, mit
@code{-r} zu reparieren und nur im Falle des Fehlschlagens @code{-o}
benutzen.

Wenn Sie viel Arbeitsspeicher haben, sollten Sie die Gr��e von
@code{key_buffer_size} herauf setzen!
@item -n oder --sort-recover
Zwingt @code{myisamchk} zu sortieren, um Schl�ssel aufzul�sen, selbst wenn
die tempor�ren Dateien sehr Gro� sein sollten. Diese Option hat keine
Auswirkung, wenn Sie Volltextschl�ssel in der Tabelle haben.

@item --character-sets-dir=...
Verzeichnis, wo Zeichens�tze gespeichert sind.
@item --set-character-set=name
�ndert den Zeichensatz, der vom Index benutzt wird.
@item -t oder --tmpdir=path
Pfad zum Speichern tempor�rer Dateien. Wenn dieser nicht gesetzt ist,
benutzt @code{myisamchk} hierf�r die Umgebungsvariable @code{TMPDIR}.
@item -q oder --quick
Repariert schneller, indem die Daten-Datei nicht ver�ndert wird. Man kann
ein zweites @code{-q} angeben, um @code{myisamchk} zu zwingen, die
Original-Daten-Datei zu �ndern, falls doppelte Schl�ssel auftreten.
@item -u oder --unpack
Datei entpacken, die mit myisampack gepackt wurde.
@end table


@node myisamchk other options, myisamchk memory, myisamchk repair options, Table maintenance
@c German node Andere Optionen f�r myisamchk
@subsubsection Weitere Optionen f�r @code{myisamchk}

Weitere Aktionen, die @code{myisamchk} ausf�hren kann, neben der Pr�fung
und Reparatur von Tabellen:

@table @code
@item -a oder --analyze
Analysiert die Verteilung von Schl�sseln. Das verbessert die Performance
bei Tabellenverkn�pfungen (Joins), indem der Join-Optimierer in die Lage
versetzt wird, besser auszuw�hlen, in welcher Reihenfolge die Tabellen
verkn�pft werden sollten und welche Schl�ssel er dabei verwenden sollte:
@code{myisamchk --describe --verbose tabelle'} oder Benutzung von
@code{SHOW KEYS} in MySQL.
@item -d oder --description
Gibt ein paar Informationen �ber die Tabelle aus.
@item -A oder --set-auto-increment[=value]
Zwingt auto_increment, mit diesem oder einem h�heren Wert anzufangen. Wenn
kein Wert angegeben wird, wird der n�chste auto_increment-Wert auf den
h�chsten benutzten Wert f�r den auto-Schl�ssel + 1 gesetzt.
@item -S oder --sort-index
Sortiert die Bl�cke des Indexbaums in Hoch-Niedrig-Reihenfolge. Das
optimiert Suchoperationen und macht das Durchsehen (Scanning) von Tabellen
nach Schl�sseln schneller.
@item -R oder --sort-records=#
Sortiert Datens�tze in �bereinstimmung mit einem Index. Das macht Ihre
Daten viel konzentrierter und kann @code{SELECT} mit Bereichen und
@code{ORDER BY}-Operationen auf diesem Index erheblich beschleunigen. (Beim
ersten Sortieren kann das SEHR langsam sein!) Um die Anzahl von Indexen
einer Tabelle herauszufinden, benutzen Sie @code{SHOW INDEX}, was die
Indexe einer Tabelle in genau der Reihenfolge zeigt, in der
@code{myisamchk} sie sieht. Indexe werden mit 1 beginnend nummeriert.
@end table


@node myisamchk memory, Crash recovery, myisamchk other options, Table maintenance
@c German node Speicher bei myisamchk
@subsubsection Speicherbenutzung von @code{myisamchk}

@cindex memory usage, myisamchk

Die Speicherzuordnung ist wichtig, wenn Sie @code{myisamchk} laufen lassen.
@code{myisamchk} benutzt nicht mehr Speicher, als Sie mir der
@code{-O}-Option festlegen. Wenn Sie @code{myisamchk} f�r sehr gro�e
Dateien benutzen wollen, sollten Sie zuerst entscheiden, wieviel Speicher
Sie benutzen wollen. Die Vorgabe liegt bei nur etwa 3 MB, um Dinge zu
reparieren. Indem gr��ere Werte benutzt werden, k�nnen Sie
@code{myisamchk} dazu bringen, schneller zu arbeiten. Wenn Sie
beispielsweise 32 MB Arbeitsspeicher haben, k�nnten Sie Optionen wie die
folgende benutzen (zus�tzlich zu weiteren Optionen, die Sie eventuell
angeben):

@example
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
@end example

@code{-O sort=16M} sollte f�r die meisten F�lle ausreichen.

Denken Sie daran, dass @code{myisamchk} tempor�re Dateien in @code{TMPDIR}
benutzt. Wenn @code{TMPDIR} auf ein Speicher-Dateisystem zeigt, k�nnen
Kein-Speicher-Fehler schnell auftreten. Wenn das passiert, setzen Sie
@code{TMPDIR} so, dass es auf ein Verzeichnis mit mehr Speicherplatz zeigt
und starten Sie @code{myisamchk} erneut.

Beim Reparieren ben�tigt @code{myisamchk} gro�e Mengen von
Festplattenspeicher:

@itemize @bullet
@item
Die doppelte Gr��e der Daten-Datei (die Originaldatei und eine Kopie).
Dieser Platz wird nicht ben�tigt, wenn die Reparatur mit @code{--quick}
durchgef�hrt wird, weil in diesem Fall nur die Index-Datei neu erzeugt
wird. Der Platz wird auf derselben Festplatte ben�tigt, wo die
Original-Daten-Datei liegt!
@item
Platz f�r die neue Index-Datei, die die alte ersetzt. Die alte Index-Datei
wird beim Start beschnitten, daher kann man diesen Platz �blicherweise
ignorieren. Der Platz wird auf derselben Platte ben�tigt, auf der die
Original-Index-Datei liegt!
@item
Wenn Sie @code{--recover} oder @code{--sort-recover} benutzen (aber nicht,
wenn Sie @code{--safe-recover} benutzen), brauchen Sie Platz f�r einen
Sortierpuffer (Sort Buffer) f�r:
@code{(gr��ter_schl�ssel + zeilen_zeiger_l�nge) * anzahl_der_zeilen * 2}.
Sie k�nnen die L�nge der Schl�ssel und die Zeilen-Zeiger-L�nger mit
@code{myisamchk -dv tabelle} pr�fen.
Dieser Platz wird auf der tempor�ren Platte zugeordnet (festgelegt durch
@code{TMPDIR} oder @code{--tmpdir=#}).
@end itemize

Wenn Sie w�hrend der Reparatur ein Problem mit dem Plattenplatz bekommen,
k�nnen Sie @code{--safe-recover} anstelle von @code{--recover}
ausprobieren.


@node Crash recovery, Check, myisamchk memory, Table maintenance
@c German node Fehlerbeseitigung nach Abst�rzen
@subsubsection Benutzung von @code{myisamchk} f�r die Fehlerbeseitigung nach Abst�rzen

@cindex Absturz, Wiederherstellung
@cindex Wiederherstellung, nach Absturz

Wenn Sie @code{mysqld} mit @code{--skip-locking} laufen lassen (was auf
einigen Systemen wie Linux die Vorgabe ist), k�nnen Sie @code{myisamchk}
nicht zuverl�ssig daf�r benutzen, eine Tabelle zu pr�fen, wenn
@code{mysqld} diese Tabelle benutzt. Wenn Sie sicher sein k�nnen, dass
niemand auf die Tabellen mit @code{mysqld} zugreift, w�hrend Sie
@code{myisamchk} laufen lassen, m�ssen Sie nur ein @code{mysqladmin
flush-tables} durchf�hren, bevor Sie anfangen, die Tabellen zu pr�fen. Wenn
Sie das nicht garantieren k�nnen, m�ssen Sie @code{mysqld} herunter fahren,
w�hrend Sie die Tabellen pr�fen. Wenn Sie @code{myisamchk} laufen lassen,
w�hren @code{mysqld} die Tabellen aktualisiert, erhalten Sie m�glicherweise
die Meldung, dass eine Tabelle besch�digt ist, selbst wenn sie es nicht
ist.

Wenn Sie @code{--skip-locking} nicht benutzen, k�nnen Sie jederzeit
@code{myisamchk} benutzen, um Tabellen zu pr�fen. W�hrend Sie das tun,
warten alle Clients, die versuchen, die Tabelle zu aktualisieren, bis
@code{myisamchk} fertig ist, bevor sie weiter machen.

Wenn Sie @code{myisamchk} benutzen, um Tabellen zu reparieren oder zu
optimieren, @strong{M�SSEN} Sie stets sicherstellen, dass der
@code{mysqld}-Server die Tabelle nicht benutzt (das trifft auch zu, wenn
Sie @code{--skip-locking} benutzen). Wenn Sie @code{mysqld} nicht herunter
fahren, sollten Sie zumindest @code{mysqladmin flush-tables} ausf�hren,
bevor Sie @code{myisamchk} benutzen.

Dieses Kapitel beschreibt, wie man MySQL-Datenbanken auf Datenbesch�digung
pr�ft und damit umgeht. Wenn Ihre Tabellen h�ufig besch�digt sind, wollten
Sie versuchen, den Grund hierf�r herauszufinden! @xref{Crashing}.

Der Abschnitt �ber @code{MyISAM}-Tabellen enth�lt Gr�nde, warum eine
Tabelle besch�digt sein k�nnte. @xref{MyISAM table problems}.

Wenn Sie eine Wiederherstellung nach einem Absturz durchf�hren, ist es
wichtig zu wissen, das jede Tabelle @code{tabelle} in einer Datenbank mit
drei Dateien im Datenbank-Verzeichnis korrespondiert:

@multitable @columnfractions .2 .8
@item @strong{Datei} @tab @strong{Zweck}
@item @file{tabelle.frm} @tab Tabellendefinitionsdatei (form)
@item @file{tabelle.MYD} @tab Daten-Datei (data)
@item @file{tabelle.MYI} @tab Index-Datei (index)
@end multitable

Jeder der drei Dateitypen kann auf verschiedene Weisen besch�digt werden.
Probleme treten aber zumeist bei Daten-Dateien und Index-Dateien auf.

@code{myisamchk} funktioniert so, dass Zeile f�r Zeile eine Kopie der
@file{.MYD}-(data)-Datei gemacht wird. Es beendet die Reparaturphase damit,
dass die alte @file{.MYD}-Datei entfernt wird und die neue Datei mit dem
Orginal-Dateinamen benannt wird. Wenn Sie @code{--quick} benutzen, erzeugt
@code{myisamchk} keine tempor�re @file{.MYD}-Datei, sondern nimmt statt
dessen an, dass die @file{.MYD}-Datei korrekt ist, und erzeugt nur eine
neue Index-Datei, ohne die @file{.MYD}-Datei zu ber�hren. Das ist sicher,
weil @code{myisamchk} automatisch feststellt, wenn die @file{.MYD}-Datei
besch�digt ist, und die Reparatur in diesem Fall abbricht. Sie k�nnen
@code{myisamchk} auch mit zwei @code{--quick}-Optionen aufrufen. In diesem
Fall bricht @code{myisamchk} bei einigen Fehlern (wie doppelten
Schl�sseleintr�gen) nicht ab, sondern versucht statt dessen, diese
aufzul�sen, indem die @file{.MYD}-Datei ver�ndert wird. Normalerweise ist
die Benutzung von zwei @code{--quick}-Optionen nur sinnvoll, wenn Sie zu
wenig frei Plattenplatz haben, um eine normale Reparatur durchzuf�hren. In
diesem Fall sollten Sie zumindest eine Datensicherung machen, bevor Sie
@code{myisamchk} laufen lassen.


@node Check, Repair, Crash recovery, Table maintenance
@c German node Pr�fung
@subsubsection Wie Tabellen auf Fehler �berpr�ft werden

@cindex Pr�fen, Tabellen auf Fehler
@cindex Tabellen, Fehlerpr�fung
@cindex Fehler, Tabellen pr�fen auf

Um eine MyISAM-Tabelle zu pr�fen, benutzen Sie folgende Befehle:

@table @code
@item myisamchk tabelle
Das findet 99.99% aller Fehler. Nicht gefunden werden Besch�digungen, die
@strong{NUR} die Daten-Datei betreffen (was sehr ungew�hnlich ist). Wenn
Sie eine Tabelle pr�fen wollen, sollten Sie @code{myisamchk} normalerweise
ohne Optionen oder entweder mit der @code{-s}- oder @code{--silent}-Option
laufen lassen.

@item myisamchk -m tabelle
Das findet 99.999% aller Fehler. Zuerst pr�ft es alle Indexeintr�ge auf
Fehler und liest dann alle Zeilen durch. Es berechnet eine Pr�fsumme f�r
alle Schl�ssel in den Zeilen und best�tigt dann, dass die Pr�fsumme mit der
Pr�fsumme f�r die Schl�ssel im Indexbaum �bereinstimmt.

@item myisamchk -e tabelle
Das f�hrt eine vollst�ndige, gr�ndlich Pr�fung aller Daten durch (@code{-e}
bedeutet ``extended check'' - erweiterte Pr�fung). Es f�hrt ein Pr�f-Lesen
jedes Schl�ssels f�r jede Zeile durch, um zu best�tigen, dass sie
tats�chlich auf die richtige Zeile verweisen. Das kann bei einer gro�en
Tabelle mit vielen Schl�sseln SEHR LANG dauern. @code{myisamchk} h�lt
normalerweise an, wenn es den ersten Fehler gefunden hat. Wenn Sie mehr
Informationen haben wollen, k�nnen Sie die
@code{--verbose}-(@code{-v})-Option benutzen. Das veranlasst
@code{myisamchk}, weiterzumachen, bis maximal 20 Fehler gefunden wurden.
Bei normalem Gebrauch ist ein einfaches @code{myisamchk} (ohne weitere
Argumente ausser dem Tabellennamen) ausreichend.

@item myisamchk -e -i tabelle
Wie der vorherige Befehl, jedoch weist die @code{-i}-Option
@code{myisamchk} an, zus�tzlich einige statistische Informationen
auszugeben.
@end table


@node Repair, Optimisation, Check, Table maintenance
@c German node Reparatur
@subsubsection Wie Tabellen repariert werden

@cindex Tabellen, Reparatur
@cindex Reparatur, Tabellen

Der folgende Abschnitt behandelt nur die Benutzung von @code{myisamchk} mit
@code{MyISAM}-Tabellen (Erweiterungen @code{.MYI} und @code{.MYD}). Wenn
Sie @code{ISAM}-Tabellen benutzen (Erweiterungen @code{.ISM} und
@code{.ISD}), sollten Sie statt dessen @code{isamchk} benutzen.

Ab MySQL-Version 3.23.14 k�nnen Sie MyISAM-Tabellen mit dem
@code{REPAIR TABLE}-Befehl reparieren. @xref{REPAIR TABLE}.

Zu den Symptomen einer besch�digten Tabelle geh�ren Anfragen, die
unerwartet abbrechen, und beobachtbare Fehler wie folgender:

@itemize @bullet
@item
@file{tabelle.frm} is locked against change
@item
Can't find file @file{tabelle.MYI} (Errcode: ###)
@item
Unexpected end of file
@item
Record file is crashed
@item
Got error ### from table handler

Um mehr Information �ber den Fehler zu erhalten, lassen Sie @code{perror
###} laufen. Hier sind die h�ufigsten Fehler, die auf ein Problem mit der
Tabelle hinweisen:

@example
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index-Datei ist besch�digt / falsches Dateiformat
127 = Daten-Datei ist besch�digt
132 = Alte Datenbank-Datei
134 = Datensatz wurde bereits gel�scht (oder Daten-Datei besch�digt)
135 = Kein Platz mehr in der Daten-Datei
136 = Kein Platz mehr in der Index-Datei
141 = Doppelter Eintrag f�r eindeutigen Schl�ssel oder Beschr�nkung beim Schreiben oder Aktualisiern
144 = Tabelle ist besch�digt und die letzte Reparatur ist fehlgeschlagen
145 = Tabelle ist als besch�digt gekennzeichnet und sollte repariert werden
@end example

Beachten Sie, dass Fehler 135 (kein Platz mehr in der Daten-Datei) kein
Fehler ist, der durch eine einfache Reparatur behoben werden kann. In
diesem Fall m�ssen Sie folgendes durchf�hren:

@example
ALTER TABLE tabelle MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
@end example

@end itemize

In den anderen F�llen m�ssen Sie Ihre Tabellen reparieren. @code{myisamchk}
kann �blicherweise die meisten Dinge, die schief gehen k�nnen, finden und
beheben.

Der Reparaturprozess l�uft in vier Phasen ab, die unten beschrieben sind.
Bevor Sie anfangen, sollten Sie in das Datenbank-Verzeichnis wechseln und
die Berechtigungen der Tabellen-Dateien pr�fen. Stellen Sie sicher, dass
diese durch den Unix-Benutzer lesbar sind, unter dem @code{mysqld} l�uft
(und f�r Sie, weil Sie auf die Dateien zugreifen m�ssen, wenn Sie sie
pr�fen). Wenn Sie in der Folge Dateien ver�ndern m�ssen, m�ssen diese f�r
Sie auch schreibbar sein.

Wenn Sie MySQL-Version 3.23.16 und h�her benutzen, k�nnen (und sollten) Sie
die @code{CHECK}- und @code{REPAIR}-Befehle benutzen, um
@code{MyISAM}-Tabellen zu pr�fen und zu reparieren. @xref{REPAIR TABLE}.

Der Handbuchabschnitt �ber Tabellenwartung beinhaltet die Optionen f�r
@code{isamchk} / @code{myisamchk}. @xref{Table maintenance}.

Der folgende Abschnitt ist f�r F�lle, in denen die obigen Befehle
fehlschlagen, oder wenn Sie die erweiterten Features benutzen wollen, die
@code{isamchk} / @code{myisamchk} zur Verf�gung stellt.

Wenn Sie eine Tabelle von der Kommandozeile aus reparieren wollen, m�ssen
Sie zuerst den @code{mysqld}-Server herunter fahren. Beachten Sie bei
@code{mysqladmin shutdown} auf einen entfernten Server, dass der
@code{mysqld}-Server noch f�r eine Weile aktiv bleibt, nachdem
@code{mysqladmin} beendet ist, bis alle Anfragen beendet und alle Schl�ssel
auf Platte zur�ck geschrieben (flush) wurden.

@noindent
@strong{Phase 1: Pr�fen Ihrer Tabellen}

Lassen Sie @code{myisamchk *.MYI} laufen, oder @code{myisamchk -e *.MYI},
wenn Sie mehr Zeit haben. Benutzen Sie die @code{-s}-(silent)-Option, um
unn�tige Informationen zu unterdr�cken.

Wenn der @code{mysqld}-Server herunter gefahren ist, sollten Sie die
@code{--update}-Option benutzen, um @code{myisamchk} zu veranlassen, die
Tabelle als 'gepr�ft' zu kennzeichnen.

Sie m�ssen nur die Tabellen reparieren, bei denen @code{myisamchk} bekannt
gibt, dass sie Fehler enthalten. Gehen Sie bei solchen Tabellen zu Phase 2
�ber.

Wenn Sie beim Pr�fen merkw�rdige Fehler erhalten (wie @code{out of
memory}-Fehler), oder wenn @code{myisamchk} abst�rzt, gehen Sie zu Phase
3.

@noindent
@strong{Phase 2: Einfache, sichere Reparatur}

HINWEIS: Wenn Sie wollen, dass die Reparatur sehr viel schneller abl�uft,
sollten Sie allen @code{isamchk/myisamchk}-Befehlen folgendes hinzuf�gen:
@code{-O sort_buffer=# -O key_buffer=#} (wobei # etwa 1/4 des verf�gbaren
Arbeitsspeichers ist).

Probieren Sie zuerst @code{myisamchk -r -q tabelle} (@code{-r -q} bedeutet
``quick recovery mode'' - schnelles Wiederherstellen). Dies versucht, die
Index-Datei zu reparieren, ohne die Daten-Datei zu ber�hren. Wenn die
Daten-Datei alles enth�lt, was sie sollte, und die L�schverkn�pfungen auf
die korrekten Stellen in der Daten-Datei zeigen, sollte das funktionieren
und die Tabelle ist repariert. Machen Sie dann mit der Reparatur der
n�chsten Tabelle weiter. Ansonsten f�hren Sie folgende Prozedur durch:

@enumerate
@item
Machen Sie eine Datensicherung der Daten-Datei, bevor Sie fortfahren.

@item
Geben Sie @code{myisamchk -r tabelle} (@code{-r} bedeutet ``recovery mode''
- Wiederherstellung) ein. Das entfernt falsche und gel�schte Datens�tze aus
der Daten-Datei und stellt die Index-Datei wieder her.

@item
Wenn die vorherigen Schritte fehlschlagen, geben Sie @code{myisamchk
--safe-recover tabelle} ein. Der Modus f�r sicheres Wiederherstellen
benutzt eine alte Wiederherstellungsmethode, die ein paar F�lle behandelt,
die der normale Wiederherstellungsmodus nicht behandelt (ist aber
langsamer).
@end enumerate

Wenn Sie bei der Reparatur merkw�rdige Fehler erhalten (wie @code{out of
memory}-Fehler), oder wenn @code{myisamchk} abst�rzt, gehen Sie zu Phase
3.

@noindent
@strong{Phase 3: Schwierige Reparatur}

Diese Phase sollten Sie nur dann erreichen, wenn der erste 16-KB-Block der
Index-Datei zerst�rt ist oder falsche Informationen enth�lt, oder wenn die
Index-Datei fehlt. In diesem Fall ist es notwendig, eine neue Index-Datei
zu erzeugen. Das machen Sie wie folgt:

@enumerate
@item
Verschieben Sie die Daten-Datei an einen sicheren Ort.

@item
Benutzen Sie die Tabellen-Beschreibungsdatei, um eine neue (leere)
Daten-Datei und Index-Dateien zu erzeugen:

@example
shell> mysql datenbank
mysql> SET AUTOCOMMIT=1;
mysql> TRUNCATE TABLE tabelle;
mysql> quit
@end example

Wenn Ihre SQL-Version kein @code{TRUNCATE TABLE} hat, benutzen Sie statt
dessen @code{DELETE FROM tabelle}.

@item
Kopieren Sie Ihre alte Daten-Datei zur�ck, �ber die neu erzeugte
Daten-Datei. (Verschieben Sie Ihre alte Daten-Datei nicht einfach, damit
Sie eine Kopie erhalten, falls etwas schief geht.)
@end enumerate

Gehen Sie zur�ck zu Phase 2. @code{myisamchk -r -q} sollte jetzt
funktionieren. (Das sollte keine Endlosschleife sein.)

@noindent
@strong{Phase 4: Sehr schwierige Reparatur}

Diese Phase sollten Sie nur dann erreichen, wenn auch die
Beschreibungsdatei besch�digt ist. Das sollte nie passieren, weil die
Beschreibungsdatei nicht ver�ndert wird, nachdem die Tabelle erzeugt wurde:

@enumerate
@item
Stellen Sie die Beschreibungsdatei von einer Datensicherung wieder her und
gehen Sie zur�ck zu Phase 3. Sie k�nnen auch die Index-Datei
wiederherstellen und zu Phase 2 zur�ck gehen.  Im letzteren Fall sollten
Sie mit @code{myisamchk -r} anfangen.

@item
Wenn Sie keine Datensicherung haben, aber genau wissen, wie die Tabelle
erzeugt wurde, erzeugen Sie eine Kopie der Tabelle in einer anderen
Datenbank. Entfernen Sie die neue Daten-Datei und verschieben Sie die
Beschreibungs- und Index-Dateien von der anderen Datenbank in Ihre
besch�digte Datenbank. Das ergibt neue Beschreibungs- und Index-Dateien,
l��t aber die Daten-Datei in Ruhe. Gehen Sie zur�ck zu Phase 2 und
versuchen Sie, die Index-Datei wiederherzustellen.
@end enumerate


@node Optimisation,  , Repair, Table maintenance
@c German node Optimierung
@subsubsection Tabellenoptimierung

@cindex Tabellen, Optimierung
@cindex Optimierung, Tabellen

Um fragmentierte Datens�tze zu vereinigen und verschwendeten Speicherplatz
zu beseitigen, der sich durch L�schen und Aktualisieren von Datens�tzen
ergibt, lassen Sie @code{myisamchk} im Wiederherstellungsmodus laufen:

@example
shell> myisamchk -r tabelle
@end example

Auf dieselbe Weise k�nnen Sie eine Tabelle optimieren, indem Sie das
SQL-Statement @code{OPTIMIZE TABLE} benutzen. @code{OPTIMIZE TABLE} f�hrt
eine Reparatur der Tabelle und eine Analyse der Schl�ssel durch und
sortiert den Indexbaum, um schnelleres Nachschlagen der Schl�ssel (Key
Lookup) zu erm�glichen. Ausserdem schaltet es die M�glichkeit ungewollter
Interaktionen zwischen einem Dienstprogramm und dem Server aus, weil der Server
bei der Benutzung von @code{OPTIMIZE TABLE} die ganze Arbeit verrichtet.
@xref{OPTIMIZE TABLE}.

@code{myisamchk} hat eine Anzahl weiterer Optionen, die Sie f�r die
Verbesserung der Performance einer Tabelle benutzen k�nnen:

@table @code
@item -S, --sort-index
@item -R index_nummer, --sort-records=index_nummer
@item -a, --analyze
@end table

Eine detaillierte Beschreibung der Optionen steht unter
@xref{myisamchk syntax}.


@node Maintenance regimen, Table-info, Table maintenance, Disaster Prevention
@c German node Wartungsplan
@subsection Wartungsplan f�r Tabellen erstellen

@cindex Wartung, Tabellen
@cindex Tabellen, Wartungsplan

Ab MySQL-Version 3.23.13 k�nnen Sie MyISAM-Tabellen mit dem @code{CHECK
TABLE}-Befehl pr�fen. @xref{CHECK TABLE}. Sie k�nnen Tabellen mit dem
@code{REPAIR TABLE}-Befehl reparieren. @xref{REPAIR TABLE}.

Es ist eine gute Idee, Tabellen�berpr�fungen auf regelm��iger Basis
durchzuf�hren statt darauf zu warten, dass Probleme auftreten. F�r
Wartungszwecke benutzen Sie @code{myisamchk -s}, um Tabellen zu �berpr�fen.
Die @code{-s}-Option (Kurzform f�r @code{--silent}) veranlasst
@code{myisamchk}, im schweigsamen Modus zu laufen, wobei Meldungen nur
ausgegeben werden, wenn Fehler auftreten.

@tindex .pid-(process ID)-Datei
Ebenfalls eine gute Idee ist es, Tabellen zu �berpr�fen, wenn der Server
hoch f�hrt. Wenn beispielsweise die Maschine mitten w�hrend einer
Aktualisierung (Update) neu gebootet hat, m�ssen Sie �blicherweise alle
Tabellen pr�fen, die betroffen sein k�nnten. (Das ist ein Fall von
``erwarteter Tabellenbesch�digung''.) Sie k�nnen @code{safe_mysqld} einen
Test hinzuf�gen, der @code{myisamchk} laufen l��t, um alle Tabellen zu
�berpr�fen, die innerhalb der letzten 24 Stunden ge�ndert wurden, wenn nach
einem Reboot eine alte @file{.pid}-(process ID)-Datei �brig blieb. (Die
@file{.pid}-Datei wird von @code{mysqld} erzeugt, wenn er hoch f�hrt, und
entfernt, wenn er normal beendet wird. Die Anwesenheit einer
@file{.pid}-Datei beim Systemstart zeigt an, dass @code{mysqld} regelwidrig
abgebrochen wurde.)

Eine noch bessere Testmethode besteht darin, jede Tabelle zu pr�fen, deren
Zeit der letzten �nderung neuer ist als die der @file{.pid}-Datei.

Ausserdem sollten Sie Ihre Tabellen regelm��ig w�hrend der normalen
Systemt�tigkeit pr�fen. Bei MySQL AB lassen wir einen @code{cron}-Job
laufen, um alle wichtigen Tabellen einmal pro Woche zu pr�fen, indem wir
folgende Zeile in der @file{crontab}-Datei benutzen:

@example
35 0 * * 0 /pfad/zu/myisamchk --fast --silent /pfad/zu/datadir/*/*.MYI
@end example

Das gibt Informationen �ber besch�digte Tabellen aus, so dass wir diese
pr�fen und reparieren k�nnen, falls notwendig.

Da wir mittlerweile seit einigen Jahren keinerlei unerwartet besch�digte
Tabellen hatten (Tabellen, die aus anderen Gr�nden als Hardware-Sch�den
besch�digt wurden), reicht uns einmal pro Woche v�llig aus.

Wir empfehlen, dass Sie jede Nacht @code{myisamchk -s} auf alle Tabellen
ausf�hren, die w�hrend der letzten 24 Stunden aktualisiert wurden, bis Sie
MySQL so sehr vertrauen, wie wir selbst das mittlerweile tun.

@cindex Tabellen, defragmentieren
Normalerweise brauchen Sie MySQL-Tabellen nicht so sehr warten. Wenn Sie
Tabellen mit Zeilen dynamischer L�nge �ndern (Tabellen mit
@code{VARCHAR}-, @code{BLOB}- oder @code{TEXT}-Spalten) oder Tabellen mit
vielen gel�schten Zeilen haben, werden Sie diese von Zeit zu Zeit (einmal
im Monat?) defragmentieren wollen bzw. freien Speicherplatz schaffen.

Das k�nnen Sie mit @code{OPTIMIZE TABLE} auf die in Frage kommenden
Tabellen tun, oder, wenn Sie den @code{mysqld}-Server f�r eine Weile
herunter fahren k�nnen:

@example
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
myisamchk -r --silent --sort-index  -O sort_buffer_size=16M */*.MYI
@end example


@node Table-info,  , Maintenance regimen, Disaster Prevention
@c German node Tabelleninformation
@subsection Informationen �ber eine Tabelle erhalten

@cindex Tabellen, Informationen

Um eine Beschreibung einer Tabelle oder Statistiken �ber sie zu erhalten,
benutzen Sie die unten stehenden Befehle. Einige davon werden sp�ter
detaillierter erl�utert:

@table @code
@item myisamchk -d tabelle
L��t @code{myisamchk} im ``Beschreibungsmodus'' laufen, um eine
Beschreibung Ihrer Tabelle zu erzeugen. Wenn Sie den MySQL-Server mit der
@code{--skip-locking}-Option starten, kann @code{myisamchk} eventuell
Fehler �ber eine Tabelle berichten, die aktualisiert wird, w�hrend es
l�uft. Weil @code{myisamchk} jedoch im Beschreibungsmodus keine Tabelle
�ndert, gibt es kein Risiko, dass Daten zerst�rt werden.

@item myisamchk -d -v tabelle
Um mehr Informationen �ber das, was @code{myisamchk} tut, zu erzeugen,
f�gen Sie @code{-v} als Option hinzu, damit es im geschw�tzigen Modus
l�uft.

@item myisamchk -eis tabelle
Zeigt nur die wichtigsten Informationen �ber die Tabelle. Das ist langsam,
weil es die ganze Tabelle lesen muss.

@item myisamchk -eiv tabelle
Wie @code{-eis}, sagt aber zus�tzlich, was getan werden muss.
@end table

@cindex Beispiele, @code{myisamchk}-Ausgabe
@cindex @code{myisamchk}, Beispiele der Ausgabe
Beispiel einer @code{myisamchk -d}-Ausgabe:
@example
MyISAM file:     firma.MYI
Record format:   Fixed length
Data records:    1403698 Deleted blocks:         0
Recordlength:    226

table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text
@end example

Beispiel einer @code{myisamchk -d -v}-Ausgabe:
@example
MyISAM file:         firma
Record format:       Fixed length
File-version:        1
Creation time:       1999-10-30 12:12:51
Recover time:        1999-10-31 19:13:01
Status:              checked
Data records:           1403698  Deleted blocks:              0
Datafile parts:         1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226

table description:
Key Start Len Index   Type                  Rec/key     Root Blocksize
1   2     8   unique  double                      1 15845376      1024
2   15    10  multip. text packed stripped        2 25062400      1024
3   219   8   multip. double                     73 40907776      1024
4   63    10  multip. text packed stripped        5 48097280      1024
5   167   2   multip. unsigned short           4840 55200768      1024
6   177   4   multip. unsigned long            1346 65145856      1024
7   155   4   multip. text                     4995 75090944      1024
8   138   4   multip. unsigned long              87 85036032      1024
9   177   4   multip. unsigned long             178 96481280      1024
    193   1           text
@end example

Beispiel einer @code{myisamchk -eis}-Ausgabe:
@example
Checking MyISAMDatei: firma
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
@end example

Beispiel einer @code{myisamchk -eiv}-Ausgabe:
@example
Checking MyISAM file: firma
Data records: 1403698   Deleted blocks:       0
- check file-size
- check delete-chain
block_size 1024:
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
- check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
- check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%

- check records und index references
[LOTS OF ROW NUMBERS DELETED]

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798
@end example

Hier stehen die Gr��en der Daten- und Index-Dateien der Tabelle, die in
den vorstehenden Beispielen benutzt wurde:

@example
-rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 firma.MYD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 firma.MYM
@end example

Erl�uterungen der Informationen, die @code{myisamchk} erzeugt, werden unten
gegeben. ``keyfile'' ist die Index-Datei. ``Record'' und ``row'' sind
Synonyme:

@table @code
@item ISAM file
Name der ISAM-(Index)-Datei.

@item Isam-version
Version des ISAM-Formats. Momentan immer 2.

@item Creation time
Wann die Daten-Datei erzeugt wurde.

@item Recover time
Wann die Index-/Daten-Datei das letzte Mal rekonstruiert wurden.

@item Data records
Wie viele Datens�tze in der Tabelle sind.

@item Deleted blocks
Wie viele gel�schte Bl�cke noch Platz belegen.
Sie k�nnen Ihre Tabelle optimieren, um diesen Platz zu minimieren.
@xref{Optimisation}.

@item Datafile: Parts
Bei dynamischem Datensatzformat zeigt dies an, wie viele Datenbl�cke es
gibt. Bei einer optimierten Tabelle ohne fragmentierte Datens�tze ist das
dasselbe wie @code{Data records}.

@item Deleted data
Wie viele Bytes nicht zur�ckgewonnener gel�schter Daten es gibt.
Sie k�nnen Ihre Tabelle optimieren, um diesen Platz zu minimieren.
@xref{Optimisation}.

@item Datafile pointer
Die Gr��e des Daten-Datei-Zeigers in Bytes. Das sind normalerweise 2, 3, 4
oder 5 Bytes. Die meisten Tabellen schaffen 2 Bytes, aber das kann bislang
von MySQL noch nicht gesteuert werden. Bei festen Tabellen ist das eine
Datensatzadresse. Bei dynamischen Tabellen ist es eine Byte-Adresse.

@item Keyfile pointer
Die Gr��e des Index-Datei-Zeigers in Bytes. Sie betr�gt normalerweise 1, 2
oder 3 Bytes. Die meisten Tabellen schaffen 2 Bytes, aber das wird von
MySQL automatisch berechnet. Es ist immer die Block-Adresse.

@item Max datafile length
Wie lang die Daten-Datei (@code{.MYD}-Datei) der Tabelle werden kann, in
Bytes.

@item Max keyfile length
Wie lang die Index-Datei (@code{.MYI}-Datei) der Tabelle werden kann, in
Bytes.

@item Recordlength
Wie viel Platz jeder Datensatz ben�tigt, in Bytes.

@item Record format
Das Format, das benutzt wird, um Tabellenzeilen zu speichern.
Die oben stehenden Beispiele benutzen @code{Fixed length}.
Andere m�gliche Werte sind @code{Compressed} und @code{Packed}.

@item Table description
Eine Liste aller Schl�ssel in der Tabelle. F�r jeden Schl�ssel werden
einige Low-Level-Informationen angezeigt:

@table @code
@item Key
Die Nummer des Schl�ssels.

@item Start
Wo im Datensatz dieser Index-Teil anf�ngt.

@item Len
Wie lang dieser Index-Teil ist. Bei gepackten Zahlen sollte das immer die
gesamte L�nge der Spalte sein. Bei Zeichenketten kann es k�rzer als die
gesamte L�nge der indizierten Spalte sein, weil Sie ein Prefix einer
Zeichenkettenspalte indexieren k�nnen.

@item Index
@code{unique} oder @code{multip.} (multiple). Zeigt an, ob ein Wert einmal
oder mehrfach in diesem Index vorkommen darf.

@item Type
Welchen Datentyp dieser Index-Teil hat. Das ist ein ISAM-Datentyp mit den
Optionen @code{packed}, @code{stripped} oder @code{empty}.

@item Root
Adresse des Root-Index-Blocks.

@item Blocksize
Die Gr��e jedes Index-Blocks. Vorgabem��ig ist das 1024, doch dieser Wert
kann beim Kompilieren ge�ndert werden.

@item Rec/key
Das ist ein statistischer Wert, der vom Optimierer benutzt wird. Es sagt
aus, wie viele Datens�tze es pro Wert f�r diesen Schl�ssel gibt. Ein
eindeutiger Schl�ssel hat immer einen Wert von 1. Das kann aktualisiert
werden, nachdem eine Tabelle geladen wurde (oder in gr��erem Umfang
ge�ndert) mit @code{myisamchk -a}. Wenn dies �berhaupt nicht aktualisiert
wurde, wird ein Wert von 30 angenommen.
@end table

@item
Im ersten Beispiel oben ist der neunte Schl�ssel ein mehrteiliger Schl�ssel
mit zwei Teilen.

@item Keyblocks used
Welcher Prozentsatz von Schl�sselbl�cken benutzt wird. Weil die Tabellen,
die in den Beispielen benutzt wurden, direkt vorher mit @code{myisamchk}
reorganisiert wurden, sind diese Werte sehr hoch (sehr nahe am
theoretischen Maximum).

@item Packed
MySQL versucht, Schl�ssel mit einem gemeinsamen Suffix zu packen. Das geht
nur bei @code{CHAR}-, @code{VARCHAR} und @code{DECIMAL}-Schl�sseln. Bei
langen Zeichenketten wie Namen kann das den benutzten Platz signifikant
verringern. Im dritten Beispiel oben ist der vierte Schl�ssel zehn Zeichen
lang, wodurch ein 60%-ige Verringerung des Platzbedarfs erreicht wird.

@item Max levels
Wie tief der B-Baum f�r diesen Schl�ssel ist. gro�e Tabellen mit langen
Schl�sseln haben hohe Werte.

@item Records
Wie viele Zeilen in der Tabelle enthalten sind.

@item M.recordlength
Die durchschnittliche Datensatzl�nge. Bei Tabellen mit Datens�tzen fester
L�nge ist das die exakte Datensatzl�nge.

@item Packed
MySQL schneidet Leerzeichen am Ende von Zeichenketten ab. Der
@code{Packed}-Wert zeigt an, welcher Prozentsatz dadurch gespart wurde.

@item Recordspace used
Welcher Prozentsatz der Daten-Datei benutzt wird.

@item Empty space
Welcher Prozentsatz der Daten-Datei unbenutzt ist.

@item Blocks/Record
Durchschnittliche Anzahl der Bl�cke pro Datensatz (das hei�t, aus wie
vielen Verkn�pfungen (Links) ein fragmentierter Datensatz zusammengesetzt
ist). Bei Tabellen mit festem Format ist das immer 1. Dieser Wert sollte so
nah wie m�glich an 1,0 bleiben. Wenn er zu Gro� wird, k�nnen Sie die
Tabelle @code{myisamchk} reorganisieren.
@xref{Optimisation}.

@item Recordblocks
Wie viele Bl�cke (Verkn�pfungen, Links) benutzt werden. Bei festem Format
ist das die Anzahl der Datens�tze.

@item Deleteblocks
Wie viele Bl�cke (Verkn�pfungen, Links) gel�scht sind.

@item Recorddata
Wie viele Bytes in der Daten-Datei benutzt sind.

@item Deleted data
Wie viele Bytes in der Daten-Datei gel�scht sind (unbenutzt).

@item Lost space
Wenn ein Datensatz auf eine k�rzere L�nge aktualisiert wird, geht etwas
Platz verloren. Das ist die Summe aller solcher Verluste in Bytes.

@item Linkdata
When das dynamische Tabellenformat benutzt wird, werden Datensatzfragmente
mit Zeigern (Pointer) verkn�pft (jeder mit 4 bis 7 Bytes). @code{Linkdata}
ist die Summe des Speicherplatzes, der von diesen Zeigern benutzt wird.
@end table

Wenn eine Tabelle mit @code{myisampack} komprimiert wurde, gibt
@code{myisamchk -d} zus�tzliche Informationen �ber jede Tabellenspalte aus,
siehe @ref{myisampack, , @code{myisampack}}, wo sich ein Beispiel solcher
Informationen und was sie bedeuten befindet.


@node Database Administration, Localisation, Disaster Prevention, MySQL Database Administration
@c German node Datenbankadministration
@section Datenbankverwaltung Sprachreferenz




@menu
* OPTIMIZE TABLE::              
* ANALYZE TABLE::               
* FLUSH::                       
* KILL::                        
* SHOW::                        
@end menu

@node OPTIMIZE TABLE, ANALYZE TABLE, Database Administration, Database Administration
@c German node OPTIMIZE TABLE
@subsection @code{OPTIMIZE TABLE}-Syntax

@findex OPTIMIZE TABLE

@cindex Tabellen, defragmentieren
@cindex Tabellen, Fragmentierung

@example
OPTIMIZE TABLE tabelle[,tabelle]...
@end example

@code{OPTIMIZE TABLE} sollte benutzt werden, wenn Sie gro�e Teile der
Tabelle gel�scht haben oder bei Tabellen mit Zeilen variabler L�nge viele
�nderungen durchgef�hrt haben (Tabellen, die @code{VARCHAR}-, @code{BLOB}-
oder @code{TEXT}-Spalten enthalten). Gel�schte Datens�tze werden in einer
verkn�pften Liste vorgehalten, und nachfolgenden @code{INSERT}-Operationen
benutzen die Positionen alter Datens�tze. Sie k�nnen @code{OPTIMIZE TABLE}
benutzen, um unbenutzten Platz freizugeben und die Daten-Datei zu
defragmentieren.

Momentan funktioniert @code{OPTIMIZE TABLE} nur auf @strong{MyISAM}- und 
@code{BDB}-Tabellen. Bei @code{BDB}-Tabellen ist @code{OPTIMIZE TABLE}
momentan auf @code{ANALYZE TABLE} gemappt. @xref{ANALYZE TABLE}.

Sie k�nnen @code{OPTIMIZE TABLE} auf andere Tabellentypen zum Laufen
bringen, indem Sie @code{mysqld} mit @code{--skip-new} oder
@code{--safe-mode} starten, aber in diesem Fall wird @code{OPTIMIZE TABLE}
lediglich auf @code{ALTER TABLE} gemappt.

@code{OPTIMIZE TABLE} funktioniert wie folgt:
@itemize @bullet
@item
Wenn die Tabelle gel�schte oder aufgeteilte Zeilen hat, wird sie repariert.
@item
Wenn die Index-Seiten nicht sortiert sind, werden sie sortiert.
@item
Wenn die Statistiken nicht aktuell sind (und eine Reparatur nicht durch das
Sortieren des Indexes durchgef�hrt werden k�nnte), werden sie aktualisiert.
@end itemize

@code{OPTIMIZE TABLE} f�r @code{MyISAM}-Tabellen ist �quivalent zum
Laufenlassen von @code{myisamchk --quick --check-changed-tables
--sort-index --analyze} auf die Tabelle.

Beachten Sie, dass die Tabelle w�hrend der Zeit, in der @code{OPTIMIZE TABLE} l�uft, gesperrt ist!


@node ANALYZE TABLE, FLUSH, OPTIMIZE TABLE, Database Administration
@c German node ANALYZE TABLE
@subsection @code{ANALYZE TABLE}-Syntax

@findex ANALYZE TABLE

@example
ANALYZE TABLE tabelle[,tabelle...]
@end example

Analysiert und speichert die Schl�sselverteilung der Tabelle. W�hrend der
Analyse ist die Tabelle mit einer Lesesperre gesperrt. Das funktioniert auf
@code{MyISAM} und @code{BDB}-Tabellen.

Das ist �quivalent zum Laufenlassen von @code{myisamchk -a} auf die
Tabelle.

MySQL benutzt die gespeicherte Schl�sselverteilung, um zu entscheiden, in
welcher Reihenfolge Tabellen verkn�pft werden sollen, wenn man eine
Verkn�pfung (Join) auf irgend etwas anderes als eine Konstante macht.

Der Befehl gibt eine Tabelle mit folgenden Spalten zur�ck:

@multitable @columnfractions .35 .65
@item @strong{Spalte} @tab @strong{Wert}
@item Table @tab Tabellenname.
@item Op @tab Immer ``analyze''.
@item Msg_type @tab @code{status}, @code{error}, @code{info} oder @code{warning}.
@item Msg_text @tab Die Meldung.
@end multitable

Sie k�nnen die gespeicherte Schl�sselverteilung mit dem @code{SHOW
INDEX}-Befehl �berpr�fen. @xref{SHOW DATABASE INFO}.

Wenn die Tabelle seit dem letzten @code{ANALYZE TABLE}-Befehl nicht
ge�ndert wurde, wird sie nicht noch einmal analysiert.


@node FLUSH, KILL, ANALYZE TABLE, Database Administration
@c German node FLUSH
@subsection @code{FLUSH}-Syntax

@findex FLUSH

@cindex @code{mysqladmin}
@cindex L�schen, Caches
@cindex Caches, l�schen

@example
FLUSH flush_option [,flush_option]
@end example

Wenn Sie einige der internen Caches, die MySQL benutzt, l�schen wollen,
benutzen Sie den @code{FLUSH}-Befehl. Um @code{FLUSH} ausf�hren zu k�nnen,
m�ssen Sie die @strong{RELOAD}-Berechtigung haben.

@code{flush_option} kann eine der folgenden sein:

@multitable @columnfractions .15 .85
@item @code{HOSTS}  @tab Leert die Host-Cache-Tabellen. Sie sollten die
Host-Tabellen flushen, wenn einige Ihrer Hosts die IP-Nummer �ndern oder
wenn Sie die Fehlermeldung @code{Host ... is blocked} erhalten.  Wenn mehr
als @code{max_connect_errors} Fehler in einer Zeile f�r einen gegebenen
Host w�hrend der Verbindung zum MySQL-Server vorkommen, nimmt MySQL an,
dass etwas nicht stimmt und blockiert den Host von weiteren
Verbindungsversuchen. Wenn die Host-Tabellen geflusht werden, gestattet das
dem Host, einen erneuten Verbindungsversuch zu machen.
@c German FIX unwrapped @xref
@xref{Blocked host}. Sie k�nnen @code{mysqld} mit @code{-O
max_connection_errors=999999999} starten, um diese Fehlermeldung zu
vermeiden.

@item @code{LOGS} @tab Schlie�t alle Log-Dateien und �ffnet sie danach
wieder. Wenn Sie die Update-Log-Datei oder eine bin�re Log-Datei ohne
Erweiterung angegeben haben, wird die Erweiterungsnummer der Log-Datei um
eins relativ zur vorherigen Datei hoch gez�hlt. Wenn Sie eine Erweiterung
im Dateinamen benutzt haben, schlie�t MySQL die Update-Log-Datei und
�ffnet sie danach wieder. @xref{Update log}. Das ist dasselbe, wie
dem @code{mysqld}-Server das @code{SIGHUP}-Signal senden.

@item @code{PRIVILEGES} @tab L�dt die Berechtigungen aus den
Berechtigungstabellen der @code{mysql}-Datenbank neu.

@item @code{TABLES} @tab Schlie�t alle offenen Tabellen und erzwingt, dass
alle Tabellen in Benutzung geschlossen werden.

@item @code{[TABLE | TABLES] tabelle [,tabelle...]} @tab Flusht nur die
angegebenen Tabellen.

@item @code{TABLES WITH READ LOCK} @tab Schlie�t alle offenen Tabellen und
sperrt alle Tabellen aller Datenbanken mit einer Lesesperre, bis man
@code{UNLOCK TABLES} ausf�hrt. Das ist eine sehr bequeme M�glichkeit,
Datensicherungen zu erzeugen, wenn Sie ein Dateisystem wie Veritas haben,
das Schnappsch�sse aufnehmen kann.

@item @code{STATUS} @tab Setzt alle Status-Variablen auf null zur�ck. Das
sollte man nur benutzen, wenn man eine Anfrage debuggt.
@end multitable

Jeden der oben genannten Befehle k�nnen Sie auch mit dem
@code{mysqladmin}-Dienstprogramm ausf�hren, indem Sie @code{flush-hosts},
@code{flush-logs}, @code{reload} oder @code{flush-tables}-Befehle
eingeben.

Sehen Sie sich auch den @code{RESET}-Befehl an, der bei der Replikation
benutzt wird. @xref{Replication SQL}.



@node KILL, SHOW, FLUSH, Database Administration
@c German node KILL
@subsection @code{KILL}-Syntax

@findex KILL

@cindex @code{mysqladmin}

@example
KILL Thread_id
@end example

Jede Verbindung zu @code{mysqld} l�uft durch einen separaten Thread. Sie
k�nnen sehen, welche Threads laufen, indem Sie den @code{SHOW
PROCESSLIST}-Befehl ausf�hren, und einen Thread killen, indem Sie den
@code{KILL Thread_id}-Befehl ausf�hren.

Wenn Sie die @strong{process}-Berechtigung haben, k�nnen Sie alle Threads
sehen und killen. Ansonsten k�nnen Sie nur Ihre eigenen Threads sehen und
killen.

Sie k�nnen auch die @code{mysqladmin processlist}- und @code{mysqladmin
kill}-Befehle benutzen, um Threads einzusehen und zu killen.

Wenn Sie ein @code{KILL} ausf�hren, wird ein Thread-spezifischer @code{kill
flag} f�r den Thread gesetzt.

In den meisten F�llen kann es einige Zeit dauern, bis der Thread stirbt,
weil der kill-Flag nur in bestimmten Intervallen gepr�ft wird:

@itemize @bullet
@item
Bei @code{SELECT}-, @code{ORDER BY}- und @code{GROUP BY}-Schleifen wird der
Flag gepr�ft, nachdem ein Block von Zeilen gelesen wurde. Wenn der
kill-Flag gesetzt ist, wird das Statement abgebrochen.
@item
Bei @code{ALTER TABLE} wird der kill-Flag gepr�ft, bevor jeder Block von
Zeilen aus der Original-Tabelle gelesen wird. Wenn der Flag gesetzt ist,
wird der Befehl abgebrochen und die tempor�re Tabelle wird gel�scht.
@item
Bei @code{UPDATE TABLE} und @code{DELETE TABLE} wird der kill-Flag gepr�ft,
nachdem jeder Block gelesen wurde sowie nach jeder aktualisierten oder
gel�schten Zeile. Wenn der Flag gesetzt ist, wird das Statement
abgebrochen. Beachten Sie, dass die �nderungen nicht zur�ck gerollt
(Rollback) werden, wenn Sie keine Transaktionen benutzen!
@item
@code{GET_LOCK()} wird mit @code{NULL} abgebrochen.
@item
Ein @code{INSERT DELAYED}-Thread flusht schnell alle Zeilen, die er im
Speicher hat, und stirbt.
@item
Wenn der Thread im Tabellen-Lock-Handler ist (Status: @code{Locked}), wird
die Tabellen-Sperre schnell abgebrochen.
@item
Wenn der Thread bei einem @code{write}-Aufruf auf freien Plattenplatz
wartet, wird der Schreibvorgang mit einer Meldung, dass die Platte voll
ist, abgebrochen.
@end itemize




@node SHOW,  , KILL, Database Administration
@c German node SHOW
@subsection @code{SHOW}-Syntax

@findex SHOW DATABASE INFO
@findex SHOW DATABASES
@findex SHOW TABLES
@findex SHOW COLUMNS
@findex SHOW FIELDS
@findex SHOW INDEX
@findex SHOW KEYS
@findex SHOW STATUS
@findex SHOW VARIABLES
@findex SHOW PROCESSLIST
@findex SHOW TABLE STATUS
@findex SHOW GRANTS
@findex SHOW CREATE TABLE
@findex SHOW MASTER STATUS
@findex SHOW MASTER LOGS
@findex SHOW SLAVE STATUS

@example
   SHOW DATABASES [LIKE platzhalter]
oder SHOW [OPEN] TABLES [FROM datenbank] [LIKE platzhalter]
oder SHOW [FULL] COLUMNS FROM tabelle [FROM datenbank] [LIKE platzhalter]
oder SHOW INDEX FROM tabelle [FROM datenbank]
oder SHOW TABLE STATUS [FROM datenbank] [LIKE platzhalter]
oder SHOW STATUS [LIKE platzhalter]
oder SHOW VARIABLES [LIKE platzhalter]
oder SHOW LOGS
oder SHOW [FULL] PROCESSLIST
oder SHOW GRANTS FOR benutzer
oder SHOW CREATE TABLE tabelle
oder SHOW MASTER STATUS
oder SHOW MASTER LOGS
oder SHOW SLAVE STATUS
@end example

@code{SHOW} stellt Informationen �ber Datenbanken, Tabellen, Spalten oder
Status-Informationen �ber den Server zur Verf�gung. Wenn der @code{LIKE
platzhalter}-Teil benutzt wird, kann die @code{platzhalter}-Zeichenkette
eine Zeichenkette sein, die die SQL-@samp{%}- und @samp{_}-
Platzhalterzeichen benutzt.



@menu
* SHOW DATABASE INFO::          
* SHOW TABLE STATUS::           
* SHOW STATUS::                 
* SHOW VARIABLES::              
* SHOW LOGS::                   
* SHOW PROCESSLIST::            
* SHOW GRANTS::                 
* SHOW CREATE TABLE::           
@end menu

@node SHOW DATABASE INFO, SHOW TABLE STATUS, SHOW, SHOW
@c German node SHOW DATABASE INFO
@subsubsection Informationen �ber Datenbank, Tabellen, Spalten und Indexe abrufen

@cindex Anzeigen, Informationen, @code{SHOW}

Sie k�nnen @code{datenbank.tabelle} als Alternative zur @code{tabelle FROM
datenbank}-Syntax benutzen. Diese beiden Statements sind �quivalent:

@example
mysql> SHOW INDEX FROM tabelle FROM datenbank;
mysql> SHOW INDEX FROM datenbank.tabelle;
@end example

@code{SHOW DATABASES} listet die Datenbanken auf dem MySQL-Server-Host auf.
Diese Liste erhalten Sie auch mit dem @code{mysqlshow}-Befehl.

@code{SHOW TABLES} listet die Tabellen in einer gegebenen Datenbank auf.
Sie erhalten diese Liste auch mit dem @code{mysqlshow datenbank}-Befehl.

@strong{HINWEIS:} Wenn ein Benutzer keinerlei Berechtigungen f�r eine
Tabelle hat, wird die Tabelle in der Ausgabe von @code{SHOW TABLES} oder
@code{mysqlshow datenbank} nicht aufgef�hrt.

@code{SHOW OPEN TABLES} listet die Tabellen auf, die momentan im
Tabellen-Cache ge�ffnet sind. @xref{Open tables}. Das @code{Comment}-Feld
zeigt an, wie oft die Tabelle gecachet (@code{cached}) und in Benutzung
(@code{in_use}) ist.

@code{SHOW COLUMNS} listet die Spalten in einer gegebenen Tabelle auf. Wenn
Sie die @code{FULL}-Option angeben, erhalten Sie auch die Berechtigungen,
die Sie f�r jede Spalte besitzen. Wenn die Spaltentypen von dem abweichen,
was Sie erwarten, n�mlich, was Sie im @code{CREATE TABLE}-Statement
angegeben haben, beachten Sie, dass MySQL manchmal Spaltentypen �ndert.
@xref{Silent column changes}.

Das @code{DESCRIBE}-Statement gibt �hnliche Informationen wie @code{SHOW
COLUMNS} aus. @xref{DESCRIBE, , @code{DESCRIBE}}.

@code{SHOW FIELDS} ist ein Synonym f�r @code{SHOW COLUMNS}. @code{SHOW
KEYS} ist ein Synonym f�r @code{SHOW INDEX}. Sie k�nnen die Spalten oder
Indexe einer Tabelle auch mit @code{mysqlshow Datenbanktabelle} oder
@code{mysqlshow -k Datenbanktabelle} anzeigen.

@code{SHOW INDEX} gibt die Index-Informationen in einem Format aus, das dem
@code{SQLStatistics}-Aufruf in ODBC stark �hnelt. Folgende Spalten werden
zur�ckgegeben:

@multitable @columnfractions .35 .65
@item @strong{Spalte}            @tab @strong{Bedeutung}
@item @code{Table}               @tab Name der Tabelle.
@item @code{Non_unique}          @tab 0, wenn der Index keine Duplikate enthalten darf.
@item @code{Key_name}            @tab Name des Indexes.
@item @code{Seq_in_index}        @tab Spaltensequenznummer im Index, z�hlt ab 1.
@item @code{Column_name}         @tab Spaltenname.
@item @code{Collation}           @tab Wie die Spalte im Index sortiert ist.
                                      In MySQL k�nnen diese Werte @samp{A} (Ascending - aufsteigend)
                                      oder @code{NULL} (Not sorted - unsortiert) sein.
@item @code{Cardinality}         @tab Anzahl der eindeutigen Werte im Index.
                                      Dieser Wert wird durch Laufenlassen von @code{isamchk -a} aktualisiert.
@item @code{Sub_part}            @tab Anzahl der indizierten Zeichen, wenn die Spalte nur teilweise indiziert ist.
                                      @code{NULL}, wenn der gesamte Schl�ssel indiziert ist.
@item @code{Comment}             @tab Verschiedene Anmerkungen. Momentan teilt es nur mit,
                                      ob der Index FULLTEXT ist oder nicht.
@end multitable

Beachten Sie: Weil @code{Cardinality} basierend auf statistischen Werten
gez�hlt wird, die als Ganzzahlen gespeichert sind, ist es nicht
notwendigerweise bei kleinen Tabellen korrekt.


@node SHOW TABLE STATUS, SHOW STATUS, SHOW DATABASE INFO, SHOW
@c German node SHOW TABLE STATUS
@subsubsection @code{SHOW TABLE STATUS}

@cindex anzeigen, Tabellen-Status
@cindex Tabellen, Status anzeigen
@cindex Status, Tabellen

@example
SHOW TABLE STATUS [FROM datenbank] [LIKE platzhalter]
@end example

@code{SHOW TABLE STATUS} (neu in Version 3.23) funktioniert wie @code{SHOW
STATUS}, zeigt aber viele weitere Informationen �ber jede Tabelle. Diese
Liste erhalten Sie auch mit dem @code{mysqlshow --status datenbank}-Befehl.
Folgende Spalten werden zur�ckgegeben:

@multitable @columnfractions .30 .70
@item @strong{Spalte} @tab @strong{Bedeutung}
@item @code{Name} @tab Name der Tabelle.
@item @code{Type} @tab Typ der Tabelle. @xref{Table types}.
@item @code{Row_format} @tab Das Zeilenspeicherformat (fest, dynamisch oder komprimiert).
@item @code{Rows} @tab Anzahl der Zeilen.
@item @code{Avg_row_length} @tab Durchschnittliche Zeilenl�nge.
@item @code{Data_length} @tab L�nge der Daten-Datei.
@item @code{Max_data_length} @tab Maximale L�nge der Daten-Datei.
@item @code{Index_length} @tab L�nge der Index-Datei.
@item @code{Data_free} @tab Anzahl der zugewiesenen (allocated), aber nicht benutzten Bytes.
@item @code{Auto_increment} @tab N�chster autoincrement-Wert.
@item @code{Create_time} @tab Wann die Tabelle erzeugt wurde.
@item @code{Update_time} @tab Wann die Daten-Datei das letzte Mal aktualisiert wurde.
@item @code{Check_time} @tab Wann die Tabelle das letzte Mal gepr�ft wurde.
@item @code{Create_options} @tab Zus�tzliche Optionen, die beim @code{CREATE TABLE} benutzt wurden.
@item @code{Comment} @tab Der Kommentar, der beim Erzeugen der Tabelle angegeben wurde (oder einige Informationen, warum MySQL nicht auf die Tabelleninformationen zugreifen konnte).
@end multitable

Bei @code{InnoDB}-Tabellen wird im Tabellenkommentar der freie Platz im
Tablespace ausgegeben.


@node SHOW STATUS, SHOW VARIABLES, SHOW TABLE STATUS, SHOW
@c German node SHOW STATUS
@subsubsection @code{SHOW STATUS}

@cindex @code{mysqladmin}
@code{SHOW STATUS} zeigt Server-Status-Informationen an (wie
@code{mysqladmin extended-status}). Die Ausgabe �hnelt der unten stehenden,
obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:

@example
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| Aborted_clients          | 0          |
| Aborted_connects         | 0          |
| Bytes_received           | 155372598  |
| Bytes_sent               | 1176560426 |
| Connections              | 30023      |
| Created_tmp_disk_tables  | 0          |
| Created_tmp_tables       | 8340       |
| Created_tmp_files        | 60         |
| Delayed_insert_Threads   | 0          |
| Delayed_writes           | 0          |
| Delayed_errors           | 0          |
| Flush_commands           | 1          |
| Handler_delete           | 462604     |
| Handler_read_first       | 105881     |
| Handler_read_key         | 27820558   |
| Handler_read_next        | 390681754  |
| Handler_read_prev        | 6022500    |
| Handler_read_rnd         | 30546748   |
| Handler_read_rnd_next    | 246216530  |
| Handler_update           | 16945404   |
| Handler_write            | 60356676   |
| Key_blocks_used          | 14955      |
| Key_read_requests        | 96854827   |
| Key_reads                | 162040     |
| Key_write_requests       | 7589728    |
| Key_writes               | 3813196    |
| Max_used_connections     | 0          |
| Not_flushed_key_blocks   | 0          |
| Not_flushed_delayed_rows | 0          |
| Open_tables              | 1          |
| Open_files               | 2          |
| Open_streams             | 0          |
| Opened_tables            | 44600      |
| Questions                | 2026873    |
| Select_full_join         | 0          |
| Select_full_range_join   | 0          |
| Select_range             | 99646      |
| Select_range_check       | 0          |
| Select_scan              | 30802      |
| Slave_running            | OFF        |
| Slave_open_temp_tables   | 0          |
| Slow_launch_threads      | 0          |
| Slow_queries             | 0          |
| Sort_merge_passes        | 30         |
| Sort_range               | 500        |
| Sort_rows                | 30296250   |
| Sort_scan                | 4650       |
| Table_locks_immediate    | 1920382    |
| Table_locks_waited       | 0          |
| Threads_cached           | 0          |
| Threads_created          | 30022      |
| Threads_connected        | 1          |
| Threads_running          | 1          |
| Uptime                   | 80380      |
+--------------------------+------------+
@end example

@cindex variables, status
The status variables listed h�her have the following Bedeutung:

@multitable @columnfractions .35 .65
@item @strong{Variable} @tab @strong{Bedeutung}
@item @code{Aborted_clients} @tab Anzahl der Verbindungen, die abgebrochen
wurden, weil der Client starb, ohne die Verbindung ordnungsgem�� zu
schlie�en. @xref{Communication errors}.
@item @code{Aborted_connects} @tab Anzahl der fehlgeschlagenen Versuche,
sich mit dem MySQL-Server zu verbinden. @xref{Communication errors}.
@item @code{Bytes_received} @tab Anzahl der Bytes, die von allen Clients
empfangen wurden.
@item @code{Bytes_sent} @tab Anzahl der Bytes, die an alle Clients gesendet
wurden.
@item @code{Connections} @tab Anzahl der Verbindungsversuche zum MySQL-Server.
@item @code{Created_tmp_disk_tables} @tab Anzahl der (implizit) auf der
Platte erzeugten tempor�ren Tabellen bei der Ausf�hrung von Statements.
@item @code{Created_tmp_tables} @tab Anzahl der (implizit) im
Arbeitsspeicher erzeugten tempor�ren Tabellen bei der Ausf�hrung von
Statements.
@item @code{Created_tmp_files} @tab Wie viele tempor�re Dateien
@code{mysqld} erzeugt hat.
@item @code{Delayed_insert_Threads} @tab Anzahl der verz�gerten
Insert-Handler-Threads in Benutzung.
@item @code{Delayed_writes} @tab Anzahl der Zeilen, die mit @code{INSERT
DELAYED} geschrieben wurden.
@item @code{Delayed_errors} @tab Anzahl der Zeilen, die mit @code{INSERT
DELAYED} geschrieben wurden, und bei denen irgend ein Fehler auftrat
(wahrscheinlich @code{duplicate key}).
@item @code{Flush_commands} @tab Anzahl der ausgef�hrten @code{FLUSH}-Befehle.
@item @code{Handler_delete} @tab Wie oft eine Zeile aus einer Tabelle
gel�scht wurde.
@item @code{Handler_read_first} @tab Wie oft der erste Eintrag aus einem
Index gelesen wurde. Wenn dieser Wert hoch ist, legt das nahe, dass der
Server viele komplette Index-Scans macht (zum Beispiel @code{SELECT spalte1
FROM foo}, unter der Annahme, dass spalte1 indiziert ist).
@item @code{Handler_read_key} @tab Anzahl der Anfragen, eine Zeile
basierend auf einem Schl�ssel zu lesen. Wenn dieser Wert hoch ist, ist das
ein gutes Indiz daf�r, dass Ihre Anfragen und Tabellen korrekt indiziert
sind.
@item @code{Handler_read_next} @tab Anzahl der Anfragen, die n�chste Zeile
in der Reihenfolge des Schl�ssels zu lesen. Dieser Wert wird herauf
gez�hlt, wenn Sie eine Index-Spalte mit einer Bereichsbeschr�nkung (Limit)
abfragen. Er wird ebenfalls herauf gez�hlt, wenn Sie einen Index-Scan
durchf�hren.
@item @code{Handler_read_rnd} @tab Anzahl der Anfragen, eine Zeile
basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein,
wenn Sie viele Anfragen ausf�hren, die erfordern, dass das Ergebnis
sortiert wird.
@item @code{Handler_read_rnd_next} @tab Anzahl der Anfragen, die n�chste
Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie
viele Tabellen-Scans durchf�hren. Im Allgemeinen weist das darauf hin, dass
Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht
so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie
haben.
@item @code{Handler_update} @tab Anzahl der Anfragen, eine Zeile in einer
Tabelle zu aktualisieren.
@item @code{Handler_write} @tab Anzahl der Anfragen, eine Zeile in eine
Tabelle einzuf�gen.
@item @code{Key_blocks_used} @tab Die Anzahl der benutzten Blocks im
Schl�ssel-Cache.
@item @code{Key_read_requests} @tab Die Anzahl der Anfragen, einen
Schl�ssel-Block aus dem Cache zu lesen.
@item @code{Key_reads} @tab Die Anzahl physikalischer Lesezugriffen eines
Schl�ssel-Blocks von der Platte.
@item @code{Key_write_requests} @tab Die Anzahl der Anfragen, einen
Schl�ssel-Block in den Cache zu schreiben.
@item @code{Key_writes} @tab Die Anzahl physikalischer Schreibvorg�nge
eines Schl�ssel-Blocks auf Platte.
@item @code{Max_used_connections} @tab Die h�chste Anzahl von Verbindungen,
die gleichzeitig in Benutzung sind.
@item @code{Not_flushed_key_blocks} @tab Schl�ssel-Bl�cke im
Schl�ssel-Cache, die ver�ndert wurden, aber noch nicht auf die Platte
zur�ck geschrieben (flush).
@item @code{Not_flushed_delayed_rows} @tab Anzahl der Zeilen, die in
@code{INSERT DELAY}-Warteschleifen darauf warten, geschrieben zu werden.
@item @code{Open_tables} @tab Anzahl der offenen Tabellen.
@item @code{Open_files} @tab  Anzahl der offenen Dateien.
@item @code{Open_streams} @tab Anzahl der offenen Streams (haupts�chlich
zum Loggen benutzt).
@item @code{Opened_tables} @tab Anzahl der Tabellen, die ge�ffnet wurden.
@item @code{Select_full_join} @tab Anzahl der Joins ohne Schl�ssel (sollte
0 sein).
@item @code{Select_full_range_join} @tab Anzahl der Joins, bei denen eine
Bereichssuche auf die Referenztabelle statt fand.
@item @code{Select_range} @tab Anzahl der Joins, bei denen Bereiche auf die
erste Tabelle benutzt wurden. (Es ist normalerweise unkritisch, wenn dieser
Wert hoch ist.)
@item @code{Select_scan} @tab Anzahl der Joins, bei denen die erste Tabelle
gescannt wurde.
@item @code{Select_range_check} @tab Anzahl der Joins ohne Schl�ssel, bei
denen nach jeder Zeile auf Schl�sselbenutzung gepr�ft wurde (sollte 0
sein).
@item @code{Questions} @tab Anzahl der Anfragen, die zum Server geschickt
wurden.
@item @code{Slave_open_temp_tables} @tab Anzahl der tempor�ren Tabellen,
die momentan vom Slave-Thread ge�ffnet sind.
@item @code{Slow_launch_threads} @tab Anzahl der Threads, die l�nger als
@code{slow_launch_time} brauchten, um sich zu verbinden.
@item @code{Slow_queries} @tab Anzahl der Anfragen, die l�nger als
@code{long_query_time} ben�tigten. @xref{Slow query log}.
@item @code{Sort_merge_passes} @tab Anzahl der Verschmelzungen (Merge), die
von einem Sortiervorgang ben�tigt wurden. Wenn dieser Wert hoch ist,
sollten Sie in Betracht ziehen, @code{sort_buffer} herauf zu setzen.
@item @code{Sort_range} @tab Anzahl der Sortiervorg�nge, die mit Bereichen
durchgef�hrt wurden.
@item @code{Sort_rows}  @tab Anzahl der sortierten Zeilen.
@item @code{Sort_scan}  @tab Anzahl der Sortiervorg�nge, die durchgef�hrt
wurden, indem die Tabelle gescannt wurde.
@item @code{Table_locks_immediate} @tab Wie oft eine Tabellensperre sofort
erlangt wurde. Verf�gbar nach Version 3.23.33.
@item @code{Table_locks_waited} @tab Wie oft eine Tabellensperre nicht
sofort erlangt werden konnte und gewartet werden musst. Wenn dieser Wert
hoch ist und Sie Performance-Probleme haben, sollten Sie zun�chst Ihre
Anfragen optimieren und dann entweder Ihre Tabelle(n) zerteilen oder
Replikation benutzen. Verf�gbar nach Version 3.23.33.
@item @code{Threads_cached} @tab Anzahl der Threads im Thread-Cache.
@item @code{Threads_connected} @tab Anzahl der momentan offenen
Verbindungen.
@item @code{Threads_created} @tab Anzahl der Threads, die zur Handhabung
von Verbindungen erzeugt wurden.
@item @code{Threads_running} @tab Anzahl der Threads, die nicht schlafen.
@item @code{Uptime} @tab Seit wie vielen Sekunden der Server hoch gefahren
ist.
@end multitable

Einige Anmerkungen zum oben Aufgef�hrten:

@itemize @bullet
@item
Wenn @code{Opened_tables} hoch ist, ist Ihre @code{table_cache}-Variable
wahrscheinlich zu niedrig.
@item
Wenn @code{key_reads} hoch ist, ist Ihr @code{key_cache} wahrscheinlich zu
klein. Die Cache-Zugriffsrate kann mit @code{key_reads} /
@code{key_read_requests} berechnet werden.
@item
Wenn @code{Handler_read_rnd} hoch ist, haben Sie wahrscheinlich viele
Anfragen, die MySQL zwingen, ganze Tabellen zu scannen, oder Sie haben
Joins, die Schl�ssel nicht richtig benutzen.
@item
Wenn @code{Threads_created} hoch ist, sollten Sie eventuell die
@code{Thread_cache_size}-Variable herauf setzen.
@item
Wenn @code{Created_tmp_disk_tables} hoch ist, sollten Sie eventuell die
@code{tmp_table_size}-Variable herauf setzen, damit tempor�re Tabellen im
Speicher erzeugt werden statt auf der Platte.
@end itemize


@node SHOW VARIABLES, SHOW LOGS, SHOW STATUS, SHOW
@c German node SHOW VARIABLES
@subsubsection @code{SHOW VARIABLES}

@example
SHOW VARIABLES [LIKE platzhalter]
@end example

@code{SHOW VARIABLES} zeigt die Werte einiger MySQL-Systemvariablen. Sie
erhalten diese List auch mit dem @code{mysqladmin variables}-Befehl. Wenn
die Vorgabewerte unpassend sind, k�nnen Sie die meisten dieser Variablen
mit Kommandozeilenoptionen setzen, wenn Sie @code{mysqld} hoch fahren.
@xref{Command-line options}.

Die Ausgabe �hnelt der unten stehenden,
obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:

@example
+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| ansi_mode               | OFF                       |
| back_log                | 50                        |
| basedir                 | /my/monty/                |
| bdb_cache_size          | 16777216                  |
| bdb_log_buffer_size     | 32768                     |
| bdb_home                | /my/monty/data/           |
| bdb_max_lock            | 10000                     |
| bdb_logdir              |                           |
| bdb_shared_data         | OFF                       |
| bdb_tmpdir              | /tmp/                     |
| binlog_cache_size       | 32768                     |
| concurrent_insert       | ON                        |
| connect_timeout         | 5                         |
| datadir                 | /my/monty/data/           |
| delay_key_write         | ON                        |
| delayed_insert_limit    | 100                       |
| delayed_insert_timeout  | 300                       |
| delayed_queue_size      | 1000                      |
| flush                   | OFF                       |
| flush_time              | 0                         |
| have_bdb                | YES                       |
| have_innodb             | YES                       |
| have_raid               | YES                       |
| have_openssl            | NO                        |
| init_file               |                           |
| interactive_timeout     | 28800                     |
| join_buffer_size        | 131072                    |
| key_buffer_size         | 16776192                  |
| language                | /my/monty/share/english/  |
| large_files_support     | ON                        |
| log                     | OFF                       |
| log_update              | OFF                       |
| log_bin                 | OFF                       |
| log_slave_updates       | OFF                       |
| long_query_time         | 10                        |
| low_priority_updates    | OFF                       |
| lower_case_table_names  | 0                         |
| max_allowed_packet      | 1048576                   |
| max_binlog_cache_size   | 4294967295                |
| max_connections         | 100                       |
| max_connect_errors      | 10                        |
| max_delayed_threads     | 20                        |
| max_heap_table_size     | 16777216                  |
| max_join_size           | 4294967295                |
| max_sort_length         | 1024                      |
| max_tmp_tables          | 32                        |
| max_write_lock_count    | 4294967295                |
| myisam_recover_options  | DEFAULT                   |
| myisam_sort_buffer_size | 8388608                   |
| net_buffer_length       | 16384                     |
| net_read_timeout        | 30                        |
| net_retry_count         | 10                        |
| net_write_timeout       | 60                        |
| open_files_limit        | 0                         |
| pid_file                | /my/monty/data/donna.pid  |
| port                    | 3306                      |
| protocol_version        | 10                        |
| record_buffer           | 131072                    |
| query_buffer_size       | 0                         |
| safe_show_database      | OFF                       |
| server_id               | 0                         |
| skip_locking            | ON                        |
| skip_networking         | OFF                       |
| skip_show_database      | OFF                       |
| slow_launch_time        | 2                         |
| socket                  | /tmp/mysql.sock           |
| sort_buffer             | 2097116                   |
| table_cache             | 64                        |
| table_type              | MYISAM                    |
| Thread_cache_size       | 4                         |
| Thread_stack            | 65536                     |
| tmp_table_size          | 1048576                   |
| tmpdir                  | /tmp/                     |
| version                 | 3.23.29a-gamma-debug      |
| wait_timeout            | 28800                     |
+-------------------------+---------------------------+
@end example

Jede Option ist unten beschrieben. Die Werte f�r Puffergr��en, L�ngen und
Stack-Gr��en sind in Bytes angegeben. Sie k�nnen Wert mit den Suffixen
@samp{K} oder @samp{M} angeben, um Kilobytes oder Megabytes zu
kennzeichnen. @code{16M} zum Beispiel bedeutet 16 Megabytes. Bei den
Suffixen spielt Gro�-/Kleinschreibung keine Rolle, @code{16M} und
@code{16m} sind �quivalent:

@cindex Variablen, Werte
@table @code
@item @code{ansi_mode}.
Ist @code{ON}, wenn @code{mysqld} mit @code{--ansi} gestartet wurde.
@xref{ANSI mode}.

@item @code{back_log}
Die Anzahl unerledigter Verbindungsanforderung, die MySQL haben kann. Dies
kommt ins Spiel, wenn der Haupt-Thread von MySQL @strong{SEHR} viele
Verbindungsanforderungen in sehr kurzer Zeit erh�lt. Dann dauert es etwas
(wenngleich sehr kurz), damit der Haupt-Thread die Verbindung pr�fen und
einen neuen Thread starten kann. Der @code{back_log}-Wert zeigt an, wie
viele Verbindungen w�hrend dieser kurzen Zeit gestapelt (gestackt) werden k�nnen, bevor
MySQL f�r einen Moment aufh�rt, neue Anforderungen zu beantworten. Sie
brauchen diesen Wert nur dann herauf setzen, wenn Sie eine gro�e Zahl von
Verbindungen in kurzer Zeit erwarten.

Mit anderen Worten ist dieser Wert die Gr��e der Listen-Queue
(Warteschlange) f�r herein kommende TCP/IP-Verbindungen. Ihr Betriebssystem
hat seine eigene Beschr�nkung hinsichtlich der Gr��e dieser Queue. Die
Handbuchseiten zum Unix-@code{listen(2)}-System sollten hier weitere
Details haben. Sehen Sie in der Dokumentation Ihres Betriebssystems nach,
wie hoch der Wert dieser Variablen maximal sein kann. Wenn Sie versuchen,
@code{back_log} h�her als die Begrenzung Ihres Betriebssystems zu setzen,
ist das ineffektiv.

@item @code{basedir}
Der Wert der @code{--basedir}-Option.

@item @code{bdb_cache_size}
Der zugewiesene Puffer, um Index und Zeilen bei @code{BDB}-Tabellen zu
cachen. Wenn Sie keine @code{BDB}-Tabellen benutzen, sollten Sie
@code{mysqld} mit @code{--skip-bdb} starten, um f�r diesen Cache keinen
Arbeitsspeicher zu verschwenden.

@item @code{bdb_log_buffer_size}
Der zugewiesene Puffer, um Index und Zeilen bei @code{BDB}-Tabellen zu
cachen. Wenn Sie keine @code{BDB}-Tabellen benutzen, sollten Sie diesen
Wert auf o setzen und @code{mysqld} mit @code{--skip-bdb} starten, um f�r
diesen Cache keinen Arbeitsspeicher zu verschwenden.

@item @code{bdb_home}
Der Wert der @code{--bdb-home}-Option.

@item @code{bdb_max_lock}
Die maximale Anzahl von Sperren (Vorgabewert: 1000), die bei einer
@code{BDB}-Tabelle aktiv sein k�nnen. Sie sollten diesen Wert herauf
setzen, wenn Sie Fehler folgender Art bekommen: @code{bdb:
Lock table is out of available locks} oder @code{Got error 12 from ...},
wenn Sie lange Transaktionen durchf�hren oder wenn @code{mysqld} viele
Zeile untersuchen muss, um die Anfrage zu berechnen.

@item @code{bdb_logdir}
Der Wert der @code{--bdb-logdir}-Option.

@item @code{bdb_shared_data}
Ist @code{ON}, wenn Sie @code{--bdb-shared-data} benutzen.

@item @code{bdb_tmpdir}
Der Wert der @code{--bdb-tmpdir}-Option.

@item @code{binlog_cache_size}. Die Gr��e des Caches, in dem
SQL-Statements f�r das Bin�r-Log w�hrend einer Transaktion vorgehalten
werden. Wenn Sie oft gro�e, aus vielen Statements bestehende Transaktionen
durchf�hren, k�nnen Sie diesen Wert herauf setzen, um mehr Performance zu
erzielen. @xref{COMMIT}.

@item @code{character_set}
Der vorgabem��ige Zeichensatz.

@item @code{character_sets}
Die unterst�tzten Zeichens�tze.

@item @code{concurrent_inserts}
Falls @code{ON} (Vorgabe), l��t MySQL @code{INSERT} auf
@code{MyISAM}-Tabellen zu, auf die zur gleichen Zeit @code{SELECT}-Anfragen
laufen. Sie k�nnen diese Option ausschalten, indem Sie @code{mysqld} mit
@code{--safe} oder @code{--skip-new} starten.

@cindex timeout
@item @code{connect_timeout}
Die Anzahl von Sekunden, die der @code{mysqld}-Server auf ein
Verbindungspaket wartet, bevor er mit @code{Bad handshake} antwortet.

@item @code{datadir}
Der Wert der @code{--datadir}-Option.

@item @code{delay_key_write}
Falls angeschaltet (Vorgabe), akzeptiert MySQL die
@code{delay_key_write}-Option von @code{CREATE TABLE}. Das hei�t, dass der
Schl�sselpuffer f�r Tabellen bei dieser Option nicht bei jeder
Index-Aktualisierung auf Platte zur�ckgeschrieben (flush) wird, sondern
nur, wenn eine Tabelle geschlossen wird. Das beschleunigt Schreibvorg�nge
auf Schl�ssel ganz erheblich, aber Sie sollten eine automatische Pr�fung
aller Tabellen mit @code{myisamchk --fast --force} hinzuf�gen, wenn Sie
diese Option benutzen. Beachten Sie: Wenn Sie @code{mysqld} mit der
@code{--delay-key-write-for-all-tables}-Option startet, hei�t das, dass
alle Tabelle so behandelt werden, als wenn sie mit der
@code{delay_key_write}-Option erzeugt worden w�ren. Sie k�nnen diesen Flag
l�schen, wenn Sie @code{mysqld} mit @code{--skip-new} oder
@code{--safe-mode} starten.

@item @code{delayed_insert_limit}
Nachdem @code{delayed_insert_limit} Zeilen eingef�gt wurden, pr�ft der
@code{INSERT DELAYED}-Handler, ob noch irgend welche
@code{SELECT}-Statements anh�ngig sind. Falls ja, wird deren Ausf�hrung
zugelassen, bevor weiter gemacht wird.

@item @code{delayed_insert_timeout}
Wie lange ein @code{INSERT DELAYED}-Thread auf @code{INSERT}-Statements
warten soll, bevor abgebrochen wird.

@item @code{delayed_queue_size}
Welche Warteschleifen-(Queue)-Speichergr��e (in Zeilen) f�r die Handhabung
von @code{INSERT DELAYED} zugewiesen werden soll. Wenn die Queue voll ist,
wartet jeder Client, der @code{INSERT DELAYED} ausf�hrt, bis es wieder
Platz in der Queue gibt.

@item @code{flush}
Ist @code{ON}, wenn Sie MySQL mit der @code{--flush}-Option gestartet
haben.

@item @code{flush_time}
Wenn diese Variable auf einen Wert ungleich 0 gesetzt wird, dann werden
alle @code{flush_time} Sekunden alle Tabelle geschlossen (um Ressourcen
frei zu geben und Dinge auf Platte zur�ck zu schreiben). Diese Option
empfehlen wir nur auf Windows 95, Windows 98 oder auf Systemen, auf denen
Sie sehr wenige Ressourcen haben.

@item @code{have_bdb}
Ist @code{YES}, wenn @code{mysqld} Berkeley-DB-Tabellen unterst�tzt. Ist
@code{DISABLED}, wenn @code{--skip-bdb} benutzt wird.
@item @code{have_innodb}
Ist @code{YES}, wenn @code{mysqld} InnoDB-Tabellen unterst�tzt. Ist
@code{DISABLED}, wenn @code{--skip-innodb} benutzt wird.
@item @code{have_raid}
Ist @code{YES}, wenn @code{mysqld} die @code{RAID}-Option unterst�tzt.
@item @code{have_openssl}
Ist @code{YES}, wenn @code{mysqld} SSL (Verschl�sselung) auf dem
Client-/Server-Protokoll unterst�tzt.

@item @code{init_file}
Der Name der Datei, die mit der @code{--init-file}-Option angegeben wurde,
als Sie den Server starteten. Das ist eine Datei mit SQL-Statements, die
der Server beim Start ausf�hren soll.

@item @code{interactive_timeout}
Die Anzahl von Sekunden, die der Server bei einer interaktiven Verbindung
wartet, bis er sie schlie�t. Ein interaktiver Client ist definiert als
Client, der die @code{CLIENT_INTERACTIVE}-Option f�r
@code{mysql_real_connect()} benutzt. Siehe auch @code{wait_timeout}.

@item @code{join_buffer_size}
Die Gr��e des Puffers, der f�r volle Joins benutzt wird (Joins, die keine
Indexe benutzen). Der Puffer wird einmal pro vollem Join zwischen zwei
Tabellen zugewiesen. Setzen Sie diesen Wert herauf, um einen schnelleren
vollen Join zu erhalten, wenn das Addieren von Indexen nicht m�glich ist.
(Normalerweise ist die beste Art, schnelle Joins zu erhalten, das Addieren
von Indexen.)

@c Make texi2html Support index @anchor{Index cache size}. Then change
@c some xrefs to point here
@cindex Indexe, Blockgr��e
@item @code{key_buffer_size}
Index-Bl�cke werden gepuffert und von allen Threads geteilt.
@code{key_buffer_size} ist die Gr��e des Puffers, der f�r Index-Bl�cke
benutzt wird.

Setzen Sie diesen Wert herauf, um eine bessere Index-Handhabung zu erzielen
(f�r alle Lesevorg�nge und f�r mehrfache Schreibvorg�nge), so weit, wie Sie
es sich leisten k�nnen; 64 MB auf einer 256-MB-Maschine, auf der
haupts�chlich MySQL l�uft, ist ein gebr�uchlicher Wert. Wenn Sie diesen
Wert allerdings zu hoch setzen (mehr als 50% Ihres gesamten
Arbeitsspeichers), kann es sein, dass Ihr System anf�ngt auszulagern
(Paging), was SEHR langsam werden kann. Denken Sie daran, dass Sie Platzt
f�r den Dateisystem-Cache des Betriebssystems lassen m�ssen, weil MySQL
Daten-Lesen nicht cachet.

Sie k�nnen die Performance des Schl�sselpuffers mit @code{show status}
�berpr�fen und sich die Variablen @code{Key_read_requests},
@code{Key_reads}, @code{Key_write_requests} und @code{Key_writes} ansehen.
Das Verh�ltnis @code{Key_reads/Key_read_request} sollte normalerweise <
0,01 sein. @code{Key_write/Key_write_requests} ist �blicherweise nahe 1,
wenn Sie haupts�chlich Aktualisieren (Update) und L�schen (Delete)
ausf�hren, kann aber sehr viel kleiner werden, wenn Sie tendenziell
Aktualisierungen ausf�hren, die viele Zeilen gleichzeitig betreffen, oder
wenn Sie @code{delay_key_write} benutzen. @xref{SHOW}.

Um noch mehr Geschwindigkeit beim Schreiben vieler Zeilen auf einmal zu
erhalten, benutzen Sie @code{LOCK TABLES}. @xref{LOCK TABLES, , @code{LOCK TABLES}}.

@item @code{language}
Die Sprache, in der Fehlermeldungen ausgegeben werden.

@item @code{large_file_support}
Ob @code{mysqld} mit Optionen f�r die Unterst�tzung gro�er Dateien
kompiliert wurde.

@item @code{locked_in_memory}
Ob @code{mysqld} mit @code{--memlock} in den Speicher gesperrt wurde.

@item @code{log}
Ob das Loggen aller Anfragen angeschaltet ist.

@item @code{log_update}
Ob das Update-Log angeschaltet ist.

@item @code{log_bin}
Ob das Bin�r-Log angeschaltet ist.

@item @code{log_slave_updates}
Ob Aktualisierungen vom Slave geloggt werden sollen.

@item @code{long_query_time}
Wenn eine Anfrage l�nger als diesen Wert (in Sekunden) ben�tigt, wird der
@code{Slow_queries}-Z�hler hoch gez�hlt. Wenn Sie @code{--log-slow-queries}
benutzen, wird die Anfrage in die Slow-Query-Logdatei geschrieben.
@xref{Slow query log}.

@item @code{lower_case_table_names}
Wenn auf 1 gesetzt, werden Tabellennamen in Kleinschreibung auf Platte
gespeichert. Tabellennamen sind dann unabh�ngig von der verwendeten
Gro�-/Kleinschreibung.
@xref{Case sensitivity}.

@item @code{max_allowed_packet}
Die maximale Gr��e eine Pakets. Der Nachrichtenpuffer wird auf
@code{net_buffer_length} Bytes L�nge initialisiert, kann aber wenn n�tig
bis zu @code{max_allowed_packet} Bytes Gro� werden. Der Vorgabewert ist
klein, um gro�e (m�glicherweise falsche) Pakete abzufangen. Sie m�ssen
diesen Wert erh�hen, wenn Sie gro�e @code{BLOB}-Spalten verwenden. Er
sollte so Gro� sein wie die gr��te @code{BLOB}-Spalte, die Sie verwenden
wollen. Das aktuelle Protokoll begrenzt @code{max_allowed_packet} auf 16 MB.

@item @code{max_binlog_cache_size}
Wenn eine Transaktion aus mehreren Statements mehr als diese Speichermenge
ben�tigt, erh�lt man den Fehler "Multi-Statement transaction required more
than 'max_binlog_cache_size' bytes of storage".

@item @code{max_binlog_size}
Verf�gbar nach Version 3.23.33. Wenn ein Schreibvorgang ins bin�re
(Replikations-) Log den angegebenen Wert �bersteigt, werden die Logs
rotiert. Sie k�nnen den Wert auf weniger als 1024 Bytes setzen oder auf
mehr als 1 GB. Vorgabe ist 1 GB.

@item @code{max_connections}
Die Anzahl von Clients, die gleichzeitig verbunden sind. Wenn Sie diesen
Wert hoch setzen, wird die Anzahl der Datei-Deskriptoren heraufgesetzt, die
@code{mysqld} ben�tigt. Siehe weiter unten, Bemerkungen zu Beschr�nkungen
bei Datei-Deskriptoren. @xref{Too many connections}.

@item @code{max_connect_errors}
Wenn es mehr als diese Anzahl unterbrochener Verbindungen von einem Host
gibt, wird dieser Host von weiteren Verbindungen abgeschnitten. Sie k�nnen
diese Sperre mit dem @code{FLUSH HOSTS}-Befehl aufheben.

@item @code{max_delayed_Threads}
Nicht mehr als diese Anzahl von Threads zulassen, um @code{INSERT
DELAYED}-Statements abzuarbeiten. Wenn Sie versuchen, Daten in eine neue
Tabelle einzuf�gen, wenn alle @code{INSERT DELAYED}-Threads in Benutzung
sind, wird die Zeile eingef�gt, als ob das @code{DELAYED}-Attribut nicht
angegeben w�re.

@item @code{max_heap_table_size}
Kein Erzeugen von Heap-Tabellen zulassen, die gr��er als dieser Wert sind.

@item @code{max_join_size}
Joins, die wahrscheinlich mehr als @code{max_join_size} Datens�tze lesen
werden, geben einen Fehler zur�ck. Setzen Sie diesen Wert, wenn Ihre
Benutzer dazu neigen, Joins auszuf�hren, denen eine @code{WHERE}-Klausel
fehlt und die daher lange Zeit ben�tigen und wom�glich Millionen von Zeilen
zur�ck geben.

@item @code{max_sort_length}
Die Anzahl von Bytes, die beim Sortieren von @code{BLOB}- oder
@code{TEXT}-Werten benutzt werden (nur die ersten @code{max_sort_length}
Bytes jedes Werts werden benutzt, der Rest wird ignoriert).

@item @code{max_user_connections}
Die maximale Anzahl aktiver Verbindungen f�r einen einzelnen Benutzer (0 =
keine Beschr�nkung).

@item @code{max_tmp_tables}
(Diese Option macht bislang noch nichts.)
Maximale Anzahl von tempor�ren Tabellen, die ein Client zur selben Zeit
offen halten darf.

@item @code{max_write_lock_count}
Nach dieser Anzahl Schreibsperren wird einigen Lesesperren erlaubt,
zwischendurch zu laufen.

@item @code{myisam_recover_options}
Der Wert der @code{--myisam-recover}-Option.

@item @code{myisam_sort_buffer_size}
Der Puffer, der beim Sortieren des Indexes zugewiesen wird, wenn man ein
@code{REPAIR} oder ausf�hrt oder Indexe mit @code{CREATE INDEX} oder
@code{ALTER TABLE} erzeugt.

@item @code{myisam_max_extra_sort_file_size}.
Wenn das Erzeugen der tempor�ren Datei f�r schnelle Index-Erzeugung um
diesen Wert gr��er sein w�rde als die Benutzung des Schl�ssel-Caches, wird
die Schl�ssel-Cache-Methode bevorzugt. Wird haupts�chlich benutzt, um lange
Zeichen-Schl�ssel in gro�en Tabellen zu zwingen, die langsamere
Schl�ssel-Cache-Methode zu benutzen, um den Index zu erzeugen.
@strong{HINWEIS:} Dieser Parameter wird in Megabytes angegeben!

@item @code{myisam_max_sort_file_size}
Die maximale Gr��e der tempor�ren Datei, die MySQL benutzen darf, w�hrend
es den Index erzeugt (w�hrend @code{REPAIR}, @code{ALTER TABLE} oder
@code{LOAD DATA INFILE}). Wenn die Datei gr��er als dieser Wert w�rde, wird
der Index �ber den Schl�ssel-Cache erzeugt (was langsamer ist).
@strong{HINWEIS:} Dieser Parameter wird in Megabytes angegeben!

@item @code{net_buffer_length}
Der Kommunikationspuffer wird zwischen Anfragen auf diesen Wert zur�ck
gesetzt. Normalerweise sollte das nicht ge�ndert werden, aber wenn Sie sehr
wenig Arbeitsspeicher haben, k�nnen Sie ihn auf die erwartete Gr��e einer
Anfrage setzen (also die erwartete L�nge von SQL-Statements, die von
Clients gesendet werden. Wenn Statements diese L�nge �berschreiten, wird
der Puffer automatisch vergr��ert, bis zu @code{max_allowed_packet} Bytes.)

@item @code{net_read_timeout}
Anzahl von Sekunden, die auf weitere Daten von einer Verbindung gewartet
wird, bevor das Lesen abgebrochen wird. Beachten Sie: Wenn keine Daten von
einer Verbindung erwartet werden, ist der Timeout durch
@code{write_timeout} definiert. Siehe auch @code{slave_read_timeout}.

@item @code{net_retry_count}
Wenn ein Lesevorgang auf einem Kommunikations-Port unterbrochen wird, wird
so oft wie angegeben neu versucht, bevor aufgegeben wird. Dieser Wert
sollte auf @code{FreeBSD} recht hoch sein, weil interne
Unterbrechnungsanforderungen (Interrupts) an alle Threads gesendet werden.

@item @code{net_write_timeout}
Anzahl von Sekunden, die auf das Schreiben eines Blocks zu einer Verbindung
gewartet wird, bis das Schreiben abgebrochen wird.

@item @code{open_files_limit}
Wenn dieser Wert ungleich 0 ist, benutzt @code{mysqld} Datei-Deskriptoren,
die mit @code{setrlimit()} benutzt werden. Wenn dieser Wert gleich 0 ist,
reserviert @code{mysqld} @code{max_connections * 5} oder
@code{max_connections + table_cache * 2} (je nachdem, was gr��er ist)
Anzahl von Dateien. Sie sollten diesen Wert herauf setzen, wenn
@code{mysqld} Ihnen die Fehlermeldung 'Too many open files' gibt.

@item @code{pid_file}
Der Wert der @code{--pid-file}-Option.

@item @code{port}
Der Wert der @code{--port}-Option.

@item @code{protocol_version}
Die Protokoll-Version, die vom MySQL-Server benutzt wird.

@item @code{record_buffer}
Jeder Thread, der einen sequentiellen Scan ausf�hrt, alloziert einen Puffer
dieser Gr��e f�r jede Tabelle, die er scannt. Wenn Sie viele sequentielle
Scans ausf�hren, sollten Sie diesen Wert herauf setzen.

@item @code{record_rnd_buffer}
Wenn Zeilen nach einem Sortiervorgang in sortierter Reihenfolge gelesen
werden, werden die Zeilen aus diesem Puffer gelesen, um Suchvorg�nge auf
der Platte zu vermeiden. Wenn dieser Wert nicht gesetzt ist, wird er auf
den Wert von @code{record_buffer} gesetzt.

@item @code{query_buffer_size}
Die anf�ngliche Zuweisung des Anfragen-Puffers. Wenn die meisten Ihrer
Anfragen lang sind (zum Beispiel beim Einf�gen von Blobs), sollten Sie
diesen Wert herauf setzen!

@item @code{safe_show_databases}
Keine Datenbanken zeigen, wenn der Benutzer keinerlei Datenbank- oder
Tabellen-Berechtigungen daf�r hat. Das kann die Sicherheit erh�hen, wenn
Sie sich Sorgen machen, dass Leute in der Lage sind zu sehen, welche
Datenbanken andere Benutzer haben. Siehe auch
@code{skip_show_databases}.

@item @code{server_id}
Der Wert der @code{--server-id}-Option.

@item @code{skip_locking}
Ist @code{OFF}, wenn @code{mysqld} externes Sperren benutzt.

@item @code{skip_networking}
Ist @code{ON}, wenn nur lokale (Socket-) Verbindungen zugelassen sind.

@item @code{skip_show_databases}
H�lt Leute davon ab, @code{SHOW DATABASES} zu benutzen, wenn sie keine
the @code{PROCESS_PRIV}-Berechtigung haben. Das kann die Sicherheit erh�hen, wenn
Sie sich Sorgen machen, dass Leute in der Lage sind zu sehen, welche
Datenbanken andere Benutzer haben. Siehe auch @code{safe_show_databases}.

@item @code{slave_read_timeout}
Anzahl von Sekunden, die auf weitere Daten von einer
Master-/Slave-Verbindung gewartet wird, bevor das Lesen abgebrochen wird.

@item @code{slow_launch_time}
Wenn das Erzeugen des Threads l�nger als dieser Wert (in Sekunden) dauert,
word der @code{Slow_launch_threads}-Z�hler herauf gez�hlt.

@item @code{socket}
Der Unix-Socket, der vom Server benutzt wird.

@item @code{sort_buffer}
Jeder Thread, der einen Sortierdurchgang durchf�hren muss, alloziert einen
Puffer dieser Gr��e. Setzen Sie diesen Wert herauf, um schnellere
@code{ORDER BY}- oder @code{GROUP BY}-Operationen zu erhalten.
@xref{Temporary files}.

@item @code{table_cache}
Die Anzahl offener Tabellen f�r alle Threads. Wenn dieser Wert herauf
gesetzt wird, erh�ht sich die Anzahl von Datei-Deskriptoren, die
@code{mysqld} ben�tigt. Sie k�nnen pr�fen, ob Sie den Tabellen-Cache
vergr��ern m�ssen, indem Sie die @code{Opened_tables}-Variable pr�fen.
@xref{SHOW}. Wenn diese Variable sehr Gro� ist und Sie @code{FLUSH TABLES}
nicht oft brauchen (was lediglich alle Tabellen zwingt, geschlossen und
wieder ge�ffnet zu werden), sollten Sie den Wert dieser Variablen herauf
setzen.

Wegen weiterer Informationen zum Tabellen-Cache sehen Sie unter
@ref{Open tables} nach.

@item @code{table_type}
Der vorgabem��ige Tabellentyp.

@item @code{thread_cache_size}
Wie viele Threads in einem Cache f�r weitere Benutzung offen gehalten
werden sollen. Wenn eine Client die Verbindung schlie�t, werden die
Threads des Clients in den Cache geschrieben, wenn es nicht mehr als
@code{Thread_cache_size} Threads als vorher gibt. Alle neuen Threads werden
zuerst aus dem Cache genommen und nur, wenn der Cache leer ist, wird ein
neuer Thread erzeugt. Diese Variable kann hoch gesetzt werden, um die
Performance zu verbessern, wenn Sie sehr viele neue Verbindungen haben.
(Normalerweise f�hrt das nicht zu namhafter Performance-Steigerung, wenn
Sie eine gute Thread-Implementierung haben.) Wie effizient der aktuelle
Thread-Cache f�r Sie ist, k�nnen Sie feststellen, indem Sie den Unterschied
zwischen @code{Connections} und @code{Threads_created} betrachten.

@item @code{thread_concurrency}
On Solaris, @code{mysqld} will call @code{thr_setconcurrency()} mit
this value.  @code{thr_setconcurrency()} permits the Applikation to give
the Threads System a hint f�r the desired Anzahl von Threads that should
be run at the same time.

@item @code{thread_stack}
Die Stack-Gr��e jedes Threads. Viele der Beschr�nkungen, die durch den
@code{crash-me}-Test festgestellt werden, h�ngen von diesem Wert ab. Der
Vorgabewert ist Gro� genug f�r normale Operationen.
@xref{MySQL Benchmarks}.

@item @code{timezone}
Die Zeitzone f�r den Server.

@item @code{tmp_table_size}
Wenn eine tempor�re Tabelle im Arbeitsspeicher diese Gr��e �berschreitet,
wandelt MySQL sie automatisch in eine @code{MyISAM}-Tabelle auf der Platte
um. Setzen Sie den Wert von @code{tmp_table_size} herauf, wenn Sie viele
fortgeschrittene @code{GROUP BY}-Anfragen und viel Arbeitsspeicher haben.

@item @code{tmpdir}
Das Verzeichnis, das f�r tempor�re Dateien und tempor�re Tabellen benutzt
wird.

@item @code{version}
Die Versionsnummer des Servers.

@item @code{wait_timeout}
Die Anzahl von Sekunden, die der Server auf Aktivit�t auf einer Verbindung
wartet, bevor er sie schlie�t. Siehe auch @code{interactive_timeout}.
@end table

Der Handbuchabschnitt, der das Tunen von MySQL beschreibt, enth�lt einige
Informationen dar�ber, wie die oben aufgef�hrten Variablen getunt werden.
@xref{Server parameters}.


@node SHOW LOGS, SHOW PROCESSLIST, SHOW VARIABLES, SHOW
@c German node SHOW LOGS
@subsubsection @code{SHOW LOGS}

@code{SHOW LOGS} zeigt Ihnen Statusinformationen �ber bestehende
Log-Dateien. Momentan werden nur Informationen �ber Berkeley-DB-Log-Dateien
angezeigt.

@itemize @bullet
@item @code{File} zeigt den vollen Pfad zur Log-Datei.
@item @code{Type} zeigt den Typ der Log-Datei (@code{BDB} f�r
Berkeley-DB-Log-Dateien).
@item @code{Status} zeigt den Status der Log-Datei (@code{FREE}, wenn die
Datei entfernt werden kann, oder @code{IN USE}, wenn die Datei vom
Transaktions-Subsystem ben�tigt wird)
@end itemize


@node SHOW PROCESSLIST, SHOW GRANTS, SHOW LOGS, SHOW
@c German node SHOW PROCESSLIST
@subsubsection @code{SHOW PROCESSLIST}

@findex Threads
@findex PROCESSLIST

@cindex Threads, anzeigen
@cindex Prozesse, anzeigen

@code{SHOW PROCESSLIST} zeigt, welche Threads laufen. Diese Information
erhalten Sie auch mit dem @code{mysqladmin processlist}-Befehl. Wenn Sie
die @strong{process}-Berechtigung haben, k�nnen Sie alle Threads sehen.
Ansonsten sehen Sie nur Ihre eigenen Threads. @xref{KILL, , @code{KILL}}.
Wenn Sie die @code{FULL}-Option nicht benutzen, werden nur die ersten 100
Zeichen jeder Anfrage gezeigt.

Dieser Befehl ist sehr n�tzlich, wenn Sie die 'too many
connections'-Fehlermeldung erhalten und herausfinden wollen, was vor sich
geht. MySQL reserviert eine zus�tzliche Verbindung f�r einen Client mit der
@code{Process_priv}-Berechtigung, um sicherzustellen, dass Sie sich
jederzeit einloggen und das System pr�fen k�nnen (unter der Annahme, dass
Sie diese Berechtigung nicht allen Ihren Benutzern geben).


@node SHOW GRANTS, SHOW CREATE TABLE, SHOW PROCESSLIST, SHOW
@c German node SHOW GRANTS
@subsubsection @code{SHOW GRANTS}

@cindex Berechtigungen, anzeigen

@code{SHOW GRANTS FOR benutzer} listet die @code{Grant}-Befehle auf, die
abgesetzt werden m�ssen, um die Berechtigungen f�r einen Benutzer zu
duplizieren. Beispiel:

@example
mysql> SHOW GRANTS FOR root@@localhost;
+----------------------------------------------------------------------+
| Grants for root@@localhost                                           |
+----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------+
@end example


@node SHOW CREATE TABLE,  , SHOW GRANTS, SHOW
@c German node SHOW CREATE TABLE
@subsubsection @code{SHOW CREATE TABLE}

Zeigt ein @code{CREATE TABLE}-Statement an, das die angegebene Tabelle
erzeugt:

@example
mysql> show create table tabelle\G
*************************** 1. row ***************************
       Table: tabelle
Create Table: CREATE TABLE tabelle (
  id int(11) default NULL auto_increment,
  s char(60) default NULL,
  PRIMARY KEY (id)
) TYPE=MyISAM

@end example

@code{SHOW CREATE TABLE} setzt Tabellen- und Spaltennamen gem�� der
@code{SQL_QUOTE_SHOW_CREATE}-Option in Anf�hrungszeichen.
@ref{SET OPTION, , @code{SET OPTION SQL_QUOTE_SHOW_CREATE}}.


@node Localisation, Server-Side Scripts, Database Administration, MySQL Database Administration
@c German node Lokalisierung
@section MySQL-Lokalisierung und internationaler Gebrauch



@menu
* Character sets::              
* Languages::                   
* Adding character set::        
* Character arrays::            
* String collating::            
* Multi-byte characters::       
* Problems with character sets::  
@end menu

@node Character sets, Languages, Localisation, Localisation
@c German node Zeichens�tze
@subsection Der f�r Daten und Sortieren benutzte Zeichensatz

@cindex Zeichens�tze
@cindex Daten, Zeichens�tze
@cindex sortieren, Zeichens�tze

Vorgabem��ig benutzt MySQL den ISO-8859-1-(Latin1)-Zeichensatz, wobei nach
schwedischer / finnischer Reihenfolge sortiert wird. Dieser Zeichensatz ist
f�r die USA und Westeuropa geeignet.

Alle standardm��igen MySQL-Bin�rdistributionen werden mit
@code{--with-extra-charsets=complex} kompiliert. Das f�gt allen
Standard-Programmen Code hinzu, damit diese @code{latin1} und alle
Multi-Byte-Zeichens�tze in der Bin�rdatei handhaben k�nnen. Andere
Zeichens�tze werden bei Bedarf aus einer Zeichensatz-Definitionsdatei
geladen.

Der Zeichensatz legt fest, welche Zeichen in Namen erlaubt sind und wie
Dinge durch die @code{ORDER BY}- und @code{GROUP BY}-Klauseln des
@code{SELECT}-Statements sortiert werden.

Sie k�nnen den Zeichensatz mit der @code{--default-character-set}-Option
�ndern, wenn Sie den Server starten. Die verf�gbaren Zeichens�tze h�ngen
von den @code{--with-charset=charset}- und @code{--with-extra-charset=
list-of-charset | complex | all}-Optionen f�r @code{configure} ab und den
Zeichensatz-Konfigurationsdateien, die in @file{SHAREDIR/charsets/Index}
aufgef�hrt sind. @xref{configure options}.

Wenn Sie den Zeichensatz �ndern, wenn Sie MySQL laufen lassen (was
eventuell auch die Sortierreihenfolge �ndert), m�ssen Sie @code{myisamchk
-r -q} �ber alle Tabellen laufen lassen. Ansonsten sind Ihre Indexe
eventuell nicht richtig sortiert.

Wenn sich ein Client mit dem MySQL-Server verbindet, schickt der Server den
vorgabem��igen Zeichensatz, der in Benutzung ist, an den Client. Der
Client schaltet f�r diese Verbindung auf den Gebrauch dieses Zeichensatzes
um.

Man sollte bei einer SQL-Anfrage @code{mysql_real_escape_string()}
benutzen, wenn man Zeichenketten escapet. @code{mysql_real_escape_string()}
ist identisch mit der alten @code{mysql_escape_string()}-Funktion, ausser
dass es die MySQL-Connection-Handle als ersten Parameter nimmt.

Wenn der Client mit anderen Pfaden kompiliert wird, als wo der Server
installiert ist, und der Benutzer, der MySQL konfigurierte, nicht alle
Zeichens�tze in die MySQL-Bin�rdatei eingeschlossen hat, muss man f�r den
Client festlegen, wo dieser die zus�tzlichen Zeichens�tze finden kann, die
er ben�tigt, falls der Server mit einem anderen Zeichensatz l�uft als der
Client.

Das kann man in einer MySQL-Optionsdatei festlegen:

@example
[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets
@end example

Wobei der Pfad auf das Verzeichnis zeigt, in dem sich die dynamischen
MySQL-Zeichens�tze befinden.

Man kann den Client zwingen, einen bestimmten Zeichensatz zu benutzen,
indem man angibt:

@example
[client]
default-character-set=character-set-name
@end example

Aber normalerweise wird das nie ben�tigt.


@menu
* German character set::        
@end menu

@node German character set,  , Character sets, Character sets
@c German node Deutscher Zeichensatz
@subsubsection Deutscher Zeichensatz

Um eine deutsche Sortierreihenfolge zu erhalten, startet man @code{mysqld}
mit @code{--default-character-set=latin_de}. Das ergibt die folgenden
Kennzeichen:

Beim Sortieren und Vergleichen von Zeichenketten wird das folgende Mapping
auf die Zeichenketten durchgef�hrt, bevor der Vergleich ausgef�hrt wird:

@example
�  ->  ae
�  ->  oe
�  ->  ue
�  ->  ss
@end example

Alle Akzentzeichen werden in ihr Nicht-Akzent-Pendant in Gro�schreibung
umgewandelt. Alle Buchstaben werden in Gro�schreibung umgewandelt.

Beim Zeichenkettenvergleich mit @code{LIKE} wird das Mapping von einem auf
zwei Buchstaben nicht durchgef�hrt. Alle Buchstaben werden in
Gro�schreibung umgewandelt. Akzente werden aus allen Buchstaben entfernt,
mit folgenden Ausnahmen: @code{�}, @code{�}, @code{�}, @code{�}, @code{�}
und @code{�}.


@node Languages, Adding character set, Character sets, Localisation
@c German node Sprachen
@subsection Nicht englische Fehlermeldungen

@cindex Fehlermeldungen, Sprachen
@cindex Meldungen, Sprachen
@cindex Dateien, Fehlermeldungen
@cindex Sprachunterst�tzung

@code{mysqld} kann Fehlermeldungen in folgenden Sprachen ausgeben:
tschechisch, d�nisch, niederl�ndisch, englisch (die Vorgabe), estnisch,
franz�sisch, deutsch, griechisch, ungarisch, italienisch, japanisch,
koreanisch, norwegisch, norwegisch-ny, polnisch, portugiesisch, rum�nisch,
russisch, slowakisch, spanisch und schwedisch.

Um @code{mysqld} mit einer bestimmten Sprache zu starten, benutzen Sie die
@code{--language=sprache} oder @code{-L sprache}-Optionen. Beispiel:

@example
shell> mysqld --language=german
@end example

oder:

@example
shell> mysqld --language=/usr/local/share/german
@end example

Beachten Sie, dass alle Sprachnamen in Kleinschreibung angegeben werden.

Die Sprachdateien liegen (vorgabem��ig) in
@file{@var{mysql_base_dir}/share/@var{language}/}.

Um die Fehlermeldungsdatei zu aktualisieren, editieren Sie die
@file{errmsg.txt}-Datei und f�hren folgenden Befehl aus, um die
@file{errmsg.sys}-Datei zu erzeugen:

@example
shell> comp_err errmsg.txt errmsg.sys
@end example

Wenn Sie auf eine neuere Version von MySQL aktualisieren, denken Sie daran,
Ihre �nderungen mit der neuen @file{errmsg.txt}-Datei zu wiederholen!


@node Adding character set, Character arrays, Languages, Localisation
@c German node Zeichensatz hinzuf�gen
@subsection Einen neuen Zeichensatz hinzuf�gen

@cindex Zeichens�tze, hinzuf�gen
@cindex hinzuf�gen, Zeichens�tze

Um MySQL einen weiteren Zeichensatz hinzuzuf�gen, f�hren Sie folgende
Prozedur durch:

Entscheiden Sie, ob der Zeichensatz einfach oder komplex ist. Wenn der
Zeichensatz keine besonderen Zeichenkettenvergleichsroutinen zum Sortieren
und keine Multi-Byte-Unterst�tzung ben�tigt, ist er einfach. Wenn er eines
oder beide Features ben�tigt, ist er komplex.

@code{latin1} und @code{d�nisch} zum Beispiel sind einfache Zeichens�tze,
wohingegen @code{big5} oder @code{tschechisch} komplexe Zeichens�tze sind.

Im folgenden Abschnitt wird angenommen, dass Sie Ihren Zeichensatz
@code{MEINSET} nennen.

Bei einem einfachen Zeichensatz machen Sie folgendes:

@enumerate
@item
F�gen Sie MEINSET am Ende der @file{sql/share/charsets/Index}-Datei hinzu.
Geben Sie ihm eine eindeutige Nummer.

@item
Erzeugen Sie die Datei @file{sql/share/charsets/MEINSET.conf}.
(Sie k�nnen hierf�r als Grundlage @file{sql/share/charsets/latin1.conf}
benutzen).

Die Syntax f�r die Datei ist sehr einfach:

@itemize @bullet
@item
Kommentare fangen mit einem '#'-Zeichen an und gehen bis zum Ende der
Zeile.
@item
W�rter werden durch beliebige Mengen von Leerraum getrennt.
@item
Bei der Definition des Zeichensatzes muss jedes Wort eine Zahl im
hexadezimalen Format sein.
@item
Das @code{ctype}-Array nimmt bis zu 257 W�rter auf. Die @code{to_lower}-,
@code{to_upper}- und @code{sort_order}-Arrays nehmen danach jeweils bis zu
256 W�rter auf.
@end itemize

@xref{Character arrays}.

@item
F�gen Sie den Zeichensatznamen den @code{CHARSETS_AVAILABLE}- und
@code{COMPILED_CHARSETS}-Listen in @code{configure.in} hinzu.

@item
Rekonfigurieren, rekompilieren und testen Sie.

@end enumerate

Bei einem komplexen Zeichensatz machen Sie folgendes:

@enumerate
@item
Erzeugen Sie die Datei @file{strings/ctype-MEINSET.c} in der
MySQL-Quelldistribution.

@item
F�gen Sie MEINSET am Ende der @file{sql/share/charsets/Index}-Datei hinzu.
Weisen Sie ihm eine eindeutige Nummer zu.

@item
Sehen Sie sich eine der bestehenden @file{ctype-*.c}-Dateien an, um zu
sehen, was definiert werden muss, zum  Beispiel
@file{strings/ctype-big5.c}. Beachten Sie, dass die Arrays in Ihrer Datei
Namen wie @code{ctype_MEINSET}, @code{to_lower_MEINSET} usw. haben m�ssen.
Das entspricht den Arrays im einfachen Zeichensatz.
@xref{Character arrays}. Bei einem komplexen Zeichensatz

@item
f�gen Sie am Anfang der Datei einen speziellen Kommentar wie folgt ein:

@example
/*
 * Dieser Kommentar wird von configure geparst, um ctype.c zu erzeugen,
 * also �ndern Sie ihn nicht, wenn Sie nicht genau wissen, was Sie tun.
 *
 * .configure. number_MEINSET=MYNUMBER
 * .configure. strxfrm_multiply_MEINSET=N
 * .configure. mbmaxlen_MEINSET=N
 */
@end example

Das @code{configure}-Programm benutzt diesen Kommentar, um den Zeichensatz
automatisch in die MySQL-Bibliothek einzuf�gen.

Die Zeilen mit strxfrm_multiply und mbmaxlen werden in den folgenden
Abschnitten erl�utert. Geben Sie diese nur dann ein, wenn Sie die
Zeichenketten-Vergleichsfunktionen oder die
Multi-Byte-Zeichensatzfunktionen ben�tigen.

@item
Danach sollten Sie einige der folgenden Funktionen erzeugen:

@itemize @bullet
@item @code{my_strncoll_MEINSET()}
@item @code{my_strcoll_MEINSET()}
@item @code{my_strxfrm_MEINSET()}
@item @code{my_like_range_MEINSET()}
@end itemize

@xref{String collating}.

@item
F�gen Sie den Zeichensatznamen den @code{CHARSETS_AVAILABLE}- und
@code{COMPILED_CHARSETS}-Listen in @code{configure.in} hinzu.

@item
Rekonfigurieren, rekompilieren und testen Sie.
@end enumerate

Die Datei @file{sql/share/charsets/README} enth�lt einige weitere
Anweisungen.

Wenn Sie wollen, dass der Zeichensatz in die MySQL-Distribution aufgenommen
wird, senden Sie einen Patch an @email{internals@@lists.mysql.com}.


@node Character arrays, String collating, Adding character set, Localisation
@c German node Zeichen-Arrays
@subsection Die Zeichen-Definitions-Arrays

@code{to_lower[]} und @code{to_upper[]} sind einfache Arrays, die die
Buchstaben in Klein- und Gro�schreibung enthalten, die jedem Mitglied des
Zeichensatzes entsprechen. Beispiel:

@example
to_lower['A'] enth�lt 'a'
to_upper['a'] enth�lt 'A'
@end example

@code{sort_order[]} ist eine Map, die anzeigt, wie Buchstaben f�r
Vergleichs- und Sortierzwecke geordnet werden sollten. Bei vielen
Zeichens�tzen ist das dasselbe wie @code{to_upper[]} (was bedeutet, dass
das Sortieren ohne Ber�cksichtigung der Gro�-/Kleinschreibung erfolgt).
MySQL sortiert Buchstaben auf der Grundlage des Wertes von
@code{sort_order[character]}. Wegen komplizierterer Sortierregeln sehen Sie
die Er�rterung zu Zeichenketten-Vergleichen unten an
@xref{String collating}.

@code{ctype[]} ist ein Array von Bit-Werten, mit einem Element pro Zeichen.
(Beachten Sie, dass @code{to_lower[]}, @code{to_upper[]} und
@code{sort_order[]} durch den Buchstabenwert indiziert werden, aber
@code{ctype[]} durch den Buchstabenwert + 1. Das ist aus Gr�nden der
Abw�rtskompatibilit�t notwendig, um EOF (Dateiende) handhaben zu k�nnen.)

Sie finden folgenden Bitmasken-Definitionen in @file{m_ctype.h}:

@example
#define _U      01      /* Gro�schreibung */
#define _L      02      /* Kleinschreibung */
#define _N      04      /* Numerisch (Ziffer) */
#define _S      010     /* Leerzeichen */
#define _P      020     /* Punkt */
#define _C      040     /* Steuerungszeichen (Control) */
#define _B      0100    /* leer */
#define _X      0200    /* heXadezimale Ziffer */
@end example

Der @code{ctype[]}-Eintrag f�r jeden Buchstaben sollte die
Vereinigungsmenge der betreffenden Bitmasken-Werte sein, die den Buchstaben
beschreiben. @code{'A'} beispielsweise ist Buchstabe in Gro�schreibung
(@code{_U}) und gleichzeitig eine hexadezimale Ziffer (@code{_X}), daher
sollte @code{ctype['A'+1]} folgenden Wert erhalten:

@example
_U + _X = 01 + 0200 = 0201
@end example


@node String collating, Multi-byte characters, Character arrays, Localisation
@c German node Zeichenketten-Vergleich
@subsection Unterst�tzung f�r Zeichenketten-Vergleich

@cindex Vergleich, Zeichenketten
@cindex Zeichenkettenvergleich

Wenn die Sortierregeln Ihrer Sprache zu komplex sind, um durch die einfache
@code{sort_order[]}-Tabelle gehandhabt zu werden, m�ssen Sie die
Zeichenketten-Vergleichsfunktionen benutzen.

Zum jetzigen Zeitpunkt ist die beste Dokumentation hier�ber die
Zeichens�tze, die bereits implementiert sind. Sehen Sie sich als Beispiele
die Zeichens�tze big5, tschechisch, gbk, sjis und tis160 an.

Sie m�ssen den @code{strxfrm_multiply_MEINSET=N}-Wert mit einem speziellen
Kommentar am Anfang der Datei festlegen. @code{N} sollte auf das h�chste
Verh�ltnis gesetzt werden, auf das die Zeichenketten w�hrend
@code{my_strxfrm_MEINSET} anwachsen k�nnen (es muss eine positive Ganzzahl
sein).


@node Multi-byte characters, Problems with character sets, String collating, Localisation
@c German node Multi-Byte-Zeichen
@subsection Unterst�tzung f�r Multi-Byte-Zeichen

@cindex Buchstaben, Multi-Byte
@cindex Multi-Byte-Zeichen

Wenn Sie Unterst�tzung f�r einen neuen Zeichensatz hinzuf�gen wollen, der 
Multi-Byte-Buchstaben enth�lt, m�ssen Sie die Multi-Byte-Zeichenfunktionen
benutzen.

Zum jetzigen Zeitpunkt ist die beste Dokumentation hier�ber die
Zeichens�tze, die bereits implementiert sind. Sehen Sie sich als Beispiele
die Zeichens�tze euc_kr, gb2312, gbk, sjis und ujis an. Diese sind in den
@code{ctype-'charset'.c}-Dateien im @file{strings}-Verzeichnis
implementiert.

Sie m�ssen den @code{mbmaxlen_MEINSET=N}-Wert in einem speziellen Kommentar
am Anfang der Quelldatei angeben. @code{N} sollte auf die Gr��e in Bytes
des gr��ten Buchstabens im Zeichensatz gesetzt werden.

@node Problems with character sets,  , Multi-byte characters, Localisation
@c German node Probleme mit Zeichens�tzen
@subsection Probleme mit Zeichens�tzen

Wenn Sie versuchen, einen Zeichensatz zu benutzen, der nicht in Ihre
Bin�rdatei kompiliert ist, k�nnen Sie verschiedene Probleme bekommen:

@itemize @bullet
@item
Ihr Programm hat einen falschen Pfad zum Speicherort der Zeichens�tze.
(Vorgabe ist @file{/usr/local/mysql/share/mysql/charsets}). Das kann durch
die Benutzung der @code{--character-sets-dir}-Option f�r das fragliche
Programm behoben werden.
@item
Der Zeichensatz ist ein Multi-Byte-Zeichensatz, der nicht dynamisch geladen
werden kann. Wenn das der Fall ist, m�ssen Sie das Programm mit
Unterst�tzung f�r diesen Zeichensatz neu kompilieren.
@item
Der Zeichensatz ist ein dynamischer Zeichensatz, aber Sie haben keine
configure-Datei daf�r. In diesem Fall m�ssen Sie die configure-Datei f�r
den Zeichensatz aus einer neuen MySQL-Distribution installieren.
@item
Ihre @file{Index}-Datei enth�lt nicht den Namen f�r den Zeichensatz.

@example
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found
(Errcode: 2)
@end example

In diesem Fall m�ssen Sie sich entweder eine neue @code{Index}-Datei holen
oder den Namen jedes fehlenden Zeichensatzes von Hand eintragen.
@end itemize

Bei MyISAM-Tabellen k�nnen Sie den Zeichensatznamen und die Anzahl f�r eine
Tabelle mit @code{myisamchk -dvv tabelle} pr�fen.


@node Server-Side Scripts, Client-Side Scripts, Localisation, MySQL Database Administration
@c German node Serverseitige Skripte
@section Serverseitige Skripte und Dienstprogramme f�r MySQL



@menu
* Server-Side Overview::        
* safe_mysqld::                 
* mysqld_multi::                
* myisampack::                  
* mysqld-max::                  
@end menu

@node Server-Side Overview, safe_mysqld, Server-Side Scripts, Server-Side Scripts
@c German node �berblick �ber serverseitige Programme
@subsection �berblick �ber serverseitige Programme und Dienstprogramme

@cindex Umgebungsvariablen
@cindex Programme, Auflistung

Alle MySQL-Clients, die mittels der @code{mysqlclient}-Bibliothek mit dem
Server kommunizieren, benutzen folgenden Umgebungsvariablen:

@tindex @code{MYSQL_UNIX_PORT}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_UNIX_PORT}
@tindex @code{MYSQL_TCP_PORT}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_TCP_PORT}
@tindex @code{MYSQL_PWD}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_PWD}
@tindex @code{MYSQL_DEBUG}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_DEBUG}
@multitable @columnfractions .25 .75
@item @strong{Name} @tab @strong{Beschreibung}
@item @code{MYSQL_UNIX_PORT} @tab Der vorgabem��ige Socket; benutzt f�r Verbindungen zu @code{localhost}
@item @code{MYSQL_TCP_PORT}  @tab Der vorgabem��ige TCP/IP-Port
@item @code{MYSQL_PWD} @tab Das vorgabem��ige Passwort
@item @code{MYSQL_DEBUG} @tab Debug-Trace-Optionen beim Debuggen
@item @code{TMPDIR} @tab Das Verzeichnis, in dem tempor�re Tabellen / Dateien erzeugt werden
@end multitable

Die Benutzung von @code{MYSQL_PWD} ist unsicher.
@xref{Connecting}.

@tindex @code{MYSQL_HISTFILE}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_HISTFILE}
@tindex @code{HOME}-Umgebungsvariable
@tindex Umgebungsvariable, @code{HOME}
@cindex History-Datei
@cindex Kommandozeilen-History
@tindex .mysql-History-Datei
Der @file{mysql}-Client benutzt die Datei, die in der
@code{MYSQL_HISTFILE}-Umgebungsvariablen angegeben ist, um die
Kommandozeilen-History zu speichern. Der Vorgabewert f�r die History-Datei
ist @file{$HOME/.mysql_history}, wobei @code{$HOME} der Wert der
@code{HOME}-Umgebungsvariablen ist. @xref{Environment variables}.

Alle MySQL-Programme nehmen viele unterschiedliche Optionen auf. Jedes
MySQL-Programm bietet jedoch eine @code{--help}-Option, die Sie benutzen
k�nnen, um eine vollst�ndige Beschreibung der unterschiedlichen
Programmoptionen zu erhalten. Probieren Sie zum Beispiel @code{mysql
--help} aus.

Sie k�nnen Vorgabeoptionen f�r alle Standard-Client-Programme mit einer
Optionsdatei �berschreiben. @ref{Option files}.

Die unten stehende Liste beschreibt kurz die MySQL-Programme:

@table @code

@cindex @code{myisamchk}
@item myisamchk
Dienstprogramm zur Beschreibung, Pr�fung, Optimierung und Reparatur von
MySQL-Tabellen. Weil @code{myisamchk} viele Funktionen hat, ist es in einem
eigenen Kapitel beschrieben. @xref{MySQL Database Administration}.

@cindex @code{make_binary_distribution}
@item make_binary_distribution
Macht ein Bin�r-Release eines kompilierten MySQL. Dieses k�nnte �ber FTP an
@file{/pub/mysql/Incoming} oder an @code{Support.mysql.com} geschickt
werden, damit andere MySQL-Benutzer es benutzen k�nnen.

@cindex @code{msql2mysql}
@item msql2mysql
Ein Shell-Skript, das @code{mSQL}-Programme zu MySQL konvertiert. Es deckt
nicht alle F�lle ab, ist aber hilfreich, um mit dem Konvertieren
anzufangen.

@cindex @code{mysqlaccess}
@item mysqlaccess
Ein Skript, das die Zugriffsberechtigungen f�r eine Host-, Benutzer- und
Datenbank-Kombination pr�ft.

@cindex @code{mysqladmin}
@item mysqladmin
Dienstprogramm f�r die Durchf�hrung von Verwaltungsoperationen wie Erzeugen
und L�schen von Datenbanken, Neuladen der Berechtigungstabellen,
Zur�ckschreiben von Tabellen auf Platte und Neu�ffnen von Log-Dateien.
@code{mysqladmin} kann auch benutzt werden, um Versionsnummer sowie Status-
und Prozess-Informationen vom Server zu erhalten.
@xref{mysqladmin, , @code{mysqladmin}}.

@cindex @code{mysqlbug}
@item mysqlbug
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden,
wenn Sie einen Bug-Bericht an die MySQL-Liste ausf�llen.

@cindex @code{mysqld}
@item mysqld
Der SQL-Daemon. Dieser sollte immer laufen.

@cindex @code{mysqldump}
@item mysqldump
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als
Tabulator-separierte Textdateien. Verbesserte Freeware, urspr�nglich von
Igor Romanenko. @xref{mysqldump, , @code{mysqldump}}.

@cindex @code{mysqlimport}
@item mysqlimport
Importiert Textdateien in die jeweiligen Tabellen mittels @code{LOAD DATA
INFILE}. @xref{mysqlimport, , @code{mysqlimport}}.

@cindex @code{mysqlshow}
@item mysqlshow
Zeigt Informationen �ber Datenbanken, Tabellen, Spalten und Indexe an.

@cindex @code{mysql_install_db}
@item mysql_install_db
Erzeugt die MySQL-Berechtigungstabellen mit vorgabem��igen Berechtigungen.
Dieses Skript wird gew�hnlich nur einmal ausgef�hrt, wenn Sie MySQL das
erste Mal auf einem System installieren.

@cindex @code{replace}
@item replace
Ein Dienstprogramm, das von @code{msql2mysql} benutzt wird, aber auch
dar�ber hinaus benutzt werden kann. @code{replace} �ndert Zeichenketten in
Dateien oder auf der Standardeingabe. Benutzt eine finite Status-Maschine,
um zuerst �bereinstimmung mit l�ngeren Zeichenketten zu finden. Kann
benutzt werden, um Zeichenketten umzudrehen. Der folgende Befehl zum
Beispiel dreht @code{a} und @code{b} in den angegebenen Dateien um:

@example
shell> replace a b b a --Datei1 Datei2 ...
@end example
@end table


@node safe_mysqld, mysqld_multi, Server-Side Overview, Server-Side Scripts
@c German node safe_mysqld
@subsection safe_mysqld, der Wrapper um mysqld

@cindex Werkzeuge, safe_mysqld
@cindex Skripts
@cindex @code{safe_mysqld}

@code{safe_mysqld} ist die empfohlene Art, einen @code{mysqld}-Daemon unter
Unix zu starten. @code{safe_mysqld} f�gt einige Sicherheits-Features hinzu
wie das Neustarten des Servers, wenn ein Fehler auftritt, und das
Mitschreiben von Laufzeitinformationen in eine Log-Datei.

Wenn Sie nicht @code{--mysqld=#} oder @code{--mysqld-version=#} benutzen,
benutzt @code{safe_mysqld} eine ausf�hrbare Datei namens @code{mysqld-max},
wenn es diese gibt. Wenn nicht, startet @code{safe_mysqld} @code{mysqld}.
Das macht es sehr einfach, @code{mysqld-max} anstelle von @code{mysqld}
versuchsweise zu benutzen. Kopieren Sie einfach @code{mysqld-max} dorthin,
wo @code{mysqld} liegt, und es wird benutzt werden.

Normalerweise sollte man das @code{safe_mysqld}-Skript nie editieren,
sondern statt dessen die Optionen f�r @code{safe_mysqld} in den
@code{[safe_mysqld]}-Abschnitt der @code{my.cnf}-Datei einf�gen.
@code{safe_mysqld} liest alle Optionen des @code{[mysqld]}-,
@code{[server]}- und @code{[safe_mysqld]}-Abschnitts aus den
Optionsdateien. @xref{Option files}.

Beachten Sie, dass alle Optionen auf der Kommandozeile f�r
@code{safe_mysqld} an @code{mysqld} durchgereicht werden. Wenn Sie in
@code{safe_mysqld} irgend welche Optionen benutzen wollen, die
@code{mysqld} nicht unterst�tzt, m�ssen Sie diese in der Optionsdatei
angeben.

Die meisten Optionen f�r @code{safe_mysqld} sind dieselben wie die Optionen
f�r @code{mysqld}. @xref{Command-line options}.

@code{safe_mysqld} unterst�tzt folgende Optionen:

@table @code
@item --basedir=pfad
@item --core-file-size=#
Gr��e der Core-Datei, die @code{mysqld} in der Lage sein sollte zu
erzeugen. Wird an @code{ulimit -c} durchgereicht.
@item --datadir=pfad
@item --defaults-extra-file=pfad
@item --defaults-file=pfad
@item --err-log=pfad
@item --ledir=pfad
Pfad zu @code{mysqld}
@item --log=pfad
@item --mysqld=mysqld-version
Name der @code{mysqld}-Version im @code{ledir}-Verzeichnis, die Sie starten
wollen.
@item --mysqld-version=version
�hnlich wie @code{--mysqld=}, aber hier f�r nur das Suffix f�r
@code{mysqld} angegeben. Wenn Sie zum Beispiel @code{--mysqld-version=max}
benutzen,  startet @code{safe_mysqld} die @code{ledir/mysqld-max}-Version.
Wenn das Argument f�r @code{--mysqld-version} leer ist, wird
@code{ledir/mysqld} benutzt.
@item --no-defaults
@item --open-files-limit=#
Anzahl der Dateien, die @code{mysqld} in der Lage sein sollte zu �ffnen.
Wird an @code{ulimit -n} durchgereicht. Beachten Sie, dass Sie
@code{safe_mysqld} als Root starten m�ssen, damit dies korrekt
funktioniert!
@item --pid-file=pfad
@item --port=#
@item --socket=pfad
@item --timezone=#
Setzt die Zeitzone (die @code{TZ})-Variable auf den Wert dieses Parameters.
@item --user=#
@end table

Das @code{safe_mysqld}-Skript ist so geschrieben, dass es normalerweise
einen Server starten kann, der aus einer Quell- oder einer Bin�rversion von
MySQL installiert wurde, selbst wenn diese den Server an etwas anderen
Stellen installieren. @code{safe_mysqld} erwartet, dass eine der folgenden
Bedingungen zutrifft:

@itemize @bullet
@item
Server und Datenbanken liegen relativ zum Verzeichnis, aus dem
@code{safe_mysqld} aufgerufen wird. @code{safe_mysqld} sucht unterhalb
seines Arbeitsverzeichnisses nach @file{bin}- und
@file{data}-Verzeichnissen (bei Bin�rdistributionen) oder nach
@file{libexec}- und @file{var}-Verzeichnissen (bei Quelldistributionen).
Diese Bedingung sollte zutreffen, wenn Sie @code{safe_mysqld} aus Ihrem
MySQL-Installationsverzeichnis ausf�hren (zum Beispiel
@file{/usr/local/mysql} bei einer Bin�rdistribution).

@item
Wenn Server und Datenbanken nicht relativ zum Arbeitsverzeichnis liegen,
versucht @code{safe_mysqld}, sie anhand absoluter Pfadnamen zu finden.
Typische Speicherort sind @file{/usr/local/libexec} und
@file{/usr/local/var}. Die tats�chlichen Speicherorte werden festgelegt,
wenn die Distribution gebaut wird, woher @code{safe_mysqld} kommt. Sie
sollten korrekt sein, wenn MySQL an einem Standardort installiert wurde.
@end itemize

Weil @code{safe_mysqld} versucht, Server und Datenbanken relativ zum
eigenen Arbeitsverzeichnis zu finden, k�nnen Sie eine Bin�rdistribution von
MySQL irgendwo hin installieren, so lange Sie @code{safe_mysqld} aus dem
MySQL-Installationsverzeichnis starten:

@example
shell> cd mysql_installations_verzeichnis
shell> bin/safe_mysqld &
@end example

Wenn @code{safe_mysqld} fehlschl�gt, selbst wenn es aus dem
MySQL-Installationsverzeichnis aufgerufen wurde, k�nnen Sie es so �ndern,
dass es den Pfad zu @code{mysqld} und die Pfadnamen-Optionen benutzt, die
auf Ihrem System korrekt sind. Beachten Sie, dass bei zuk�nftigen
Aktualisierungen von MySQL Ihre ver�nderte Version von @code{safe_mysqld}
�berschrieben wird. Daher sollten Sie eine Kopie Ihrer editierten Version
machen, damit Sie diese neu installieren k�nnen.


@node mysqld_multi, myisampack, safe_mysqld, Server-Side Scripts
@c German node mysqld_multi
@subsection mysqld_multi, Programm zur Verwaltung mehrerer MySQL-Server

@cindex Werkzeuge, mysqld_multi
@cindex Skripts
@cindex multi mysqld
@cindex @code{mysqld_multi}

@code{mysqld_multi} ist f�r die Verwaltung mehrerer @code{mysqld}-Prozesse
gedacht, die auf unterschiedlichen UNIX-Sockets und TCP/IP-Ports laufen.

Das Programm sucht nach Gruppe(n), die [mysqld#] benannt sind, in my.cnf
(oder der angegebenen --config-file=...), wobei # jede positive Zahl ab 1
sein kann. Diese Gruppen sollten dieselben sein wie die �bliche
@code{[mysqld]}-Gruppe (zum Beispiel Optionen f�r mysqld, siehe
ausf�hrliche Informationen im Handbuch �ber diese Gruppe), aber mit
denjenigen Port-, Socket- usw. Optionen, die f�r jeden separaten
@code{mysqld}-Prozess gew�nscht sind. Die Zahl im Gruppennamen hat eine
andere Funktion: Sie kann benutzt werden, um bestimmte @code{mysqld}-Server
zu starten, anzuhalten, oder Berichte �ber sie mit diesem Programm
auszugeben. Unten stehen weitere Informationen zur Benutzung und zu den
Optionen.

@example
Benutzung: mysqld_multi [OPTIONS] @{start|stop|report@} [GNR,GNR,GNR...]
oder       mysqld_multi [OPTIONS] @{start|stop|report@} [GNR-GNR,GNR,GNR-GNR,...]
@end example

Die GNR oben bedeutet die Gruppennummer. Sie k�nnen jede GNR starten,
anhalten oder Berichtsinformationen �ber sie ausgeben, oder �ber mehrere
von ihnen zugleich. (Siehe --example) Die GNRs in der Liste k�nnen mit
Komma getrennt oder mit Bindestrich kombiniert werden, wobei letzteres
hei�t, dass alle GNRs zwischen GNR1-GNR2 betroffen sind. Ohne GNR-Argument
werden alle gefundenen Gruppen entweder gestartet, angehalten, oder es
werden Berichtsinformationen �ber sie ausgegeben. Beachten Sie, dass Sie in
der GNR-Liste keinen Leerraum haben d�rfen. Alles nach Leerraum wird
ignoriert.

@code{mysqld_multi} unterst�tzt folgende Optionen:

@table @code
@cindex config-file option
@item --config-file=...
Alternative config-Datei. HINWEIS: Das betrifft nicht die eigenen Optionen
des Programms (Gruppe @code{[mysqld_multi]}), sondern nur die Gruppen
[mysqld#]. Ohne diese Option wird alles aus der normalen my.cnfDatei heraus
gesucht.
@cindex Beispiel option
@item --example
Zeigt ein Beispiel einer config-Datei.
@cindex help option
@item --help
Hilfetext ausgeben und beenden.
@cindex log option
@item --log=...
Log-Datei. Name und voller Pfad zur Log-Datei. HINWEIS: Wenn es die Datei
gibt, wird alles angeh�ngt.
@cindex mysqladmin option
@item --mysqladmin=...
@code{mysqladmin}-Bin�rdatei, die zum Herunterfahren des Servers benutzt
wird.
@cindex mysqld option
@item --mysqld=...
@code{mysqld}-Bin�rdatei, die benutzt wird. Beachten Sie, dass Sie auch
@code{safe_mysqld} diese Option angeben k�nnen. Die Optionen werden an
@code{mysqld} durchgereicht. Stellen Sie jedoch sicher, dass Sie
@code{mysqld} in Ihrer Umgebungsvariablen @code{PATH} haben oder bearbeiten
Sie @code{safe_mysqld}.
@cindex no-log option
@item --no-log
An stdout ausgeben statt in die Log-Datei. Vorgabem��ig ist die Log-Datei
angeschaltet.
@cindex password option
@item --password=...
Passwort f�r Benutzer von @code{mysqladmin}.
@cindex tcp-ip option
@item --tcp-ip
Zu MySQL-Server(n) �ber den TCP/IP-Port statt �ber den UNIX-Socket
verbinden. Das betrifft das Anhalten und Berichten. Wenn eine Socket-Datei
fehlt, kann der Server trotzdem laufen, aber man kann nur �ber den
TCP/IP-Port auf ihn zugreifen. Vorgabem��ig wird die Verbindung �ber den
UNIX-Socket hergestellt.
@cindex user option
@item --user=...
MySQL-Benutzer von @code{mysqladmin}.
@cindex version option
@item --version
Versionsnummer ausgeben und beenden.
@end table

Einige Anmerkungen zu @code{mysqld_multi}:

@itemize @bullet
@item
Stellen Sie sicher, dass der MySQL-Benutzer, der die @code{mysqld}-Dienste
anh�lt (indem er zum Beispiel @code{mysqladmin} benutzt), dasselbe Passwort
und denselben Benutzernamen f�r alle Daten-Verzeichnisse benutzt, auf die
zugegriffen wird (zur 'mysql'-Datenbank). Stellen Sie ausserdem sicher,
dass der Benutzer die 'Shutdown_priv'-Berechtigung hat! Wenn Sie viele
Daten-Verzeichnisse und viele verschiedene 'mysql'-Datenbanken mit
unterschiedlichen Passw�rtern f�r den MySQL-'root'-Benutzer haben, sollten
Sie einen allgemeinen 'multi_admin'-Benutzer anlegen, der dasselbe Passwort
benutzt (siehe unten). Hier ein Beispiel daf�r:
@example
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e
"GRANT SHUTDOWN ON *.* TO multi_admin@@localhost IDENTIFIED BY 'multipass'"
@xref{Privileges}.
@end example
Das oben Angegebene m�ssen Sie f�r jeden laufenden @code{mysqld} im
Daten-Verzeichnis tun, das Sie haben (�ndern Sie einfach den Socket,
-S=...).
@item
@code{pid-file} ist sehr wichtig, wenn Sie @code{safe_mysqld} benutzen, um
@code{mysqld} zu starten (zum Beispiel --mysqld=safe_mysqld). Jeder
@code{mysqld} sollte seine eigene @code{pid-file} haben. Der Vorteil der
Benutzung von @code{safe_mysqld} anstelle von @code{mysqld} direkt ist
hierbei, dass @code{safe_mysqld} jeden @code{mysqld}-Prozess 'bewacht' und
neu startet, falls ein @code{mysqld}-Prozess wegen eines Signals kill -9
fehlschl�gt oder �hnliches (wenn beispielsweise Speicherzugriffsfehler
auftreten, was bei MySQL nat�rlich nie passiert ;-). Beachten Sie bitte,
dass es f�r das @code{safe_mysqld}-Skript eventuell erforderlich ist, es
von einer bestimmten Stelle aus zu starten. Das hei�t, dass Sie eventuell
in ein bestimmtes Verzeichnis wechseln m�ssen, bevor Sie
@code{mysqld_multi} starten. Wenn Sie beim Starten Probleme haben, sehen
Sie bitte im @code{safe_mysqld}-Skript nach. �berpr�fen Sie insbesondere
folgende Zeilen:
@example
--------------------------------------------------------------------------
MY_PWD=`pwd` Check if we are starting this relative (for the binary
release) if test -d /data/mysql -a -f ./share/mysql/englisch/errmsg.sys
-a -x ./bin/mysqld
--------------------------------------------------------------------------
@xref{safe_mysqld, , @code{safe_mysqld}}.
@end example
Der obige Test soll erfolgreich verlaufen, ansonsten k�nnen Sie Probleme
bekommen.
@item
Vermeiden Sie Gefahren, die auftauchen, wenn Sie mehrere @code{mysqlds} im
selben Daten-Verzeichnis starten. Benutzen Sie unterschiedlichen
Daten-Verzeichnisse, es sei denn, Sie wissen @strong{GENAU}, was Sie tun!
@item
Die Socket-Datei und der TCP/IP-Port m�ssen f�r jeden @code{mysqld}
verschieden sein.
@item
Die erste und die f�nfte @code{mysqld}-Gruppe wurden beim Beispiel
absichtlich ausgelassen. Sie haben eventuell 'L�cken' in der config-Datei.
Das gibt Ihnen mehr Flexibilit�t. Die Reihenfolge, in der die
@code{mysqlds} gestartet oder angehalten werden, h�ngt von der Reihenfolge
ab, in der sie in der config-Datei erscheinen.
@item
Wenn Sie auf eine bestimmte Gruppe verweisen wollen, wenn Sie GNR bei
diesem Programm benutzen, nehmen Sie einfach die Nummer am Ende des
Gruppennamens ( [mysqld# <== ).
@item
Eventuell sollten Sie die Option '--user' f�r @code{mysqld} benutzen, aber
um das zu tun, m�ssen Sie root sein, wenn Sie das
@code{mysqld_multi}-Skript starten. Wenn Sie die Option in der config-Datei
haben, macht das nichts; Sie erhalten nur eine Warnmeldung, wenn Sie nicht
der Superuser sind und die @code{mysqlds} unter @strong{IHREM} UNIX-Account
gestartet werden. @strong{WICHTIG}: Stellen Sie sicher, dass die
@code{pid-file} und das Daten-Verzeichnis f�r @strong{DENJENIGEN}
UNIX-Benutzer lesbar und schreibbar sind (und ausf�hrbar im letzteren
Fall), als der der spezifische @code{mysqld}-Prozess gestartet wird.
Benutzen Sie hier @strong{NICHT} den UNIX-root-Account, es sei denn, Sie
wissen @strong{GENAU}, was Sie tun!
@item
@strong{SEHR WICHTIG}: Stellen Sie sicher, dass Sie die Bedeutung der
Optionen verstehen, die an die @code{mysqlds} durchgereicht werden und
@strong{WARUM} Sie mehrere verschiedene @code{mysqld}-Prozesse haben
wollen. Mehrere @code{mysqlds} in einem Daten-Verzeichnis starten
@strong{ergibt keine zus�tzliche Performance} bei einem threaded System!
@end itemize

@xref{Multiple servers}.

Hier ist ein Beispiel einer config-Datei f�r @code{mysqld_multi}.

@example
# Diese Datei sollte wahrscheinlich in Ihrem Heimatverzeichnis liegen (~/.my.cnf) oder in /etc/my.cnf
# Version 2.1 von Jani Tolonen

[mysqld_multi]
mysqld     = /usr/local/bin/safe_mysqld
mysqladmin = /usr/local/bin/mysqladmin
user       = multi_admin
password   = multipass

[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/mysql/var2/hostname.pid2
datadir    = /usr/local/mysql/var2
language   = /usr/local/share/mysql/english
user       = john

[mysqld3]
socket     = /tmp/mysql.sock3
port       = 3308
pid-file   = /usr/local/mysql/var3/hostname.pid3
datadir    = /usr/local/mysql/var3
language   = /usr/local/share/mysql/swedish
user       = monty

[mysqld4]
socket     = /tmp/mysql.sock4
port       = 3309
pid-file   = /usr/local/mysql/var4/hostname.pid4
datadir    = /usr/local/mysql/var4
language   = /usr/local/share/mysql/estonian
user       = tonu

[mysqld6]
socket     = /tmp/mysql.sock6
port       = 3311
pid-file   = /usr/local/mysql/var6/hostname.pid6
datadir    = /usr/local/mysql/var6
language   = /usr/local/share/mysql/japanese
user       = jani
@end example

@xref{Option files}.


@node myisampack, mysqld-max, mysqld_multi, Server-Side Scripts
@c German node myisampack
@subsection myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen

@cindex komprimierte Tabellen
@cindex Tabellen, komprimierte
@cindex MyISAM, komprimierte Tabellen
@cindex @code{myisampack}
@cindex @code{pack_isam}

@code{myisampack} wird benutzt, um MyISAM-Tabellen zu komprimieren.
@code{pack_isam} wird benutzt, um ISAM-Tabellen zu komprimieren. Weil
ISAM-Tabellen veraltet sind, wird hier nur @code{myisampack} er�rtert, aber
alles, was auf @code{myisampack} zutrifft, gilt auch f�r @code{pack_isam}.

@code{myisampack} funktioniert, indem jede Spalte in der Tabelle separat
komprimiert wird. Die Informationen, die ben�tigt werden, um Spalten zu
dekomprimieren, werden in den Arbeitsspeicher gelesen, wenn die Tabelle
ge�ffnet wird. Das ergibt viel bessere Performance beim Zugriff auf
einzelne Datens�tze, denn man muss nur exakt einen Datensatz
dekomprimieren, nicht einen viel gr��eren Block, wie das zum Beispiel bei
der Benutzung von Stacker auf MS-DOS n�tig ist. �blicherweise komprimiert
@code{myisampack} die Daten-Datei auf 40%-70%.

MySQL benutzt Speicher-Mapping (@code{mmap()}) auf komprimierte Tabellen
und geht zu normalen Lesen / Schreiben von Dateien zur�ck, wenn
@code{mmap()} nicht funktioniert.

F�r @code{myisampack} gibt es momentan zwei Einschr�nkungen:
@itemize @bullet
@item
Nach dem Komprimieren ist die Tabelle nur-lesbar.
@item
@code{myisampack} kann auch @code{BLOB}- oder @code{TEXT}-Spalten
komprimieren. Das �ltere @code{pack_isam} konnte das nicht.
@end itemize

Die Behebung dieser Einschr�nkungen steht mit niedrigen Priorit�t auf
unserer TODO-Liste.

@code{myisampack} wird wie folgt aufgerufen:

@example
shell> myisampack [options] Dateiname ...
@end example

Jeder Dateiname sollte der Name einer Index-(@file{.MYI})-Datei sein. Wenn
Sie nicht im Datenbank-Verzeichnis sind, m�ssen Sie den Pfadnamen zur Datei
angeben. Die @file{.MYI} Erweiterung kann weggelassen werden.

@code{myisampack} unterst�tzt folgende Optionen:

@table @code
@item -b, --backup
Stellt eine Datensicherung der Tabelle als @code{tabelle.OLD} her.

@item -#, --debug=debug_options
Debug-Log ausgeben. Die @code{debug_options}-Zeichenkette ist h�ufig
@code{'d:t:o,filename'}.

@item -f, --force
Erzwingt die Komprimierung der Tabelle, selbst wenn sie dadurch gr��er
wird oder die tempor�re Datei existiert. @code{myisampack} erzeugt eine
tempor�re Datei namens @file{tabelle.TMD}, w�hrend es die Tabelle
komprimiert. Wenn Sie @code{myisampack} killen, kann es sein, dass die
@file{.TMD}-Datei nicht gel�scht wird. Normalerweise wird @code{myisampack}
mit einer Fehlermeldung beendet, wenn es eine existierende
@file{tabelle.TMD}-Datei findet. Mit @code{--force} packt @code{myisampack}
die Tabelle trotzdem.

@item -?, --help
Hilfetext ausgeben und beenden.

@item -j gro�e_tabelle, --join=gro�e_tabelle
Verbindet alle Tabellen, die auf der Kommandozeile angegeben wurden, in
eine einzige gro�e Tabelle @code{gro�e_tabelle}. Alle Tabellen, die
kombiniert werden sollen, M�SSEN identisch sein (dieselben Spaltennamen und
-typen, dieselben Indexe usw.).

@item -p #, --packlength=#
Legt die Speichergr��e der Datensatzl�nge in Bytes fest. Der Wert sollte
1, 2 oder 3 sein. (@code{myisampack} speichert alle Zeilen mit
L�ngenzeigern von 1, 2, oder 3 Bytes. In den meisten F�llen kann
@code{myisampack} den richtigen L�ngenwert festlegen, bevor es anf�ngt, die
Datei zu komprimieren. W�hrend des Komprimierungsprozesses stellt es aber
eventuell fest, dass es eine k�rzere L�nge h�tte nehmen k�nnen. In diesem
Fall gibt @code{myisampack} einen Hinweis aus, dass Sie beim n�chsten Mal,
wenn Sie dieselbe Datei packen, eine k�rzere Datensatzl�nge nehmen
sollten.)

@item -s, --silent
Schweigsamer Modus. Ausgaben erfolgen nur, wenn Fehler auftreten.

@item -t, --test
Tabelle nicht tats�chlich komprimieren, sondern nur testweise packen.

@item -T dir_name, --tmp_dir=dir_name
Das genannte Verzeichnis als Speicherort der tempor�ren Tabelle benutzen.

@item -v, --verbose
Geschw�tziger Modus. Informationen �ber den Fortschritt und das
Komprimierungsergebnis ausgeben.

@item -V, --version
Versionsinformationen ausgeben und beenden.

@item -w, --wait
Warten und noch einmal versuchen, wenn die Tabelle in Benutzung ist. Wenn
der @code{mysqld}-Server mit der @code{--skip-locking}-Option aufgerufen
wurde, ist es keine gute Idee, @code{myisampack} aufzurufen, wenn die
Tabelle w�hrend des Komprimierungsprozesses m�glicherweise aktualisiert
wird.
@end table

@cindex Beispiele, komprimierte Tabellen
Die unten stehende Befehlssequenz zeigt eine typische
Tabellen-Komprimierungssitzung:

@example
shell> ls -l station.*
-rw-rw-r--   1 monty    my         994128 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:   station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-02-02  3:06:43
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
Max datafile length:   54657023  Max keyfile length:   33554431
Recordlength:               834
Record format: Fixed length

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long              1024       1024          1
2   32    30  multip. text                      10240       1024          1

Field Start Length Type
1     1     1
2     2     4
3     6     4
4     10    1
5     11    20
6     31    1
7     32    30
8     62    35
9     97    35
10    132   35
11    167   4
12    171   16
13    187   35
14    222   4
15    226   16
16    242   20
17    262   20
18    282   20
19    302   30
20    332   4
21    336   4
22    340   1
23    341   8
24    349   8
25    357   8
26    365   2
27    367   2
28    369   4
29    373   4
30    377   1
31    378   2
32    380   8
33    388   4
34    392   4
35    396   4
36    400   4
37    404   1
38    405   4
39    409   4
40    413   4
41    417   4
42    421   4
43    425   4
44    429   20
45    449   30
46    479   1
47    480   1
48    481   79
49    560   79
50    639   79
51    718   79
52    797   8
53    805   1
54    806   1
55    807   20
56    827   4
57    831   4

shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics

normal:     20  empty-space:      16  empty-zero:        12  empty-fill:  11
pre-space:   0  end-space:        12  table-lookups:      5  zero:         7
Original trees:  57  After join: 17
- Compressing file
87.14%

shell> ls -l station.*
-rw-rw-r--   1 monty    my         127874 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:     station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-04-17 19:04:26
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
Max datafile length:   16777215  Max keyfile length:     131071
Recordlength:               834
Record format: Compressed

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long             10240       1024          1
2   32    30  multip. text                      54272       1024          1

Field Start Length Type                         Huff tree  Bits
1     1     1      constant                             1     0
2     2     4      zerofill(1)                          2     9
3     6     4      no zeros, zerofill(1)                2     9
4     10    1                                           3     9
5     11    20     table-lookup                         4     0
6     31    1                                           3     9
7     32    30     no endspace, not_always              5     9
8     62    35     no endspace, not_always, no empty    6     9
9     97    35     no empty                             7     9
10    132   35     no endspace, not_always, no empty    6     9
11    167   4      zerofill(1)                          2     9
12    171   16     no endspace, not_always, no empty    5     9
13    187   35     no endspace, not_always, no empty    6     9
14    222   4      zerofill(1)                          2     9
15    226   16     no endspace, not_always, no empty    5     9
16    242   20     no endspace, not_always              8     9
17    262   20     no endspace, no empty                8     9
18    282   20     no endspace, no empty                5     9
19    302   30     no endspace, no empty                6     9
20    332   4      always zero                          2     9
21    336   4      always zero                          2     9
22    340   1                                           3     9
23    341   8      table-lookup                         9     0
24    349   8      table-lookup                        10     0
25    357   8      always zero                          2     9
26    365   2                                           2     9
27    367   2      no zeros, zerofill(1)                2     9
28    369   4      no zeros, zerofill(1)                2     9
29    373   4      table-lookup                        11     0
30    377   1                                           3     9
31    378   2      no zeros, zerofill(1)                2     9
32    380   8      no zeros                             2     9
33    388   4      always zero                          2     9
34    392   4      table-lookup                        12     0
35    396   4      no zeros, zerofill(1)               13     9
36    400   4      no zeros, zerofill(1)                2     9
37    404   1                                           2     9
38    405   4      no zeros                             2     9
39    409   4      always zero                          2     9
40    413   4      no zeros                             2     9
41    417   4      always zero                          2     9
42    421   4      no zeros                             2     9
43    425   4      always zero                          2     9
44    429   20     no empty                             3     9
45    449   30     no empty                             3     9
46    479   1                                          14     4
47    480   1                                          14     4
48    481   79     no endspace, no empty               15     9
49    560   79     no empty                             2     9
50    639   79     no empty                             2     9
51    718   79     no endspace                         16     9
52    797   8      no empty                             2     9
53    805   1                                          17     1
54    806   1                                           3     9
55    807   20     no empty                             3     9
56    827   4      no zeros, zerofill(2)                2     9
57    831   4      no zeros, zerofill(1)                2     9
@end example

Die Informationen, die @code{myisampack} ausgibt, sind unten beschrieben:

@table @code
@item normal
Die Anzahl von Spalten, f�r die keine spezielle Komprimierung benutzt wird.

@item empty-space
Die Anzahl von Spalten, die Werte enthalten, die ausschlie�lich aus
Leerzeichen bestehen. Diese Werte nehmen 1 Bit in Anspruch.

@item empty-zero
Die Anzahl von Spalten, die Werte enthalten, die nur aus bin�ren Nullen
bestehen. Diese Werte nehmen 1 Bit in Anspruch.

@item empty-fill
Die Anzahl von Ganzzahl-Spalten, die nicht den gesamten Bereich Ihres Typs
einnehmen. Diese werden auf einen kleineren Typ ge�ndert (eine
@code{INTEGER}-Spalte kann zum Beispiel auf @code{MEDIUMINT} ge�ndert
werden).

@item pre-space
Die Anzahl von Dezimal-Spalten, die mit f�hrenden Leerzeichen gespeichert
sind. In diesem Fall enth�lt jeder Wert einen Z�hler f�r die Anzahl
f�hrender Leerzeichen.

@item end-space
Die Anzahl von Spalten, die viele Leerzeichen am Ende enthalten. In diesem
Fall enth�lt jeder Wert einen Z�hler f�r die Anzahl von Leerzeichen am
Ende.

@item table-lookup
Die Spalte hat nur eine kleine Anzahl verschiedener Werte, die in
@code{ENUM} umgewandelt werden, bevor die Huffman-Kompression durchgef�hrt
wird.

@item zero
Die Anzahl von Spalten, bei denen alle Werte 0 sind.

@item Original trees
Die anf�ngliche Anzahl von Huffman-B�umen.

@item After join
Die Anzahl von unterschiedlichen Huffman-B�umen, die �brig sind, nachdem
B�ume zusammengefasst wurden, um etwas Header-Platz zu sparen.
@end table

Nachdem eine Tabelle komprimiert wurde, gibt @code{myisamchk -dvv}
zus�tzliche Informationen �ber jedes Feld aus:

@table @code
@item Type
Der Feldtyp kann folgende Deskriptoren enthalten:

@table @code
@item constant
Alle Zeilen haben denselben Wert.

@item no endspace
Kein Leerzeichen am Ende speichern.

@item no endspace, not_always
Kein Leerzeichen am Ende speichern und bei allen Werten keine Komprimierung
f�r Leerzeichen am Ende durchf�hren.

@item no endspace, no empty
Kein Leerzeichen am Ende speichern. Keine leeren Werte speichern.

@item table-lookup
Die Spalte wurde zu @code{ENUM} umgewandelt.

@item zerofill(n)
Die wichtigsten @code{n} Bytes im Wert sind immer 0 und wurden nicht
gespeichert.

@item no zeros
Keine Nullen speichern.

@item always zero
0-Werte sind in 1 Bit gespeichert.
@end table

@item Huff tree
Der Huffman-Baum, der zu dem Feld geh�rt.

@item Bits
Die Anzahl von Bits, die im Huffman-Baum benutzt werden.
@end table

Nachdem Sie @code{pack_isam}/@code{myisampack} laufen gelassen haben,
m�ssen Sie @code{isamchk} / @code{myisamchk} laufen lassen, um den Index
neu zu erzeugen. Zugleich k�nnen Sie die Index-Bl�cke sortieren und die
Statistiken erzeugen, die ben�tigt werden, damit der MySQL-Optimierer
effizienter l�uft:

@example
myisamchk -rq --analyze --sort-index tabelle.MYI
isamchk   -rq --analyze --sort-index tabelle.ISM
@end example

Nachdem Sie die komprimierte Tabelle ins MySQL-Datenbank-Verzeichnis
gespielt haben, m�ssen Sie @code{mysqladmin flush-tables} ausf�hren, um
@code{mysqld} anzuweisen, die neue Tabelle zu benutzen.

Wenn Sie eine gepackte Tabelle entpacken wollen, k�nnen Sie das mit der
@code{--unpack}-Option f�r @code{isamchk} oder @code{myisamchk} tun.


@node mysqld-max,  , myisampack, Server-Side Scripts
@c German node mysqld-max
@subsection mysqld-max, ein erweiterter mysqld-Server

@cindex @code{mysqld-max}

@code{mysqld-max} ist der MySQL-Server (@code{mysqld}), der mit folgenden
configure-Optionen konfiguriert wurde:

@multitable @columnfractions .3 .7
@item @strong{Option} @tab @strong{Kommentar}
@item --with-server-suffix=-max @tab Zur @code{mysqld}-Versionszeichenkette ein Suffix hinzuf�gen.
@item --with-bdb @tab Unterst�tzung f�r Berkeley-DB-(BDB)-Tabellen
@item --with-innodb @tab Unterst�tzung f�r InnoDB-Tabellen.
@item CFLAGS=-DUSE_SYMDIR @tab Symbolische-Links-Unterst�tzung f�r Windows.
@end multitable

Sie finden die MySQL-max-Bin�rdateien unter
@uref{http://www.mysql.com/downloads/mysql-max-3.23.html}.

Die Windows-MySQL-3.23-Bin�rdistribution beinhaltet sowohl die
Standard-@code{mysqld.exe}-Bin�rdatei als auch die
@code{mysqld-max.exe}-Bin�rdatei.
@uref{http://www.mysql.com/downloads/mysql-3.23.html}.
@xref{Windows installation}.

Beachten Sie, dass, weil InnoDB und Berkeley-DB nicht f�r alle Plattformen
verf�gbar sind, einige der @code{Max}-Bin�rdateien eventuell noch
Unterst�tzung f�r diese beiden Typen haben. Sie k�nnen �berpr�fen, welche
Tabellentypen unterst�tzt werden, indem Sie die folgende Anfrage ausf�hren:

@example
mysql> show variables like "have_%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_bdb      | YES   |
| have_innodb   | NO    |
| have_isam     | YES   |
| have_raid     | NO    |
| have_openssl  | NO    |
+---------------+-------+
@end example

Die Bedeutung dieser Werte ist:

@multitable @columnfractions .3 .7
@item @strong{Wert} @tab @strong{Bedeutung}.
@item YES @tab Die Option ist aktiviert und benutzbar.
@item NO @tab MySQL ist nicht mit Unterst�tzung f�r diese Option kompiliert.
@item DISABLED @tab Die xxxx-Option ist deaktiviert, weil @code{mysqld} mit @code{--skip-xxxx} gestartet wurde oder weil @code{mysqld} nicht mit allen notwendigen Optionen gestartet wurde, um die Option zu aktivieren. In diesem Fall sollte die @code{hostname.err}-Datei den Grund daf�r enthalten, warum die Option deaktiviert wurde.
@end multitable

@strong{HINWEIS}: Um InnoDB-Tabellen erzeugen zu k�nnen, @strong{M�SSEN}
Sie Ihre Startoptionen editieren und zumindest die
@code{innodb_data_file_path}-Option eingeben. @xref{InnoDB start}.

Um bessere Performance f�r BDB-Tabellen zu erzielen, sollten Sie auch f�r
diese einige Konfigurationsoptionen angeben. @xref{BDB start}.

@code{safe_mysqld} versucht automatisch, eine @code{mysqld}-Bin�rdatei mit
dem @code{-max}-Pr�fix zu starten. Das macht es sehr einfach, eine andere
@code{mysqld}-Bin�rdatei in einer bestehenden Installation auszutesten.
Lassen Sie einfach @code{configure} mit den Optionen, die Sie wollen,
laufen, und installieren Sie dann die neue @code{mysqld}-Bin�rdatei als
@code{mysqld-max} im selben Verzeichnis, wo Ihre alte
@code{mysqld}-Bin�rdatei liegt. @xref{safe_mysqld, , @code{safe_mysqld}}.

Der @code{mysqld-max}-RPM benutzt das oben erw�hnte
@code{safe_mysqld}-Feature. Er installiert nur die ausf�hrbare Datei
@code{mysqld-max} und @code{safe_mysqld} benutzt diese automatisch, wenn
@code{safe_mysqld} neu gestartet wird.

Folgende Tabelle zeigt, welche Tabellentypen unsere
Standard-@strong{MySQL-Max}-Bin�rdateien beinhalten:

@multitable @columnfractions .4 .3 .3
@item @strong{System} @tab @strong{BDB} @tab @strong{InnoDB}
@item AIX 4.3            @tab NEIN @tab JA
@item HP-UX 11.0         @tab NEIN @tab JA
@item Linux-Alpha        @tab NEIN @tab JA
@item Linux-Intel        @tab JA   @tab JA
@item Linux-Ia64         @tab NEIN @tab JA
@item Solaris-intel      @tab NEIN @tab JA
@item Solaris-sparc      @tab JA   @tab JA
@item Caldera (SCO) OSR5 @tab JA   @tab JA
@item UnixWare           @tab JA   @tab JA
@item Windows/NT         @tab JA   @tab JA
@end multitable


@node Client-Side Scripts, Log Files, Server-Side Scripts, MySQL Database Administration
@c German node Clientseitige Skripte
@section Clientseitige Skripte und Hilfsprogramme von MySQL



@menu
* Client-Side Overview::        
* mysql::                       
* mysqladmin::                  
* Using mysqlcheck::            
* mysqldump::                   
* mysqlhotcopy::                
* mysqlimport::                 
* mysqlshow::                   
* perror::                      
* Batch Commands::              
@end menu

@node Client-Side Overview, mysql, Client-Side Scripts, Client-Side Scripts
@c German node �berblick �ber die clientseitigen Skripte
@subsection �berblick �ber die clientseitigen Skripte und Dienstprogramme

@cindex Umgebungsvariablen
@cindex Programme, Auflistung

Alle MySQL-Clients, die mittels der @code{mysqlclient}-Bibliothek mit dem
Server kommunizieren, benutzen folgende Umgebungsvariablen:

@tindex @code{MYSQL_UNIX_PORT}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_UNIX_PORT}
@tindex @code{MYSQL_TCP_PORT}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_TCP_PORT}
@tindex @code{MYSQL_PWD}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_PWD}
@tindex @code{MYSQL_DEBUG}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_DEBUG}
@multitable @columnfractions .25 .75
@item @strong{Name} @tab @strong{Beschreibung}
@item @code{MYSQL_UNIX_PORT} @tab Der vorgabem��ige Socket, benutzt f�r Verbindungen zu @code{localhost}
@item @code{MYSQL_TCP_PORT}  @tab Der vorgabem��ige TCP/IP-Port
@item @code{MYSQL_PWD} @tab Das vorgabem��ige Passwort
@item @code{MYSQL_DEBUG} @tab Debug-Trace-Optionen beim Debuggen
@item @code{TMPDIR} @tab Das Verzeichnis, in dem tempor�re Tabellen / Dateien erzeugt werden
@end multitable

Die Benutzung von @code{MYSQL_PWD} ist unsicher.
@xref{Connecting}.

@tindex @code{MYSQL_HISTFILE}-Umgebungsvariable
@tindex Umgebungsvariable, @code{MYSQL_HISTFILE}
@tindex @code{HOME}-Umgebungsvariable
@tindex Umgebungsvariable, @code{HOME}
@cindex History-Datei
@cindex Kommandozeilen-History
@tindex .mysql_History-Datei
Der @file{mysql}-Client benutzt die Datei in der @code{MYSQL_HISTFILE}-
Umgebungsvariablen genannte Datei, um die Kommandozeilen-History zu
speichern. Der Vorgabewert f�r die History-Datei ist
@file{$HOME/.mysql_history}, wobei @code{$HOME} der Wert der
@code{HOME}-Umgebungsvariablen ist. @xref{Environment variables}.

Alle MySQL-Programme haben viele verschiedene Optionen. Jedes 
MySQL-Programm stellt jedoch ein @code{--help}-Option zur Verf�gung, die
Sie benutzen k�nnen, um eine vollst�ndige Beschreibung der verschiedenen
Optionen des Programms zu erhalten. Probieren Sie zum Beispiel @code{mysql
--help} aus.

Sie k�nnen die vorgabem��igen Optionen f�r alle Standard-Client-Programme
mit einer Optionsdatei �berschreiben. @ref{Option files}.

Die unten stehende Liste beschreibt kurz die MySQL-Programme:

@table @code
@cindex @code{myisamchk}
@item myisamchk
Dienstprogramm zur Beschreibung, Pr�fung, Optimierung und Reparatur von
MySQL-Tabellen. Weil @code{myisamchk} viele Funktionen hat, ist es in einem
eigenen Kapitel beschrieben. @xref{MySQL Database Administration}.

@cindex @code{make_binary_distribution}
@item make_binary_distribution
Macht ein Bin�r-Release eines kompilierten MySQL. Dieses k�nnte �ber FTP an
@file{/pub/mysql/Incoming} oder an @code{Support.mysql.com} geschickt
werden, damit andere MySQL-Benutzer es benutzen k�nnen.

@cindex @code{msql2mysql}
@item msql2mysql
Ein Shell-Skript, das @code{mSQL}-Programme zu MySQL konvertiert. Es deckt
nicht alle F�lle ab, ist aber hilfreich, um mit dem Konvertieren
anzufangen.

@cindex @code{mysqlaccess}
@item mysqlaccess
Ein Skript, das die Zugriffsberechtigungen f�r eine Host-, Benutzer- und
Datenbank-Kombination pr�ft.

@cindex @code{mysqladmin}
@item mysqladmin
Dienstprogramm f�r die Durchf�hrung von Verwaltungsoperationen wie Erzeugen
und L�schen von Datenbanken, Neulanden der Berechtigungstabellen,
Zur�ckschreiben von Tabellen auf Platte und Neu�ffnen von Log-Dateien.
@code{mysqladmin} kann auch benutzt werden, um Versionsnummer sowie Status-
und Prozess-Informationen vom Server zu erhalten.
@xref{mysqladmin, , @code{mysqladmin}}.

@cindex @code{mysqlbug}
@item mysqlbug
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden,
wenn Sie einen Bug-Bericht an die MySQL-Liste ausf�llen.

@cindex @code{mysqld}
@item mysqld
Der SQL-Daemon. Dieser sollte immer laufen.

@cindex @code{mysqldump}
@item mysqldump
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als
Tabulator-separierte Textdateien. Verbesserte Freeware, urspr�nglich von
Igor Romanenko. @xref{mysqldump, , @code{mysqldump}}.

@cindex @code{mysqlimport}
@item mysqlimport
Importiert Textdateien in die jeweiligen Tabellen mittels @code{LOAD DATA
INFILE}. @xref{mysqlimport, , @code{mysqlimport}}.

@cindex @code{mysqlshow}
@item mysqlshow
Zeigt Informationen �ber Datenbanken, Tabellen, Spalten und Indexe an.

@cindex @code{mysql_install_db}
@item mysql_install_db
Erzeugt die MySQL-Berechtigungstabellen mit vorgabem��igen Berechtigungen.
Dieses Skript wird gew�hnlich nur einmal ausgef�hrt, wenn Sie MySQL das
erste Mal auf einem System installieren.

@cindex @code{replace}
@item replace
Ein Dienstprogramm, das von @code{msql2mysql} benutzt wird, aber auch
dar�ber hinaus benutzt werden kann. @code{replace} �ndert Zeichenketten in
Dateien oder auf der Standardeingabe. Benutzt eine finite Status-Maschine,
um zuerst �bereinstimmung mit l�ngeren Zeichenketten zu finden. Kann
benutzt werden, um Zeichenketten umzudrehen. Der folgende Befehl zum
Beispiel dreht @code{a} und @code{b} in den angegebenen Dateien um:

@example
shell> replace a b b a --Datei1 Datei2 ...
@end example
@end table


@node mysql, mysqladmin, Client-Side Overview, Client-Side Scripts
@c German node mysql
@subsection Das Kommandozeilen-Werkzeug

@cindex Kommandozeilen-Werkzeug
@cindex Werkzeuge, Kommandozeile
@cindex Skripte
@cindex @code{mysql}

@code{mysql} ist eine einfache SQL-Shell (mit GNU
@code{readline}-F�higkeiten). Sie unterst�tzt interaktiven und nicht
interaktiven Gebrauch. Wenn sie interaktiv benutzt wird, werden
Anfrageergebnisse in einem ASCII-Tabellenformat ausgegeben. Wenn sie nicht
interaktiv benutzt wird (zum Beispiel als Filter), wird das Ergebnis in
Tabulator-separiertem Format ausgegeben. (Das Ausgabeformat kann mit den
Kommandozeilenoptionen ge�ndert werden.) Skripte k�nnen Sie einfach wie
folgt laufen lassen:

@example
shell> mysql datenbank < skript.sql > ausgabe.tab
@end example

Wenn Sie Probleme haben, die auf ungen�genden Speicher beim Client
zur�ckzuf�hren sind, benutzen Sie die @code{--quick}-Option! Diese zwingt
@code{mysql}, @code{mysql_use_result()} statt @code{mysql_store_result()}
zu benutzen, um die Ergebnismenge zu holen.

Die Benutzung von @code{mysql} ist sehr einfach. Starten Sie es einfach wie
folgt:
@code{mysql datenbank} oder @code{mysql --user=benutzername
--password=ihr_passwort datenbank}. Geben Sie ein SQL-Statement ein,
beenden Sie es mit @samp{;}, @samp{\g} oder @samp{\G}, und dr�cken Sie die
Eingabetaste.

@cindex @code{mysql}-Kommandozeilenoptionen
@cindex Kommandozeilenoptionen, @code{mysql}
@cindex Optionen, Kommandozeile, @code{mysql}
@cindex Startparameter, @code{mysql}
@code{mysql} unterst�tzt folgende Optionen:

@table @code
@cindex @code{help}, @code{mysql}-Option
@item -?, --help
Hilfetext ausgeben und beenden.

@cindex @code{no-auto-rehash}, @code{mysql}-Option
@item -A, --no-auto-rehash
Kein automatisches Rehashing. Man muss 'rehash' benutzen, um Tabellen- und
Feld-Vervollst�ndigung zu erhalten. Durch die Option wird mysql schneller
gestartet.

@cindex @code{batch}, @code{mysql}-Option
@item -B, --batch
Ergebnisse mit einem Tabulator als Trennzeichen ausgeben, jede
Tabellenzeile auf einer neuen Zeile. Keine History-Datei benutzen.

@cindex @code{character-sets-dir}, @code{mysql}-Option
@item --character-sets-dir=...
Verzeichnis, in dem sich die Zeichens�tze befinden.

@cindex @code{compress}, @code{mysql}-Option
@item -C, --compress
Im Client-Server-Protokoll Komprimierung benutzen.

@cindex @code{debug}, @code{mysql}-Option
@item -#, --debug[=...]
Debug loggen. Vorgabe ist 'd:t:o,/tmp/mysql.trace'.

@cindex @code{database}, @code{mysql}-Option
@item -D, --database=...
Datenbank, die benutzt werden soll. Haupts�chlich n�tzlich in der
@code{my.cnf}-Datei.

@cindex @code{default-character-set}, @code{mysql}-Option
@item --default-character-set=...
Den vorgabem��igen Zeichensatz setzen.

@cindex @code{execute}, @code{mysql}-Option
@item -e, --execute=...
Befehl ausf�hren und beenden. (Ausgabe wie bei --batch)

@cindex @code{vertical}, @code{mysql}-Option
@item -E, --vertical
Ausgabe einer Anfrage (Zeilen) vertikal darstellen. Ohne diese Option
k�nnen Sie diese Ausgabe auch dadurch erzwingen, dass Sie Ihre Statements
mit @code{\G} beenden.

@cindex @code{force}, @code{mysql}-Option
@item -f, --force
Weitermachen, auch wenn ein SQL-Fehler auftritt.

@cindex @code{no-named-commands}, @code{mysql}-Option
@item -g, --no-named-commands
Benannte Befehle werden deaktiviert. Benutzen Sie nur die \*-Form, oder
benutzen Sie benannte Befehle nur bei Zeilen, die mit einem Semikolon
enden. Ab Version 10.9 startet der Client vorgabem��ig mit ANGESCHALTETER
Option! Wenn die -g-Option angeschaltet ist, funktionieren Befehle im
Langformat jedoch immer noch von der ersten Zeile aus.

@cindex @code{enable-named-commands}, @code{mysql}-Option
@item -G, --enable-named-commands
Benannte Befehle sind @strong{angeschaltet}. Befehle im Langformat sind
ebenso zugelassen wie die abgek�rzten \*-Befehle.

@cindex @code{ignore-space}, @code{mysql}-Option
@item -i, --ignore-space
Leerzeichen nach Funktionsnamen ignorieren.

@cindex @code{host}, @code{mysql}-Option
@item -h, --host=...
Connect to the given host.

@cindex @code{html}, @code{mysql}-Option
@item -H, --html
HTML-Ausgabe produzieren.

@cindex @code{skip-line-numbers}, @code{mysql}-Option
@item -L, --skip-line-numbers
Bei Fehlern keine Zeilennummer ausgeben. N�tzlich, wenn man mit
Ergebnisdateien vergleichen will, die Fehlermeldungen enthalten.

@cindex @code{no-pager}, @code{mysql}-Option
@item --no-pager
Pager deaktivieren und nach stdout ausgeben. Siehe auch interaktive Hilfe
(\h).

@cindex @code{no-tee}, @code{mysql}-Option
@item --no-tee
Ausgabedatei (Outfile) deaktivieren. Siehe auch interaktive Hilfe (\h).

@cindex @code{unbuffered}, @code{mysql}-Option
@item -n, --unbuffered
Nach jeder Anfrage Buffer zur�ckschreiben (flush).

@cindex @code{skip-column-names}, @code{mysql}-Option
@item -N, --skip-column-names
In Ergebnissen keine Spaltennamen ausgeben.

@cindex @code{set-variable}, @code{mysql}-Option
@item -O, --set-variable var=option
Einer Variablen einen Wert zuweisen. @code{--help} listet Variablen auf.

@cindex @code{one-database}, @code{mysql}-Option
@item -o, --one-database
Nur die vorgabem��ige Datenbank aktualisieren. Das ist n�tzlich, wenn man
in der Update-Logdatei Aktualisierungen (Updates) auf eine andere Datenbank
�berspringen will.

@cindex @code{pager}, @code{mysql}-Option
@item @code{--pager[=...]}
Ausgabetyp. Vorgabe ist Ihre @code{ENV}-Variable @code{PAGER}. G�ltige
Pager sind less, more, cat [> Dateiname] usw. Siehe auch interaktive Hilfe
(\h). Diese Option funktioniert nicht im Stapelmodus. Der Pager
funktioniert nur unter UNIX.

@cindex @code{password}, @code{mysql}-Option
@item -p[password], --password[=...]
Passwort, das f�r die Verbindung zum Server benutzt wird. Wenn das Passwort
nicht auf der Kommandozeile angegeben wird, wird eine Eingabeaufforderung
daf�r ausgegeben. Beachten Sie: Wenn Sie die Kurzform @code{-p} benutzen,
darf zwischen der Option und dem Passwort kein Leerzeichen stehen.

@cindex @code{port}, @code{mysql}-Option
@item -P  --port=...
TCP/IP-Portnummer, die f�r die Verbindung benutzt wird.

@cindex @code{quick}, @code{mysql}-Option
@item -q, --quick
Ergebnisse nicht cachen, Zeile f�r Zeile ausgeben. Das kann den Server
verlangsamen, wenn die Ausgabe verschoben wird. Keine History-Datei
benutzen.

@cindex @code{raw}, @code{mysql}-Option
@item -r, --raw
Spaltenwerte ohne Escape-Umwandlung schreiben. Benutzt f�r @code{--batch}.

@cindex @code{silent}, @code{mysql}-Option
@item -s, --silent
Schweigsamer sein.

@cindex @code{socket}, @code{mysql}-Option
@item -S  --socket=...
Socket-Datei, die f�r die Verbindung benutzt wird.

@cindex @code{table}, @code{mysql}-Option
@item -t  --table
Ausgabe im Tabellenformat. Das ist die Vorgabe im Nicht-Stapelmodus.

@cindex @code{debug-info}, @code{mysql}-Option
@item -T, --debug-info
Beim Verlassen einige Debug-Informationen ausgeben.

@cindex @code{tee}, @code{mysql}-Option
@item --tee=...
Alles an die Ausgabedatei anh�ngen. Siehe auch interaktive Hilfe (\h).
Funktioniert nicht im Stapelmodus.

@cindex @code{user}, @code{mysql}-Option
@item -u, --user=#
Benutzer zum Einloggen, falls nicht der aktuelle UNIX-Benutzer.

@cindex @code{safe-updates}, @code{mysql}-Option
@item -U, --safe-updates[=#], --i-am-a-dummy[=#]
L��t nur @code{UPDATE} und @code{DELETE} zu, die Schl�ssel benutzen. Siehe
unten wegen weiterer Informationen �ber diese Option. Sie k�nnen diese
Option zur�cksetzen, wenn Sie sie in Ihrer @code{my.cnf}-Datei haben, indem
Sie @code{--safe-updates=0} benutzen.

@cindex @code{verbose}, @code{mysql}-Option
@item -v, --verbose
Geschw�tzigere Ausgabe (-v -v -v ergibt das Tabellen-Ausgabeformat).

@cindex @code{version}, @code{mysql}-Option
@item -V, --version
Versionsinformationen ausgeben und beenden.

@cindex @code{wait}, @code{mysql}-Option
@item -w, --wait
Wenn die Verbindung geschlossen wurde, warten und noch einmal versuchen,
statt abzubrechen.
@end table

Mit @code{-O} oder @code{--set-variable} k�nnen Sie auch die folgenden
Variablen setzen:

@cindex timeout, @code{connect_timeout}-Variable
@cindex @code{connect_timeout}-Variable
@cindex @code{max_allowed_packet}
@cindex @code{net_buffer_length}
@cindex @code{select_limit}
@cindex @code{max_join_size}
@multitable @columnfractions .3 .2 .5
@item Variablenname      @tab Vorgabe   @tab Beschreibung
@item connect_timeout    @tab 0         @tab Anzahl von Sekunden, bevor die Verbindung wegen Zeit�berschreitung abgebrochen wird
@item max_allowed_packet @tab 16777216  @tab Maximale Paketl�nge, die zum Server gesendet bzw. von diesem empfangen wird
@item net_buffer_length  @tab 16384     @tab Puffer f�r TCP/IP- und Socket-Kommunikation
@item select_limit       @tab 1000      @tab Automatisches Limit f�r SELECT bei Benutzung von --i-am-a-dummy
@item max_join_size      @tab 1000000   @tab Automatisches Limit f�r Zeilen in einem Join bei Benutzung von --i-am-a-dummy.
@end multitable

Wenn Sie 'help' auf der Kommandozeile eingeben, gibt @code{mysql} die
Befehle aus, die es unterst�tzt:

@cindex Befehle, Auflistung
@example
mysql> help

MySQL-Befehle:
help    (\h)    Diesen Text anzeigen.
?       (\h)    Synonym f�r `help'.
clear   (\c)    L�sch-Befehl.
connect (\r)    Erneut mit dem Server verbinden. Optionale Argumente sind db und host.
edit    (\e)    Befehl mit $EDITOR editieren.
ego     (\G)    Befehl an den MySQL-Server schicken, Ergebnis vertikal anzeigen.
exit    (\q)    mysql beenden. Dasselbe wie quit.
go      (\g)    Befehl an den MySQL-Server schicken.
nopager (\n)    Pager deaktivieren, nach stdout ausgeben.
notee   (\t)    Nicht in die Ausgabedatei (Outfile) schreiben.
pager   (\P)    PAGER [auf_pager] setzen. Anfrageergebnisse �ber PAGER ausgeben.
print   (\p)    Aktuellen Befehl ausgeben.
quit    (\q)    mysql beenden.
rehash  (\#)    Vervollst�ndigungs-Hash neu aufbauen.
source  (\.)    Eine SQLsSkriptdatei ausf�hren. Ben�tigt einen Dateinamen als Argument.
status  (\s)    Statusinformationen vom Server abrufen.
tee     (\T)    Ausgabedatei [auf_outfile] setzen. Alles an die angegebene Ausgabedatei anh�ngen.
use     (\u)    Eine andere Datenbankbenutzung. Ben�tigt Datenbanknamen als Argument.
@end example

Bei diesen Befehlen funktioniert PAGER nur unter UNIX.

@cindex status command
Der @code{status}-Befehl gibt Ihnen einige Informationen �ber die
Verbindung und den Server, den Sie benutzen. Wenn der Server im
@code{--safe-updates}-Modus l�uft, gibt @code{status} auch die Werte der
@code{mysql}-Variablen aus, die Ihre Anfragen beeinflussen.

@cindex @code{safe-mode}-Befehl
Eine n�tzliche Startoption f�r Anf�nger (eingef�hrt in MySQL-Version
3.23.11) ist @code{--safe-updates} (oder @code{--i-am-a-dummy} f�r
Benutzer, die irgendwann ein @code{DELETE FROM tabelle} eingeben, aber
vergessen, die @code{WHERE}-Klausel) zu benutzen. Wenn Sie diese Option
benutzen, schickt @code{mysql} beim �ffnen der Verbindung folgenden Befehl
an den MySQL-Server:

@example
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
    SQL_MAX_JOIN_SIZE=#max_join_size#"
@end example

Wobei @code{#select_limit#} und @code{#max_join_size#} Variablen sind, die
auf der @code{mysql}-Kommandozeile gesetzt werden k�nnen.
@c German FIX unsplit @xref
@xref{SET OPTION}.

Die Auswirkung davon ist folgende:

@itemize @bullet
@item
@code{UPDATE}- oder @code{DELETE}-Statements ohne Schl�sselbeschr�nkung im
@code{WHERE}-Teil sind nicht zugelassen. Man kann jedoch ein
@code{UPDATE/DELETE} durch die Benutzung von @code{LIMIT} erzwingen:
@example
UPDATE tabelle SET not_key_column=# WHERE not_key_column=# LIMIT 1;
@end example
@item
Alle gro�en Ergebnisse werden automatisch auf @code{#select_limit#} Zeilen
begrenzt.
@item
@code{SELECT}'s, die wahrscheinlich mehr als @code{#max_join_size}
Zeilenkombinationen durchgehen m�ssen, werden abgebrochen.
@end itemize

Einige n�tzliche Anmerkungen zum @code{mysql}-Client:

Einige Daten sind lesbarer, wenn sie vertikal angezeigt werden statt auf
die �bliche horizontale kasten�hnliche Art. Langer Text zum Beispiel, der
Zeilenumbr�che beinhaltet, ist bei vertikaler Ausgabe meist viel einfacher
zu lesen.

@example
mysql> select * from mails where length(txt) < 300 limit 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: monty@@no.spam.com
  mail_to: "Thimble Smith" <tim@@no.spam.com>
      sbj: UTF-8
      txt: >>>>> "Thimble" == Thimble Smith writes:

Thimble> Hi. Meines Erachtens eine gute Idee. Kennt sich jemand mit UTF-8
Thimble> oder Unicode aus? Ansonsten packe ich das auf meine TODO-Liste
Thimble> und warte, was passiert.

Ja, mach das bitte!

Regards,
Monty
    Datei: inbox-jani-1
     hash: 190402944
1 row in set (0.09 sec)
@end example

@itemize @bullet
@item
Zum Mitloggen benutzen Sie die @code{tee}-Option. @code{tee} wird mit der
Option @code{--tee=...} oder interaktiv auf der Kommandozeile mi dem Befehl
@code{tee} gestartet. Alle Daten, die auf dem Bildschirm erscheinen, werden
auch in die angegebene Datei geschrieben. Das kann auch f�r Debug-Zwecke
sehr hilfreich sein. @code{tee} kann von der Kommandozeile aus mit dem
Befehl @code{notee} deaktiviert werden. Wenn @code{tee} noch einmal
eingegeben wird, wird wiederum mit dem Loggen begonnen. Ohne Parameter wird
die vorherige Datei wiederum benutzt. Beachten Sie, dass @code{tee} die
Ergebnisse nach jedem Befehl in die Datei zur�ckschreibt, direkt bevor die
Kommandozeilenaufforderung f�r den n�chsten Befehl erscheint.

@item
Das Durchst�bern oder Durchsuchen der Ergebnisse im interaktiven Modus in
UNIX-less, -more oder einem �hnlichen Programm ist jetzt m�glich mit der
Option @code{--pager[=...]}. Ohne Argument aufgerufen sieht der
@code{mysql}-Client in der Umgebungsvariablen PAGER nach und setzt
@code{pager} auf diesen Wert. @code{pager} kann von der interaktiven
Kommandozeile mit dem Befehl @code{pager} gestartet und mit @code{nopager}
deaktiviert werden. Optional nimmt der Befehl ein Argument entgegen und
setzt @code{pager} darauf. @code{pager} kann ohne Argument aufgerufen
werden, aber das erfordert, dass die Option @code{--pager} benutzt wurde,
ansonsten gibt @code{pager} in stdout aus. @code{pager} funktioniert nur
unter UNIX, denn es benutzt die popen()-Funktion, die es unter Windows
nicht gibt. Unter Windows kann statt dessen die @code{tee}-Option benutzt
werden, wenngleich diese in manchen Situationen nicht ganz so handlich ist
wie @code{pager}.

@item
Ein paar Tipps zu @code{pager}: Sie k�nnen es benutzen, um in eine Datei zu
schreiben:
@example
mysql> pager cat > /tmp/log.txt
@end example
Die Ergebnisse werden nur in eine Datei geschrieben. Sie k�nnen auch
Optionen an Programme �bergeben, die Sie mit @code{pager} zusammen benutzen
wollen:
@example
mysql> pager less -n -i -S
@end example
Beachten Sie hierbei die Option '-S'. Beim Durchst�bern der Ergebnisse
werden Sie diese wahrscheinlich als sehr n�tzlich erachten. Probieren Sie
dei Option mit horizontaler Ausgabe (Befehle enden mit '\g', oder ';') und
mit vertikaler Ausgabe (Befehle enden mit '\G') aus. Manchmal ist ein sehr
breites Ergebnis schwer am Bildschirm zu lesen. Mit der Option -S f�r less
k�nnen Sie die Ergebnisse im interaktiven less von links nach rechts
durchst�bern, wobei verhindert wird, dass Zeilen, die l�nger sind als Ihre
Bildschirmbreite, in die n�chste Zeile umgebrochen werden. Das kann ein
Ergebnis sehr viel lesbarer gestalten. Sie k�nnen den Modus im interaktiven
less an- und abschalten, wenn Sie '-S' benutzen. Siehe 'h' f�r weitere
Hilfe zu less.

@item
Zum Schluss (falls Sie das nicht schon aus den oben aufgef�hrten Beispielen
heraus gefunden haben ;-) k�nnen Sie sehr komplexe Dinge tun, um die
Ergebnisse zu handhaben. Folgendes w�rde die Ergebnisse beispielsweise an
zwei verschiedene Dateien in zwei unterschiedlichen Verzeichnissen
schicken, auf zwei unterschiedlichen Festplatten, die auf /dr1 und /dr2
gemountet sind, und dennoch die Ergebnisse �ber less am Bildschirm
anzeigen:
@example
mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
@end example

@item
Sie k�nnen die obigen Funktionen auch kombinieren, indem Sie @code{tee}
anschalten und @code{pager} auf 'less' setzen. Dann k�nnen Sie die
Ergebnisse in 'less' durchst�bern und trotzdem wird alles zugleich an eine
Datei angeh�ngt. Der Unterschied zwischen @code{UNIX tee}, was mit
@code{pager} benutzt wird, und dem im @code{mysql}-Client eingebauten
@code{tee} ist, dass das eingebaute @code{tee} sogar dann funktioniert,
wenn kein @code{UNIX tee} verf�gbar ist. Dar�ber hinaus gibt das eingebaute
@code{tee} alles, was mitgeloggt wird, auch am Bildschirm aus, wohingegen
das @code{UNIX tee} in Verbindung mit @code{pager} nicht so viel mitloggt.
Letztlich l��t sich das interaktive @code{tee} auch handlicher aus- und
einschalten, wenn Sie teilweise mitloggen wollen, aber in der Lage sein,
das Feature zwischendurch auszuschalten.
@end itemize


@node mysqladmin, Using mysqlcheck, mysql, Client-Side Scripts
@c German node mysqladmin
@subsection mysqladmin, Verwaltung eines MySQL-Servers

@cindex Administration, Server
@cindex Serververwaltung
@cindex @code{mysladmn}

Ein Dienstprogramm, um Verwaltungsoperationen durchzuf�hren. Die Syntax ist::

@example
shell> mysqladmin [OPTIONS] befehl [befehl-option] befehl ...
@end example

Sie erhalten eine Auflistung der Optionen, die Ihre
@code{mysqladmin}-Version unterst�tzt, indem Sie @code{mysqladmin --help}
ausf�hren.

Das aktuelle @code{mysqladmin} unterst�tzt folgende Befehle:

@table @code
@item create datenbank
Eine neue Datenbank erzeugen.

@item drop datenbank
Eine Datenbank und alle ihre Tabellen l�schen.

@item extended-status
Eine erweiterte Statusmeldung vom Server ausgeben.

@item flush-hosts
Alle gecacheten Hosts zur�ckschreiben (flush).

@item flush-logs
Alle Logs zur�ckschreiben (flush).

@item flush-tables
Alle Tabellen zur�ckschreiben (flush).

@item flush-privileges
Berechtigungstabellen neu laden (dasselbe wie reload).

@item kill id,id,...
MySQL-Threads killen.

@item password
Ein neues Passwort setzen. Altes Passwort zu neuem Passwort �ndern.

@item ping
�berpr�fen, ob mysqld lebt.

@item processlist
Auflistung aktiver Threads im Server.

@item reload
Berechtigungstabellen neu laden.

@item refresh
Alle Tabellen zur�ckschreiben (flush), Log-Dateien schlie�en und erneut
�ffnen.

@item shutdown
Server herunter fahren.

@item slave-start
Slave-Replikations-Thread starten.

@item slave-stop
Slave-Replikations-Thread anhalten.

@item status
Eine kurze Statusmeldung vom Server ausgeben.

@item variables
Verf�gbare Variablen ausgeben.

@item version
Versionsinformation vom Server abrufen.
@end table

Alle Befehle k�nnen auf ihr eindeutiges Pr�fix abgek�rzt werden. Beispiel:

@example
shell> mysqladmin proc stat
+----+-------+-----------+----+-------------+------+-------+------+
| Id | User  | Host      | db | Command     | Time | State | Info |
+----+-------+-----------+----+-------------+------+-------+------+
| 6  | monty | localhost |    | Processlist | 0    |       |      |
+----+-------+-----------+----+-------------+------+-------+------+
Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 2  Memory in use: 1092K  Max memory used: 1116K
@end example

@cindex Status-Befehl, Ergebnisse
Das Ergebnis des @code{mysqladmin status}-Befehls hat folgende Spalten:

@cindex uptime
@multitable @columnfractions .3 .7
@item Uptime @tab Anzahl von Sekunden, seit der MySQL-Server hoch gefahren ist.
@cindex Threads
@item Threads @tab Anzahl aktiver Threads (Clients).
@cindex questions
@item Questions @tab Anzahl von Questions von Clients, seit @code{mysqld} gestartet wurde.
@cindex slow queries
@item Slow queries @tab Anfragen, die l�nger als @code{long_query_time} Sekunden ben�tigten. @xref{Slow query log}.
@cindex opens
@item Opens @tab Wie viele Tabellen @code{mysqld} ge�ffnet hat.
@cindex flush tables
@cindex tables, flush
@item Flush Tables @tab Anzahl von @code{flush ...}-, @code{refresh}- und @code{reload}-Befehlen.
@cindex open tables
@item Open Tables @tab Anzahl der Tabellen, die gerade ge�ffnet sind.
@cindex memory use
@item Memory in use @tab Arbeitsspeicher, der direkt vom @code{mysqld}-Code beansprucht wird (nur verf�gbar, wenn MySQL mit --with-debug=full kompiliert wurde).
@cindex max memory used
@item Max memory used @tab Maximaler Arbeitsspeicher, der direkt vom @code{mysqld}-Code beansprucht wird (nur verf�gbar, wenn MySQL mit --with-debug=full kompiliert wurde).
@end multitable

Wenn Sie @code{mysqladmin shutdown} auf einem Socket ausf�hren (mit anderen
Worten, auf dem Computer, wo @code{mysqld} l�uft), wartet
@code{mysqladmin}, bis MySQL die @code{pid-file} entfernt hat, um
sicherzustellen, dass der @code{mysqld}-Server korrekt angehalten wurde.


@node Using mysqlcheck, mysqldump, mysqladmin, Client-Side Scripts
@c German node mysqlcheck
@subsection Benutzung von @code{mysqlcheck} f�r Tabellenwartung und Wiederherstellung nach Abst�rzen

Ab MySQL-Version 3.23.38 k�nnen Sie ein neues Pr�f- und Reparatur-Werkzeug
f�r @code{MyISAM}-Tabellen einsetzen. Der Unterschied zu @code{myisamchk}
ist, dass @code{mysqlcheck} benutzt werden kann, wenn der
@code{mysqld}-Server l�uft, wohingegen @code{myisamchk} nur benutzt werden
sollte, wenn er nicht l�uft. Der Vorteil ist, dass Sie den Server zum
Pr�fen oder zur Reparatur Ihrer Tabellen nicht mehr herunter fahren m�ssen.

@code{mysqlcheck} benutzt die MySQL-Server-Befehle @code{CHECK},
@code{REPAIR}, @code{ANALYZE} und @code{OPTIMIZE} auf eine f�r den Benutzer
bequeme Weise.

Es gibt drei alternative M�glichkeiten, @code{mysqlcheck} aufzurufen:

@example
shell> mysqlcheck [OPTIONS] datenbank [tabellen]
shell> mysqlcheck [OPTIONS] --databases datenbank1 [datenbank2 datenbank3...]
shell> mysqlcheck [OPTIONS] --all-databases
@end example

Daher kann es hinsichtlich der Auswahl von Datenbanken und Tabellen �hnlich
wie @code{mysqldump} benutzt werden.

@code{mysqlcheck} besitzt im Vergleich zu den anderen Clients ein
besonderes Feature: Das vorgabem��ige Verhalten, Tabellen mit -c zu
pr�fen, kann ge�ndert werden, indem die Bin�rdatei umbenannt wird. Wenn Sie
nur ein Werkzeug haben wollen, das vorgabem��ig Tabellen repariert,
kopieren Sie eine @code{mysqlcheck} mit einem neuen Namen auf Ihre
Festplatte, n�mlich @code{mysqlrepair}, oder legen alternativ einen
symbolischen Link auf @code{mysqlrepair} und benennen den Link
@code{mysqlrepair}. Wenn Sie jetzt @code{mysqlrepair} aufrufen, repariert
es vorgabem��ig Tabellen.

Folgende Namen k�nnen Sie benutzen, um das vorgabem��ige Verhalten von
@code{mysqlcheck} zu ver�ndern:

@example
mysqlrepair:   Vorgabe-Option: -r (reparieren)
mysqlanalyze:  Vorgabe-Option: -a (analysieren)
mysqloptimize: Vorgabe-Option: -o (optimieren)
@end example

Die verf�gbaren Optionen f�r @code{mysqlcheck} sind hier aufgelistet. Bitte
pr�fen Sie mit @code{mysqlcheck --help}, welche davon Ihre Version
unterst�tzt.

@table @code
@item -A, --all-databases
Pr�ft alle Datenbanken. Das ist dasselbe wie --databases mit allen
Datenbanken ausgew�hlt.
@item -1, --all-in-1
Statt f�r jede Tabelle eine Anfrage auszuf�hren, alle Anfragen in 1 Anfrage
pro Datenbank ausf�hren. Tabellennamen stehen in einer durch Kommas
getrennten Liste.
@item  -a, --analyze
Analysiert die angegebene Tabelle.
@item --auto-repair
Wenn eine gepr�fte Tabelle besch�digt ist, sie automatisch reparieren. Die
Reparatur wird durchgef�hrt, nachdem alle Tabellen gepr�ft wurden, falls
besch�digte gefunden wurden.
@item -#, --debug=...
Debug-Log-Datei ausgeben. Das ist h�ufig 'd:t:o,filename'.
@item --character-sets-dir=...
Verzeichnis, wo Zeichens�tze gespeichert sind.
@item -c, --check
Tabelle auf Fehler pr�fen.
@item -C, --check-only-changed
Nur die Tabellen pr�fen, die seit der letzten Pr�fung ge�ndert wurden oder
die nicht ordnungsgem�� geschlossen wurden.
@item --compress
Kompression im Client-Server-Protokoll benutzen.
@item -?, --help
Diese Nachricht ausgeben und beenden.
@item -B, --databases
Mehrere Datenbanken pr�fen. Beachten Sie den Unterschied im Gebrauch: In
diesem Fall werden keine Tabellen angegeben. Alle Namensargumente werden
als Datenbanknamen erachtet.
@item --default-character-set=...
Setzt den vorgabem��igen Zeichensatz.
@item -F, --fast
Nur Tabellen pr�fen, die nicht ordnungsgem�� geschlossen wurden.
@item -f, --force
Fortfahren, auch wenn ein SQL-Fehler auftritt.
@item -e, --extended
Wenn Sie diese Option beim Pr�fen von Tabellen benutzen, stellt das sicher,
dass die Tabelle zu 100% konsistent ist, dauert aber sehr lange.
Wenn Sie diese Option beim Reparieren von Tabellen benutzen, wird eine
erweiterte Reparatur der Tabelle durchgef�hrt, was nicht nur sehr lange
dauern kann, sondern auch viele 'M�ll'-Zeilen produzieren kann!
@item -h, --host=...
Mit dem angegebenen Host verbinden.
@item -m, --medium-check
Schneller als extended-check, findet aber nur 99,99% aller Fehler. Sollte
in den meisten F�llen gen�gen.
@item -o, --optimize
Tabelle optimieren.
@item -p, --password[=...]
Passwort, das bei der Verbindung zum Server benutzt werden soll. Wenn das
Passwort nicht angegeben wird, wird vom Terminal eine Eingabeaufforderung
pr�sentiert.
@item -P, --port=...
Portnummer, die f�r Verbindungen zum Server benutzt werden soll.
@item -q, --quick
Wenn Sie diese Option beim Pr�fen von Tabellen benutzen, verhindert das,
dass die Zeilen nach falschen Verkn�pfungen (Links) durchgesehen werden
(gescannt). Das ist die schnellste Pr�fmethode.
Wenn Sie diese Option beim Reparieren von Tabellen benutzen, wird versucht,
nur den Index-Baum zu reparieren. Das ist die schnellste Reparaturmethode.
@item -r, --repair
Kann fast alles reparieren, ausser eindeutige Schl�ssel, die nicht
eindeutig sind.
@item -s, --silent
Nur Fehlermeldungen ausgeben.
@item -S, --socket=...
Socket-Datei, die f�r die Verbindung benutzt werden soll.
@item --tables
Option --databases (-B) �berschreiben.
@item -u, --user=#
Benutzer zum Einloggen, falls nicht der aktuelle Unix-Benutzer.
@item -v, --verbose
Informationen �ber die verschiedenen Phasen ausgeben.
@item -V, --version
Versionsinformationen ausgeben und beenden.
@end table


@node mysqldump, mysqlhotcopy, Using mysqlcheck, Client-Side Scripts
@c German node mysqldump
@subsection mysqldump, Tabellenstrukturen und -daten dumpen

@cindex dumpen, Datenbanken
@cindex Datenbanken, dumpen
@cindex Tabellen, dumpen
@cindex Datensicherung, Datenbanken

@cindex @code{mysqldump}
Dienstprogramm, um eine Datenbank oder eine Sammlung von Datenbanken zu
sichern oder um Daten auf einen anderen SQL-Server zu �bertragen (nicht
notwendigerweise ein MySQL-Server). Der Dump enth�lt SQL-Statements, um
Datenbanken und Tabellen zu erzeugen und / oder Tabellen mit Daten zu
f�llen.

Wenn Sie eine Datensicherung auf dem Server machen, sollten Sie in Betracht
ziehen, statt dessen @code{mysqlhotcopy} zu benutzen. @xref{mysqlhotcopy, ,
@code{mysqlhotcopy}}.

@example
shell> mysqldump [OPTIONS] datenbank [tabellen]
OR     mysqldump [OPTIONS] --databases [OPTIONS] datenbank1 [datenbank2 datenbank3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
@end example

Wenn Sie keine Tabellen angeben oder @code{--databases} bzw.
@code{--all-databases} benutzen, wird die gesamte Datenbank (bzw. werden
alle Datenbanken) gedumpt.

Sie erhalten eine Auflistung der Optionen, die Ihre Version von
@code{mysqldump} unterst�tzt, indem Sie @code{mysqldump --help} eingeben.

Wenn Sie @code{mysqldump} ohne @code{--quick} oder @code{--opt} ausf�hren,
beachten Sie, dass @code{mysqldump} die gesamte Ergebnismenge in den
Arbeitsspeicher l�dt, bevor das Ergebnis gedumpt wird. Das kann zu
Problemen f�hren, wenn Sie eine gro�e Datenbank dumpen.

Wenn Sie eine neue Version des @code{mysqldump}-Programms benutzen und
einen Dump erzeugen, der in einen sehr alten MySQL-Server eingelesen werden
soll, sollten Sie die @code{--opt}- und @code{-e}-Optionen nicht benutzen.

@code{mysqldump} unterst�tzt folgende Optionen:

@table @code
@item --add-locks
F�hrt @code{LOCK TABLES} vor und @code{UNLOCK TABLE} nach jedem
Tabellen-Dump durch (um schnelleres Einf�gen in MySQL zu erreichen).
@item --add-drop-table
Ein @code{drop table} vor jedem @code{create}-Statement hinzuf�gen.
@item -A, --all-databases
Alle Datenbanken dumpen. Das ist dasselbe wie @code{--databases} mit allen
Datenbanken ausgew�hlt.
@item -a, --all
Alle MySQL-spezifischen Optionen f�r @code{create} benutzen.
@item --allow-keywords
Erzeugung von Spaltennamen zulassen, die Schl�sselw�rter sind. Das
funktioniert, indem jedem Spaltenname der Tabellenname als Pr�fix angef�gt
wird.
@item -c, --complete-insert
Vollst�ndige @code{insert}-Statements benutzen (mit Spaltennamen).
@item -C, --compress
Alle Informationen zwischen Client und Server komprimieren, wenn bei
Kompression unterst�tzen.
@item -B, --databases
Mehrere Datenbanken pr�fen. Beachten Sie den Unterschied im Gebrauch: In
diesem Fall werden keine Tabellen angegeben. Alle Namensargumente werden
als Datenbanknamen erachtet. Vor jeder Ausgabe einer neuen Datenbank wird
@code{USE datenbank;} eingef�gt.
@item --delayed
Zeilen mit dem @code{INSERT DELAYED}-Befehl einf�gen.
@item -e, --extended-insert
Die neue mehrzeilige @code{INSERT}-Syntax benutzen. (Ergibt kompaktere und
schnellere inserts-Statements.)
@item -#, --debug[=option_string]
Programmbenutzung tracen (f�r Debug-Zwecke).
@item --help
Hilfetext ausgeben und beenden.
@item --fields-terminated-by=...
@itemx --fields-enclosed-by=...
@itemx --fields-optionally-enclosed-by=...
@itemx --fields-escaped-by=...
@itemx --lines-terminated-by=...
Diese Optionen werden zusammen mit der @code{-T}-Option benutzt und haben
dieselbe Bedeutung wie die entsprechenden Klauseln f�r @code{LOAD DATA
INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.
@item -F, --flush-logs
Log-Datei im MySQL-Server zur�ckschreiben, bevor der Dump durchgef�hrt
wird.
@item -f, --force,
Fortfahren, selbst wenn beim Dump einer Tabelle ein SQL-Fehler auftritt.
@item -h, --host=..
Daten auf dem MySQL-Server auf dem genannten Host dumpen. Der
vorgabem��ige Host ist @code{localhost}.
@item -l, --lock-tables.
Alle Tabellen sperren, bevor mit dem Dump begonnen wird. Die Tabellen
werden mit @code{READ LOCAL} gesperrt, um gleichzeitiges Einf�gen zu
erlauben (bei @code{MyISAM}-Tabellen).
@item -n, --no-create-db
'CREATE DATABASE /*!32312 IF NOT EXISTS*/ datenbank;' wird nicht in die
Ausgabe gschrieben. Diese Zeile wird ansonsten hinzugef�gt, wenn
--databases oder --all-databases angegeben wurde.
@item -t, --no-create-info
Keine Tabellenerzeugungsinformation schreiben (das @code{CREATE
TABLE}-Statement).
@item -d, --no-data
Keine Zeileninformationen f�r die Tabelle schreiben. Das ist sehr
n�tzlich, wenn Sie lediglich einen Dump der Tabellenstruktur erzeugen
wollen.
@item --opt
Dasselbe wie @code{--quick --add-drop-table --add-locks --extended-insert
--lock-tables}. Das sollte den schnellstm�glichen Dump zum Einlesen in
einen MySQL-Server ergeben.
@item -pihr_passwort, --password[=ihr_passwort]
Das Passwort, das f�r die Verbindung zum Server benutzt werden soll. Wenn
Sie keinen @samp{=ihr_passwort}-Teil angeben, zeigt @code{mysqldump} eine
Eingabeaufforderung f�r Ihr Passwort.
@item -P port_num, --port=port_num
Die TCP/IP-Portnummer, die f�r die Verbindung zu einem Host benutzt werden
soll. (Diese wird f�r Verbindungen zu Hosts ausser @code{localhost}
benutzt, f�r den Unix-Sockets benutzt werden.)
@item  -q, --quick
Anfrage nicht puffern, sondern direkt zu stdout dumpen. Benutzt f�r die
Durchf�hrung @code{mysql_use_result()}.
@item -r, --result-file=...
Direkte Ausgabe in die angegebene Datei. Diese Ausgabe sollte bei MS-DOS
benutzt werden, weil sie verhindert, dass das Zeichen f�r neue Zeile '\n'
in '\n\r' (new line + carriage return) umgewandelt werden.
@item -S /pfad/zu/socket, --socket=/pfad/zu/socket
Die Socket-Datei, die f�r die Verbindung zu @code{localhost} benutzt werden
soll (was der vorgabem��ige Host ist).
@item --tables
�berschreibt die Option --databases (-B).
@item  -T, --tab=pfad-zu-einem-verzeichnis
Erzeugt eine @code{tabelle.sql}-Datei, die die SQL-CREATE-Befehle enth�lt,
und eine @code{tabelle.txt}-Datei, die die Daten enth�lt, f�r jede
angegebene Tabelle. @strong{HINWEIS}: Das funktioniert nur, wenn
@code{mysqldump} auf derselben Maschine l�uft wie der @code{mysqld}-Daemon.
Das Format der @code{.txt}-Datei h�ngt von den @code{--fields-xxx}- und
@code{--lines--xxx}-Optionen ab.
@item -u benutzername, --user=benutzername
Der MySQL-Benutzername, der f�r die Verbindung zum Server benutzt werden
soll. Der Vorgabewert ist Ihr Unix-Loginname. 
@item -O var=option, --set-variable var=option
Den Wert einer Variablen setzen. Die m�glichen Werte sind unten aufgef�hrt.
@item -v, --verbose
Geschw�tziger Modus. Gibt mehr Informationen dar�ber aus, was das Programm
tut.
@item -V, --version
Versionsinformationen ausgeben und beenden.
@item -w, --where='wo-bedingung'
Nur ausgew�hlte Datens�tze dumpen. Beachten Sie, dass Anf�hrungszeichen
zwingend erforderlich sind:

@example
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
@end example
@item -O net_buffer_length=#, where # < 16M
Beim Erzeugen von mehrzeiligen insert-Statements (wie bei der Option
@code{--extended-insert} oder @code{--opt}), erzeugt @code{mysqldump}
Zeilen bis zur L�nge von @code{net_buffer_length}. Wenn Sie diesen Wert
herauf setzen, m�ssen Sie sicherstellen, dass die
@code{max_allowed_packet}-Variable im MySQL-Server gr��er als
@code{net_buffer_length} ist.
@end table

Der h�ufigste Gebrauch von @code{mysqldump} dient wahrscheinlich der
Herstellung einer Datensicherung ganzer Datenbanken. @xref{Backup}.

@example
mysqldump --opt datenbank > datensicherung.sql
@end example

Diese k�nnen Sie zur�ck in MySQL einlesen mit:

@example
mysql datenbank < datensicherung.sql
@end example

oder

@example
mysql -e "source /pfad-zur-datensicherung/datensicherung.sql" datenbank
@end example

Ausserdem ist es sehr n�tzlich, um einen anderen MySQL-Server mit
Informationen aus einer Datenbank zu f�llen:

@example
mysqldump --opt datenbank | mysql ---host=entfernter-host -C datenbank
@end example

Es ist m�glich, mehrere Datenbanken mit einem Befehl zu dumpen:

@example
mysqldump --databases datenbank1 [datenbank2 datenbank3...] > meine_datenbanken.sql
@end example

Wenn Sie alle Datenbanken dumpen wollen, benutzen Sie:

@example
mysqldump --all-databases > alle_datenbanken.sql
@end example


@node mysqlhotcopy, mysqlimport, mysqldump, Client-Side Scripts
@c German node mysqlhotcopy
@subsection mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren

@cindex dumpen, Datenbanken
@cindex Datenbanken, dumpen
@cindex Tabellen, dumpen
@cindex Datensicherung, Datenbanken

@code{mysqlhotcopy} ist a perl Skript that uses @code{LOCK TABLES},
@code{FLUSH TABLES} und @code{cp} oder @code{scp} to quickly make a backup
of a Datenbank.  It's the fastest way to make a backup of the Datenbank,
of single Tabellen but it can only be run on the same machine where the
Datenbankverzeichnisse are.

@example
mysqlhotcopy datenbank [/pfad/zu/new_Verzeichnis]

mysqlhotcopy datenbank_1 ... datenbank_n /pfad/zu/new_Verzeichnis

mysqlhotcopy datenbank./regex/
@end example

@code{mysqlhotcopy} unterst�tzt folgende Optionen:

@table @code
@item -?, --help
Hilfe ausgeben und beenden.
@item -u, --user=# 
Benutzername zum Einloggen.
@item -p, --password=#
Passwort f�r die Verbindung zum Server.
@item -P, --port=# 
Port zur Verbindung zum lokalen Server.
@item -S, --socket=#
Socket zur Verbindung zum lokalen Server.
@item --allowold
Nicht abbrechen, wenn das Ziel bereits existiert (sondern in _old umbenennen)
@item --keepold
Vorheriges (jetzt umbenanntes) Ziel nach dem Durchf�hren nicht l�schen.
@item --noindices
Keine kompletten Index-Dateien in die Kopie einf�gen, um die Datensicherung
kleiner und schneller zu machen. Die Indexe k�nnen sp�ter mit
@code{myisamchk -rq.} neu aufgebaut werden.
@item --method=#
Kopiermethode (@code{cp} oder @code{scp}).
@item -q, --quiet
Keine Meldungen ausgeben, ausser bei Fehlern.
@item --debug
Debug anschalten.
@item -n, --dryrun
Aktionen berichten, ohne sie auszuf�hren.
@item --regexp=#
Alle Datenbanken mit �bereinstimmenden regexp-Namen sichern.
@item --suffix=#
Suffix f�r Namen kopierter Datenbanken.
@item --checkpoint=#
Checkpoint-Eingang in angegebene datenbank.tabelle einf�gen.
@item --flushlog
Log-Dateien zur�ckschreiben, sobald alle Tabellen gesperrt sind.
@item --tmpdir=#
Tempor�res Verzeichnis (anstelle von /tmp).
@end table

Geben Sie @code{perldoc mysqlhotcopy} ein, um eine vollst�ndigere
Dokumentation von @code{mysqlhotcopy} zu erhalten.

@code{mysqlhotcopy} liest die Gruppen @code{[client]} und
@code{[mysqlhotcopy]} aus den Optionsdateien.

Damit Sie @code{mysqlhotcopy} ausf�hren k�nnen, ben�tigen Sie Schreibrechte
im Datensicherungsverzeichnis, @code{SELECT}-Berechtigung auf die Tabellen,
die Sie kopieren wollen, und die MySQL-@code{Reload}-Berechtigung (damit
Sie @code{FLUSH TABLES} ausf�hren k�nnen).


@node mysqlimport, mysqlshow, mysqlhotcopy, Client-Side Scripts
@c German node mysqlimport
@subsection mysqlimport, Daten aus Textdateien importieren

@cindex importieren, Daten
@cindex Daten, importieren
@cindex Dateien, Text-
@cindex Textdateien, importieren
@cindex @code{mysqlimport}

@code{mysqlimport} stellt eine Kommandozeilen-Schnittstelle f�r das
@code{LOAD DATA INFILE} SQL-Statement zur Verf�gung. Die meisten Optionen
f�r @code{mysqlimport} entsprechen denselben Optionen f�r @code{LOAD DATA
INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.

@code{mysqlimport} wird wie folgt aufgerufen:

@example
shell> mysqlimport [optionen] datenbank textdatei1 [textdatei2....]
@end example

Bei jeder Textdatei, die auf der Kommandozeile angegeben wird, entfernt
@code{mysqlimport} jegliche Erweiterungen vom Dateinamen und benutzt das
Ergebnis, um festzulegen, in welche Tabelle der Dateiinhalt importiert
werden soll. Dateien namens @file{patient.txt}, @file{patient.text} und
@file{patient} beispielsweise w�rden alle in eine Tabelle namens
@code{patient} importiert werden.

@code{mysqlimport} unterst�tzt folgende Optionen:

@table @code
@item -c, --columns=...
Diese Option nimmt ein durch Kommas getrennte Auflistung von Feldnamen als
Argument entgegen. Die Feldliste wird benutzt, um einen korrekten
@code{LOAD DATA INFILE}-Befehl zu erzeugen, der an MySQL durchgereicht
wird. @xref{LOAD DATA, , @code{LOAD DATA}}.

@item -C, --compress
Komprimiert alle Informationen zwischen Client und Server, wenn bei
Kompression unterst�tzen.

@item -#, --debug[=option_string]
Programmbenutzung tracen (zum Debuggen).

@item -d, --delete
Tabelle leeren, bevor die Textdatei importiert wird.

@item --fields-terminated-by=...
@itemx --fields-enclosed-by=...
@itemx --fields-optionally-enclosed-by=...
@itemx --fields-escaped-by=...
@itemx --lines-terminated-by=...
Diese Optionen haben dieselbe Bedeutung wie die entsprechenden Klauseln f�r
@code{LOAD DATA INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.

@item -f, --force
Fehler ignorieren. Wenn beispielsweise eine Tabelle f�r eine Textdatei
nicht existiert, mit den verbleibenden Dateien weitermachen. Ohne
@code{--force} wird @code{mysqlimport} beendet, wenn die Tabelle nicht
existiert.

@item --help
Hilfetext ausgeben und beenden.

@item -h host_name, --host=host_name
Daten in den MySQL-Server auf dem genannten Host importieren. Der
vorgabem��ige Host ist @code{localhost}.

@item -i, --ignore
Siehe Beschreibung f�r die @code{--replace}-Option.

@item -l, --lock-tables
@strong{ALLE} Tabellen f�r Schreibvorg�nge sperren, bevor irgend welche
Textdateien verarbeitet werden. Das stellt sich, dass alle Tabellen auf dem
Server synchronisiert werden.

@item -L, --local
Liest Eingabedateien vom Client. Vorgabem��ig wird angenommen, dass
Textdateien auf dem Server liegen, wenn Sie sich �ber @code{localhost}
verbinden (was der vorgabem��ige Host ist).

@item -pihr_passwort, --password[=ihr_passwort]
Das Passwort, das f�r die Verbindung zum Server benutzt werden soll. Wenn
Sie keinen @samp{=ihr_passwort}-Teil angeben, zeigt @code{mysqlimport}
eine Eingabeaufforderung f�r Ihr Passwort.

@item -P port_num, --port=port_num
Die TCP/IP-Portnummer, die f�r die Verbindung zu einem Host benutzt werden
soll. (Diese wird f�r Verbindungen zu Hosts ausser @code{localhost}
benutzt, f�r den Unix-Sockets benutzt werden.)

@item -r, --replace
Die @code{--replace}- und @code{--ignore}-Optionen steuern die Handhabung
von Eingabe-Datens�tzen, die bestehende Datens�tze auf eindeutigen
Schl�sseln duplizieren w�rden. Wenn Sie @code{--replace} angeben, werden
bestehende Zeilen ersetzt, die denselben eindeutigen Schl�sselwert
besitzen. Wenn Sie @code{--ignore} angeben, werden Zeilen, die eine
bestehende Zeile duplizieren w�rden, �bersprungen. Wenn Sie keine der
beiden Optionen angeben, tritt ein Fehler auf, wenn ein doppelter
Schl�sseleintrag gefunden wird, und der Rest der Textdatei wird ignoriert.

@item  -s, --silent
Schweigsamer Modus.  Ausgaben erfolgen nur, wenn Fehler auftreten.

@item -S /pfad/zu/socket, --socket=/pfad/zu/socket
Die Socket-Datei, die f�r die Verbindung zu @code{localhost} benutzt werden
soll (der der vorgabem��ige Host ist).

@item -u benutzername, --user=benutzername
Der MySQL-Benutzername, der f�r die Verbindung zum Server benutzt werden
soll. Der Vorgabewert ist Ihr Unix-Loginname.

@item -v, --verbose
Geschw�tziger Modus. Mehr Informationen dar�ber ausgeben, was das Programm
macht.

@item -V, --version
Versionsinformationen ausgeben und beenden.
@end table

Hier ist ein Beispiel f�r die Benutzung von @code{mysqlimport}:

@example
$ mysql --version
mysql  Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
$ uname -a
Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
$ ed
a
100     Max Sydow
101     Graf Dracula
.
w imptest.txt
32
q
$ od -c imptest.txt
0000000   1   0   0  \t   M   a   x       S   y   d   o   w  \n   1   0
0000020   1  \t   G r a f       D   r   a   c   u   l   a  \n
0000040
$ mysqlimport --local test imptest.txt
test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
$ mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id   | n             |
+------+---------------+
|  100 | Max Sydow     |
|  101 | Graf Dracula  |
+------+---------------+
@end example


@node mysqlshow, perror, mysqlimport, Client-Side Scripts
@c German node mysqlshow
@subsection Datenbanken, Tabellen und Spalten anzeigen

@cindex Datenbanken, anzeigen
@cindex anzeigen, Datenbankinformationen
@cindex Tabellen, anzeigen
@cindex Spalten, anzeigen
@cindex Anzeigen, Datenbankinformationen

@code{mysqlshow} wird benutzt, um schnell nachzusehen, welche Datenbanken,
Tabellen und Tabellenspalten es gibt.

Mit dem @code{mysql}-Programm k�nnen Sie dieselben Information mit den
@code{SHOW}-Befehlen erhalten. @xref{SHOW}.

@code{mysqlshow} wird wie folgt aufgerufen:

@example
shell> mysqlshow [optionen] [datenbank [tabelle [spalte]]]
@end example

@itemize @bullet
@item
Wenn keine Datenbank angegeben wird, werden alle passenden Datenbanken
gezeigt.
@item
Wenn keine Tabelle angegeben wird, werden alle passenden Tabellen in der
Datenbank gezeigt.
@item
Wenn keine Spalte angegeben wird, werden alle passenden Spalten und
Spaltentypen in der Tabelle gezeigt.
@end itemize

Beachten Sie, dass Sie in neueren MySQL-Versionen nur die Datenbanken,
Tabellen und Spalten sehen k�nnen, f�r die Sie irgend welche Berechtigungen
haben.

Wenn das letzte Argument einen Shell- oder SQL-Platzhalter enth�lt
(@code{*}, @code{?}, @code{%} oder @code{_}), wird nur das gezeigt, was dem
Platzhalter entspricht. Das kann zu Verwirrung f�hren, wenn Sie Spalten
einer Tabelle anzeigen, die einen Unterstrich (@code{_}) enthalten, weil
Ihnen @code{mysqlshow} in diesem Fall nur die Tabellennamen zeigt, die dem
Muster entsprechen. Das kann leicht durch Hinzuf�gen eines zus�tzlichen
@code{%} am Ende der Kommandozeile (als separates Argument) behoben werden.


@node perror, Batch Commands, mysqlshow, Client-Side Scripts
@c German node perror
@subsection perror, Erkl�rung der Fehler-Codes

@cindex Fehlermeldungen, anzeigen
@cindex perror

@code{perror} wird benutzt, um Fehlermeldungen auszugeben. @code{perror}
wird wie folgt aufgerufen:

@example
shell> perror [optionen] [ERRORCODE [ERRORCODE...]]

For example:

shell> perror 64 79
Error code  64:  Machine ist not on the network
Error code  79:  Can not access a needed shared library
@end example

@code{perror} wird benutzt, um eine Beschreibung f�r einen
Systemfehler-Code anzuzeigen, oder einen Fehler-Code des
MyISAM/ISAM-Tabellen-Handlers. Die Fehlermeldungen sind haupts�chlich
abh�ngig vom Betriebssystem.


@node Batch Commands,  , perror, Client-Side Scripts
@c German node Stapelbefehle
@subsection Wie SQL-Befehle aus einer Textdatei laufen gelassen werden

@c FIX add the 'source' befehl

Der @code{mysql}-Client wird typischerweise interaktiv benutzt, wie folgt:

@example
shell> mysql datenbank
@end example

Es ist jedoch m�glich, Ihre SQL-Befehle in eine Datei zu schreiben und
@code{mysql} anzuweisen, ihre Eingaben aus dieser Datei zu lesen. Um das zu
tun, erzeugen Sie eine Textdatei @file{textdatei}, die die Befehle enth�lt,
die Sie ausf�hren wollen. Dann rufen Sie @code{mysql} wie gezeigt auf:

@example
shell> mysql datenbank < textdatei
@end example

Sie k�nnen Ihre Textdatei auch mit einem @code{USE datenbank}-Statement
beginnen lassen. In diesem Fall ist es nicht notwendig, den Datenbanknamen
auf der Kommandozeile anzugeben:

@example
shell> mysql < textdatei
@end example

@xref{Client-Side Scripts}.


@node Log Files, Replication, Client-Side Scripts, MySQL Database Administration
@c German node Log-Dateien
@section Die MySQL-Log-Dateien

@cindex Log-Dateien

MySQL hat mehrere unterschiedliche Log-Dateien, die Ihnen helfen k�nnen
herauszufinden, was innerhalb @code{mysqld} vor sich geht:

@multitable @columnfractions .3 .7
@item Die Fehler-Log-Datei @tab Probleme, die beim Start, beim Laufenlassen oder beim Anhalten von @code{mysqld} auftreten.
@item Die ISAM-Log-Datei @tab Loggt alle �nderungen in ISAM-Tabellen mit. Wird nur benutzt, um den ISAM-Code zu debuggen.
@item Die Anfragen-Log-Datei @tab Hergestellte Verbindungen und ausgef�hrte Anfragen.
@item Die Update-Log-Datei @tab Veraltet: Speichert Statements, die Daten ver�ndern.
@item Die Bin�r-Log-Datei @tab Speichert alle Statements, die etwas �ndern. Wird auch f�r Replikation benutzt.
@item Die Slow-Log-Datei @tab Speichert alle Anfragen, die l�nger als @code{long_query_time} zur Ausf�hrung ben�tigten oder keine Indexe benutzten.
@end multitable

Alle Log-Dateien liegen im @code{mysqld} Daten-Verzeichnis. Sie k�nnen
@code{mysqld} zwingen, die Log-Dateien neu zu �ffnen (oder in manchen
F�llen auf eine neue Log-Datei umzuschalten), indem Sie @code{FLUSH LOGS}
ausf�hren. @xref{FLUSH}.



@menu
* Error log::                   
* Query log::                   
* Update log::                  
* Binary log::                  
* Slow query log::              
* Log file maintenance::        
@end menu

@node Error log, Query log, Log Files, Log Files
@c German node Fehler-Log-Datei
@subsection Die Fehler-Log-Datei

@code{mysqld} schreibt alle Fehler nach stderr, die das
@code{safe_mysqld}-Skript in eine Datei namens @code{'hostname'.err}
umleitet. (Unter Windows schreibt @code{mysqld} direkt in die Datei
@file{\mysql\data\mysql.err}.)

Diese enth�lt Informationen, wann @code{mysqld} gestartet und angehalten
wurde und zus�tzlich jeden kritischen Fehler, der w�hrend der Laufzeit
passierte. Wenn @code{mysqld} unerwartet stirbt und @code{safe_mysqld} ihn
neu starten muss, schreibt @code{safe_mysqld} eine @code{restarted
mysqld}-Zeile in diese Datei. Diese Log-Datei enth�lt auch Warnungen, wenn
@code{mysqld} eine Tabelle bemerkt, die automatisch gepr�ft oder repariert
werden muss.

Auf manchen Betriebssystemen enth�lt die Fehler-Log-Datei einen
Stack-Trace, wo @code{mysqld} starb. Dieser kann benutzt werden, um
herauszufinden, wo @code{mysqld} starb. @xref{Using stack trace}.


@node Query log, Update log, Error log, Log Files
@c German node Anfragen-Log-Datei
@subsection Die allgemeine Anfragen-Log-Datei

@cindex Anfragen-Log-Datei
@cindex Dateien, Anfragen-Log-Datei

Wenn Sie wissen wollen, was innerhalb @code{mysqld} geschieht, sollten Sie
ihn mit @code{--log[=file]} starten. Diese Option loggt alle Verbindungen
und Anfragen in die Log-Datei (vorgabem��ig @file{'hostname'.log}
benannt). Diese Log-Datei kann sehr n�tzlich sein, wenn Sie einen Fehler in
einem Client vermuten und wissen wollen, was genau @code{mysqld} sich bei
dem dachte, was es vom Client geschickt bekam.

Vorgabem��ig startet das @code{mysql.server}-Skript den MySQL-Server mit
der @code{-l}-Option. Wenn Sie bessere Performance brauchen, wenn Sie MySQL
in einer Produktionsumgebung starten, k�nnen Sie die @code{-l}-Option aus
@code{mysql.server} entfernen oder sie zu @code{--log-binary} �ndern.

Die Eintr�ge in diese Log-Datei werden geschrieben, wenn @code{mysqld} die
Anfragen erh�lt. Die Reihenfolge kann vor derjenigen abweichen, in der die
Statements ausgef�hrt werden. Das steht im Gegensatz zur Update-Log-Datei
und zur Bin�r-Log-Datei, bei denen geschrieben wird, nachdem die Anfrage
ausgef�hrt wurde, aber bevor irgend welche Sperren aufgehoben werden.


@node Update log, Binary log, Query log, Log Files
@c German node Update-Log-Datei
@subsection Die Update-Log-Datei

@cindex Update-Log-Datei
@cindex Dateien, Update-Log-Datei

@strong{HINWEIS}: Die Update-Log-Datei wird durch die bin�re Log-Datei
ersetzt. @xref{Binary log}. Mit dieser k�nnen Sie alles machen, was
Sie mit der Update-Log-Datei machen k�nnen.

Wenn er mit der @code{--log-update[=datei]}-Option gestartet wird, schreibt
@code{mysqld} eine Log-Datei, die alle SQL-Befehle enth�lt, die Daten
aktualisieren. Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name
der Host-Maschine. Wenn ein Dateiname angegeben wird, der aber keine
Pfadangabe enth�lt, wird die Datei ins Daten-Verzeichnis geschrieben. Wenn
@file{datei} keine Erweiterung hat, erzeugt @code{mysqld} eine Log-Datei,
die er wie folgt benennt: @file{datei.###}, wobei @code{###} eine Zahl ist,
die jedes Mal hochgez�hlt wird, wenn Sie @code{mysqladmin refresh} oder
@code{mysqladmin flush-logs} oder das @code{FLUSH LOGS}-Statement
ausf�hren, oder wenn Sie den Server neu starten.

@strong{HINWEIS:} Damit das dargestellte Schema funktioniert, sollten Sie
NICHT eigene Dateien mit demselben Dateinamen wie die Update-Log-Datei plus
Erweiterungen, die als die hochgez�hlte Zahl betrachtet werden k�nnten, im
Verzeichnis anlegen, das von der Update-Log-Datei benutzt wird!

Wenn Sie die @code{--log} oder @code{-l}-Optionen benutzen, schreibt
@code{mysqld} eine allgemeine Log-Datei mit dem Dateinamen
@file{hostname.log}. Neustarts und Refresh-Operationen f�hren dann nicht
dazu, dass eine neue Log-Datei erzeugt wird (obwohl diese geschlossen und
wieder ge�ffnet wird). In diesem Fall k�nnen Sie sie (unter Unix) wie folgt
kopieren:

@example
mv hostname.log hostname-old.log
mysqladmin flush-logs
cp hostname-old.log ins-datensicherungs-verzeichnis
rm hostname-old.log
@end example

Das Mitloggen mittels der Update-Log-Datei ist clever, weil es nur
Statements loggt, die tats�chlich Daten aktualisieren. Wenn ein
@code{UPDATE} oder ein @code{DELETE} mit einem @code{WHERE} keine passenden
Zeilen findet, wird nichts in die Log-Datei geschrieben. Es werden sogar
@code{UPDATE}-Statements �bersprungen, die eine Spalte auf einen Wert
setzen, die sie bereits hat.

Das Schreiben in die Update-Log-Datei wird unmittelbar durchgef�hrt,
nachdem eine Anfrage fertig ist, aber bevor irgend welche Sperren
aufgehoben sind oder irgendein Commit durchgef�hrt wurde. Das stellt
sicher, dass die Log-Datei stets in der Reihenfolge der Ausf�hrung
mitschreibt.

Wenn Sie eine Datenbank von Update-Log-Datei-Dateien aktualisieren wollen,
k�nnten Sie folgendes tun (angenommen, Ihre Update-Log-Dateien haben Namen
der Form @file{datei.###}):

@example
shell> ls -1 -t -r datei.[0-9]* | xargs cat | mysql
@end example

@code{ls} wird benutzt, um alle Log-Dateien in der richtigen Reihenfolge zu
erhalten.

Das ist n�tzlich, wenn Sie Datensicherungsdateien nach einem Absturz
zur�ckspielen m�ssen und die Aktualisierungen neu ausf�hren wollen, die
zwischen der Zeit der Datensicherung und dem Absturz lagen.


@node Binary log, Slow query log, Update log, Log Files
@c German node Bin�r-Log-Datei
@subsection Die bin�re Update-Log-Datei

@cindex Bin�r-Log-Datei
@cindex Dateien, Bin�r-Log-Datei

In Zukunft wird die Bin�r-Log-Datei die Update-Log-Datei ersetzen, daher
empfehlen wir, dass Sie so bald wie m�glich zu diesem Log-Format wechseln!

Die Bin�r-Log-Datei enth�lt alle Informationen, die im Update-Log verf�gbar
sind, in einem effizienteren Format. Sie enth�lt ausserdem Informationen
dar�ber, wie lange jede Anfrage brauchte, die die Datenbank aktualisierte.

Die Bin�r-Log-Datei wird auch benutzt, wenn Sie einen Slave von einem
Master replizieren. @xref{Replication}.

Mit der @code{--log-bin[=datei]}-Option gestartet, schreibt @code{mysqld}
eine Log-Datei, die alle SQL-Befehle enth�lt, die Daten aktualisieren. Wenn
kein Dateiname angegeben wird, ist die Vorgabe der Name der Host-Machine,
gefolgt von @code{-bin}. Wenn der Dateiname angegeben wird, aber keine
Pfadangabe enth�lt, wird die Datei ins Daten-Verzeichnis geschrieben.

Sie k�nnen folgende Optionen f�r @code{mysqld} benutzen, um zu
beeinflussen, was in die Bin�r-Log-Datei geschrieben wird:

@multitable @columnfractions .4 .6
@item @code{binlog-do-db=datenbank} @tab
Weist den Master an, Aktualisierungen f�r die angegebene Datenbank zu
loggen und alle anderen, nicht explizit erw�hnten, auszuschlie�en.
(Beispiel: @code{binlog-do-db=eine_datenbank})

@item @code{binlog-ignore-db=datenbank} @tab
Weist den Master an, Aktualisierungen f�r die angegebene Datenbank nicht in
die Bin�r-Log-Datei zu loggen (Beispiel:
@code{binlog-ignore-db=eine_datenbank}).
@end multitable

@code{mysqld} h�ngt dem Bin�r-Log-Datei-Dateinamen eine Erweiterung an, die
eine Zahl ist, die jedes Mal heraufgez�hlt wird, wenn Sie @code{mysqladmin
refresh}, @code{mysqladmin flush-logs} oder ein @code{FLUSH LOGS}-Statement
ausf�hren oder den Server neu starten.

Damit Sie feststellen k�nnen, welche verschiedenen Bin�r-Log-Datei-Dateien
benutzt wurden, erzeugt @code{mysqld} auch eine Bin�r-Log-Index-Datei, die
die Namen aller benutzten Bin�r-Log-Datei-Dateien enth�lt. Vorgabem��ig
hat diese denselben Namen wie die Bin�r-Log-Datei, mit der Erweiterung
@code{'.index'}. Sie k�nnen den Namen der Bin�r-Log-Index-Datei mit der
@code{--log-bin-index=[filename]}-Option �ndern.

Wenn Sie Replikation benutzen, sollten Sie keine alten Bin�r-Log-Dateien
l�schen, bis Sie sicher sind, dass kein Slave sie jemals wieder ben�tigen
wird. Eine Art, das zu tun, ist, einmal pro Tag @code{mysqladmin
flush-logs} auszuf�hren, und danach alle Logs zu entfernen, die �lter als 3
Tage sind.

Sie k�nnen die Bin�r-Log-Datei mit dem @code{mysqlbinlog}-Befehl
untersuchen. Beispielsweise k�nnen Sie einen MySQL-Server wie folgt aus der
Bin�r-Log-Datei aktualisieren:

@example
mysqlbinlog log-file | mysql -h server_name
@end example

Sie k�nnen auch das @code{mysqlbinlog}-Programm benutzen, um die
Bin�r-Log-Datei direkt von einem entfernten MySQL-Server zu lesen!

@code{mysqlbinlog --help} gibt Ihnen weitere Informationen zur Benutzung
dieses Programms.

Wenn Sie @code{BEGIN [WORK]} oder @code{SET AUTOCOMMIT=0} verwenden, m�ssen
Sie die MySQL-Bin�r-Log-Datei f�r Datensicherungen anstelle der alten
Update-Log-Datei benutzen.

Das Loggen in die Bin�r-Log-Datei wird unmittelbar nach jeder Anfrage
geschrieben, aber bevor irgend welche Sperren aufgehoben wurden oder irgend
ein Commit durchgef�hrt wurde. Das stellt sicher, dass die Log-Datei in der
Reihenfolge der Ausf�hrung mitschreibt.

Alle Aktualisierungen (@code{UPDATE}, @code{DELETE} oder @code{INSERT}),
die eine transaktionale Tabelle (like BDB-Tabellen) �ndern, werden bis zu
einem @code{COMMIT} gecachet. Jegliche Aktualisierungen auf eine nicht
transaktionale Tabelle werden sofort in der Bin�r-Log-Datei gespeichert.
Jedem Thread wird beim Start ein Puffer der Gr��e @code{binlog_cache_size}
f�r die Pufferung von Anfragen zugewiesen. Wenn eine Anfrage gr��er als
dieser ist, �ffnet der Thread eine tempor�re Datei, um den gr��eren Cache
zu handhaben. Die tempor�re Datei wird gel�scht, wenn der Thread beendet
wird.

@code{max_binlog_cache_size} kann dazu benutzt werden, um die gesamte
benutzte Gr��e zu begrenzen, und um eine Anfrage aus mehreren
Transaktionen zu cachen.

Wenn Sie die Update- oder Bin�r-Log-Datei benutzen, funktionieren
gleichzeitige Einf�geoperationen nicht im Zusammenhang mit @code{CREATE ...
INSERT} und @code{INSERT ... SELECT}. Damit stellen Sie sicher, dass Sie
eine exakte Kopie Ihrer Tabellen wieder herstellen k�nnen, indem Sie die
Log-Datei auf eine Datensicherung anwenden.


@node Slow query log, Log file maintenance, Binary log, Log Files
@c German node Langsame-Anfragen-Log-Datei
@subsection Die Anfragen-Log-Datei f�r langsame Anfragen

@cindex Langsame-Anfragen-Log-Datei
@cindex Dateien, Langsame-Anfragen-Log-Datei

Mit der @code{--log-slow-queries[=datei]}-Option gestartet schreibt
@code{mysqld} eine Log-Datei, die alle SQL-Befehle enth�lt, die l�nger als
@code{long_query_time} zur Ausf�hrung brauchten. Die Zeit, um die
anf�nglichen Tabellensperren zu erhalten, wird nicht zur Ausf�hrungszeit
hinzugez�hlt.

Anfragen-Log-Datei f�r langsame Anfragen wird geschrieben, nachdem jede
Anfrage ausgef�hrt wurde und nachdem alle Sperren aufgehoben wurden. Das
kann von der Reihenfolge abweichen, in der die Statements ausgef�hrt
wurden.

Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name der
Host-Maschine mit dem Suffix @code{-slow.log}. Wenn ein Dateiname angegeben
wird, der aber keine Pfadangabe enth�lt, wird die Datei ins Daten-Verzeichnis geschrieben. 

Die Anfragen-Log-Datei f�r langsame Anfragen kann benutzt werden, um
Anfragen zu finden, die f�r die Ausf�hrung lange Zeit ben�tigen und daher
Kandidaten f�r Optimierungen sind, was bei einer gro�en Log-Datei
allerdings eine schwierige Aufgabe werden kann. Sie k�nnen die
Anfragen-Log-Datei f�r langsame Anfragen durch den
@code{mysqldumpslow}-Befehl durchschleifen (pipen), um eine Zusammenfassung
der Anfragen zu erhalten, die in der Log-Datei erscheinen.

Wenn Sie @code{--log-long-format} benutzen, erscheinen auch Anfragen, die
keine Indexe benutzen. @xref{Command-line options}.


@node Log file maintenance,  , Slow query log, Log Files
@c German node Log-Datei-Wartung
@subsection Wartung und Pflege der Log-Dateien

@cindex Dateien, Log-Dateien
@cindex Wartung, Log-Dateien
@cindex Log-Dateien, Wartung

MySQL hat viele Log-Dateien, die es leicht machen festzustellen, was vor
sich geht. @xref{Log Files}. Von Zeit zu Zeit jedoch muss man hinter
@code{MySQL} saubermachen, damit die Log-Dateien nicht zu viel
Festplattenplatz in Anspruch nehmen.

Wenn Sie MySQL mit Log-Dateien benutzen, werden Sie von Zeit zu Zeit alte
Log-Dateien entfernen wollen und MySQL mitteilen, in neue Dateien zu
loggen. @xref{Backup}.

Bei einer Linux-(@code{RedHat})-Installation k�nnen Sie hierf�r das
@code{mysql-log-rotate}-Skript benutzen. Wenn Sie MySQL von einer
RPM-Distribution installiert haben, sollte das Skript automatisch
installiert worden sein. Beachten Sie, dass Sie damit vorsichtig umgehen
sollten, wenn Sie die Log-Datei f�r Replikation benutzen!

Auf anderen Systemen m�ssen Sie selbst ein kurzes Skript installieren, dass
Sie von @code{cron} starten k�nnen, um Log-Dateien zu handhaben.

Sie k�nnen MySQL zwingen, mit neuen Log-Dateien zu starten, indem Sie
@code{mysqladmin flush-logs} oder den SQL-Befehl @code{FLUSH LOGS}
benutzen. Wenn Sie MySQL-Version 3.21 benutzen, m�ssen Sie @code{mysqladmin
refresh} benutzen.

Der obige Befehl macht folgendes:

@itemize @bullet
@item
Wenn standardm��iges Loggen (@code{--log}) oder Loggen langsamer Anfragen
(@code{--log-slow-queries}) benutzt wird, wird die Log-Datei geschlossen
und wieder ge�ffnet (@file{mysql.log} und @file{`hostname`-slow.log} als
Vorgabe).
@item
Wenn Update-Logging (@code{--log-update}) benutzt wird, wird die
Update-Log-Datei geschlossen und eine neue Log-Datei mit einer h�heren
Log-Zahl ge�ffnet.
@end itemize

Wenn Sie nur eine Update-Log-Datei benutzen, m�ssen Sie die Log-Dateien nur
auf Platte zur�ckschreiben (flush) und dann die alten
Update-Log-Datei-Dateien zu einer Datensicherungsdatei verschieben. Wenn
Sie normales Loggen benutzen, k�nnen Sie etwas wie das Folgende tun:

@example
shell> cd mysql-data-verzeichnis
shell> mv mysql.log mysql.old
shell> mysqladmin flush-logs
@end example

Und dann eine Datensicherung nehmen und @file{mysql.old} entfernen.


@node Replication,  , Log Files, MySQL Database Administration
@c German node Replikation
@section Replikation bei MySQL

@cindex Replikation
@cindex erh�hen, Geschwindigkeit
@cindex Geschwindigkeit, erh�hen
@cindex Datenbanken, replizieren


Dieses Kapitel beschreibt die verschiedenen Replikationsfeatures in MySQL.
Es dient als Referenz f�r die Optionen, die bei Replikation verf�gbar sind.
Sie erhalten eine Einf�hrung in die Replikation und lernen, wie Sie sie
implementieren. Am Ende des Kapitels werden einige h�ufige gestellte Fragen
und die dazugeh�rigen Antworten aufgelistet sowie Beschreibungen der
Probleme und wie man sie l�st.


@menu
* Replication Intro::           
* Replication Implementation::  
* Replication HOWTO::           
* Replication Features::        
* Replication Options::         
* Replication SQL::             
* Replication FAQ::             
* Replication Problems::        
@end menu

@node Replication Intro, Replication Implementation, Replication, Replication
@c German node Einf�hrung in die Replikation
@subsection Einf�hrung in die Replikation

Einweg-Replikation wird benutzt, um sowohl Stabilit�t als auch
Geschwindigkeit zu steigern. Was Stabilit�t betrifft, haben Sie zwei
M�glichkeiten und k�nnen zur M�glichkeit der Datensicherung zur�ckkehren,
wenn Sie Probleme mit dem Master haben. Die Geschwindigkeitssteigerung wird
dadurch erreicht, dass ein Teil der Anfragen, die nichts aktualisieren, an
den Replikationsserver geschickt werden. Das funktioniert naturgem�� nur
dann, wenn Anfragen, die nichts aktualisieren, �berwiegen, aber das ist der
Normalfall.

@c German FIX changes @xref to @pxref (because it's in parenthesis).
Ab Version 3.23.15 unterst�tzt MySQL intern Einweg-Replikation. Ein Server
agiert als Master, der andere als Slave. Beachten Sie, dass ein Server
beide Rolle - als Master und als Slave - in einem Paar spielen kann. Der
Master h�lt eine Bin�r-Log-Datei der Aktualisierungen vor
(@pxref{Binary log}) sowie eine Index-Datei f�r Bin�r-Log-Dateien, um
hinsichtlich der Log-Rotation auf dem Laufenden zu bleiben. Der Slave
informiert den Master beim Verbinden dar�ber, wo er seit der letzten
erfolgreich durchgef�hrten Aktualisierung aufgeh�rt hat, schlie�t zu den
Aktualisierungen auf, blockiert danach und wartet darauf, dass ihn der
Master �ber neue Aktualisierungen informiert.

Beachten Sie, dass alle Aktualisierungen auf eine Datenbank, die repliziert
wird, durch den Master durchgef�hrt werden sollten!

Ein weiterer Vorteil von Replikation ist, dass man permanente (live)
Datensicherungen vom System erh�lt, wenn man die Datensicherung auf dem
Slave durchf�hrt statt auf dem Master. @xref{Backup}.


@node Replication Implementation, Replication HOWTO, Replication Intro, Replication
@c German node Replikationsimplementation
@subsection Replikationsimplementation

@cindex Master-Slave-Einrichtung

@c German FIX changes @xref to @pxref (because it's in parenthesis).
MySQL-Replikation basiert darauf, dass der Server alle �nderungen Ihrer
Datenbank im Bin�r-Log verfolgt (Updates, Deletes usw.)
(@pxref{Binary log}) und der oder die Slave-Server die gespeicherten
Anfragen aus der Bin�r-Log-Datei des Masters lesen, so dass der Slave
dieselben Anfragen auf seine Kopie der Daten ausf�hren kann.

Es ist @strong{sehr wichtig} sich klarzumachen, dass die Bin�r-Log-Datei
schlicht eine Aufzeichnung ist, die ab einem festen Zeitpunkt an startet
(ab dem Moment, wo Sie Bin�r-Loggen starten). Alle Slaves, die Sie
aufsetzen, ben�tigen Kopien aller Daten vom Master, wie Sie zu dem
Zeitpunkt existierten, als Bin�r-Loggen auf dem Master aktiviert wurde.
Wenn Sie Ihre Slaves mit Daten starten, die nicht mit dem �bereinstimmen,
was auf dem Master war, @strong{als die Bin�r-Log-Datei gestartet wurde},
funktionieren Ihre Slaves wom�glich nicht richtig.

Eine zuk�nftige Version (4.0) von MySQL wird die Notwendigkeit beseitigen,
(eventuell gro�e) Schnappsch�sse von Daten f�r neue Slaves vorzuhalten,
die Sie �ber die Live-Datensicherungs-Funktionalit�t aufsetzen wollen,
wobei kein Sperren (Locking) erforderlich ist. Zu dieser Zeit ist es jedoch
notwendig, alle Schreibzugriffe entweder mit einer globalen Lese-Sperre
oder durch das Herunterfahren des Masters zu blockieren, w�hrend man einen
Schnappschuss anlegt.

Sobald ein Slave korrekt konfiguriert ist und l�uft, verbindet er sich
einfach mit dem Master und wartet darauf, dass Aktualisierung ausgef�hrt
werden. Wenn der Master abgeschaltet wird oder der Slave die Verbindung zum
Master verliert, versucht er alle @code{master-connect-retry} Sekunden,
sich neu zu verbinden, bis er sich neu verbinden kann, und nimmt dann das
Warten auf Aktualisierungen wieder auf.

Jeder Slave achtet darauf, wo er aufgeh�rt hat. Der Master-Server wei�
nicht, wie viele Slaves es gibt oder welche zu einem gegebenen Zeitpunkt
auf aktuellem Stand sind.

Der n�chste Abschnitt erl�utert den Master-Slave-Einrichtungsprozess
detaillierter.


@node Replication HOWTO, Replication Features, Replication Implementation, Replication
@c German node Wie man Replikation aufsetzt
@subsection Wie man Replikation aufsetzt

Unten findet sich eine kurze Beschreibung, wie Sie komplette Replikation
auf Ihrem aktuellen MySQL-Server einrichten k�nnen. Es wird angenommen,
dass Sie alle Ihre Datenbanken replizieren wollen und bislang Replikation
noch nicht konfiguriert haben. Sie m�ssen Ihren Master-Server kurz herunter
fahren, um die unten stehenden Schritte fertigzustellen.

@enumerate
@item
Stellen Sie sicher, dass Sie eine aktuelle Version von MySQL auf dem Master
und dem Slave oder den Slaves haben.

Benutzen Sie Version 3.23.29 oder h�her. Vorherige Releases benutzten ein
anderes Bin�r-Log-Format und hatten Bugs, die in neueren Releases behoben
wurden. Bitte berichten Sie keine Bugs, bevor Sie best�tigen k�nnen, dass
das Problem im neuesten Release beobachtet werden kann.

@item
Richten Sie einen speziellen Replikationsbenutzer auf dem Master mit der
@code{FILE}-Berechtigung und Berechtigungen, sich von allen Slaves aus zu
verbinden, ein. Wenn der Benutzer ausschlie�lich Replikation durchf�hrt
(was empfohlen wird), m�ssen Sie ihm keine zus�tzlichen Berechtigungen
geben.

Erzeugen Sie zum Beispiel einen Benutzer namens @code{repl}, der auf Ihren
Master von jedem Host aus zugreifen kann, mit folgendem Befehl:

@example
GRANT FILE ON *.* TO repl@@"%" IDENTIFIED BY 'passwort';
@end example

@item
Fahren Sie den MySQL-Master herunter:

@example
mysqladmin -u root -ppasswort shutdown
@end example

@item
Machen Sie einen Schnappschuss aller Daten auf Ihrem Master-Server.

Die einfachste Art, das (unter Unix) zu tun, ist, einfach @strong{tar} zu
benutzen, um ein Archiv Ihre gesamten Daten-Verzeichnisses zu erzeugen. Der
genaue Speicherort Ihres Daten-Verzeichnisses h�ngt von Ihrer Installation
ab.

@example
tar -cvf /tmp/mysql-snapshot.tar /pfad/zu/data-dir
@end example

Windows-Benutzer k�nnen WinZip oder �hnliche Software benutzen, um ein
Archiv des Daten-Verzeichnisses anzulegen.

@item
In der Datei @code{my.cnf} f�r den Master f�gen Sie @code{log-bin} und
@code{server-id=eindeutige_nummer} zum @code{[mysqld]}-Abschnitt und hinzu
und starten Sie den Server neu. Es ist sehr wichtig, dass die ID auf dem
Slave sich von der ID auf dem Master unterscheidet. Denken Sie sich
@code{server-id} als etwas, dass einer IP-Adresse �hnlich ist - es
identifiziert in der Gemeinschaft der Replikationspartner die
Server-Instanz eindeutig.

@example
[mysqld]
log-bin
server-id=1
@end example

@item
Starten Sie den MySQL-Master neu.

@item
F�gen Sie auf dem Slave oder den Slaves folgendes zur Datei
@code{my.cnf} hinzu:

@example
master-host=hostname_des_masters
master-user=replikations_benutzername
master-password=replikations_benutzerpasswort
master-port=TCP/IP-Port_f�r_master>
server-id=eine_eindeutige_nummer_zwischen_2_und_2^32-1
@end example

Ersetzen Sie die Beispielwerte durch etwas, was f�r Ihr System stimmig ist.

@code{server-id} muss f�r jeden Partner, der an Replikation teilnimmt,
unterschiedlich sein. Wenn Sie keine server-id angeben, wird sie auf 1
gesetzt, falls Sie @code{master-host} nicht definiert haben, ansonsten wird
sie auf 2 gesetzt. Beachten Sie f�r den Fall, dass sie @code{server-id}
weglassen, dass der Master Verbindungen von allen Slaves verweigert und die
Slaves verweigern werden, sich mit dem Master zu verbinden. Daher ist das
Weglassen der @code{server-id} nur dann eine gute Idee, wenn Sie es nur f�r
Datensicherungen mit einer Bin�r-Log-Datei verwenden.


@item
Kopieren Sie die Schnappschuss-Daten in Ihr Daten-Verzeichnis auf Ihrem
Slave oder Ihren Slaves. Stellen Sie sicher, dass die Berechtigungen auf
die Dateien und Verzeichnisse korrekt sind. Der Benutzer, unter dem MySQL
l�uft, muss in der Lage sein, sie zu lesen und zu schreiben, genau wie auf
dem Master.

@item Starten Sie den Slave oder die Slaves neu.

@end enumerate

Nachdem Sie das Obige durchgef�hrt haben, sollten sich die Slaves mit dem
Master verbinden k�nnen und alle Aktualisierungen mitbekommen, die nach der
Aufnahme des Schnappschusses passieren.


Wenn Sie vergessen haben, die @code{server-id} f�r den Slave zu setzen,
erhalten Sie folgenden Fehler in der Fehler-Log-Datei:

@example
Warning: one should set server_id to a non-0 value if master_host ist set.
The server will not act as a slave.
@end example

Wenn Sie vergessen haben, selbiges f�r den Master zu machen, sind die
Slaves nicht in der Lage, sich mit dem Master zu verbinden.

Wenn ein Slave aus irgend welchen Gr�nden nicht in der Lage ist zu
replizieren, finden Sie Fehlermeldungen in der Fehler-Log-Datei auf dem
Slave.

Sobald ein Slave repliziert, finden Sie eine Datei namens
@code{master.info} im selben Verzeichnis, wo auch Ihre Fehler-Log-Datei
liegt. Die @code{master.info}-Datei wird vom Slave benutzt, um auf dem
Laufenden zu bleiben, wie viel der Bin�r-Log-Datei des Masters er bereits
abgearbeitet hat. Sie sollten die Datei @strong{NICHT} entfernen oder
editieren, es sei denn, Sie wissen genau, was Sie tun. Selbst in diesem
Fall sollten Sie vorzugsweise den @code{CHANGE MASTER TO}-Befehl benutzen.




@node Replication Features, Replication Options, Replication HOWTO, Replication
@c German node Replikationsfeatures
@subsection Replikationsfeatures und bekannte Probleme

@cindex Optionen, Replikation
@cindex @code{my.cnf}-Datei
@cindex Dateien,@code{my.cnf}

Unten steht eine Erl�uterung dessen, was unterst�tzt wird und was nicht:

@itemize @bullet
@item
Replikation l�uft korrekt mit @code{AUTO_INCREMENT}-,
@code{LAST_INSERT_ID}- und @code{TIMESTAMP}-Werten.
@item
@code{RAND()} bei Updates repliziert nicht korrekt. Benutzen Sie
@code{RAND(ein_nicht_zufalls_ausdruck)}, wenn Sie Updates mit
@code{RAND()} replizieren. Sie k�nnen zum Beispiel @code{UNIX_TIMESTAMP()}
als Argument f�r @code{RAND()} benutzen.
@item
Sie m�ssen auf Master und Slave denselben Zeichensatz
(@code{--default-character-set}) benutzen. Wenn nicht, erhalten Sie
eventuell Fehler wegen doppelter Schl�sseleintr�ge (duplicate key) auf dem
Slave, weil ein Schl�ssel, der auf dem Master als eindeutig betrachtet
wird, das in einem anderen Zeichensatz eventuell nicht ist.
@item
@code{LOAD DATA INFILE} wird korrekt gehandhabt, solange die Datei zur Zeit
der Update-Ausf�hrung noch auf dem Master-Server liegt. @code{LOAD LOCAL
DATA INFILE} wird �bersprungen.
@item
Aktualisierungsanfragen, die Benutzer-Variablen benutzen, sind (noch) nicht
replikationssicher.
@item
@code{FLUSH}-Befehle werden nicht in der Bin�r-Log-Datei gespeichert und
werden deswegen nicht auf den Slaves repliziert. Das stellt normalerweise
kein Problem dar, weil @code{FLUSH} nichts �ndert. In Bezug auf die
@code{MySQL}-Berechtigungstabellen hei�t das jedoch, dass Sie bei direkten
�nderungen in diesen Tabellen ohne Benutzung des @code{GRANT}-Statements
und der anschlie�enden Replikation der
@code{MySQL}-Berechtigungs-Datenbank auf den Slaves @code{FLUSH PRIVILEGES}
ausf�hren m�ssen, damit die neuen Berechtigungen wirksam werden.
@item
Tempor�re Tabellen werden ab Version 3.23.29 korrekt repliziert,
ausgenommen im Fall, dass Sie den Slave-Server schlie�en (nicht nur den
Slave-Thread), Sie noch einige tempor�re Tabellen offen haben und diese bei
nachfolgenden Aktualisierungen benutzt werden. Um mit diesem Problem fertig
zu werden, schlie�en Sie den Slave mit @code{SLAVE STOP} und pr�fen dann
die @code{Slave_open_temp_tables}-Variable, um zu sehen, ob Sie 0 ist. Dann
f�hren Sie @code{mysqladmin shutdown} aus. Wenn die Variable nicht 0 ist,
starten Sie den Slave-Thread neu mit @code{SLAVE START} und probieren es
noch einmal. Zuk�nftig (ab Version 4.0) wird es eine sauberere L�sung
geben.
In fr�heren Versionen wurden tempor�re Tabellen nicht korrekt repliziert.
Wir empfehlen, dass Sie entweder auf eine neuere Version aktualisieren oder
vor allen Anfragen mit tempor�ren Tabellen @code{SET SQL_LOG_BIN=0} auf
alle Clients ausf�hren.
@item
MySQL unterst�tz nur einen Master und viele Slaves. In Version 4.x wird ein
Abstimmungsalgorithmus eingebaut, der automatisch den Master umschaltet,
wenn etwas mit dem aktuellen Master schief geht. Ausserdem werden wir
'Agenten'-Prozesse einf�hren, die bei der Lastverteilung helfen, indem sie
SELECT-Anfragen an verschiedene Slaves senden.
@item
Ab Version 3.23.26 ist es sicher, Server in einer zirkul�ren
Master-Slave-Beziehung mit angeschaltetem @code{log-slave-updates} zu
verbinden. Beachten Sie jedoch, dass bei dieser Art von Einrichtung viele
Anfrage nicht richtig funktionieren, es sei denn, Ihr Client-Code ist so
geschrieben, dass er sich um m�gliche Probleme k�mmert, die durch
Aktualisierungen auftreten k�nnen, die in unterschiedlicher Reihenfolge auf
verschiedenen Servern laufen.

Das bedeutet, dass Sie eine Einrichtung wie die folgende machen k�nnen:

@example
A -> B -> C -> A
@end example

Diese Einrichtung funktioniert nur dann, wenn Sie ausschlie�lich
Aktualisierungen ausf�hren, die nicht zwischen den Tabellen zu Konflikten
f�hren. Mit anderen Worten, wenn Sie Daten in A und C einf�gen, sollten Sie
nie eine Zeile in A einf�gen, die zu einem Konflikt mit einem Schl�sselwert
bei einem Zeilen-Einf�gevorgang in C f�hrt. Ebenfalls sollte Sie nie
dieselben Zeilen auf zwei Servern einf�gen, wenn die Reihenfolge, in der
die Aktualisierungen durchgef�hrt werden, eine Rolle spielt.

Beachten Sie, dass sich das Log-Format in Version 3.23.26 ge�ndert hat, so
das Slaves vor Version 3.23.26 diese nicht lesen k�nnen.
@item
Wenn die Anfrage auf dem Slave zu einem Fehler f�hrt, beendet sich der
Slave-Thread und in der @code{.err}-Datei erscheint eine Meldung. Sie
sollten sich dann manuell mit dem Slave verbinden, die Ursache des Fehlers
beheben (zum Beispiel nicht existierende Tabellen) und dann den SQL-Befehl
@code{SLAVE START} laufen lassen (verf�gbar ab Version 3.23.16). In Version
3.23.15 m�ssen Sie den Server neu starten.
@item
Wenn die Verbindung zum Master verloren geht, versucht der Slave
unmittelbar, sich neu zu verbinden, und wenn das fehlschl�gt, alle
@code{master-connect-retry} Sekunden (Vorgabe 60 Sekunden). Deswegen ist es
sicher, den Master herunter zu fahren und dann nach einer Weile wieder
hochzufahren. Der Slave ist auch in der Lage, mit
Netzwerk-Verbindungsausf�llen umzugehen.
@item
Den Slave (sauber) herunterzufahren ist ebenfalls sicher, weil er sich
merkt, wo er aufgeh�rt hat. Unsauberes Herunterfahren kann zu Problemen
f�hren, insbesondere dann, wenn der Platten-Cache nicht synchronisiert
wurde, als das System starb. Die Fehlertoleranz Ihres Systems wird stark
verbessert, wenn Sie ein gutes UPS haben.
@item
Wenn der Master auf einem Port auf Anfragen wartet, der nicht Standard ist,
m�ssen Sie diesen mit dem @code{master-port}-Parameter in @code{my.cnf}
angeben.
@item
In Version 3.23.15 werden alle Tabellen und Datenbanken repliziert. Ab
Version 3.23.16 k�nnen Sie die Replikation mit der
@code{replicate-do-db}-Anweisung in @code{my.cnf} auf einen Satz von
Datenbanken beschr�nken oder einen Satz von Datenbanken mit
@code{replicate-ignore-db} ausschlie�en. Beachten Sie, dass es bis Version
3.23.23 einen Bug gab, so dass mit @code{LOAD DATA INFILE} nicht sauber
umgegangen wurde, wenn Sie diesen Befehl in einer Datenbank ausf�hrten, die
von der Replikation ausgeschlossen war.
@item
Ab Version 3.23.16 schaltet @code{SET SQL_LOG_BIN = 0}
Replikations-(Bin�r)-Loggen auf dem Master aus und @code{SET SQL_LOG_BIN =
1} schaltet es wieder an. Sie ben�tigen die process-Berechtigung, um das
auszuf�hren.
@item
Ab Version 3.23.19, you can clean up stale Replikation leftovers when
something goes wrong und you want a clean start mit @code{FLUSH MASTER}
und @code{FLUSH SLAVE}-Befehle. In Version 3.23.26 we have renamed them to
@code{RESET MASTER} und @code{RESET SLAVE} respectively to clarify
what they do. The old @code{FLUSH} variants still work, though, for
Kompatibilit�t.

@item
Ab Version 3.23.21, you can use @code{LOAD TABLE FROM MASTER} for
network backup und to set up Replikation initially. We have recently
received a Anzahl von bug reports concerning it that we are investigating, so
we recommend that you use it only in testing until we make it mehr stable.
@item
Ab Version 3.23.23, you can change masters und adjust log position
mit @code{CHANGE MASTER TO}.
@item
Ab Version 3.23.23, you tell the master that updates in certain
Datenbanken should not be logged to the Bin�r-Log-Datei mit @code{binlog-ignore-db}.
@item
Ab Version 3.23.26 k�nnen Sie @code{replicate-rewrite-db} benutzen, um den
Slave anzuweisen, Aktualisierungen einer Datenbank auf dem Master auf eine
mit einem anderen Namen auf dem Slave anzuwenden.
@item
Ab Version 3.23.28 k�nnen Sie @code{PURGE MASTER LOGS TO 'log-name'}
benutzen, um alte Log-Dateien loszuwerden, w�hrend der Slave l�uft.
@end itemize


@node Replication Options, Replication SQL, Replication Features, Replication
@c German node Replikationsoptionen
@subsection Replikationsoptionen in my.cnf

Wenn Sie Replikation benutzen, empfehlen wir, dass Sie MySQL-Version
3.23.30 oder h�her benutzen. �ltere Versionen funktionieren, haben aber
einige Bugs und fehlende Features.

Sowohl auf dem Master als auch auf dem Slave m�ssen Sie die
@code{server-id}-Option benutzen. Diese setzt eine eindeutige
Replikations-ID. Sie sollten einen eindeutigen Wert im Bereich zwischen 1
und 2^32-1 f�r jeden Master und Slave benutzen. Beispiel: @code{server-id=3}

In folgender Tabelle stehen die Optionen, die Sie f�r den @strong{MASTER}
benutzen k�nnen:

@multitable @columnfractions .3 .7

@item @strong{Option} @tab @strong{Beschreibung}
@item @code{log-bin=dateiname} @tab
Schreibt in die bin�re Update-Log-Datei am angegebenen Ort. Beachten Sie,
dass, wenn Sie ihr einen Parameter mit einer Erweiterung angeben (zum
Beispiel @code{log-bin=/mysql/logs/replikation.log}), Versionen bis zu
3.23.24 w�hrend der Replikation nicht richtig funktionieren, wen Sie
@code{FLUSH LOGS} ausf�hren. Das Problem ist seit Version 3.23.25 behoben.
Wenn Sie Log-Namen dieser Art benutzen, wird @code{FLUSH LOGS} auf dem
bin�ren Log ignoriert. Um das Log zu l�schen, f�hren Sie @code{FLUSH
MASTER} aus. Vergessen Sie dabei nicht, @code{FLUSH SLAVE} auf allen Slaves
laufen zu lassen.Ab Version 3.23.26 sollten Sie @code{RESET MASTER} und
@code{RESET SLAVE} benutzen.

@item @code{log-bin-index=dateiname} @tab
Weil der Benutzer @code{FLUSH LOGS}-Befehle ausf�hren k�nnte, muss man
wissen, welches Log momentan aktiv ist und welche in welcher Reihenfolge
durch Log-Rotation herausgenommen wurden. Diese Informationen sind in der
Bin�r-Log-Index-Datei gespeichert. Der Vorgabewert ist `hostname`.index. 

Beispiel: @code{log-bin-index=datenbank.index}.

@item @code{sql-bin-update-same} @tab
Falls gesetzt, f�hrt das Setzen von @code{SQL_LOG_BIN} auf einen Wert
automatisch dazu, dass @code{SQL_LOG_UPDATE} auf denselben Wert gesetzt
wird, und umgekehrt.

@item @code{binlog-do-db=datenbank} @tab
Weist den Master an, Aktualisierung in die Bin�r-Log-Datei zu loggen, wenn
die aktuelle Datenbank 'datenbank' ist. Alle anderen Datenbanken werden
ignoriert. Beachten Sie bei der Benutzung, dass Sie sicherstellen sollten,
dass Sie Aktualisierungen nur in der aktuellen Datenbank ausf�hren.

Beispiel: @code{binlog-do-db=eine_datenbank}.

@item @code{binlog-ignore-db=datenbank} @tab
Weist den Master an, das Aktualisierung der aktuellen Datenbank 'datenbank'
nicht in der Bin�r-Log-Datei gespeichert werden sollen. ignoriert. Beachten
Sie bei der Benutzung, dass Sie sicherstellen sollten, dass Sie
Aktualisierungen nur in der aktuellen Datenbank ausf�hren.

Beispiel: @code{binlog-ignore-db=eine_datenbank}
@end multitable

Folgende Tabelle enth�lt die Optionen, die Sie f�r @strong{SLAVE} benutzen
k�nnen:

@multitable @columnfractions .3 .7

@item @strong{Option} @tab @strong{Beschreibung}
@item @code{master-host=host} @tab
Hostname des Masters oder IP-Adresse f�r Replikation. Falls nicht gesetzt,
startet der Slave-Thread nicht.

Beispiel: @code{master-host=datenbank-master.meinefirma.de}.

@item @code{master-user=benutzername} @tab
Der Benutzer, den der Slave-Thread f�r Authentifizierung benutzt, wenn er
sich mit dem Master verbindet. Der Benutzer muss die
@code{FILE}-Berechtigung besitzen. Wenn der Master-Benutzer nicht gesetzt
ist, wird Benutzer @code{test} angenommen.

Beispiel: @code{master-user=steve}.

@item @code{master-password=passwort} @tab
Das Passwort, das der Slave-Thread f�r Authentifizierung benutzt, wenn er
sich mit dem Master verbindet. Wenn nicht gesetzt, wird ein leeres Passwort
angenommen.

Beispiel: @code{master-password=hund}.

@item @code{master-port=portnummer} @tab
Der Port, auf dem der Master auf Verbindungen wartet. Wenn nicht gesetzt,
wird die kompilierte Einstellung von @code{MYSQL_PORT} angenommen. Wenn Sie
nicht an den @code{configure}-Optionen gedreht haben, sollte das 3306 sein.

Beispiel: @code{master-port=3306}.

@item @code{master-connect-retry=sekunden} @tab
Die Anzahl Sekunden, die der Slave-Thread schl�ft, bevor er wiederum
versucht, sich mit dem Master zu verbinden, falls der Master herunter fuhr
oder die Verbindung verloren ging. Vorgabewert ist 60.

Beispiel: @code{master-connect-retry=60}.

@item @code{master-ssl} @tab
Schaltet SSL an.

Beispiel: @code{master-ssl}.

@item @code{master-ssl-key} @tab
Der Name der SSL-Schl�sseldatei f�r den Master.

Beispiel: @code{master-ssl-key=SSL/master-key.pem}.

@item @code{master-ssl-cert} @tab
Der Dateiname des SSL-Zertifikats f�r den Master.

Beispiel: @code{master-ssl-key=SSL/master-cert.pem}.

@item @code{master-info-file=dateiname} @tab
Der Speicherort der Datei, die sich merkt, bis wohin der Master w�hrend des
Replikationsprozesses verfolgt wurde. Vorgabewert ist master.info im data-
Verzeichnis.

Beispiel: @code{master-info-file=master.info}.

@item @code{replicate-do-table=datenbank.tabelle} @tab
Weist den Slave-Thread an, die Replikation auf die angegebene Tabelle zu
beschr�nken. Um mehr als eine Tabelle anzugeben, benutzen Sie die Anweisung
mehrfach, einmal f�r jede Tabelle. Das funktioniert auch bei
Datenbank-�bergreifenden Aktualisierungen, im Gegensatz zu
@code{replicate-do-db}.

Beispiel: @code{replicate-do-table=eine_datenbank.eine_tabelle}.

@item @code{replicate-ignore-table=datenbank.tabelle} @tab
Weist den Slave-Thread an, die angegebene Tabelle nicht zu replizieren. Um
mehr als eine Tabelle anzugeben, die ignoriert werden soll, geben Sie die
Anweisung mehrfach ein, einmal f�r jede Tabelle. Das funktioniert auch bei
Datenbank-�bergreifenden Aktualisierungen, im Gegensatz zu
@code{replicate-ignore-db}.

Beispiel: @code{replicate-ignore-table=eine_datenbank.eine_tabelle}.

@item @code{replicate-wild-do-table=datenbank.tabelle} @tab
Weist den Slave-Thread an, die Replikation auf Tabellen zu beschr�nken, die
dem angegebenen Platzhalter-Muster entsprechen. Um mehr als ein
Tabellenmuster anzugeben, das ignoriert werden soll, geben Sie die
Anweisung mehrfach ein, einmal f�r jedes Tabellenmuster. Das funktioniert
auch bei Datenbank-�bergreifenden Aktualisierungen.

Beispiel: @code{replicate-wild-do-table=foo%.bar%} repliziert nur
Aktualisierungen auf Tabellen in allen Datenbanken, die mit 'foo' anfangen
und deren Tabellennamen mit 'bar' beginnen.

@item @code{replicate-wild-ignore-table=datenbank.tabelle} @tab
Weist den Slave-Thread an, Tabellen nicht zu replizieren, die dem
angegebenen Platzhalter-Muster entsprechen. Um mehr als ein
Tabellenmuster anzugeben, das ignoriert werden soll, geben Sie die
Anweisung mehrfach ein, einmal f�r jedes Tabellenmuster. Das funktioniert
auch bei Datenbank-�bergreifenden Aktualisierungen.

Beispiel: @code{replicate-wild-ignore-table=foo%.bar%} aktualisiert keine
Tabellen in Datenbanken, die mit 'foo' anfangen und deren Tabellennamen mit
'bar' beginnen.

@item @code{replicate-ignore-db=datenbank} @tab
Weist den Slave-Thread an, die angegebene Datenbank nicht zu replizieren.
Um mehr als eine Datenbank anzugeben, die ignoriert werden soll, geben Sie
die Anweisung mehrfach ein, einmal f�r jede Datenbank. Diese Option
funktioniert nicht f�r Datenbank-�bergreifende Aktualisierungen. Wenn Sie
Datenbank-�bergreifende Aktualisierungen brauchen, stellen Sie sicher, dass
Sie Version 3.23.28 oder h�her verwenden und benutzen Sie
@code{replicate-wild-ignore-table=datenbank.%}

Beispiel: @code{replicate-ignore-db=eine_datenbank}.

@item @code{replicate-do-db=datenbank} @tab

Weist den Slave-Thread an, die Replikation auf die angegebene Datenbank zu
beschr�nken. Um mehr als eine Datenbank anzugeben, benutzen Sie die
Anweisung mehrfach, einmal f�r jede Datenbank. Beachten Sie, dass das nicht
funktioniert, wenn Sie Datenbank-�bergreifende Anfragen wie @code{UPDATE
eine_datenbank.eine_tabelle SET foo='bar'} ausf�hren, w�hrend Sie eine
andere oder keine Datenbank ausgew�hlt haben. Wenn Sie
Datenbank-�bergreifende Aktualisierungen brauchen, stellen Sie sicher, dass
Sie Version 3.23.28 oder h�her verwenden und benutzen Sie
@code{replicate-wild-do-table=datenbank.%}.

Beispiel: @code{replicate-do-db=eine_datenbank}.

@item @code{log-slave-updates} @tab
Weist den Slave an, Aktualisierungen vom Slave-Thread in die bin�re
Log-Datei zu schreiben. Ist vorgabem��ig ausgeschaltet. Sie m�ssen diese
Option anschalten, wenn Sie planen, die Slave in eine zirkul�re Kette zu
h�ngen ('Daisy-Chain').

@item @code{replicate-rewrite-db=von_name->zu_name} @tab
Aktualisierungen auf eine Datenbank mit einem anderen Namen als dem
Orginalnamen.

Beispiel: @code{replicate-rewrite-db=master_datenbank->slave_datenbank}.

@item @code{skip-slave-start} @tab
Weist den Slave-Server an, den Slave nicht beim Hochfahren zu starten. Der
Benutzer kann ihn sp�ter mit @code{SLAVE START} starten.

@item @code{slave_read_timeout=#} @tab
Anzahl von Sekunden, die der Slave auf weitere Daten vom Master wartet,
bevor er abbricht.
@end multitable


@node Replication SQL, Replication FAQ, Replication Options, Replication
@c German node SQL und Replikation
@subsection SQL-Befehle in Bezug auf Replikation

@cindex SQL-Befehle, Replikation
@cindex Befehle, Replikation
@cindex Replikation, Befehle

Replikation kann �ber die SQL-Schnittstelle gesteuert werden. Hier eine
Zusammenfassung der Befehle:

@multitable @columnfractions .30 .70
@item @strong{Befehl} @tab @strong{Beschreibung}

@item @code{SLAVE START}
 @tab Startet den Slave-Thread. (Slave)

@item @code{SLAVE STOP}
 @tab H�lt den Slave-Thread an. (Slave)

@item @code{SET SQL_LOG_BIN=0}
 @tab Schaltet das Loggen in die Update-Log-Datei aus, wenn der Benutzer
die process-Berechtigung hat. Wird ansonsten ignoriert. (Master)

@item @code{SET SQL_LOG_BIN=1}
 @tab Schaltet das Loggen in die Update-Log-Datei wieder an, wenn der
Benutzer die process-Berechtigung hat. Wird ansonsten ignoriert. (Master)

@item @code{SET SQL_SLAVE_SKIP_COUNTER=n}
 @tab Die n�chsten @code{n} Ereignisse vom Master ignorieren. Gilt nur,
wenn der Slave-Thread nicht l�uft, gibt ansonsten einen Fehler aus.
N�tzlich f�r den Ausgleich von Replikationsabweichungen.

@item @code{RESET MASTER}
 @tab L�scht alle Bin�r-Log-Dateien, die in der Index-Datei aufgef�hrt
sind, und setzt die Bin�rLog-Index-Datei auf leer zur�ck. In Versionen vor
3.23.26 versions hei�t dieser Befehl @code{FLUSH MASTER}. (Master)

@item @code{RESET SLAVE}
 @tab F�hrt dazu, dass der Slave seine Replikationsposition in den
Master-Logs vergisst. In Versionen vor 3.23.26 versions hei�t dieser
Befehl @code{FLUSH SLAVE}. (Slave)

@item @code{LOAD TABLE tabelle FROM MASTER}
 @tab L�dt eine Kopie der Tabelle vom Master auf den Slave. (Slave)

@item @code{CHANGE MASTER TO master_def_list}
 @tab �ndert die Master-Parameters auf den Wert, der in
@code{master_def_list} angegeben ist, und startet den Slave-Thread neu.
@code{master_def_list} ist eine durch Kommas getrennte Liste
@code{master_def}, wobei @code{master_def} eins der folgenden Elemente ist:
@code{MASTER_HOST}, @code{MASTER_USER}, @code{MASTER_PASSWORD},
@code{MASTER_PORT}, @code{MASTER_CONNECT_RETRY}, @code{MASTER_LOG_FILE}
oder @code{MASTER_LOG_POS}. Beispiel:

@example

CHANGE MASTER TO
  MASTER_HOST='master2.meinefirma.com',
  MASTER_USER='replikation',
  MASTER_PASSWORD='gro33esgeheimnis',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master2-bin.001',
  MASTER_LOG_POS=4;

@end example

Sie m�ssen nur die Werte angeben, die ge�ndert werden sollen. Die Werte,
die Sie auslassen, bleiben dieselben, ausser wenn Sie den Host oder den
Port �ndern. In diesem Fall nimmt der Slave an, dass der Master ein anderer
ist, weil Sie sich zu einem anderen Host oder �ber einen anderen Port
verbinden. Daher treffen die alten Werte von Log und Position nicht mehr zu
und werden automatisch auf eine leere Zeichenkette bzw. auf 0 zur�ck
gesetzt (dem Startwert). Beachten Sie, dass sich der Slave beim Neustart an
seinen alten Master erinnert. Falls das nicht w�nschenswert ist, sollten
Sie die @file{master.info}-Datei l�schen, bevor Sie neu starten. Der Slave
liest dann seinen Master aus der Datei @code{my.cnf} oder von der
Kommandozeile. (Slave)

@item @code{SHOW MASTER STATUS} 
 @tab Stellt Statusinformationen �ber die Bin�r-Log-Datei des Masters zur
Verf�gung. (Master)

@item @code{SHOW SLAVE STATUS} 
 @tab Stellt Statusinformationen �ber die wichtigsten Parameter des
Slave-Threads zur Verf�gung. (Slave)
@item @code{SHOW MASTER LOGS} 
 @tab Nur verf�gbar ab Version 3.23.28. Listet die Bin�r-Log-Dateien auf
dem Master auf. Sie sollten diesen Befehl vor @code{PURGE MASTER LOGS TO}
benutzen, um herauszufinden, wie weit Sie gehen sollten.

@item @code{PURGE MASTER LOGS TO 'logname'}
 @tab Verf�gbar ab Version 3.23.28. L�scht alle Replikations-Logs, die in
der Index-Log-Datei aufgef�hrt sind, die vor dem angegebenen Log liegen und
entfernt Sie aus dem Log-Index, so dass die angegebene Log-Datei nunmehr
die erste wird. Beispiel:

@example
PURGE MASTER LOGS TO 'mysql-bin.010'
@end example

Dieser Befehl macht nichts und schl�gt mit einer Fehlermeldung fehl, wenn
Sie einen aktiven Slave haben, der momentan eine der Log-Dateien liest, die
Sie zu l�schen versuchen. Wenn Sie jedoch einen schlafenden Slave haben und
gerade eine der Log-Dateien l�schen, die dieser Slave lesen will, wird der
Slave nicht in der Lage sein zu replizieren, sobald er wach wird. Der
Befehl kann sicher verwendet werden, w�hrend Slaves replizieren - Sie
brauchen diese also nicht anhalten.

Zuerst m�ssen Sie alle Slaves mit @code{SHOW SLAVE STATUS} �berpr�fen, um
festzustellen, an welcher Log-Datei sie gerade sind, dann eine Auflistung
aller Log-Dateien auf dem Master mit @code{SHOW MASTER LOGS} machen, die
fr�heste davon herausfinden, an der noch ein Slave arbeitet (wenn alle
Slaves aktuell sind, ist das die letzte Log-Datei auf der Liste), dann alle
Logs, die Sie l�schen wollen, sichern (optional), und schlie�lich bis zum
Ziel-Log l�schen.

@end multitable


@node Replication FAQ, Replication Problems, Replication SQL, Replication
@c German node Replikations-FAQ
@subsection Replikation - H�ufig gestellte Fragen

@cindex @code{Binlog_Dump}
@strong{Frage}: Warum sehe ich manchmal mehr als eine
@code{Binlog_Dump}-Thread auf dem Master, nachdem ich den Slave neu
gestartet habe?

@strong{Antwort}: @code{Binlog_Dump} ist ein kontinuierlicher Prozess, der
folgenderma�en vom Server gehandhabt wird:

@itemize @bullet
@item
Zu den Aktualisierungen aufschlie�en.
@item
Sobald keine Aktualisierungen mehr �brig sind, in den Zustand
@code{pThread_cond_wait()} gehen, durch den er entweder durch eine
Aktualisierung oder einen Kill erweckt werden kann.
@item
Beim Aufwachen den Grund daf�r pr�fen. Wenn er nicht sterben soll,
mit der @code{Binlog_dump}-Schleife weitermachen.
@item
Wenn ein schwerer Fehler auftritt, wenn zum Beispiel ein toter Client
entdeckt wird, die Schleife beenden.
@end itemize

Wenn der Slave-Thread also beim Slave anh�lt, bemerkt das der entsprechende
@code{Binlog_Dump}-Thread auf dem Master solange nicht, bis zumindest eine
Aktualisierung (oder ein Kill) auf den Master durchgef�hrt wird, was
ben�tigt wird, um ihn von @code{pThread_cond_wait()} aufzuwecken. In der
Zwischenzeit k�nnte der Slave bereits eine weitere Verbindung ge�ffnet
haben, die in einem weiteren @code{Binlog_Dump}-Thread resultiert.

Das beschriebene Problem sollten in Versionen ab 3.23.26 nicht auftreten.
In Version 3.23.26 kam @code{server-id} f�r jeden Replikationsserver hinzu,
und nun werden alle alten Zombie-Threads auf dem Master gekillt, wenn ein
neuer Replikations-Thread sich vom selben Slave aus verbindet.

@strong{Frage}: Wie rotiere ich Replikations-Logs?

@strong{Antwort}: In Version 3.23.28 sollten Sie den @code{PURGE MASTER
LOGS TO}-Befehl benutzen, nachdem festgestellt wurde, welche Logs gel�scht
werden k�nnen und nachdem sie optional gesichert wurden. In fr�heren
Versionen ist der Prozess sehr viel anstrengender und kann nicht sicher
durchgef�hrt werden, ohne alle Slaves anzuhalten, falls Sie planen,
Log-Namen wiederholt zu verwenden. Sie m�ssen die Slave-Threads anhalten,
die Bin�r-Log-Index-Datei editieren, alle alten Logs l�schen, den Master
neu starten, die Slave-Threads neu starten und dann die alten Log-Dateien
entfernen.


@strong{Frage}: Wie aktualisiere ich bei einer laufenden
Replikationseinrichtung?

@strong{Antwort}: Wenn Sie vor Version 3.23.26 aktualisieren, sollten Sie
nur die Master-Tabellen sperren, warten, bis die Slaves auf aktuellem Stand
sind, und dann @code{FLUSH MASTER} auf dem Master und @code{FLUSH SLAVE}
auf dem Slave laufen lassen, um die Logs zur�ckzusetzen, und danach neue
Versionen des Masters und des Slaves neu starten. Beachten Sie, dass der
Slave f�r einige Zeit heruntergefahren bleiben kann - weil der Master alle
Aktualisierung loggt, wird der Slave in der Lage sein, auf den aktuellen
Stand zu kommen, sobald er hoch gefahren ist und sich verbinden kann.

Nach Version 3.23.26 wurde das Replikationsprotokoll f�r �nderungen
gesperrt, daher k�nnen Sie Masters und Slaves im laufenden Betrieb auf eine
neuere 3.23-Version aktualisieren, und Sie k�nnen unterschiedliche
Versionen von MySQL auf Slave und Master laufen haben, solange beide neuer
als Version 3.23.26 sind.

@cindex Replikation, Zweiweg-
@strong{Frage}: Welche Dinge sollte ich beachten, wenn ich
Zweiweg-Replikation aufsetze?

@strong{Antwort}: MySQL-Replikation unterst�tzt derzeit kein
Sperr-Protokoll zwischen Master und Slave, um die Atomizit�t einer
verteilten (Cross-Server-) Aktualisierung zu gew�hrleisten. Mit anderen
Worten ist es f�r einen Client A m�glich, eine Aktualisierung zu Co-Master
1 zu machen. In der Zwischenzeit, bevor er sich an Co-Master 2 wendet,
k�nnte Client B eine Aktualisierung auf Co-Master 2 machen, die dazu f�hrt,
dass die Aktualisierung von Client A anders funktioniert als auf Master 1.
Wenn daher die Aktualisierung von Client A zu Co-Master 2 durchdringt,
produziert das Tabellen, die anders sein werden als die auf Co-Master 1,
selbst nachdem alle Aktualisierungen von Co-Master 2 ebenfalls durchgef�hrt
wurden. Daher sollten sie keine zwei Server in einer Zweiweg-Replikation
verketten, es sei denn, Sie k�nnen sicher sein, dass Ihre Aktualisierungen
immer in bestimmter Reihenfolge ablaufen, oder indem Sie irgendwie in Ihrem
Client-Code Vorkehrungen gegen Aktualisierung treffen, die nicht in der
richtigen Reihenfolge sind.

Sie m�ssen sich auch dar�ber im Klaren sein, dass Zweiweg-Replikation Ihre
Performance nicht wesentlich verbessert, falls �berhaupt, sofern
Aktualisierungen betroffen sind. Beide Server m�ssen ungef�hr dieselbe
Menge Aktualisierungen durchf�hren, was auch ein Server h�tte tun k�nnen.
Der einzige Unterschied liegt darin, dass es sehr viel weniger
Lock-Contention gibt, weil die Aktualisierungen, die von einem anderen
Server stammen, in einem Slave-Thread serialisiert werden. Dennoch kann der
erzielte Vorteil durch Netzwerk-Verz�gerungen konterkariert werden.

@cindex Performance, verbessern
@cindex erh�hen, Performance
@strong{Frage}: Wie kann ich Replikation benutzen, um die Performance
meines Systems zu verbessern?

@strong{Antwort}: Sie sollten einen Server als Master aufsetzen und alle
Schreibvorg�nge zu ihm lenken, und so viele Slaves wie m�glich einrichten
und die Lesevorg�nge zwischen Master und Slaves verteilen. Ausserdem k�nnen
Sie die Slaves mit @code{--skip-bdb}, @code{--low-priority-updates} und
@code{--delay-key-write-for-all-tables} starten, um f�r die Slaves
Geschwindigkeitsverbesserungen zu erzielen. In diesem Fall benutzt der
Slave nicht transaktionale @code{MyISAM}-Tabellen anstelle von
@code{BDB}-Tabellen, um mehr Geschwindigkeit zu erhalten.

@strong{Frage}: Was muss ich in meinem Client-Code tun, damit dieser
Performance-verbessernde Replikation nutzt?

@strong{Antwort}:
Wenn der Teil Ihres Codes, der f�r den Datenbankzugriff zust�ndig ist,
korrekt abstrahiert / modularisiert ist, sollte die Konvertierung zur
replizierten Einrichtung sehr glatt und einfach verlaufen: �ndern Sie die
Implementation Ihres Datenbankzugriffs so, dass von irgend einem Slave oder
dem Master gelesen und immer zum Master geschrieben wird. Wenn Ihr Code
nicht diese Abstraktionsebene besitzt, ist die Einrichtung eines
Replikationssystems ein guter Grund, ihn zu s�ubern. Sie k�nnten damit
beginnen, eine Wrapper-Bibliothek oder ein Wrapper-Modul mit folgenden
Funktionen zu benutzen:

@itemize @bullet
@item
@code{safe_writer_connect()}
@item
@code{safe_reader_connect()}
@item
@code{safe_reader_query()}
@item
@code{safe_writer_query()}
@end itemize

@code{safe_} bedeutet, dass die Funktion sich um die Handhabung jeglicher
Fehlerbedingungen k�mmert.

Danach sollten Sie Ihren Client-Code so umwandeln, dass er die
Wrapper-Bibliothek benutzt. Dieser Prozess kann anfangs etwas anstrengend
und aufregend sein, wird sich aber auf lange Sicht lohnen. Alle
Applikationen, die dem geschilderten Muster folgen, werden ebenfalls Nutzen
aus der Master-/Slaves-L�sung ziehen. Der Code wird sich viel einfacher
pflegen lassen und Optionen zur Probleml�sung werden trivial sein. Sie
brauchen einfach nur ein oder zwei Funktionen zu �ndern, um zum Beispiel zu
loggen, wie lang jede Anfrage dauerte, oder welche Anfrage unter Ihren
Tausenden einen Fehler produzierte. Wenn Sie schon eine Menge Code
geschrieben haben, wollen Sie den Umwandlungsprozess wahrscheinlich
automatisieren. Hierf�r k�nnen Sie zum Beispiel Monty's
@code{replace}-Dienstprogramm benutzen, das der Standard-Distribution von
MySQL beiliegt, oder Ihr eigenes Perl-Skript schreiben. Hoffentlich folgt
Ihr Code irgend einem erkennbaren Muster - wenn nicht, ist es
wahrscheinlich ohnehin besser, ihn neu zu schreiben, oder zumindest, ihn
durchzugehen und manuell in ein Muster zu bringen.

Beachten Sie, dass Sie nat�rlich andere Namen f�r die Funktionen verwenden
k�nnen. Wichtig ist, eine einheitliche Schnittstelle f�r Verbindungen zum
Lesen, Verbindungen zum Schreiben, Durchf�hren von Lesevorg�ngen und
Durchf�hrung von Schreibvorg�ngen zu haben.


@strong{Frage}: Wann und in welchem Umfang kann MySQL-Replikation die
Performance meines Systems verbessern?

@strong{Antwort}: MySQL-Replikation bringt die meisten Vorteile auf einem
System mit h�ufigen Lesevorg�ngen und nicht so h�ufigen Schreibvorg�ngen.
Theoretisch k�nnen Sie eine Einrichtung aus einem Master und vielen Slaves
so skalieren, dass Sie solange Slaves hinzuf�gen, bis Sie entweder keine
Netzwerk-Bandbreite mehr haben oder bis Ihre Aktualisierungslast so weit
ansteigt, dass der Master sie nicht mehr handhaben kann.

Im festlegen zu k�nnen, wie viele Slaves sie haben k�nnen, bevor die
zus�tzlichen Vorteile aufgewogen werden, und um wieviel Sie die Performance
Ihrer Site steigern k�nnen, m�ssen Sie Ihre Anfragenmuster kennen und
empirisch (durch Benchmarks) festlegen, wie das Verh�ltnis zwischen dem
Durchsatz von Lesevorg�ngen (pro Sekunde, oder @code{max_reads}) und
Schreibvorg�ngen (@code{max_writes}) auf einem typischen Master und einem
typischen Slave ist. Das unten stehende Beispiel zeigt Ihnen eine eher
vereinfachte Berechnung, was Sie mit Replikation f�r ein imagin�res System
erreichen k�nnen.

Nehmen wir an, Ihr Systemlast besteht aus 10% Schreibvorg�ngen und 90%
Lesevorg�ngen, und Sie haben festgestellt, dass @code{max_reads} = 1200 - 2
* @code{max_writes} ist. Mit anderen Worten kann Ihr System 1.200
Lesevorg�nge pro Sekunde ohne Schreibzugriffe ausf�hren, und der
durchschnittliche Schreibvorgang ist zweimal so langsam wie der
durchschnittliche Lesevorgang, und das Verh�ltnis ist linear. Nehmen wir
ferner an, dass Ihr Master und Slave dieselbe Kapazit�t haben, und dass es
N Slaves und 1 Master gibt. Dann gilt f�r jeden Server (Master oder Slave):

@code{lesen = 1200 - 2 * schreiben} (aus Benchmarks)

@code{lesen = 9 * schreiben / (N + 1) } (lesen aufgeteilt, aber schreiben
geht an alle Server)

@code{9 * schreiben / (N+1) + 2 * schreiben = 1200}

@code{schreiben = 1200/(2 + 9/(N+1)}

Wenn also N = 0, was bedeutet, dass es keine Replikation gibt, kann Ihr
System 1200 / 11, also etwa 109 Schreibvorg�nge pro Sekunden handhaben (was
hei�t, dass Sie neunmal so viele Lesevorg�nge haben, was der Natur Ihrer
Applikation entspricht).

Wenn N = 1 ist, k�nnen Sie bis zu 184 Schreibvorg�nge pro Sekunde haben.

Wenn N = 8 ist, k�nnen Sie bis zu 400 haben.

Wenn N = 17 ist, k�nnen Sie 480 haben.

Wenn schlie�lich N gegen unendlich geht (und Ihr Budget gegen negativ
unendlich), k�nnen Sie sehr nahe an 600 Schreibvorg�nge pro Sekunde kommen
und damit den Systemdurchsatz um etwa den Faktor 5,5 erh�hen. Mit nur 8
Servern jedoch kommen Sie bereits auf eine Steigerung um fast den Faktor 4.

Beachten Sie, dass diese Berechnungen von unbegrenzter Netzwerk-Bandbreite
ausgehen und verschiedene andere Faktoren vernachl�ssigen, die auf Ihrem
System signifikant sein k�nnten. In vielen F�llen werden Sie nicht in der
Lage sein, pr�zise vorauszusagen, was auf Ihrem System passieren wird, wenn
Sie N Replikations-Slaves hinzuf�gen. Dennoch kann die Beantwortung
folgender Fragen Ihnen helfen zu entscheiden, ob und wie viel (wenn
�berhaupt) Replikation bewirken kann, dass sich Ihre System-Performance
verbessert:

@itemize @bullet
@item
Was ist das Lese-/Schreibverh�ltnis auf Ihrem System?
@item
Wieviel zus�tzliche Schreiblast kann ein Server handhaben, wenn Sie die
Leselast verringern?
@item
F�r wie viele Slave haben Sie Bandbreite auf Ihrem Netzwerk?
@end itemize

@strong{Frage}: Wie kann ich Replikation benutzen, um Redundanz / hohe
Verf�gbarkeit zur Verf�gung zu stellen?

@strong{Antwort}: Mit den momentan verf�gbaren Features w�rden Sie einen
Master und einen Slave (nicht mehrere Slaves) aufsetzen und ein Skript
schreiben, das den Master beobachtet, um zu sehen, ob er hochgefahren ist,
und Ihre Applikationen und die Slaves anweisen, den Master im Falle von
Fehlschl�gen zu �ndern. Einige Vorschl�ge:
set up a master und a slave (or several slaves) und write a Skript

@itemize @bullet
@item
Um einem Slave mitzuteilen, den Master zu �ndern, benutzen Sie den
@code{CHANGE MASTER TO}-Befehl.
@item
Eine gute M�glichkeit, Ihre Applikationen dar�ber informiert zu halten, wo
der Master ist, ist ein dynamischer DNS-Eintrag f�r den Master. Bei
@strong{bind} k�nnen Sie @code{nsupdate} benutzen, um Ihr DNS dynamisch zu
aktualisieren.
@item
Sie sollten Ihre Slaves mit der @code{log-bin}-Option und ohne
@code{log-slave-updates} laufen lassen. Auf diese Art wird der Slave bereit
sein, ein Master zu werden, sobald Sie @code{STOP SLAVE} eingeben,
@code{RESET MASTER} und @code{CHANGE MASTER TO} auf den anderen Slaves. Das
wird auch dabei helfen, fehlgelaufene Aktualisierungen zu entdecken, die
auf Grund von Fehlkonfiguration des Slaves passieren (im Idealfall sollten
Sie die Zugriffsrechte so konfigurieren, dass kein Client einen Slave
aktualisieren kann, ausser der Slave-Thread), in Kombination mit den Bugs
in Ihren Client-Programmen (die den Slave nie direkt aktualisieren
sollten).

@end itemize

Momentan arbeiten wir an der Integration eines Systems in MySQL, das
automatisch den Master ausw�hlt, aber bis es fertig ist, m�ssen Sie Ihre
eigenen Beobachtungswerkzeuge schaffen.


@node Replication Problems,  , Replication FAQ, Replication
@c German node Replikationsprobleme
@subsection Probleml�sung bei Replikation

Wenn Sie den Anweisungen gefolgt sind und Ihre Replikationseinrichtung
nicht funktioniert, beseitigen Sie zun�chst die M�glichkeit von
Benutzerfehlern, indem Sie folgendes pr�fen:

@itemize @bullet
@item
Loggt der Master in die Bin�r-Log-Datei? Pr�fen Sie das mit @code{SHOW
MASTER STATUS}. Wenn das der Fall ist, ist die @code{Position} nicht 0.
Wenn nicht, �berpr�fen Sie, ob Sie dem Master die @code{log-bin}-Option
angegeben und die @code{server-id} gesetzt haben.
@item
L�uft der Slave? �berpr�fen Sie das mit @code{SHOW SLAVE STATUS}. Die
Antwort steht in der @code{Slave_running}-Spalte. Wenn nicht, �berpr�fen
Sie die Slave-Optionen und �berpr�fen Sie die Fehler-Log-Datei auf
Meldungen.
@item
Wenn der Slave l�uft, hat er eine Verbindung mit dem Master hergestellt?
F�hren Sie @code{SHOW PROCESSLIST} aus, finden Sie den Thread mit dem
@code{System user}-Wert in der @code{User}-Spalte und @code{none} in der
@code{Host}-Spalte und �berpr�fen Sie die @code{State}-Spalte. Wenn dort
steht @code{connecting to master}, �berpr�fen Sie die Berechtigungen f�r
den Replikations-Benutzer auf dem Master, den Master-Hostnamen, Ihre
DNS-Einrichtung, ob der Master tats�chlich l�uft, ob er durch den Slave
erreichbar ist, und wenn all das in Ordnung zu sein scheint, lesen Sie die
Fehler-Log-Dateien.
@item
Wenn der Slave lief, aber dann anhielt, schauen Sie in die Ausgabe von SHOW
SLAVE STATUS und �berpr�fen Sie die Fehler-Log-Dateien. Das passiert
�blicherweise, wenn eine Anfrage, die auf dem Master funktionierte, auf dem
Slave fehlschl�gt. Das sollte nie vorkommen, wenn Sie einen korrekten
Schnappschuss des Masters aufgenommen haben und die Daten nie auf dem Slave
ausserhalb des Slave-Threads ver�ndern. Wenn das doch auftritt, ist es ein
Bug und sollte berichtet werden.
@item
Wenn eine Anfrage, die auf dem Master funktionierte, nicht auf dem Slave
l�uft, und eine komplette Datenbank-Synchronisation (das richtige, was man
tun sollte) nicht ratsam erscheint, versuchen Sie folgendes:
@itemize @minus
@item
�berpr�fen Sie zun�chst, ob irgend ein 'streunender' Datensatz im Weg ist.
Finden Sie heraus, wie das geschehen konnte, dann l�schen Sie ihn und
lassen @code{SLAVE START} laufen.
@item
Wenn das Obige nicht funktioniert oder nicht zutrifft, versuchen Sie
herauszufinden, ob es sicher ist, die Aktualisierung manuell durchzuf�hren
(falls notwendig) und ignorieren Sie dann die n�chste Anfrage vom Master.
@item
Wenn Sie sich entschieden haben, dass Sie die n�chste Anfrage �berspringen
k�nnen, f�hren Sie @code{SET SQL_SLAVE_SKIP_COUNTER=1; SLAVE START;} aus,
um eine Anfrage zu �berspringen, die kein auto_increment oder
last_insert_id benutzt, ansonsten @code{SET SQL_SLAVE_SKIP_COUNTER=2; SLAVE
START;}. Der Grund, warum auto_increment- / last_insert_id-Anfragen anders
sind, liegt darin, dass f�r Sie zwei Ereignisse in der Bin�r-Log-Datei des
Masters verzeichnet sind.

@item
Wenn Sie sicher sind, dass der Slave perfekt mit dem Master synchronisiert
gestartet ist, und dass niemand die fraglichen Tabellen ausserhalb des
Slave-Threads aktualisiert hat, berichten Sie den Bug, damit wir die oben
beschriebenen Tricks nicht noch einmal machen m�ssen.
@end itemize
@item
Stellen Sie sicher, dass es sich nicht um alten Bug handelt, indem
Sie auf die aktuellste Version aktualisieren.
@item
Wenn alles Weitere fehlschl�gt, lesen Sie die Fehler-Log-Dateien. Wenn
diese Gro� sind, f�hren Sie ein @code{grep -i slave /pfad/zu/your-log.err}
auf dem Slave durch. Es gibt kein allgemeines Muster, nach dem man auf dem
Master suchen k�nnte, weil die einzigen Fehler, die dieser mitschreibt,
allgemeine Systemfehler sind - falls m�glich, wird er Fehler an die Slaves
senden, wenn etwas schief ging.
@end itemize

Wenn Sie sicher sind, dass es keine Benutzerfehler gibt und die Replikation
immer noch nicht funktioniert oder nicht stabil ist, ist es an der Zeit,
einen Bug-Bericht auszuarbeiten. Um dem Bug auf die Spur zu kommen,
brauchen wir soviel Informationen von Ihnen wie m�glich. Bitte nehmen Sie
sich etwas Zeit und schreiben Sie einen guten Bug-Bericht. Im Idealfall
h�tten wir gerne einen Test-Fall in dem Format, das Sie im
@code{mysql-test/t/rpl*}-Verzeichnis des Source-Baums finden. Wenn Sie
einen solchen Test-Fall schicken, k�nnen Sie in den meisten F�llen ein Patch
innerhalb von ein oder zwei Tagen erwarten. Diese Zeitspanne h�ngt
allerdings von einer Anzahl weiterer Faktoren ab.

Die zweitbeste Option ist ein einfaches Programm mit leicht
konfigurierbaren Verbindungsargumenten f�r Master und Slave, das das
Problem auf Ihrem System veranschaulicht. Sie k�nnen dies in Perl oder C
schreiben, abh�ngig davon, welche Sprache Sie besser beherrschen.

Wenn Sie den Bug auf eine der beiden oben beschriebenen Weisen
demonstrieren k�nnen, benutzen Sie @code{mysqlbug}, um einen Bug-Bericht
vorzubereiten, und schicken Sie ihn an @email{bugs@@lists.mysql.com}. Wenn
Sie ein 'Phantom' haben - ein Problem, das auftritt, aber nicht einfach
reproduziert werden kann - tun Sie folgendes:

@itemize @bullet
@item
Stellen Sie sicher, dass kein Benutzerfehler im Spiel ist. Beispielsweise
k�nnte der Slave ausserhalb des Slave-Threads aktualisiert werden - dann
sind die Daten nicht synchronisiert und Sie haben wom�glich einen Fehler
wegen doppelter Schl�sseleintr�ge bei Aktualisierungen, wobei der
Slave-Thread dann anh�lt und darauf wartet, dass Sie die Tabellen manuell
in Ordnung und in Synchronisation bringen.
@item
Lassen Sie den Slave mit @code{log-slave-updates} und @code{log-bin} laufen
- das beh�lt eine Log-Datei aller Aktualisierungen auf dem Slave bei.
@item
Sichern Sie alle Beweise, bevor Sie die Replikation zur�ck setzen. Wenn wir
keine oder nur schemenhafte Informationen haben, brauchen wir eine Weile,
um dem Problem auf den Grund zu gehen. Die Beweise, die Sie f�r uns sammeln
sollten, sind:
@itemize @minus
@item
Alle Bin�r-Log-Dateien auf dem Master.
@item
Alle Bin�r-Log-Dateien auf dem Slave.
@item
Die Ausgabe von @code{SHOW MASTER STATUS} auf dem Master zu der Zeit, als
Sie das Problem entdeckten.
@item
Die Ausgabe von @code{SHOW SLAVE STATUS} auf dem Master zu der Zeit, als
Sie das Problem entdeckten.
@item
Fehler-Log-Dateien auf Master und Slave.
@end itemize
@item
Benutzen Sie @code{mysqlbinlog}, um die Bin�r-Log-Dateien zu untersuchen.
Folgendes sollte hilfreich sein, um eine Anfrage zu finden, die Probleme
verursacht, zum Beispiel:
@example
mysqlbinlog -j pos_from_slave_status /pfad/zu/log_from_slave_status | head
@end example
@end itemize

Sobald Sie die Beweise des Phantomproblems gesammelt haben, versuchen Sie
zuerst, es in einen separaten Test-Fall zu isolieren. Berichten Sie dann
das Problem an @email{bugs@@lists.mysql.com}, wobei Sie soviel
Informationen wie m�glich mitschicken.




@node MySQL Optimisation, Reference, MySQL Database Administration, Top
@c German node MySQL-Optimierung
@chapter MySQL-Optimierung



Optimierung ist eine komplizierte Aufgabe, weil sie ein umfassendes
Verst�ndnis des gesamten Systems voraussetzt. Es ist m�glich, einige lokale
Optimierungen Ihres Systems oder Ihrer Applikation mit geringem Wissen
durchzuf�hren. Je optimaler Sie allerdings Ihr System gestalten wollen,
desto mehr m�ssen Sie dar�ber wissen.

Dieses Kapitel erkl�rt und gibt Beispiele f�r verschiedene M�glichkeiten,
MySQL zu optimieren. Denken Sie allerdings daran, dass es immer noch
zus�tzliche M�glichkeiten gibt, das System noch schneller zu machen.


@menu
* Optimise Overview::           
* Query Speed::                 
* Locking Issues::              
* Optimising Database Structure::  
* Optimising the Server::       
* Disk issues::                 
@end menu

@node Optimise Overview, Query Speed, MySQL Optimisation, MySQL Optimisation
@c German node �berblick �ber Optimierung
@section �berblick �ber Optimierung

Der wichtigste Teil, um ein System schnell zu machen, ist nat�rlich das
grundlegende Design. Ausserdem m�ssen Sie wissen, welche Dinge Ihr System
macht und was die Flaschenh�lse sind.

Die wichtigsten Flaschenh�lse sind:
@itemize @bullet
@item Suchvorg�nge auf Festplatte.
Die Festplatte ben�tigt Zeit, um ein St�ck Daten zu finden. Bei modernen
Festplatten (Stand: 1999) ist die mittlere Zugriffszeit �blicherweise
weniger als 10 ms, daher k�nnen theoretisch etwa 1.000 Suchvorg�nge pro
Sekunde durchgef�hrt werden. Bei neueren Festplatten wird diese Zeit
allm�hlich besser. F�r einzelne Tabellen ist sie sehr schwer zu optimieren.
Eine M�glichkeit, das zu optimieren, besteht darin, Daten auf mehr als eine
Platte zu verteilen.

@item Lesen von / Schreiben auf Festplatte.
Wenn die Festplatte in der richtigen Position ist, um die Daten zu lesen,
die wir brauchen, kann sie bei modernen Platten (Stand: 1999) etwas 10 bis
20 MB pro Sekunde heraus geben. Das ist leichter zu optimieren als
Suchvorg�nge, weil man von mehrfachen Festplatten parallel lesen kann.

@item CPU-Zyklen.
Wenn die Daten im Hauptspeicher sind (oder bereits dort waren), m�ssen sie
verarbeitet werden, um das Ergebnis zu erhalten. Kleine Tabellen im
Vergleich zum Arbeitsspeicher ist der Faktor, der am meisten begrenzt. Auf
der anderen Seite ist Geschwindigkeit bei kleinen Tabellen �blicherweise
nicht das Problem.

@item Speicher-Bandbreite.
Wenn der Prozessor mehr Daten braucht, als in den CPU-Cache passen, wird
die Bandbreite des Hauptspeichers zum Flaschenhals. Auf den meisten
Systemen ist das ein ungew�hnlicher Flaschenhals, aber man sollte sich
dessen bewusst sein.
@end itemize




@menu
* Design Limitations::          
* Portability::                 
* Internal use::                
* MySQL Benchmarks::            
* Custom Benchmarks::           
@end menu

@node Design Limitations, Portability, Optimise Overview, Optimise Overview
@c German node Design-Einschr�nkungen
@subsection MySQL-Design-Einschr�nkungen

@cindex Design, Einschr�nkungen
@cindex Einschr�nkungen, Design

Weil MySQL extrem schnelles Tabellensperren beherrscht (mehrfache Leser /
einzelne Schreiber), ist das gr��te verbleibende Problem eine Mischung aus
einem laufenden Strom von Einf�gevorg�ngen und langsamen Selects auf
dieselbe Tabelle.

Wir glauben, dass diese Wahl auf einer sehr gro�en Anzahl von Systemen
letztlich einen Gewinn darstellt. Auch dieser Fall ist �blicherweise
dadurch zu l�sen, dass man mehrfache Kopien der Tabelle vorh�lt, aber man
ben�tigt mehr Anstrengung und Hardware.

Wir arbeiten auch an einigen Erweiterungen, um dieses Problem in Hinsicht
auf einige h�ufige Applikationsnischen zu l�sen.


@node Portability, Internal use, Design Limitations, Optimise Overview
@c German node Portabilit�t
@subsection Portabilit�t

@cindex Portabilit�t
@cindex Crash-me-Programm
@cindex Programme, Crash-me

Weil alle SQL-Server unterschiedliche Teile von SQL implementieren, ist es
immer Arbeit, portable SQL-Applikationen zu schreiben. Bei sehr einfachen
Selects und Inserts ist das sehr einfach, aber je mehr Sie brauchen, desto
schwieriger wird es. Wenn Sie eine Applikation wollen, die bei vielen
Datenbanken noch schnell l�uft, wird es sogar noch schwieriger!

Um eine komplexe Applikation portabel zu machen, m�ssen Sie sich f�r eine
Reihe von SQL-Servern entscheiden, mit denen sie funktionieren soll.

Sie k�nnen das MySQL-Crash-me-Programm bzw. die Webpage
@uref{http://www.mysql.com/information/crash-me.php} benutzen, um
Funktionen, Typen und Einschr�nkungen zu finden, die Sie mit einer Auswahl
von Datenbank-Servern benutzen k�nnen. Crash-me testet bei weitem nicht
alles, was m�glich ist, aber mit etwa 450 unterschiedlichen Dingen ist es
recht umfassend.

Sie sollten zum Beispiel keine Spaltennamen benutzen, die l�nger als 10
Zeichen sind, wenn Sie auch Informix oder DB2 benutzen wollen.

Sowohl die MySQL-Benchmarks als auch die Crash-me-Programme sind sehr 
Datenbank-abh�ngig. Indem Sie einen Blick darauf werfen, wie wir damit
umgegangen sind, bekommen Sie ein Gef�hl daf�r, was Sie in Ihrer
Applikation schreiben m�ssen, damit diese Datenbank-unabh�ngig l�uft. Die
Benchmark-Tests selbst befinden sich im @file{sql-bench}-Verzeichnis der
MySQL-Quelldistribution. Sie sind in Perl mit der
DBI-Datenbank-Schnittstelle geschrieben (die den Zugriffsteil des Problems
l�st).

Siehe @uref{http://www.mysql.com/information/benchmarks.html} wegen der
Ergebnisse aus diesem Benchmark-Test.

Wie Sie an den Ergebnissen sehen, haben alle Datenbanken einige
Schwachpunkte, das hei�t, sie haben verschiedene Design-Kompromisse, die
zu unterschiedlichem Verhalten f�hren.

Wenn Sie nach Datenbank-Unabh�ngigkeit streben, m�ssen Sie ein gutes Gef�hl
f�r die Flaschenh�lse jedes SQL-Servers bekommen. MySQL ist SEHR schnell
beim Abrufen und Aktualisieren von Dingen, hat aber Probleme, wenn
gleichzeitig langsame Leser / Schreiber auf dieselbe Tabelle zugreifen.
Oracle hat ein gro�es Problem, wenn Sie versuchen, auf Zeilen zuzugreifen,
der k�rzlich aktualisiert wurden (solange, bis sie auf Platte
zur�ckgeschrieben wurden). Transaktionale Datenbanken sind allgemein nicht
sehr gut darin, Zusammenfassungstabellen aus Log-Tabellen zu erzeugen, weil
in diesem Fall Sperren auf Zeilenebene fast nutzlos ist.

Um Ihre Applikation @emph{wirklich} Datenbank-unabh�ngig zu machen, m�ssen
Sie eine leicht erweiterbare Schnittstelle definieren, �ber die Sie Ihre
Daten manipulieren. Weil auf den meisten Systemen C++ verf�gbar ist, ist es
sinnvoll, C++-Klassen als Schnittstellen zu den Datenbanken zu benutzen.

Wenn Sie irgend ein spezifisches Feature einer Datenbankbenutzung (wie den
@code{REPLACE}-Befehl in MySQL), sollten Sie eine Methode f�r die anderen
SQL-Server codieren, um dasselbe Feature (wenngleich langsamer) zu
implementieren. Bei MySQL k�nnen Sie die @code{/*!  */}-Syntax benutzen, um
MySQL-spezifische Schl�sselw�rter in einer Anfrage zu verwenden. Der Code
innerhalb von @code{/**/} wird von den meisten anderen SQL-Servern als
Kommentar behandelt (ignoriert).

Wenn WIRKLICH hohe Performance wichtiger als Exaktheit ist, wie bei einigen
Web-Applikationen, besteht eine M�glichkeit darin, eine Applikationsebene
zu erzeugen, die alle Ergebnisse cachet, um Ihnen noch h�here Performance
zu bringen. Indem Sie alte Ergebnisse nach einer Weile 'auslaufen' lassen,
k�nnen Sie den Cache in vern�nftiger Weise 'frisch' halten. Das ist in
F�llen extrem hoher Last recht nett, wobei Sie den Cache dynamisch
vergr��ern und die Verfallszeit (Expire Timeout) h�her setzen k�nnen, bis
wieder Normalauslastung eintritt.

In diesem Fall sollte die Tabellenerzeugungsinformation Informationen �ber
die urspr�ngliche Cache-Gr��e enthalten und dar�ber, wie oft die Tabelle
normalerweise aktualisiert (refresh) werden sollte.


@node Internal use, MySQL Benchmarks, Portability, Optimise Overview
@c German node Interner Gebrauch
@subsection Wof�r benutzen wir MySQL?

@cindex Gebrauch, von MySQL
@cindex Kunden, von MySQL

In der anf�nglichen Phase der Entwicklung von MySQL wurden die Features von
MySQL f�r unseren gr��ten Kunden gemacht. Dieser macht Data-Warehousing
f�r eine Reihe der gr��ten Einzelh�ndler in Schweden.

Aus allen Verkaufsstellen erhalten wir w�chentliche Zusammenfassungen aller
Bonuskarten-Transaktionen, und es wird erwartet, dass daraus n�tzliche
Informationen f�r die Eigent�mer der Verkaufsstellen zur Verf�gung gestellt
werden, damit diese herausfinden k�nnen, wie ihre Werbema�nahmen ihre
Kunden beeinflussen.

Die Datenmenge ist recht riesig (etwa 7 Millionen
Zusammenfassungs-Transaktionen pro Monat), und wir haben Daten von 4 bis 10
Jahren, die wir dem Benutzer pr�sentieren m�ssen. Wir bekamen w�chentliche
Anfragen von Kunden, die 'sofortigen' Zugriff auf neue Berichte aus diesen
Daten wollten.

Die L�sung bestand darin, alle Informationen monatsweise in komprimierten
'Transaktions-' Tabellen zu speichern. Wir haben einen Satz einfacher
Makros (ein Skript), die aus diesen Tabellen Zusammenfassungstabellen
erzeugen, die nach verschiedenen Kriterien gruppiert sind (Produktgruppe,
Kunden-ID, Verkaufsstelle usw.). Die Berichte sind Web-Seiten, die
dynamisch durch ein kleines Perl-Skript erzeugt werden, das eine Web-Seite
parst, die enthaltenen SQL-Statements ausf�hrt und die Ergebnisse einf�gt.
Wir h�tten statt dessen PHP oder mod_perl benutzt, aber diese waren damals
noch nicht verf�gbar.

F�r grafische Darstellungen schrieben wir ein einfaches Werkzeug in
@code{C}, das GIFs auf der Grundlage der Ergebnisse einer SQL-Anfrage
erzeugen kann (nach einigem Verarbeiten des Ergebnisses). Dieses wird
ebenfalls dynamisch durch ein Perl-Skript ausgef�hrt, das die
@code{HTML}-Dateien parst.

In den meisten F�llen kann ein neuer Bericht einfach durch das Kopieren
eines bestehenden Skripts und das Ver�ndern der SQL-Anfrage darin erzeugt
werden. In einigen F�llen m�ssen wir einer bestehenden
Zusammenfassungstabelle weitere Felder hinzuf�gen oder eine neue
generieren, aber auch das ist recht einfach, weil wir alle
Transaktionstabellen auf Platte haben. (Momentan haben wir mindestens 50 GB
an Transaktionstabellen und 200 GB weiterer Kundendaten.)

Wir lassen unsere Kunden auch direkt mit ODBC auf die Transaktionstabellen
zugreifen, so dass fortgeschrittene Benutzer selbst mit den Daten
experimentieren k�nnen.

Wir hatten mit der Handhabung keinerlei Probleme, auf einer recht
bescheidenen Sun Ultra SPARCstation (2x200 MHz). K�rzlich haben wir einen
unserer Server auf eine mit 2 Prozessoren best�ckte 400 MHz-UltraSPARC
erweitert und planen jetzt, Transaktionen auf Produktebene zu handhaben,
was eine zehnfache Steigerung der Datenmenge bedeuten w�rde. Wir glauben,
dass wir auch damit Schritt halten k�nnen, indem wir unseren Systemen
einfach mehr Festplattenplatz hinzuf�gen.

Wir experimentieren auch mit Intel-Linux, um in der Lage zu sein, mehr
CPU-Power preisg�nstiger zu erhalten. Jetzt, wo wir das bin�re portable
Datenbankformat haben (neu seit Version 3.23), werden wir dieses f�r einige
Teile der Applikation benutzen.

Unser anf�ngliches Gef�hl sagt uns, dass Linux viel besser bei geringer bis
mittlerer Last ist, w�hrend Solaris wegen der extremen
Festplatten-Eingabe-/Ausgabe-Geschwindigkeit (Disk-IO) bei Hochlast besser
ist, aber wir k�nnen noch nichts Endg�ltiges dar�ber aussagen. Nach einigen
Diskussionen mit den Linux-Kernel-Entwicklern ist das eventuell ein
Seiteneffekt von Linux, das dem Stapel-Job so viel Ressourcen gibt, dass
die interaktive Performance sehr gering wird. Dadurch scheint die Maschine
sehr langsam und unempf�nglich f�r Eingaben zu lassen, w�hrend gro�e
Stapel-Jobs abgearbeitet werden. Wir hoffen, dass dies in zuk�nftigen
Linux-Kernels besser gehandhabt wird.


@node MySQL Benchmarks, Custom Benchmarks, Internal use, Optimise Overview
@c German node MySQL-Benchmarks
@subsection Die MySQL-Benchmark-Suite

@cindex Benchmark-Suite
@cindex Crash-me-Programm

Dieser Abschnitt sollte eine technische Beschreibung der MySQL-
Benchmark-Suite (und von @code{crash-me}) enthalten, aber diese
Beschreibung wurde noch nicht geschrieben. Momentan k�nnen Sie eine gute
Idee �ber den Benchmark bekommen, wenn Sie einen Blick auf den Code und die
Ergebnisse im @file{sql-bench}-Verzeichnis jeder MySQL-Quelldistribution
werfen.

Diese Benchmark-Suite ist als Benchmark gedacht, der jedem Benutzer
mitteilt, welche Dinge in einer gegebenen SQL-Implementation gut performen
und welche schlecht.

Beachten Sie, dass dieser Benchmark single-threaded ist. Daher misst er die
minimale Zeit der Operationen. In Zukunft planen wir, auch etliche
multi-threaded Test hinzuzuf�gen.

Beispiele (die auf derselben NT-4.0-Maschine liefen):

@multitable @columnfractions .6 .2 .2
@strong{2.000.000 Zeilen vom Index lesen} @tab @strong{Sekunden} @tab @strong{Sekunden}
@item mysql             @tab 367 @tab 249
@item mysql_odbc	@tab 464
@item db2_odbc		@tab 1206
@item informix_odbc	@tab 121126
@item ms-sql_odbc	@tab 1634
@item oracle_odbc	@tab 20800
@item solid_odbc	@tab 877
@item sybase_odbc	@tab 17614
@end multitable

@multitable @columnfractions .6 .2 .2
@strong{350.768 Zeilen einf�gen} @tab @strong{Sekunden} @tab @strong{Sekunden}
@item mysql		@tab 381 @tab 206
@item mysql_odbc	@tab 619
@item db2_odbc		@tab 3460
@item informix_odbc	@tab 2692
@item ms-sql_odbc	@tab 4012
@item oracle_odbc	@tab 11291
@item solid_odbc	@tab 1801
@item sybase_odbc	@tab 4802
@end multitable

Im obigen Test lief MySQL mit einem 8 MB Index-Cache.

Weitere Benchmark-Ergebnisse haben wir unter
@uref{http://www.mysql.com/information/benchmarks.html} gesammelt.

Beachten Sie, dass Oracle nicht beinhaltet ist, weil sie gebeten haben,
entfernt zu werden. Alle Oracle-Benchmarks m�ssen von Oracle freigegeben
werden! Wir glauben, dass das die Aussagef�higkeit von Oracle-Benchmarks 
@strong{SEHR} zweifelhaft erscheinen l��t, weil alle obigen Benchmarks
daf�r da sind zu zeigen, was eine Standard-Installation bei einem einzelnen
Client machen kann.

Um eine Benchmark-Suite laufen zu lassen, m�ssen Sie eine
MySQL-Quelldistribution herunter laden, den Perl-DBI-Treiber und den
Perl-DBD-Treiber f�r die gew�nschte Datenbank installieren und dann
folgendes tun:

@example
cd sql-bench
perl run-all-tests --server=#
@end example

Wobei # einer der unterst�tzten Server ist. Sie erhalten eine Auflistung
aller Optionen und unterst�tzten Server, indem Sie @code{run-all-tests
--help} ausf�hren.

@cindex Crash-me
@code{Crash-me} versucht herauszufinden, welche Features eine Datenbank
unterst�tzt und wo ihre F�higkeiten und Einschr�nkungen sind, indem
tats�chliche Anfragen ausgef�hrt werden. Beispielsweise stellt es fest:

@itemize @bullet
@item
Welche Spaltentypen unterst�tzt werden.
@item
Wie viele Indexe unterst�tzt werden.
@item
Welche Funktionen unterst�tzt werden.
@item
Wie Gro� eine Anfrage sein kann.
@item
Wie Gro� eine @code{VARCHAR}-Spalte sein kann.
@end itemize

Sie finden die Ergebnisse von Crash-me f�r viele verschiedene Datenbanken
unter @uref{http://www.mysql.com/information/crash-me.php}.


@node Custom Benchmarks,  , MySQL Benchmarks, Optimise Overview
@c German node Benutzerspezifische Benchmarks
@subsection Wie Sie Ihre eigenen Benchmarks benutzen

@cindex Benchmarks
@cindex Performance, Benchmarks

Sie sollten Ihre Applikation und Datenbank auf jeden Fall einem
Benchmark-Test unterziehen um herauszufinden, wo Flaschenh�lse sind. Indem
Sie einen Flaschenhals beseitigen (oder ihn durch ein 'Dummy-Modul'
ersetzen), k�nnen Sie leicht den n�chsten Flaschenhals herausfinden (usw.).
Selbst wenn die insgesamte Performance f�r Ihre Applikation ausreichend
ist, sollten Sie zumindest einen Plan f�r jeden Flaschenhals aufstellen und
entscheiden, auf welche Weise dieser beseitigt werden soll, wenn Sie eines
Tages die zus�tzliche Performance ben�tigen.

Als Beispiel f�r ein portables Benchmark-Programm schauen Sie sich die
MySQL-Benchmark-Suite an. @xref{MySQL Benchmarks, , MySQL-Benchmarks}. Sie
k�nnen jedes Programm dieser Suite nehmen und es Ihren Bed�rfnissen
entsprechend ab�ndern. Wenn Sie das tun, k�nnen Sie unterschiedliche
L�sungen f�r Ihr Problem finden und testen, was bei Ihnen wirklich die
schnellste L�sung ist.

Es ist h�ufig der Fall, dass Probleme nur dann auftreten, wenn das System
unter schwerer Last l�uft. Viele Kunden nahmen mit uns Kontakt auf, nachdem
sie ein (getestetes) System in eine Produktionsumgebung stellten und
Lastprobleme bekamen. Bei jedem dieser F�lle gab es bislang entweder
Probleme mit dem Grund-Design (Tabellen-Scans laufen NICHT gut unter hoher
Last) oder im Zusammenhang mit dem Betriebssystem / den Bibliotheken. Das
meiste davon w�re @strong{SEHR} viel einfacher zu beheben, wenn die Systeme
nicht bereits in einer Produktionsumgebung liefen.

Um solcherlei Probleme zu vermeiden, sollten Sie einige Anstrengung darauf
verwenden, Ihre gesamte Applikation unter der schlimmstm�glichen Last zu
benchmarken! Hierf�r k�nnen Sie Super Smack benutzen, das Sie hier
erhalten:
@uref{http://www.mysql.com/downloads/super-smack/super-smack-1.0.tar.gz}.
Wie der Name nahelegt, kann es Ihr System auf die Knie zwingen, wenn Sie
das wollen. Achten Sie daher darauf, es nur auf Entwicklungssystemen zu
verwenden.


@node Query Speed, Locking Issues, Optimise Overview, MySQL Optimisation
@c German node Anfragen-Geschwindigkeit
@section @code{SELECT}s und andere Anfragen optimieren

@cindex Anfragen, Geschwindigkeit von
@cindex Berechtigungspr�fungen, Auswirkung auf Geschwindigkeit
@cindex Geschwindigkeit, von Anfragen

Zun�chst etwas, das alle Anfragen betrifft: Je komplexer das
Berechtigungssystem, das Sie einrichten, desto mehr Overhead bekommen Sie.

Falls Sie noch keinerlei @code{GRANT}-Statements ausgef�hrt haben,
optimiert MySQL die Berechtigungspr�fung zum Teil. Wenn Sie also sehr hohe
Zugriffszahlen haben, kann es einen Zeitvorteil darstellen, Grants zu
vermeiden. Ansonsten k�nnen mehr Berechtigungspr�fungen in einem gr��eren
Overhead resultieren.

Wenn Sie Probleme bei einer bestimmten MySQL-Funktion haben, k�nnen Sie den
Zeitbedarf jederzeit wie folgt mit dem MySQL-Client feststellen:

@example
mysql> select benchmark(1000000,1+1);
+------------------------+
| benchmark(1000000,1+1) |
+------------------------+
|                      0 |
+------------------------+
1 row in set (0.32 sec)
@end example

Das Ergebnis zeigt, dass MySQL 1.000.000 @code{+}-Operationen in 0,32
Sekunden auf einer @code{PentiumII-400MHz}-Maschine ausf�hren kann.

Alle MySQL-Funktionen sollten sehr optimiert sein, aber es mag einige
Ausnahmen geben und @code{benchmark(schleifenzaehler,ausdruck)} ist ein
gro�artiges Werkzeug, um herauszufinden, ob das das Problem bei Ihrer
Anfrage darstellt.



@menu
* EXPLAIN::                     
* Estimating performance::      
* SELECT speed::                
* Where optimisations::         
* DISTINCT optimisation::       
* LEFT JOIN optimisation::      
* LIMIT optimisation::          
* Insert speed::                
* Update speed::                
* Delete speed::                
* Tips::                        
@end menu

@node EXPLAIN, Estimating performance, Query Speed, Query Speed
@c German node EXPLAIN
@subsection @code{EXPLAIN}-Syntax (Informationen �ber ein @code{SELECT} erhalten)

@findex EXPLAIN
@findex SELECT, Optimierung

@example
     EXPLAIN tabelle
oder EXPLAIN SELECT select_optionen
@end example

@code{EXPLAIN tabelle} ist ein Synonym f�r @code{DESCRIBE tabelle} oder
@code{SHOW COLUMNS FROM tabelle}.

Wenn Sie einem @code{SELECT}-Statement das Schl�sselwort @code{EXPLAIN}
voran stellen, erkl�rt MySQL explains, wie er das @code{SELECT} ausf�hren
w�rde, indem Informationen dar�ber gemacht werden, wie Tabellen verkn�pft
(Join) werden und in welcher Reihenfolge.

Mit der Hilfe von @code{EXPLAIN} k�nnen Sie erkennen, wo Sie Tabellen
Indexe hinzuf�gen m�ssen, um ein schnelleres @code{SELECT} zu erhalten, das
Indexe benutzt, um die Datens�tze zu finden. Ausserdem sehen Sie, ob der
Optimierer die Tabellen in optimaler Reihenfolge verkn�pft. Um den
Optimierer zu zwingen, eine spezielle Verkn�pfungsreihenfolge bei einem
@code{SELECT}-Statement einzuhalten, f�gen Sie eine
@code{STRAIGHT_JOIN}-Klausel hinzu.

Bei nicht einfachen Verkn�pfungen (Joins) gibt @code{EXPLAIN} f�r jede
Tabelle, die im @code{SELECT}-Statement benutzt wurde, eine
Informationszeile zur�ck. Die Tabellen sind in der Reihenfolge aufgelistet,
in der sie gelesen werden w�rden. MySQL l�st alle Joins mit einer
Single-Sweep-Multi-Join-Methode auf. Das bedeutet, dass MySQL eine Zeile
aus der ersten Tabelle liest, dann die passende Zeile in der zweiten
Tabelle sucht, dann in der dritten Tabelle usw. Wenn alle Tabellen
verarbeitet wurden, gibt er die ausgew�hlten Spalten aus und geht
r�ckw�rts durch die Tabellenliste durch, bis eine Tabelle gefunden wird,
bei der es weitere passende Zeilen gibt. Die n�chste Zeile wird aus dieser
Tabelle gelesen, und der Prozess f�hrt mit der n�chsten Tabelle fort.

Die Ausgabe von @code{EXPLAIN} enth�lt folgende Spalten:

@table @code
@item table
Die Tabelle, auf die sich die Ausgabezeile bezieht.

@item type
Der Join-Typ. Informationen �ber die verschiedenen Typen finden Sie weiter
unten.

@item possible_keys
Die @code{possible_keys}-Spalte gibt an, welche Indexe MySQL verwenden
konnte, um Zeilen in dieser Tabelle zu finden. Beachten Sie, dass diese
Spalte v�llig unabh�ngig von der Reihenfolge der Tabellen ist. Das hei�t,
dass einige der Schl�ssel in possible_keys m�glicherweise bei der
tats�chlich verwendeten Tabellenreihenfolge nicht verwendbar sind.

Wenn diese Spalte leer ist, gibt es keine relevanten Indexe. In diesem Fall
k�nnen Sie die Performance Ihrer Anfrage wom�glich verbessern, indem Sie
die @code{WHERE}-Klausel untersuchen, um festzustellen, ob diese auf eine
oder mehrere Spalten verweist, die zweckm��igerweise indiziert werden
sollten. Wenn das der Fall ist, erzeugen Sie einen entsprechenden Index und
pr�fen Sie die Anfrage noch einmal mit @code{EXPLAIN}. @xref{ALTER TABLE}.

Um zu sehen, welche Indexe eine Tabelle hat, benutzen Sie @code{SHOW INDEX
FROM tabelle}.

@item key
@c German FIX changed @xref to @ref
Die @code{key}-Spalte gibt den Schl�ssel an, den MySQL tats�chlich benutzen
wird. Der Schl�ssel ist @code{NULL}, wenn kein Index gew�hlt wurde. Wenn
MySQL den falschen Index w�hlt, k�nnen Sie ihn wahrscheinlich zwingen,
einen anderen Index zu nehmen, indem Sie @code{myisamchk --analyze} oder
@ref{myisamchk syntax} ausf�hren oder @code{USE INDEX/IGNORE INDEX}
benutzen. @xref{JOIN}.

@item key_len
Die @code{key_len}-Spalte gibt die L�nge des Schl�ssels an, den MySQL
benutzen wird. Die L�nge ist @code{NULL}, wenn @code{key} @code{NULL} ist.
Beachten Sie, dass Ihnen das angibt, wie viele Teile eines mehrteiligen
Schl�ssels MySQL tats�chlich benutzen wird.

@item ref
Die @code{ref}-Spalte zeigt an, welche Spalten oder Konstanten beim
@code{key} benutzt werden, um Zeilen aus der Tabelle auszuw�hlen.

@item rows
die @code{rows}-Spalte gibt die Anzahl von Zeilen an, von denen MySQL
annimmt, dass es sie untersuchen muss, um die Anfrage auszuf�hren.

@item Extra
Diese Spalte enth�lt zus�tzliche Informationen dar�ber, wie MySQL die
Anfrage aufl�sen wird. Folgende unterschiedliche Text-Zeichenketten k�nnen
in dieser Spalte stehen:

@table @code
@item Distinct
MySQL wird die Suche nach weiteren Zeilen f�r die aktuelle
Zeilenkombination nicht fortsetzen, nachdem er die erste passende Zeile
gefunden hat.

@item Not exists
MySQL war in der Lage, eine @code{LEFT JOIN}-Optimierung der Anfrage
durchzuf�hren, und wird keine weiteren Spalten in dieser Tabelle f�r die
vorherige Zeilenkombination mehr untersuchen, nachdem er eine Zeile
gefunden hat, die den @code{LEFT JOIN}-Kriterien entspricht.

Hier ist ein Beispiel daf�r:

@example
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
@end example

Angenommen, @code{t2.id} ist mit @code{NOT NULL} definiert. In diesem Fall
scannt MySQL @code{t1} und schl�gt die Zeilen in @code{t2} �ber
@code{t1.id} nach. Wenn MySQL eine �bereinstimmende Zeile in @code{t2}
findet, wei� er, dass @code{t2.id} nie @code{NULL} sein kann und scannt
nicht durch den Rest der Zeilen in @code{t2}, die dieselbe @code{id} haben.
Mit anderen Worten, f�r jede Zeile in @code{t1} muss MySQL nur ein einziges
Mal in @code{t2} nachschlagen, unabh�ngig davon, wie viel �bereinstimmende
Zeilen es in @code{t2} gibt.

@item @code{range checked for each record (index map: #)}
MySQL hat keinen gut geeigneten Index zum Benutzen gefunden. Statt dessen
wird er f�r jede Zeilenkombination in der vorherigen Tabelle eine Pr�fung
vornehmen, welchen Index er benutzen soll (falls �berhaupt) und diesen
Index benutzen, um Zeilen aus der Tabelle abzurufen. Das ist nicht sehr
schnell, aber immer noch schneller, als einen Join ohne Index
durchzuf�hren.

@item Using filesort
MySQL braucht einen zus�tzlichen Durchgang, um herauszufinden, wie die
Zeilen in sortierter Reihenfolge abgerufen werden sollen. Die Sortierung
wird durchgef�hrt, indem in Abh�ngigkeit vom @code{join type} durch alle
Zeilen durchgegangen wird und der Sortierschl�ssel und Zeiger auf die
Zeilen f�r alle Zeilen gespeichert wird, die dem @code{WHERE} entsprechen.
Danach werden die Schl�ssel sortiert. Schlie�lich werden die Zeilen in
sortierter Reihenfolge abgerufen.

@item Using index
Die Spalteninformation wird aus der Tabelle abgerufen, indem nur
Informationen aus dem Index-Baum benutzt werden, ohne dass zum Suchen
zus�tzlich in den tats�chlichen Zeilen gelesen werden muss. Das kann
gemacht werden, wenn alle benutzten Spalten der Tabelle Teil desselben
Indexes sind.

@item Using temporary
Um die Anfrage aufzul�sen muss MySQL eine tempor�re Tabelle erzeugen, die
das Ergebnis enth�lt. Das passiert typischerweise, wenn Sie ein @code{ORDER
BY} auf eine andere Spalte setzen als auf die, die Sie im @code{GROUP BY}
angegeben haben.

@item Where used
Eine @code{WHERE}-Klausel wird benutzt, um zu begrenzen, bei welchen Zeilen
auf �bereinstimmung in der n�chsten Tabelle gesucht wird oder welche Zeilen
an den Client geschickt werden. Wenn Sie diese Information nicht haben und
die Tabelle vom Typ @code{ALL} oder @code{index} ast, ist vielleicht in
Ihrer Anfrage etwas falsch (falls Sie nicht vorhaben, alle Zeilen aus der
Tabelle zu holen / zu untersuchen).
@end table

Wenn Sie wollen, dass Ihre Anfragen so schnell wie m�glich laufen, sollten
Sie auf @code{Using filesort} und @code{Using temporary} achten.
@end table

Die verschiedenen Join-Typen sind unten aufgef�hrt, sortiert vom besten zum
schlechtesten Typ:

@cindex Systemtabelle
@cindex Tabellen, System-
@table @code
@item system
Die Tabelle hat nur eine Zeile (= Systemtabelle). Das ist ein spezieller
Fall des @code{const}-Join-Typs.

@cindex Konstanten-Tabelle
@cindex Tabellen, Konstanten-
@item const
Die Tabelle hat h�chsten eine �bereinstimmende Zeile, die am Anfang der
Anfrage gelesen werden wird. Weil es nur eine Zeile gibt, k�nnen
Spaltenwerte in dieser Zeile vom Optimierer als Konstanten betrachtet
werden. @code{const}-Tabellen sind sehr schnell, weil sie nur einmal
gelesen werden!

@item eq_ref
Aus dieser Tabelle wird f�r jede Zeilenkombination der vorherigen Tabellen
eine Zeile gelesen. Das ist der bestm�gliche Join-Typ, ausgenommen die
@code{const}-Typen. Er wird benutzt, wenn alle Teile eines Indexes vom Join
benutzt werden und der Index @code{UNIQUE} oder ein @code{PRIMARY KEY} ist.

@item ref
Alle Zeilen mit �bereinstimmenden Index-Werten werden f�r jede
Zeilenkombination der vorherigen Tabellen gelesen. @code{ref} wird benutzt,
wenn der Join nur das am weitesten links stehende Pr�fix des Schl�ssels
benutzt, oder wenn der Schl�ssel nicht @code{UNIQUE} oder ein @code{PRIMARY
KEY} ist (mit anderen Worten, wenn der Join auf der Grundlage des
Schl�sselwerts keine einzelne Zeile ausw�hlen kann). Wenn der Schl�ssel,
der benutzt wird, nur mit einigen wenigen Zeilen �bereinstimmt, ist dieser
Join-Typ gut.

@item range
Nur Zeilen, die innerhalb eines angegebenen Bereichs sind, werden abrufen,
wobei ein Index benutzt wird, um die Zeilen auszuw�hlen. Die
@code{key}-Spalte gibt an, welcher Index benutzt wird. @code{key_len}
enth�lt den l�ngsten Schl�sselteil, der benutzt wurde. Die
@code{ref}-Spalte ist f�r diesen Typ NULL.

@item index
Das ist dasselbe wie @code{ALL}, ausser dass nur der Index-Baum gescannt
wird. Das ist �blicherweise schneller als @code{ALL}, weil die Index-Datei
�blicherweise kleiner ist als die Daten-Datei.

@item ALL
F�r jede Zeilenkombination der vorherigen Tabellen wird ein kompletter
Tabellenscan durchgef�hrt. Das ist normalerweise nicht gut, wenn die
Tabelle die erste Tabelle ist, die nicht als @code{const} gekennzeichnet
ist, und �blicherweise @strong{sehr} schlecht in allen anderen F�llen. Sie
k�nnen @code{ALL} normalerweise vermeiden, indem Sie mehr Indexe
hinzuf�gen, so dass die Zeile auf der Grundlage der Konstanten-Werte oder
Spaltenwerte von fr�heren Tabellen abgerufen werden kann.
@end table

Sie erhalten einen guten Anhaltspunkt, wie gut ein Join ist, wenn Sie alle
Werte in der @code{rows}-Spalte der @code{EXPLAIN}-Ausgabe multiplizieren.
Das sollte grob aussagen, wie vielen Zeilen MySQL untersuchen muss, um die
Anfrage auszuf�hren. Diese Anzahl wird auch benutzt, wenn Sie Anfragen mit
der @code{max_join_size}-Variablen begrenzen.
@xref{Server parameters}.

Das folgende Beispiel zeigt, wie ein @code{JOIN} progressiv optimiert
werden kann, indem die Informationen genutzt werden, die @code{EXPLAIN}
bereit stellt.

Angenommen, Sie haben unten stehendes @code{SELECT}-Statement, das Sie mit
@code{EXPLAIN} untersuchen:

@example
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
            tt.ProjectReference, tt.EstimatedShipDate,
            tt.ActualShipDate, tt.ClientID,
            tt.ServiceCodes, tt.RepetitiveID,
            tt.CurrentProcess, tt.CurrentDPPerson,
            tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
            et_1.COUNTRY, do.CUSTNAME
        FROM tt, et, et AS et_1, do
        WHERE tt.SubmitTime IS NULL
            AND tt.ActualPC = et.EMPLOYID
            AND tt.AssignedPC = et_1.EMPLOYID
            AND tt.ClientID = do.CUSTNMBR;
@end example

Nehmen wir bei diesem Beispiel folgendes an:

@itemize @bullet
@item
Die Spalten, die verglichen werden, wurden wie folgt deklariert:

@multitable @columnfractions .1 .2 .7
@item @strong{Tabelle} @tab @strong{Spalte} @tab @strong{Spaltentyp}
@item @code{tt}      @tab @code{ActualPC}      @tab @code{CHAR(10)}
@item @code{tt}      @tab @code{AssignedPC}    @tab @code{CHAR(10)}
@item @code{tt}      @tab @code{ClientID}      @tab @code{CHAR(10)}
@item @code{et}      @tab @code{EMPLOYID}      @tab @code{CHAR(15)}
@item @code{do}      @tab @code{CUSTNMBR}      @tab @code{CHAR(15)}
@end multitable

@item
Die Tabellen haben die unten stehenden Indexe:

@multitable @columnfractions .1 .9
@item @strong{Tabelle} @tab @strong{Index}
@item @code{tt}      @tab @code{ActualPC}
@item @code{tt}      @tab @code{AssignedPC}
@item @code{tt}      @tab @code{ClientID}
@item @code{et}      @tab @code{EMPLOYID} (primary key)
@item @code{do}      @tab @code{CUSTNMBR} (primary key)
@end multitable

@item
Die @code{tt.ActualPC}-Werte sind nicht gleichm��ig verteilt.
@end itemize

Anfangs, bevor die Optimierung durchgef�hrt wurde, ergab das
@code{EXPLAIN}-Statement folgende Informationen:

@example
table type possible_keys                key  key_len ref  rows  Extra
et    ALL  PRIMARY                      NULL NULL    NULL 74
do    ALL  PRIMARY                      NULL NULL    NULL 2135
et_1  ALL  PRIMARY                      NULL NULL    NULL 74
tt    ALL  AssignedPC,ClientID,ActualPC NULL NULL    NULL 3872
      range checked for each record (key map: 35)
@end example

Weil @code{type} bei jeder Tabelle @code{ALL} ist, zeigt die Ausgabe, dass
MySQL eine komplette Verkn�pfung (Full Join) aller Tabellen durchf�hrt! Das
dauert recht lange, weil das Produkt der Zeilenanzahl in jeder Tabelle
untersucht werden muss! In diesem Fall ist das @code{74 * 2.135 * 74 *
3.872 = 45.268.558.720} Zeilen. Wenn die Tabellen gr��er w�ren, k�nnen Sie
sich vorstellen, wie lange das dauern w�rde.

Ein Problem liegt hier darin, dass MySQL (noch) keine Indexe auf Spalten
effizient benutzen kann, wenn sie unterschiedlich deklariert sind. In
diesem Zusammenhang sind @code{VARCHAR} und @code{CHAR} dasselbe, es sei
denn, sie sind mit unterschiedlichen L�ngen deklariert. Weil
@code{tt.ActualPC} als @code{CHAR(10)} und @code{et.EMPLOYID} als
@code{CHAR(15)} deklariert ist, gibt eine Unstimmigkeit der L�ngen.

Um diese Ungleichheit der Spaltenl�ngen zu beheben, benutzen Sie
@code{ALTER TABLE}, um @code{ActualPC} von 10 auf 15 Zeichen zu verl�ngern:

@example
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
@end example

Jetzt sind @code{tt.ActualPC} und @code{et.EMPLOYID} beide
@code{VARCHAR(15)}. Eine erneute Ausf�hrung des @code{EXPLAIN}-Statements
ergibt dieses Ergebnis:

@example
table type   possible_keys   key     key_len rew         rows    Extra
tt    ALL    AssignedPC,ClientID,ActualPC NULL NULL NULL 3872    where used
do    ALL    PRIMARY         NULL    NULL    NULL        2135
      range checked for each record (key map: 1)
et_1  ALL    PRIMARY         NULL    NULL    NULL        74
      range checked for each record (key map: 1)
et    eq_ref PRIMARY         PRIMARY 15      tt.ActualPC 1
@end example

Das ist nicht perfekt, aber viel besser (das Produkt der @code{rows}-Werte
ist jetzt um einen Faktor 74 niedriger). Diese Version wird innerhalb von
ein paar Sekunden ausgef�hrt.

Eine zweite �nderung kann durchgef�hrt werden, um die Unstimmigkeit der
Spaltenl�ngen f�r die @code{tt.AssignedPC = et_1.EMPLOYID}- und
@code{tt.ClientID = do.CUSTNMBR}-Vergleiche zu beheben:

@example
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),
                      MODIFY ClientID   VARCHAR(15);
@end example

Jetzt ergibt @code{EXPLAIN} folgende Ausgabe:

@example
table type   possible_keys   key     key_len rew            rows     Extra
et    ALL    PRIMARY         NULL    NULL    NULL           74
tt    rew    AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used
et_1  eq_ref PRIMARY         PRIMARY 15      tt.AssignedPC  1
do    eq_ref PRIMARY         PRIMARY 15      tt.ClientID    1
@end example

Das ist fast so gut, wie es �berhaupt geht.

Das verbleibende Problem besteht darin, dass MySQL vorgabem��ig annimmt,
dass die Werte in der @code{tt.ActualPC}-Spalte gleichm��ig verteilt sind,
was in der @code{tt}-Tabelle nicht der Fall ist. Gl�cklicherweise ist es
einfach, MySQL dar�ber zu informieren:

@example
shell> myisamchk --analyze PFAD_ZU_MYSQL_DATENBANK/tt
shell> mysqladmin refresh
@end example

Jetzt ist der Join perfekt und @code{EXPLAIN} ergibt dieses Ergebnis:

@example
table type   possible_keys   key     key_len ref            rows    Extra
tt    ALL    AssignedPC,ClientID,ActualPC NULL NULL NULL    3872    where used
et    eq_ref PRIMARY         PRIMARY 15      tt.ActualPC    1
et_1  eq_ref PRIMARY         PRIMARY 15      tt.AssignedPC  1
do    eq_ref PRIMARY         PRIMARY 15      tt.ClientID    1
@end example

Beachten Sie, dass die @code{rows}-Spalte in der Ausgabe von @code{EXPLAIN}
eine gehobene Form von Vermutung des MySQL-Join-Optimierers ist. Um eine
Anfrage zu optimieren, sollten Sie �berpr�fen, ob diese Zahlen der Wahrheit
nahe kommen. Wenn nicht, erhalten Sie eventuell bessere Performance, wenn
Sie @code{STRAIGHT_JOIN} in Ihrem @code{SELECT}-Statement benutzen und
versuchen, die Tabellen in der @code{FROM}-Klausel in anderer Reihenfolge
anzugeben.


@node Estimating performance, SELECT speed, EXPLAIN, Query Speed
@c German node Performance absch�tzen
@subsection Anfragen-Performance absch�tzen

@cindex absch�tzen, Anfragen-Performance
@cindex Anfragen, Performance absch�tzen
@cindex Performance, absch�tzen

In den meisten F�llen k�nnen Sie die Performance sch�tzen, indem Sie
Suchvorg�nge auf Festplatte z�hlen. Bei kleinen Tabellen k�nnen Sie die
Zeile �blicherweise mit 1 Festplatten-Suchvorgang finden (weil der Index
wahrscheinlich im Cache ist). Bei gr��eren Tabellen k�nnen Sie sch�tzen,
dass Sie (bei der Benutzung von B++-Baum-Indexen) brauchen werden:
@code{log(zeilen_zahl) / log(index_block_laenge / 3 * 2 / (index_laenge +
daten_zeiger_laenge)) + 1} Suchvorg�nge, um die Zeile zu finden.

In MySQL ist ein Index-Block �blicherweise 1024 Bytes lang und der
Daten-Zeiger �blicherweise 4 Bytes. Eine 500.000-Zeilen-Tabelle mit einer
Indexl�nge von 3 (medium integer) ergibt:
@code{log(500.000)/log(1024/3*2/(3+4)) + 1} = 4 Suchvorg�nge.

Da der obige Index etwa 500.000 * 7 * 3/2 = 5,2 MB ben�tigen w�rde
(angenommen, dass die Index-Puffer zu 2/3 gef�llt sind, was ein typischer
Wert sit), haben Sie wahrscheinlich viel vom Index im Arbeitsspeicher und
werden wahrscheinlich nur 1 bis 2 Betriebssystem-Aufrufe ben�tigen, um
Daten zu lesen, um die Zeile zu finden.

Bei Schreibvorg�ngen brauchen Sie jedoch 4 Suchanfragen (wie oben), um
herauszufinden, wo der neue Index platziert wird, und normalerweise 2
Suchvorg�nge, um den Index zu aktualisieren und die Zeile zu schreiben.

Beachten Sie, dass oben Gesagtes nicht bedeutet, dass Ihre Applikation
allm�hlich mit N log N verf�llt! Solange alles durch das Betriebssystem
oder den SQL-Server gecachet wird, werden die Dinge nur marginal langsamer,
wenn die Tabellen gr��er werden. Wenn die Daten zu Gro� werden, um
gecachet zu werden, werden die Dinge anfangen, viel langsamer zu laufen,
bis Ihre Applikation schlie�lich komplett durch Suchvorg�nge auf
Festplatte ausgebremst wird (die mit N log N zunehmen). Um das zu
vermeiden, vergr��ern Sie den Index-Cache, wenn die Daten wachsen.
@xref{Server parameters}.


@node SELECT speed, Where optimisations, Estimating performance, Query Speed
@c German node SELECT-Geschwindigkeit
@subsection Geschwindigkeit von @code{SELECT}-Anfragen

@findex SELECT-Geschwindigkeit

@cindex Geschwindigkeit, von Anfragen

Wenn Sie ein langsames @code{SELECT ... WHERE} schneller machen wollen, ist
im Allgemeinen das erste, was zu pr�fen ist, ob Sie einen Index hinzuf�gen
k�nnen oder nicht. @xref{MySQL indexes, , MySQL-Indexe}. Alle Verweise
(Reference) zwischen verschiedenen Tabellen sollten �blicherweise mit
Indexen gemacht werden. Sie k�nnen den @code{EXPLAIN}-Befehl benutzen, um
herauszufinden, welche Indexe f�r ein @code{SELECT} benutzt werden.
@xref{EXPLAIN, , @code{EXPLAIN}}.

Einige allgemeine Tipps:

@itemize @bullet
@item
Um MySQL zu helfen, Anfragen besser zu optimieren, lassen Sie
@code{myisamchk --analyze} auf eine Tabelle laufen, nachdem sie mit
relevanten Daten gef�llt wurde. Das aktualisiert einen Wert f�r jeden
Index-Teil, der die durchschnittliche Anzahl von Zeilen angibt, die
denselben Wert haben. (Bei eindeutigen Indexen ist das nat�rlich immer 1).
MySQL benutzt diesen Wert, um zu entscheiden, welcher Index benutzt werden
soll, wenn Sie zwei Tabellen mit einem 'nicht konstanten Ausdruck'
verbinden. Sie k�nnen das Ergebnis nach dem Laufenlassen von @code{analyze}
mit @code{SHOW INDEX FROM tabelle} �berpr�fen und die
@code{Cardinality}-Spalte untersuchen.

@item
Um einen Index und Daten gem�� einem Index zu sortieren, benutzen Sie
@code{myisamchk --sort-index --sort-records=1} (wenn Sie nach Index 1
sortieren wollen). Wenn Sie einen eindeutigen Index haben, von dem Sie alle
Datens�tze gem�� der Reihenfolge dieses Indexes lesen wollen, ist das eine
gute Art, das schneller zu machen. Beachten Sie jedoch, dieses Sortieren
nicht optimal geschrieben wird und bei einer gro�en Tabelle lange dauert!
@end itemize


@node Where optimisations, DISTINCT optimisation, SELECT speed, Query Speed
@c German node WHERE-Optimierung
@subsection Wie MySQL @code{WHERE}-Klauseln optimiert

@findex WHERE

@cindex Optimierungen

Die @code{WHERE}-Optimierungen wurden hier in den @code{SELECT}-Teil
aufgenommen, weil sie meist in Verbindung mit @code{SELECT} benutzt werden,
aber dieselben Optimierungen treffen f�r @code{WHERE} bei @code{DELETE}-
und @code{UPDATE}-Statements zu.

Beachten Sie auch, dass dieser Abschnitt nicht vollst�ndig ist. MySQL f�hrt
viele Optimierungen durch und wir hatten noch keine Zeit, alle davon zu
dokumentieren.

Einige der Optimierungen, die MySQL durchf�hrt, sind unten aufgef�hrt:

@itemize @bullet
@item
Entfernung unn�tiger Klammern:
@example
   ((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
@end example
@item
Konstanten-'Falten' (Folding):
@example
   (a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
@end example
@item
Bedingungsentfernung bei Konstanten (notwendig wegen Konstanten-'Falten'):
@example
   (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
@end example
@item
Konstante Ausdr�cke, die von Indexen benutzt werden, werden nur einmal
ausgewertet.
@item
@code{COUNT(*)} auf eine einzelne Tabelle ohne ein @code{WHERE} wird direkt
aus der Tabelleninformation abgerufen. Das wird auch bei jeglichen
@code{NOT NULL}-Ausdr�cken gemacht, wenn diese nur f�r eine Tabelle benutzt
werden.
@item
Fr�herkennung ung�ltiger Konstanten-Ausdr�cke. MySQL stellt schnell fest,
dass einige @code{SELECT}-Statements unm�glich sind, und gibt keine Zeilen
zur�ck.
@item
@code{HAVING} wird mit @code{WHERE} vereinigt, wenn Sie @code{GROUP BY}
oder Gruppen-Funktionen (@code{COUNT()}, @code{MIN()} usw.) nicht
benutzen.
@item
F�r jeden Sub-Join wird ein einfacheres @code{WHERE} konstruiert, um eine
schnelle @code{WHERE}-Evaluierung f�r jeden Sub-Join zu erzielen, und auch,
um Datens�tze so bald wie m�glich �berspringen zu k�nnen.
@cindex Konstanten-Tabelle
@cindex Tabellen, Konstanten-
@item
Alle Konstanten-Tabellen werden zuerst gelesen, vor jeder anderen Tabelle
in der Anfrage. Eine Konstanten-Tabelle ist:
@itemize @minus
@item
Eine leere Tabelle oder eine Tabelle mit 1 Zeile.
@item
Eine Tabelle, die bei einer @code{WHERE}-Klausel auf einen
@code{UNIQUE}-Index oder einen @code{PRIMARY KEY} benutzt wird, wobei alle
Index-Teile mit konstanten Ausdr�cken benutzt werden und die Index-Teile
als @code{NOT NULL} definiert sind.
@end itemize
Alle folgenden Tabellen werden als Konstanten-Tabellen benutzt:
@example
mysql> SELECT * FROM t WHERE primary_key=1;
mysql> SELECT * FROM t1,t2
           WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
@end example

@item
Die beste Join-Kombination, um Tabellen zu verkn�pfen, wird gefunden, wenn
man alle M�glichkeiten probiert. Wenn alle Spalten in @code{ORDER BY} und
in @code{GROUP BY} aus derselben Tabelle stammen, wird diese Tabelle
vorzugsweise vorn hingestellt, wenn verkn�pft wird.
@item
Wenn es eine @code{ORDER BY}-Klausel und eine andere @code{GROUP
BY}-Klausel gibt, oder wenn @code{ORDER BY} oder @code{GROUP BY} Spalten
aus Tabellen enth�lt, die nicht aus der ersten Tabelle in der Join-Reihe
stammen, wird eine tempor�re Tabelle erzeugt.
@item
Wenn Sie @code{SQL_SMALL_RESULT} benutzen, benutzt MySQL eine tempor�re
Tabelle im Arbeitsspeicher.
@item
Jeder Tabellen-Index wird abgefragt und der beste Index, der weniger als
30% der Zeilen �berspannt, wird benutzt. Wenn ein solcher Index nicht
gefunden werden kann, wird ein schneller Tabellenscan benutzt.
@item
In einigen F�llen kann MySQL Zeilen vom Index lesen, ohne �berhaupt in der
Daten-Datei nachzuschlagen. Wenn alle Spalten, die vom Index benutzt
werden, numerisch sind, wird nur der Index-Baum benutzt, um die Anfrage
aufzul�sen.
@item
Bevor jeder Datensatz herausgegeben wird, werden die, die nicht mit der
@code{HAVING}-Klausel �bereinstimmen, �bersprungen.
@end itemize

Einige Beispiele von Anfragen, die sehr schnell sind:

@example
mysql> SELECT COUNT(*) FROM tabelle;
mysql> SELECT MIN(schluessel_teil1),MAX(schluessel_teil1) FROM tabelle;
mysql> SELECT MAX(schluessel_teil2) FROM tabelle
           WHERE schluessel_teil_1=konstante;
mysql> SELECT ... FROM tabelle
           ORDER BY schluessel_teil1,schluessel_teil2,... LIMIT 10;
mysql> SELECT ... FROM tabelle
           ORDER BY schluessel_teil1 DESC,schluessel_teil2 DESC,... LIMIT 10;
@end example

Die folgenden Anfragen werden aufgel�st, indem nur der Index-Baum benutzt
wird (unter der Annahme, dass die indizierten Spalten numerisch sind):

@example
mysql> SELECT schluessel_teil1,schluessel_teil2 FROM tabelle WHERE schluessel_teil1=val;
mysql> SELECT COUNT(*) FROM tabelle
           WHERE schluessel_teil1=val1 AND schluessel_teil2=val2;
mysql> SELECT schluessel_teil2 FROM tabelle GROUP BY schluessel_teil1;
@end example

Die folgenden Anfragen benutzen Indexierung, um die Zeilen in sortierter
Reihenfolge abzufragen, ohne einen separaten Sortierdurchgang:

@example
mysql> SELECT ... FROM tabelle ORDER BY schluessel_teil1,schluessel_teil2,... ;
mysql> SELECT ... FROM tabelle ORDER BY schluessel_teil1 DESC,schluessel_teil2 DESC,... ;
@end example


@node DISTINCT optimisation, LEFT JOIN optimisation, Where optimisations, Query Speed
@c German node DISTINCT-Optimierung
@subsection Wie MySQL @code{DISTINCT} optimiert

@findex DISTINCT

@cindex Optimierung, DISTINCT

@code{DISTINCT} wird f�r alle Spalten in @code{GROUP BY} umgewandelt,
@code{DISTINCT} in Kombination mit @code{ORDER BY} ben�tigt in vielen
F�llen ebenfalls eine tempor�re Tabelle.

Wenn @code{LIMIT #} mit @code{DISTINCT} kombiniert wird, h�lt MySQL an,
sobald er @code{#} eindeutige Zeilen findet.

Wenn Sie nicht Spalten aus allen benutzten Tabellen verwenden, h�lt MySQL
mit dem Scannen der nicht benutzten Tabellen an, sobald er die erste
�bereinstimmung gefunden hat.

@example
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
@end example

Im Beispiel wird angenommen, dass t1 vor t2 benutzt wird (�berpr�fen Sie
das mit @code{EXPLAIN}). In diesem Fall h�rt MySQL auf, von t2 zu lesen
(f�r diese bestimmte Zeile in t1), sobald die erste Zeile in t2 gefunden
wurde.


@node LEFT JOIN optimisation, LIMIT optimisation, DISTINCT optimisation, Query Speed
@c German node LEFT-JOIN-Optimierung
@subsection Wie MySQL @code{LEFT JOIN} optimiert

@findex LEFT JOIN

@cindex Optimierung, LEFT JOIN

@code{A LEFT JOIN B} ist in MySQL wie folgt implementiert:

@itemize @bullet
@item
Die Tabelle @code{B} wird als abh�ngig von Tabelle @code{A} und allen
Tabellen, von denen @code{A} abh�ngig ist, gesetzt.

@item
Die Tabelle @code{A} wird als abh�ngig von allen Tabellen (ausser @code{B})
gesetzt, die in der @code{LEFT JOIN}-Bedingung aufgef�hrt sind.

@item
Alle @code{LEFT JOIN}-Bedingungen werden zu @code{WHERE}-Klausel
verschoben.

@item
Alle Standard-Join-Optimierungen werden durchgef�hrt, mit der Ausnahme,
dass eine Tabelle immer nach allen Tabellen gelesen wird, von denen sie
abh�ngig ist. Wenn es eine zirkul�re Abh�ngigkeit gibt, gibt MySQL einen
Fehler aus.

@item
Alle Standard-@code{WHERE}-Optimierungen werden durchgef�hrt.

@item
Wenn es eine Zeile in @code{A} gibt, die mit der @code{WHERE}-Klausel
�bereinstimmt, aber keine Zeile in @code{B}, die mit der @code{LEFT
JOIN}-Bedingung �bereinstimmt, wird eine zus�tzliche Zeile f�r @code{B}
erzeugt, deren Spalten alle auf @code{NULL} gesetzt sind.

@item
Wenn Sie @code{LEFT JOIN} benutzen, um Zeilen zu finden, die in einer
Tabelle nicht existieren, und Sie folgendes im @code{WHERE}-Teil angeben:
@code{spalten_name IS NULL}, wobei spalten_name eine Spalte ist, die als
@code{NOT NULL} deklariert ist, h�rt MySQL mit der Suche nach weiteren
Zeilen auf (f�r eine bestimmte Schl�sselkombination), nachdem er eine Zeile
gefunden hat, die mit der @code{LEFT JOIN}-Bedingung �bereinstimmt.
@end itemize

@code{RIGHT JOIN} ist analog zu @code{LEFT JOIN} implementiert.

Die Lese-Reihenfolge der Tabellen, die von @code{LEFT JOIN} und
@code{STRAIGHT JOIN} erzwungen wird, hilft dem Optimierer (der berechnet,
in welcher Reihenfolge die Tabellen verkn�pft werden sollen), seine Arbeit
schneller durchzuf�hren, weil weniger Tabellenvertauschungen �berpr�ft
werden m�ssen.

Beachten Sie, dass das oben Gesagte bedeutet, dass bei einer Anfrage des
folgenden Typs:

@example
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
@end example

MySQL einen kompletten Scan von @code{b} durchf�hren wird, weil der
@code{LEFT JOIN} erzwingt, dass diese vor @code{d} gelesen wird.

Das l��t sich in diesem Fall beheben, indem die Anfrage wie folgt ge�ndert
wird:

@example
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
@end example


@node LIMIT optimisation, Insert speed, LEFT JOIN optimisation, Query Speed
@c German node LIMIT-Optimierung
@subsection Wie MySQL @code{LIMIT} optimiert

@findex LIMIT

@cindex Optimierung, LIMIT

In einigen F�llen handhabt MySQL die Anfrage unterschiedlich, wenn Sie
@code{LIMIT #} statt @code{HAVING} benutzen:

@itemize @bullet
@item
Wenn Sie nur einige wenige Zeilen mit @code{LIMIT} ausw�hlen, benutzt MySQL
in einigen F�llen Indexe, wenn er ansonsten vorzugsweise einen
vollst�ndigen Tabellenscan durchf�hren w�rde.
@item
Wenn Sie @code{LIMIT #} mit @code{ORDER BY} benutzen, beendet MySQL das
Sortieren, sobald er die ersten @code{#} Zeilen gefunden hat, anstatt die
gesamte Tabelle zu sortieren.
@item
Wenn Sie @code{LIMIT #} mit @code{DISTINCT} kombinieren, h�rt MySQL auf,
sobald er @code{#} eindeutige Zeilen gefunden hat.
@item
In einigen F�llen kann @code{GROUP BY} aufgel�st werden, indem der
Schl�ssel in der Reihenfolge gelesen wird (oder der Schl�ssel sortiert
wird) und danach Zusammenfassungen berechnet werden, bis sich der
Schl�sselwert �ndert. In diesem Fall berechnet @code{LIMIT #} keine
unn�tigen @code{GROUP BY}'s.
@item
Sobald MySQL die ersten @code{#} Zeilen an den Client geschickt hat, wird
die Anfrage abgebrochen.
@item
@code{LIMIT 0} gibt immer schnell eine leere Ergebnismenge (empty set)
zur�ck. Das ist n�tzlich, um die Anfrage zu �berpr�fen und die Spaltentypen
der Ergebnisspalten zu erhalten.
@item
Die Gr��e der tempor�ren Tabellen benutzt @code{LIMIT #}, um zu berechnen,
wieviel Platz ben�tigt wird, um die Anfrage aufzul�sen.
@end itemize


@node Insert speed, Update speed, LIMIT optimisation, Query Speed
@c German node INSERT-Geschwindigkeit
@subsection Geschwindigkeit von @code{INSERT}-Anfragen

@findex INSERT

@cindex Geschwindigkeit, beim Einf�gen
@cindex Einf�gen, Geschwindigkeit

Die Zeit, einen Datensatz einzuf�gen, besteht ungef�hr aus:

@itemize @bullet
@item
Verbindung:                     (3)
@item
Anfrage an den Server schicken: (2)
@item
Anfrage parsen:                 (2)
@item
Datensatz einf�gen:             (1 x Gr��e des Datensatzes)
@item
Indexe einf�gen:                (1 x Anzahl der Indexe)
@item
Schlie�en:                     (1)
@end itemize

Wobei die Zahlen in etwa proportional zur Gesamtzeit sind. Diese Berechnung
zieht den anf�nglichen Overhead, um Tabellen zu �ffnen, nicht in Betracht
(was einmal f�r jede gleichzeitig laufende Anfrage gemacht wird).

Die Gr��e der Tabelle verlangsamt das Einf�gen von Indexen um N log N
(B-B�ume).

Einige M�glichkeiten, die Geschwindigkeit von Einf�geoperationen zu
steigern:

@itemize @bullet
@item
Wenn Sie viele Zeilen vom selben Client aus zur gleichen Zeit einf�gen,
benutzen Sie mehrfache Werte (Liste) im @code{INSERT}-Statements. Das geht
viel schneller (in manchen F�lle um Faktoren) als separate
@code{INSERT}-Statements zu benutzen. Tunen Sie die
@code{myisam_bulk_insert_tree_size}-Variable, um das sogar noch zu
beschleunigen. @xref{SHOW VARIABLES}.
@item
Wenn Sie viele Zeilen von unterschiedlichen Clients aus einf�gen, k�nnen
Sie mehr Geschwindigkeit erzielen, wenn Sie das @code{INSERT
DELAYED}-Statement benutzen. @xref{INSERT, , @code{INSERT}}.
@item
Beachten Sie, dass Sie mit @code{MyISAM}-Tabellen Zeilen zur selben Zeit
einf�gen k�nnen, zu der @code{SELECT}s laufen, wenn es keine gel�schten
Zeilen in den Tabellen gibt.
@item
Wenn Daten in eine Tabelle aus einer Textdatei eingeladen werden, benutzen
Sie @code{LOAD DATA INFILE}. Das ist �blicherweise 20 mal schneller als
viele @code{INSERT}-Statements zu benutzen. @xref{LOAD DATA, , @code{LOAD DATA}}.
@item
Mit etwas zus�tzlicher M�he ist es m�glich, @code{LOAD DATA INFILE} noch
schneller laufen zu lassen, wenn die Tabelle viele Indexe hat. Gehen Sie
wie folgt vor:

@enumerate
@item
Optional erzeugen Sie die Tabelle mit @code{CREATE TABLE}, zum Beispiel mit
@code{mysql} oder �ber die Perl-DBI.

@item
F�hren Sie ein @code{FLUSH TABLES}-Statement oder den Shell-Befehl
@code{mysqladmin flush-tables} aus.

@item
Geben Sie @code{myisamchk --keys-used=0 -rq /pfad/zu/db/tabelle} ein.
Dadurch entfernen Sie die Benutzung aller Indexe von der Tabelle.

@item
F�gen Sie Daten in die Tabelle mit @code{LOAD DATA INFILE} ein. Dadurch
werden keine Indexe aktualisiert, was deswegen sehr schnell l�uft.

@item
Wenn Sie in Zukunft nur noch aus der Tabelle lesen, benutzen Sie
@code{myisampack}, um sie kleiner zu machen. @xref{Compressed format}.

@item
Erzeugen Sie die Indexe mit @code{myisamchk -r -q /pfad/zu/db/tabelle} neu.
Hierdurch wird der Index-Baum im Speicher erzeugt, bevor er auf die Platte
geschrieben wird, was viel schneller ist, weil viele Suchvorg�nge auf
Platte vermieden werden. Der sich ergebende Index-Baum ist ausserdem
perfekt ausbalanciert.

@item
F�hren Sie ein @code{FLUSH TABLES}-Statement oder den Shell-Befehl
@code{mysqladmin flush-tables} aus.
@end enumerate

Diese Prozedur wird in Zukunft in @code{LOAD DATA INFILE} eingebaut werden.

Ab @strong{MySQL 4.0} k�nnen Sie auch @code{ALTER TABLE tabelle DISABLE
KEYS} anstelle von @code{myisamchk --keys-used=0 -rq /pfad/zu/db/tabelle}
und @code{ALTER TABLE tabelle ENABLE KEYS} anstelle von @code{myisamchk -r
-q /pfad/zu/db/tabelle} benutzen. Damit k�nnen Sie auch die @code{FLUSH
TABLES}-Schritte �berspringen.
@item
Sie k�nnen die Einf�gegeschwindigkeit steigern, indem Sie Tabellen sperren:

@example
mysql> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;
@end example

Der haupts�chliche Geschwindigkeitsunterschied liegt darin, dass der
Index-Puffer nur einmal auf Platte zur�ck geschrieben wird, nachdem alle
@code{INSERT}-Statements fertig sind. Normalerweise w�rden die Index-Puffer
so oft zur�ck geschrieben wie es @code{INSERT}-Statements gibt. Das Sperren
wird nicht ben�tigt, wenn Sie alle Zeilen mit einem einzigen Statement
einf�gen k�nnen.

Durch das Sperren wird auch die Gesamtzeit von Tests auf mehrere
Verbindungen gesenkt, aber die maximale Wartezeit f�r einige Threads wird
erh�ht (weil sie auf Sperren warten). Beispiel:

@example
Thread 1 f�hrt 1000 Einf�gevorg�nge durch.
Thread 2, 3 und 4 f�gen 1 Einf�gevorgang durch.
Thread 5 f�hrt 1000 Einf�gevorg�nge durch.
@end example

Wenn Sie kein Sperren benutzen, sind die Threads 2, 3 und 4 vor 1 und 5
fertig. Wenn Sie Sperren benutzen, sind 2, 3 und 4 wahrscheinlich nicht vor
1 oder 5 fertig, aber die Gesamtzeit sollte etwa 40% geringer sein.

Weil @code{INSERT}-, @code{UPDATE}- und @code{DELETE}-Operationen in MySQL
sehr schnell sind, erhalten Sie bessere Performance �ber alles, wenn Sie um
alles herum Sperren hinzuf�gen, was mehr als etwa 5 Einf�geoperationen oder
Aktualisierungen (Updates) in einer Zeile durchf�hrt. Wenn Sie sehr viele
Einf�geoperationen in einer Zeile durchf�hren, k�nnen Sie ein @code{LOCK
TABLES} machen, gefolgt von einem gelegentlichen @code{UNLOCK TABLES}
(etwa alle 1.000 Zeilen), um anderen Threads zu gestatten, auf die Tabelle
zuzugreifen. Das Ergebnis w�re ebenfalls ein netter Geschwindigkeitsgewinn.

Nat�rlich ist @code{LOAD DATA INFILE} zum Einladen von Daten viel
schneller.
@end itemize

Um sowohl f�r @code{LOAD DATA INFILE} als auch f�r @code{INSERT} mehr
Geschwindigkeit zu erzielen, vergr��ern Sie den Schl�ssel-Puffer.
@xref{Server parameters}.


@node Update speed, Delete speed, Insert speed, Query Speed
@c German node UPDATE-Geschwindigkeit
@subsection Geschwindigkeit von @code{UPDATE}-Anfragen

Update-Anfragen werden wie eine @code{SELECT}-Anfrage optimiert, mit dem
zus�tzlichen Overhead eines Schreibvorgangs. Die Geschwindigkeit des
Schreibvorgangs h�ngt von der Gr��e der Daten und von der Anzahl der
Indexe, die aktualisiert werden, ab. Indexe, die nicht ge�ndert werden,
werden nicht aktualisiert.

Eine weitere M�glichkeit, Aktualisierungen (Updates) schnell zu machen,
ist, sie zu verz�gern und dann sp�ter viele Aktualisierungen hintereinander
zu machen. Viele Aktualisierungen hintereinander sind viel schneller als
nur eine zugleich, wenn Sie die Tabelle sperren.

Beachten Sie, dass die Aktualisierung eines Datensatzes bei dynamischem
Datensatzformat dazu f�hren kann, dass der Datensatz aufgespalten wird.
Wenn Sie das oft durchf�hren, ist es daher sehr wichtig, gelegentlich
@code{OPTIMIZE TABLE} auszuf�hren. @xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}.


@node Delete speed, Tips, Update speed, Query Speed
@c German node DELETE-Geschwindigkeit
@subsection Geschwindigkeit von @code{DELETE}-Anfragen

Wenn Sie alle Zeilen in der Tabelle l�schen wollen, sollten Sie
@code{TRUNCATE TABLE tabelle} benutzen. @xref{TRUNCATE}.

Die Zeit, die f�r das L�schen eines Datensatzes ben�tigt wird, ist exakt
proportional zur Anzahl der Indexe. Um Datens�tze schneller zu l�schen,
k�nnen Sie die Gr��e des Index-Caches herauf setzen.
@xref{Server parameters}.


@node Tips,  , Delete speed, Query Speed
@c German node Tipps
@subsection Weitere Optimierungstipps

@cindex Optimierung, Tipps
@cindex Tipps, Optimierung

Ungeordnete Liste von Tipps f�r schnellere Systeme:

@itemize @bullet
@item
Benutzen Sie persistente Verbindungen zur Datenbank, um
Verbindungs-Overhead zu vermeiden. Wenn Sie keine persistenten Verbindungen
benutzen k�nnen und viele neue Verbindungen zur Datenbank aufmachen,
sollten Sie den Wert der @code{Thread_cache_size}-Variablen �ndern.
@xref{Server parameters}.
@item
�berpr�fen Sie immer, dass alle Ihre Anfragen tats�chlich die Indexe
benutzen, die Sie in den Tabellen erzeugt haben. In MySQL kann man das mit
dem @code{EXPLAIN}-Befehl tun. @xref{EXPLAIN, Explain, Explain, Handbuch}.
@item
Versuchen Sie, komplexe @code{SELECT}-Anfragen auf Tabellen zu vermeiden,
die viel aktualisiert werden, um Probleme mit Tabellensperren zu vermeiden.
@item
Die neuen @code{MyISAM}-Tabellen k�nnen Zeilen in eine Tabelle ohne
gel�schte Zeile zur gleichen Zeit einf�gen, wie eine andere Tabelle aus ihr
liest. Wenn das f�r Sie wichtig ist, sollten Sie Methoden in Betracht
ziehen, bei denen Sie keine Zeilen l�schen m�ssen, oder @code{OPTIMIZE
TABLE} laufen lassen, nachdem Sie viele Zeilen gel�scht haben.
@item
Benutzen Sie @code{ALTER TABLE ... ORDER BY ausdruck1,ausdruck2,...}, wenn
Sie Zeilen zumeist in der Reihenfolge ausdruck1,ausdruck2,... abrufen. Wenn
Sie diese Option nach gro�en �nderungen in der Tabelle nutzen, erzielen
Sie eventuell h�here Performance.
@item
In einigen F�llen kann es sinnvoll sein, eine Spalte einzuf�hren, die auf
der Grundlage von Informationen aus anderen Spalten 'gehashed' ist. Wenn
diese Spalte kurz und halbwegs eindeutig ist, kann das schneller sein als
ein gro�er Index auf mehrere Spalten. In MySQL ist es sehr einfach, eine
solche zus�tzliche Spalte zu benutzen:
@code{SELECT * FROM tabelle WHERE hash=MD5(concat(spalte1,spalte2))
AND spalte_1='constant' AND spalte_2='constant'}
@item
Bei Tabellen, die sich viel �ndern, sollten Sie versuchen, alle
@code{VARCHAR}- oder @code{BLOB}-Spalten zu vermeiden. Sonst erhalten Sie
dynamische Zeilenl�ngen, sobald Sie eine einzige @code{VARCHAR}- oder
@code{BLOB}-Spalte verwenden. @xref{Table types}.
@item
Normalerweise n�tzt es nichts, eine Tabelle in verschiedene Tabellen
aufzuteilen, nur weil die Zeile 'viel' werden. Um auf eine Zeile
zuzugreifen, ist das wichtigste, was die Performance betrifft, der
Suchvorgang nach dem ersten Byte der Zeile auf der Platte. Nachdem die
Daten gefunden wurden, k�nnen die meisten neuen Platten die gesamte Zeile
f�r die meisten Applikationen schnell genug lesen. Der einzige Fall, wo es
wirklich etwas ausmacht, wenn eine Tabelle aufgeteilt wird, ist, wenn die
Tabelle dynamische Zeilenl�nge hat (siehe oben), was nicht in eine feste
Zeilenl�nge umgewandelt werden kann, oder wenn Sie die Tabelle sehr oft
scannen m�ssen, die meisten der Spalten hierf�r aber nicht ben�tigen.
@xref{Table types}.
@item
Wenn Sie sehr oft etwas auf der Grundlage von Informationen aus sehr vielen
Zeilen berechnen m�ssen (zum Beispiel Dinge z�hlen), ist es wahrscheinlich
besser, eine neue Tabelle einzuf�hren und den Z�hler in Echtzeit zu
aktualisieren. Eine Aktualisierung des Typs @code{UPDATE tabelle set
zaehler=zaehler+1 where index_spalte=konstante} ist sehr schnell!

Das ist sehr wichtig, wenn Sie Datenbanken wie MySQL benutzen, die nur
Tabellensperren haben (viele Leser / einzelne Schreiber). Bei den meisten
sonstigen Datenbanken ergibt das ebenfalls bessere Performance, weil der
Zeilensperr-Manager weniger zu tun haben wird.
@item
Wenn Sie Statistiken aus gro�en Log-Tabellen gewinnen wollen, benutzen Sie
Zusammenfassungstabellen, statt die gesamte Tabelle zu scannen. Die Wartung
der Zusammenfassungen sollte wesentlich leichter sein, als die Statistiken
'live' zu generieren. Es ist viel schneller, neue Zusammenfassungstabellen
aus den Logs zu erzeugen, wenn sich Dinge �ndern (abh�ngig von
Gesch�ftsentscheidungen) als eine laufende Applikation �ndern zu m�ssen!
@item
Wenn m�glich sollte man Berichte als 'live' oder 'statistisch'
klassifizieren, wobei die Daten, die f�r statistische Berichte ben�tigt
werden, nur auf der Grundlage von Zusammenfassungstabellen erzeugt werden,
die aus den eigentlichen Daten generiert werden.
@item
Ziehen Sie Vorteile aus der Tatsache, dass Spalten Vorgabewerte haben.
F�gen Sie nur dann explizit Werte ein, wenn der einzuf�gende Wert vom
Vorgabewert abweicht. Das verringert das Parsen, das MySQL durchf�hren
muss, und erh�ht die Einf�gegeschwindigkeit.
@item
In einigen F�llen ist es bequem, Daten zu komprimieren und in einem Blob zu
speichern. In diesem Fall m�ssen Sie in Ihrer Applikation etwas
zus�tzlichen Code unterbringen, um die Dinge im Blob zu packen bzw. zu
entpacken. Das kann aber in manchen Phasen etliches an Zugriffen einsparen.
Das ist praktisch, wenn Sie Daten haben, die mit einer statischen
Tabellenstruktur nicht konform sind.
@item
Normalerweise sollten Sie versuchen, alle Daten nicht redundant zu halten
(was sich in der Datenbanktheorie dritte Normalform nennt). Scheuen Sie
sich aber nicht davor, Dinge zu duplizieren oder Zusammenfassungstabellen
zu erzeugen, wenn Sie dies brauchen, um mehr Geschwindigkeit zu erzielen.
@item
Gespeicherte Prozeduren (Stored Procedures) oder UDF (user defined
functions, benutzerdefinierte Funktionen) sind eine gute M�glichkeit, mehr
Performance zu erzielen. Sie sollten jedoch immer eine andere (langsamere)
M�glichkeit parat haben, wenn Sie eine Datenbank benutzen, die gespeicherte
Prozeduren nicht unterst�tzt.
@item
Man erreicht immer etwas, wenn man Anfragen / Antworten in der Applikation
cachet und versucht, viele Einf�ge- oder Aktualisierungsvorg�nge zugleich
durchzuf�hren. Wenn Ihre Datenbank Tabellensperren unterst�tzt (wie MySQL
und Oracle), sollte das dazu f�hren, dass der Index-Cache nur einmal auf
Platte zur�ck geschrieben wird, nachdem alles Einf�gen / Aktualisieren
ausgef�hrt ist.
@item
Benutzen Sie @code{INSERT /*! DELAYED */}, wenn Sie nicht wissen brauchen,
wann Ihre Daten geschrieben werden. Das erh�ht die Geschwindigkeit, weil
viele Datens�tze mit einem einzige Festplattenschreibzugriff geschrieben
werden k�nnen.
@item
Benutzten Sie @code{INSERT /*! LOW_PRIORITY */}, wenn Sie wollen, dass Ihre
Selects h�here Priorit�t haben.
@item
Benutzen Sie @code{SELECT /*! HIGH_PRIORITY */}, um zu bewirken, dass
Selects in der Wartereihe nach vorn springen. Das hei�t, der Select wird
sogar dann durchgef�hrt, wenn jemand darauf wartet, etwas zu schreiben.
@item
Benutzen Sie das mehrzeilige @code{INSERT}-Statement, um viele Zeilen mit
einem SQL-Befehl zu speichern (viele SQL-Server unterst�tzen das).
@item
Benutzen Sie @code{LOAD DATA INFILE}, um gr��ere Datenmengen zu laden. Das
ist schneller als normale Einf�gevorg�nge und wird noch schneller, wenn
@code{myisamchk} in @code{mysqld} integriert wird.
@item
Benutzen Sie @code{AUTO_INCREMENT}-Spalten, um eindeutige Werte zu
erzeugen.
@item
Benutzen Sie gelegentlich @code{OPTIMIZE TABLE}, um Fragmentierungen zu
vermeiden, wenn Sie das dynamische Tabellenformat verwenden.
@c German FIX changed @xref from TABLE to OPTIMIZE TABLE (point to proper node)
@xref{OPTIMIZE TABLE}.
@item
Benutzen Sie - wenn m�glich - @code{HEAP}-Tabellen, um mehr Geschwindigkeit
zu erzielen. @xref{Table types}.
@item
Bei einer normalen Webserver-Konfiguration sollten Bilder als separate
Dateien gespeichert werden. Das hei�t, speichern Sie nur einen Verweis zur
Datei in der Datenbank. Der Hauptgrund ist, dass normale Webserver viel
besser darin sind, Dateien zu cachen als Datenbankinhalte. Daher ist es
viel einfacher, ein schnelles System zu bekommen, wenn Sie Dateien
benutzen.
@item
Benutzen Sie f�r nicht kritische Daten, auf die oft zugegriffen wird,
Tabellen im Arbeitsspeicher (zum Beispiel Informationen �ber die Banner,
die Benutzern ohne Cookies zuletzt pr�sentiert wurden).
@item
Spalten mit identischen Informationen in unterschiedlichen Tabellen sollten
identisch deklariert sein und identische Namen haben. Vor Version 3.23
konnte man ansonsten langsame Joins erhalten.

Versuchen Sie, die Namen einfach zu halten (benutzen Sie @code{name}
anstelle von @code{kunde_name} in der Kundentabelle). Um Namen f�r andere
SQL-Server portabel zu halten, sollten Sie sie k�rzer als 18 Zeichen
halten.
@item
Wenn Sie WIRKLICH hohe Geschwindigkeit brauchen, sollten Sie einen Blick
auf die Low-Level-Schnittstellen zur Datenspeicherung werfen, die die
unterschiedlichen SQL-Server unterst�tzen! Wenn Sie zum Beispiel auf
@code{MyISAM} direkt zugreifen, erhalten Sie eine
Geschwindigkeitssteigerung um den Faktor 2 bis 5, im Vergleich zur
Benutzung der SQL-Schnittstelle. Um das durchf�hren zu k�nnen, m�ssen die
Daten auf demselben Server liegen wie die Applikation und �blicherweise
sollte auf sie nur von einem Prozess zugegriffen werden (weil externes
Dateisperren reichlich langsam ist). Man k�nnte die oben genannten Probleme
beseitigen, indem Low-Level-@code{MyISAM}-Befehle in den MySQL-Server
eingebaut werden (das w�re eine einfache M�glichkeit, bei Bedarf mehr
Performance zu erlangen). Indem die Datenbankshnittstelle sorgf�ltig
entworfen wird, sollte es recht einfach sein, diese Arten von Optimierung
zu unterst�tzen.
@item
In vielen F�llen ist es schneller, auf Daten aus einer Datenbank (mit einer
direkten Verbindung) als �ber eine Textdatei zuzugreifen, schon deshalb,
weil die Datenbank wahrscheinlich kompakter ist als die Textdatei (wenn Sie
numerische Daten benutzen) und hierdurch weniger Festplattenzugriffe
erforderlich sind. Ausserdem wird Code eingespart, weil Sie Ihre
Textdateien nicht parsen m�ssen, um Zeilen- und Spaltenbegrenzungen zu
finden.
@item
Ausserdem k�nnen Sie Replikation benutzen, um die Geschwindigkeit zu
steigern. @xref{Replication}.
@item
Wenn eine Tabelle mit @code{DELAY_KEY_WRITE=1} deklariert wird, werden
Aktualisierungen auf Indexe schneller, weil diese nicht auf Platte
geschrieben werden, bis die Datei geschlossen wird. Der Nachteil ist, dass
Sie auf diesen Tabellen @code{myisamchk} laufen lassen sollten, bevor Sie
@code{mysqld} starten, um sicherzustellen, dass diese in Ordnung sind,
falls irgend etwas @code{mysqld} mittendrin killt. Weil die
Schl�ssel-Informationen jederzeit aus den Daten erzeugt werden k�nnen,
sollten Sie durch @code{DELAY_KEY_WRITE} nichts verlieren.
@end itemize


@node Locking Issues, Optimising Database Structure, Query Speed, MySQL Optimisation
@c German node Sperren (Locks)
@section Sperren (Locking)




@menu
* Internal locking::            
* Table locking::               
@end menu

@node Internal locking, Table locking, Locking Issues, Locking Issues
@c German node Internes Sperren
@subsection Wie MySQL Tabellen sperrt

@cindex internes Sperren
@cindex sperren, Tabellen
@cindex Tabellen, sperren

Im Anhang finden Sie eine Er�rterung zu den unterschiedlichen
Sperrmethoden. @xref{Locking methods}.

Jedes Sperren in MySQL ist blockierungsfrei. Das wird erreicht, indem alle
Sperren zugleich am Anfang einer Anfrage angefordert werden, und indem
Tabellen immer in derselben Reihenfolge gesperrt werden.

The Sperrmethode, die MySQL f�r @code{WRITE}-Sperren benutzt, funktioniert
wie folgt:

@itemize @bullet
@item
Falls es keine Sperren auf die Tabelle gibt, wird eine Schreibsperre
gemacht.
@item
Ansonsten wird die Sperranforderung in die Schreibsperren-Warteschlange
eingereiht.
@end itemize

Die Sperrmethode, die MySQL f�r @code{READ}Sperren benutzt, funktioniert
wie folgt:

@itemize @bullet
@item
Falls es keine Schreibsperren auf die Tabelle gibt, wird eine Lesesperre
gemacht.
@item
Ansonsten wird die Sperranforderung in die Lesesperren-Warteschlange
eingereiht.
@end itemize

Wenn eine Sperre aufgehoben wird, wird die Sperren den Threads in der
Schreibsperren-Warteschlange verf�gbar gemacht, danach den Threads in der
Lesesperren-Warteschlange.

Das bedeutet, wenn Sie viele Aktualisierungen auf eine Tabelle haben,
warten @code{SELECT}-Statements, bis es keine Aktualisierungen mehr gibt.

Um das f�r den Fall zu umgehen, dass es viele @code{INSERT}-
und-@code{SELECT}-Operationen auf eine Tabelle gibt, k�nnen Sie Zeilen in
eine tempor�re Tabelle einf�gen und die echte Tabelle gelegentlich aus den
Daten der tempor�re Tabelle aktualisieren.

Das machen Sie wie folgt:
@example
mysql> LOCK TABLES echte_tabelle WRITE, einfuege_tabelle WRITE;
mysql> insert into echte_tabelle select * von einfuege_tabelle;
mysql> TRUNCATE TABLE einfuege_tabelle;
mysql> UNLOCK TABLES;
@end example

Sie k�nnen bei @code{INSERT}, @code{UPDATE} oder @code{DELETE} die
@code{LOW_PRIORITY}-Option oder bei @code{SELECT} die
@code{HIGH_PRIORITY}-Option benutzen, wenn Sie dem Abruf von Daten in
bestimmten F�llen Priorit�t einr�umen wollen. Sie k�nnen auch @code{mysqld}
mit @code{--low-priority-updates} starten, um dasselbe Verhalten zu
erreichen.

Die Benutzung von @code{SQL_BUFFER_RESULT} kann ebenfalls helfen,
Tabellensperren k�rzer zu machen. @xref{SELECT}.

Sie k�nnen auch den Sperr-Code in @file{mysys/thr_lock.c} �ndern, um eine
einzige Warteschlagen zu benutzen. In diesem Fall haben Schreibsperren und
Lesesperren dieselbe Priorit�t, was bei einigen Applikationen eventuell
hilfreich ist.


@node Table locking,  , Internal locking, Locking Issues
@c German node Tabellensperren
@subsection Themen, die Tabellensperren betreffen

@cindex Probleme, Tabellensperren

Der Tabellensperren-Code in MySQL ist blockierungsfrei.

MySQL benutzt Tabellensperren (anstelle von Zeilensperren oder
Spaltensperren) f�r alle Tabellentypen ausser @code{BDB}-Tabellen, um eine
sehr hohe Sperrgeschwindigkeit zu erzielen. Bei gro�en Tabellen ist
Tabellensperren bei den meisten Applikationen VIEL besser als
Zeilensperren, aber es gibt nat�rlich ein paar Fallstricke.

Bei @code{BDB}- und @code{InnoDB}-Tabellen benutzt MySQL Tabellensperren,
wenn Sie die Tabelle explizit mit @code{LOCK TABLES} sperren oder einen
Befehl ausf�hren, der jede Zeile in der Tabelle �ndern wird, wie
@code{ALTER TABLE}. Bei diesen Tabellentypen empfehlen wir, @code{LOCK
TABLES} �berhaupt nicht zu benutzen.

Ab MySQL-Version 3.23.7 k�nnen Sie Zeilen in @code{MyISAM}-Tabellen zur
gleichen Zeit einf�gen, w�hrend andere Threads aus der Tabelle lesen.
Beachten Sie, dass das momentan nur funktioniert, wenn es zu der Zeit, zu
der das Einf�gen vorgenommen wird, keine durch gel�schte Zeilen verursachte
L�cher in der Tabelle gibt. Wenn alle L�cher mit neuen Daten gef�llt
wurden, werden gleichzeitige Einf�gevorg�nge automatisch wieder aktiviert.

Tabellensperren erm�glicht, dass viele Threads gleichzeitig aus einer
Tabelle lesen, aber bevor ein Thread in die Tabelle schreiben kann, muss er
zun�chst exklusiven Zugriff erhalten. W�hrend der Aktualisierung m�ssen
andere Threads, die auf diese Tabelle zugreifen wollen, warten, bis die
Aktualisierung fertig ist.

Weil Aktualisierung von Tabellen normalerweise als wichtiger erachtet
werden als @code{SELECT}, erhalten alle Statements, die eine Tabelle
aktualisieren, eine h�here Priorit�t als Statements, die Informationen aus
der Tabelle abrufen. Das sollte sicherstellen, dass Aktualisierungen nicht
'verhungern', wenn viele gro�e Anfragen auf eine bestimmte Tabelle
durchgef�hrt werden. (Sie k�nnen das �ndern, indem Sie bei dem Statement,
dass die Aktualisierung durchf�hrt, LOW_PRIORITY verwenden, oder beim
@code{SELECT}-Statement @code{HIGH_PRIORITY}.)

Ab MySQL-Version 3.23.7 k�nnen Sie die @code{max_write_lock_count}-Variable
benutzen, um MySQL zu zwingen, tempor�r allen @code{SELECT}-Statements, die
auf eine Tabelle warten, nach einer bestimmten Anzahl von Einf�gevorg�ngen
auf eine Tabelle h�here Priorit�t einzur�umen.

Tabellensperren ist jedoch bei folgendem Szenario nicht sehr gut:

@itemize @bullet
@item
Ein Client f�hrt ein @code{SELECT} aus, das lange Zeit l�uft.
@item
Ein anderer Client f�hrt danach ein @code{UPDATE} auf die benutzte Tabelle
aus. Dieser Client wartet, bis das @code{SELECT} fertig ist.
@item
Ein weiterer Client f�hrt ein weiteres @code{SELECT}-Statement auf dieselbe
Tabelle aus. Weil @code{UPDATE} h�here Priorit�t als @code{SELECT} hat,
wartet dieses @code{SELECT}, bis das @code{UPDATE} fertig ist. Es wartet
auch darauf, dass das erste @code{SELECT} fertig ist!
@item
Ein Thread wartet bei etwas wie @code{Platte voll}. In diesem Fall warten
alle anderen Threads, die auf die problemverursachende Tabelle zugreifen
wollen, bis mehr Speicher verf�gbar gemacht wurde.
@end itemize

M�gliche L�sungen dieses Problems sind:

@itemize @bullet
@item
Versuchen Sie, @code{SELECT}-Statements schneller ablaufen zu lassen.
Hierf�r m�ssen Sie eventuell Zusammenfassungstabellen erzeugen.

@item
Starten Sie @code{mysqld} mit @code{--low-priority-updates}. Das gibt allen
Statements, die eine Tabelle aktualisieren (�ndern), geringere Priorit�t
als einem @code{SELECT}-Statement. Im vorstehenden Szenario w�rde das
@code{SELECT}-Statement vor dem @code{INSERT}-Statement ausgef�hrt werden.

@item
Sie k�nnen auch einem bestimmten @code{INSERT}-, @code{UPDATE}- oder
@code{DELETE}-Statement mit dem @code{LOW_PRIORITY}-Attribut geringere
Priorit�t geben.

@item
Starten Sie @code{mysqld} mit einem niedrigen Wert f�r
@strong{max_write_lock_count}, um @code{READ}-Sperren nach einer bestimmten
Anzahl von @code{WRITE}-Sperren zu erm�glichen.

@item
Sie k�nnen festlegen, dass alle Aktualisierungen von einem bestimmten
Thread mit niedriger Priorit�t ausgef�hrt werden, indem Sie den SQL-Befehl
@code{SET SQL_LOW_PRIORITY_UPDATES=1} benutzen. @xref{SET OPTION, ,
@code{SET OPTION}}.

@item
Sie k�nnen mit dem @code{HIGH_PRIORITY}-Attribut festlegen, dass ein
bestimmtes @code{SELECT} sehr wichtig ist. @xref{SELECT, , @code{SELECT}}.

@item
Wenn Sie Probleme mit @code{INSERT} in Kombination mit @code{SELECT} haben,
stellen Sie auf die neuen @code{MyISAM}-Tabellen um, weil diese
gleichzeitige @code{SELECT}s und @code{INSERT}s unterst�tzen.

@item
Wenn Sie haupts�chlich @code{INSERT}- und @code{SELECT}-Statements mischen,
wird das @code{DELAYED}-Attribut f�r @code{INSERT} wahrscheinlich Ihre
Probleme l�sen. @xref{INSERT, , @code{INSERT}}.

@item
Wenn Sie Probleme mit @code{SELECT} und @code{DELETE} haben, mag die
@code{LIMIT}-Option f�r @code{DELETE} helfen. @xref{DELETE, ,
@code{DELETE}}.
@end itemize


@node Optimising Database Structure, Optimising the Server, Locking Issues, MySQL Optimisation
@c German node Optimierung der Datenbank-Struktur
@section Optimierung der Datenbank-Struktur




@menu
* Design::                      
* Data size::                   
* MySQL indexes::               
* Indexes::                     
* Multiple-column indexes::     
* Open tables::                 
* Table cache::                 
* Creating many tables::        
@end menu

@node Design, Data size, Optimising Database Structure, Optimising Database Structure
@c German node Design
@subsection MySQL-Datenbank-Design-�berlegungen

@cindex Design, �berlegungen zum Datenbank-Design
@cindex Datenbank-Design
@cindex Speicherung von Daten

MySQL speichert Zeilendaten und Indexdaten in separaten Dateien. Viele
(fast alle) anderen Datenbanken vermischen Zeilen- und Indexdaten in
derselben Datei. Wir glauben, dass die Wahl, die MySQL getroffen hat, f�r
einen sehr weiten Bereich moderner Systeme besser ist.

Eine weitere M�glichkeit, Zeilendaten zu speichern, besteht darin, die
Information f�r jede Spalten in einem separaten Bereich zu halten
(Beispiele sind SDBM und Focus). Das verursacht Performance-Einbussen f�r
jede Anfrage, die auf mehr als eine Spalte zugreift. Weil das so schnell
schlechter wird, wenn auf mehr als eine Spalte zugegriffen wird, glauben
wir, dass dieses Modell f�r Mehrzweck-Datenbanken nicht gut ist.

Der h�ufigere Fall ist, dass Index und Daten zusammen gespeichert sind (wie
bei Oracle, Sybase usw.). In diesem Fall befindet sich die
Zeileninformation auf der Leaf-Page des Indexes. Das Gute daran ist, dass
man sich damit - abh�ngig davon, wie gut der Index gecachet ist - einen
Festplatten-Lesezugriff spart. Das Schlechte an diesem Layout sind
folgende Dinge:

@itemize @bullet
@item
Tabellenscannen geht viel langsamer, weil man durch alle Indexe lesen muss,
um an die Daten zu kommen.
@item
Man kann nicht nur die Index-Tabelle benutzen, um Daten einer Anfrage
abzurufen.
@item
Man verliert viel Speicherplatz, weil man Indexe von den Nodes duplizieren
muss (weil man die Zeile nicht in den Nodes speichern kann).
@item
L�schvorg�nge werden die Tabelle im Zeitablauf zersetzen (weil Indexe in
Nodes �blicherweise bei L�schvorg�ngen nicht aktualisiert werden).
@item
Ist es schwieriger, NUR die Index-Daten zu cachen.
@end itemize


@node Data size, MySQL indexes, Design, Optimising Database Structure
@c German node Datengr��e
@subsection Wie Sie Ihre Daten so klein wie m�glich bekommen

@cindex Daten, Gr��e
@cindex verringern, Datengr��e
@cindex Speicherplatz, minimieren
@cindex Tabellen, Performance verbessern
@cindex Performance, verbessern

Eine der grundlegendsten Optimierungen besteht darin, Ihre Daten (und
Indexe) dazu zu bekommen, dass sie m�glichst wenige Platz auf der Platte
(und im Arbeitsspeicher) benutzen. Das kann zu gewaltigen Verbesserungen
f�hren, weil Lesezugriffe von der Platte schneller ablaufen und
normalerweise weniger Hauptspeicher benutzt wird. Das Indexieren nimmt
dar�ber hinaus weniger Ressourcen in Anspruch, wenn es auf kleinere Spalten
durchgef�hrt wird.

MySQL unterst�tzt viele verschiedene Tabellentypen und Zeilenformate. Wenn
Sie das richtige Tabellenformat benutzen, kann Ihnen das gro�e
Performance-Gewinne bringen.
@xref{Table types}.

Sie erhalten bessere Performance auf eine Tabelle und minimieren den
ben�tigten Speicherplatz, wenn Sie die unten aufgef�hrten Techniken
verwenden:

@itemize @bullet
@item
Benutzen Sie die effizientesten (kleinsten) m�glichen Typen. MySQL hat
viele spezialisierte Typen, die Plattenplatz und Arbeitsspeicher sparen.

@item
Benutzen Sie - falls m�glich - die kleineren Ganzzahl-Typen, um kleinere
Tabellen zu erhalten. @code{MEDIUMINT} zum Beispiel ist oft besser als
@code{INT}.

@item
Deklarieren Sie Spalten - falls m�glich - als @code{NOT NULL}. Das macht
alles schneller und Sie sparen ein Bit pro Spalte. Beachten Sie, dass, wenn
Sie wirklich @code{NULL} in Ihrer Applikation ben�tigen, Sie dieses
nat�rlich benutzen sollten. Vermeiden Sie nur, einfach alle Spalten
vorgabem��ig auf @code{NULL} zu haben.

@item
Wenn Sie keine Spalten variabler L�nge haben (@code{VARCHAR}, @code{TEXT}
oder @code{BLOB}-Spalten), wird ein Festgr��enformat benutzt. Das ist
schneller, mag aber leider etwas Speicherplatz verschwenden.
@xref{MyISAM table formats}.

@item
Der prim�re Index einer Tabelle sollte so kurz wie m�glich sein. Das macht
die Identifikation einer Zeile schnell und effizient.

@item
Bei jeder Tabelle m�ssen Sie entscheiden, welche Speicher- / Index-Methode
benutzt werden soll. @xref{Table types}.

@item
Erzeugen Sie nur die Indexe, die Sie tats�chlich brauchen. Indexe sind gut
f�r das Abfragen von Daten, aber schlecht, wenn Sie Dinge schnell speichern
m�ssen. Wenn Sie meist auf eine Tabelle zugreifen, indem Sie nach einer
Kombination von Spalten suchen, legen Sie einen Index auf diese. Der erste
Index-Teil sollte die meistbenutzte Spalte sein. Wenn Sie IMMER viele
Spalten benutzen, sollten Sie die Spalte zuerst benutzen, die mehr
Duplikate hat, um eine bessere Kompression des Indexes zu erzielen.

@item
Wenn es sehr wahrscheinlich ist, dass eine Spalte ein eindeutiges Pr�fix
auf der ersten Anzahl von Zeichen hat, ist es besser, nur dieses Pr�fix zu
indexieren. MySQL unterst�tzt einen Index auf einem Teil einer
Zeichen-Spalte. K�rzere Indexe sind nicht nur schneller, weil sie weniger
Plattenplatz brauchen, sondern auch, weil Sie mehr Treffer im Index-Cache
erhalten und daher weniger Festplattenzugriffe ben�tigen.
@xref{Server parameters}.

@item
Unter manchen Umst�nden kann es vorteilhaft sein, eine Tabelle zu teilen,
die sehr oft gescannt wird. Das gilt insbesondere, wenn diese ein
dynamisches Tabellenformat hat und es m�glich ist, durch die Zerlegung eine
kleinere Tabelle mit statischem Format zu erhalten, die benutzt werden
kann, um die relevanten Zeilen zu finden.
@end itemize


@node MySQL indexes, Indexes, Data size, Optimising Database Structure
@c German node MySQL-Indexe
@subsection Wie MySQL Indexe benutzt

@cindex Indexe, Benutzung von

Indexe werden benutzt, um Zeilen mit einem bestimmten Spaltenwert schnell
zu finden. Ohne Index m�sste MySQL mit dem ersten Datensatz anfangen und
dann durch die gesamte Tabelle lesen, bis er die relevanten Zeilen findet.
Je gr��er die Tabelle, desto mehr Zeit kostet das. Wenn die Tabellen f�r
die infrage kommenden Zeilen einen Index hat, kann MySQL schnell eine
Position bekommen, um mitten in der Daten-Datei loszusuchen, ohne alle
Daten zu betrachten. Wenn eine Tabelle 1.000 Zeilen hat, ist das mindestens
100 mal schneller als sequentielles Lesen. Wenn Sie jedoch auf fast alle
1.000 Zeilen zugreifen m�ssen, geht sequentielles Lesen schneller, weil man
mehrfache Festplattenzugriffe einspart.

Alle MySQL-Indexe (@code{PRIMARY}, @code{UNIQUE} und @code{INDEX}) sind in
B-B�umen gespeichert. Zeichenketten werden automatisch pr�fix-komprimiert,
ebenfalls werden Leerzeichen am Ende komprimiert.
@c German FIX unsplit @xref
@xref{CREATE INDEX, ,@code{CREATE INDEX}}.

Indexe werden benutzt, um:
@itemize @bullet
@item
Schnell die Zeilen zu finden, die mit einer @code{WHERE}-Klausel
�bereinstimmen.

@item
Zeilen aus anderen Tabellen abzurufen, wenn Sie Joins durchf�hren.

@item
Den @code{MAX()}- oder @code{MIN()}-Wert f�r eine spezielle indizierte
Spalte zu finden. Das wird durch einen Pr�prozessor optimiert, der
�berpr�ft, ob Sie @code{WHERE} schluessel_teil_# = constant auf allen
Schl�sselteilen < N verwenden. In diesem Fall f�hrt MySQL ein einzige
Schl�sselnachschlagen durch und ersetzt den @code{MIN()}-Ausdruck mit einer
Konstanten. Wenn alle Ausdr�cke durch Konstanten ersetzt sind, gibt die
Anfrage sofort ein Ergebnis zur�ck:

@example
SELECT MIN(schluessel_teil2),MAX(schluessel_teil2) FROM tabelle where schluessel_teil1=10
@end example

@item
Eine Tabelle zu sortieren oder zu gruppieren, wenn das Sortieren oder
Gruppieren mit dem am weitesten links stehenden Pr�fix eines benutzbaren
Schl�ssels durchgef�hrt wird (zum Beispiel @code{ORDER BY
schluessel_teil_1,schluessel_teil_2}). Der Schl�ssel wird in umgekehrter
Reihenfolge gelesen, wenn allen Schl�sselteilen @code{DESC} folgt.

Der Index kann auch benutzt werden, selbst wenn @code{ORDER BY} nicht exakt
mit dem Index �bereinstimmt, solange alle unbenutzten Indexteile und alle
zus�tzlichen @code{ORDER BY}-Spalten Konstanten in der @code{WHERE}-Klausel
sind. Folgende Anfragen werden einen Index benutzen, um den @code{ORDER
BY}-Teil aufzul�sen:

@example
SELECT * FROM foo ORDER BY schluessel_teil1,schluessel_teil2,schluessel_teil3;
SELECT * FROM foo WHERE spalte=konstante ORDER BY spalte, schluessel_teil1;
SELECT * FROM foo WHERE schluessel_teil1=konstante GROUP BY schluessel_teil2;
@end example

@item
In einigen F�llen kann eine Anfrage so optimiert werden, dass Sie Werte
abruft, ohne in der Daten-Datei nachzuschlagen. Wenn alle benutzten Spalten
einer Tabelle numerisch sind und ein ganz links stehendes Pr�fix f�r einen
Schl�ssel ergeben, k�nnen die Werte mit gr��erer Geschwindigkeit aus dem
Index-Baum abgerufen werden:

@example
SELECT schluessel_teil3 FROM tabelle WHERE schluessel_teil1=1
@end example

@end itemize

Angenommen, Sie f�hren folgendes @code{SELECT}-Statement aus:

@example
mysql> SELECT * FROM tabelle WHERE spalte1=val1 AND spalte2=val2;
@end example

Wenn es einen mehrspaltigen Index auf @code{spalte1} und @code{spalte2}
gibt, k�nnen die entsprechenden Zeilen direkt geholt werden. Wenn es
separate einspaltige Indexe auf @code{spalte1} und @code{spalte2} gibt,
versucht der Optimierer, den restriktivsten Index zu finden, indem er
entscheidet, welcher Index weniger Zeilen finden wird, und diesen Index
dann benutzen, um Zeilen abzurufen.

@cindex Indexe, ganz links stehendes Pr�fix von
@cindex ganz links stehendes Pr�fix von Indexen
Wenn die Tabelle einen mehrspaltigen Index hat, kann jedes Pr�fix auf der
linken Seite vom Optimierer verwendet werden, um Zeilen zu finden. Wenn Sie
zum Beispiel einen dreispaltigen Index auf @code{(spalte1,spalte2,spalte3)}
haben, haben Sie Suchm�glichkeiten auf @code{(spalte1)},
@code{(spalte1,spalte2)} und @code{(spalte1,spalte2,spalte3)} indiziert.

MySQL kann keinen teilweisen Index verwenden, wenn die Spalten kein ganz
linkes Pr�fix des Indexes bilden. Angenommen, Sie haben folgende
@code{SELECT}-Statements:

@example
mysql> SELECT * FROM tabelle WHERE spalte1=wert1;
mysql> SELECT * FROM tabelle WHERE spalte2=wert2;
mysql> SELECT * FROM tabelle WHERE spalte2=wert2 AND spalte3=wert3;
@end example

Wenn es einen Index auf @code{(spalte1,spalte2,spalte3)} gibt, benutzt nur die
erste der drei Anfragen den Index. Die zweite und dritte Anfrage umfassen
indizierte Spalten, aber @code{(spalte2)} und @code{(spalte2,spalte3)} sind
nicht die ganz linken Pr�fixe von @code{(spalte1,spalte2,spalte3)}.

@findex LIKE und Indexe
@findex LIKE und Platzhalter
@cindex Indexe und @code{LIKE}
@cindex Platzhalter und @code{LIKE}
MySQL benutzt Indexe auch f�r @code{LIKE}-Vergleiche, wenn das Argument f�r
@code{LIKE} eine Zeichenketten-Konstante ist, die nicht mit einem
Platzhalterzeichen anf�ngt. Die folgenden @code{SELECT}-Statements zum
Beispiel benutzen Indexe:

@example
mysql> select * from tabelle where schluessel_spalte LIKE "Patrick%";
mysql> select * from tabelle where schluessel_spalte LIKE "Pat%_ck%";
@end example

Im ersten Statement werden nur Zeilen mit @code{"Patrick" <=
schluessel_spalte < "Patricl"} ber�cksichtigt. Im zweiten Statement werden
nur Zeilen mit @code{"Pat" <= schluessel_spalte < "Pau"} ber�cksichtigt.

Die folgenden @code{SELECT}-Statements benutzen keine Indexe:
@example
mysql> select * from tabelle where schluessel_spalte LIKE "%Patrick%";
mysql> select * from tabelle where schluessel_spalte LIKE andere_spalte;
@end example

Im ersten Statement f�ngt der @code{LIKE}-Wert mit einem Platzhalterzeichen
an. Im zweiten Statement ist der @code{LIKE}-Wert keine Konstante.

@findex @code{IS NULL} und Indexe
@cindex Indexe und @code{IS NULL}
Suchen mit @code{spalte IS NULL} benutzt Indexe, wenn spalte ein Index ist.

MySQL benutzt normalerweise den Index, der die geringste Anzahl von Zeilen
findet. Ein Index wird benutzt f�r Spalten, die Sie mit folgenden
Operatoren vergleichen: @code{=}, @code{>}, @code{>=}, @code{<}, @code{<=},
@code{BETWEEN} und einem @code{LIKE} ohne Platzhalter-Pr�fix wie
@code{'etwas%'}.

Jeder Index, der nicht alle @code{AND}-Ebenen in der @code{WHERE}-Klausel
umfasst, wird nicht benutzt, um die Anfrage zu optimieren. Mit anderen
Worte: Um einen Index benutzen zu k�nnen, muss ein Pr�fix des Indexes in
jeder @code{AND}-Gruppe benutzt werden.

Die folgenden @code{WHERE}-Klauseln benutzen Indexe:
@example
... WHERE index_teil1=1 AND index_teil2=2 AND andere_spalte=3
... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
... WHERE index_teil1='hello' AND index_teil_3=5
          /* optimiert "index_teil1='hello'" */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
          /* kann den Index auf index1 benutzen, aber nicht auf index2 oder index 3 */
@end example

Die folgenden @code{WHERE}-Klauseln benutzen @strong{KEINE} Indexe:
@example
... WHERE index_teil2=1 AND index_teil3=2  /* index_teil_1 wird nicht benutzt */
... WHERE index=1 OR A=10                  /* Index wird nicht in beiden AND-Teilen benutzt */
... WHERE index_teil1=1 OR index_teil2=10  /* Kein Index umfasst alle Zeilen */
@end example

Beachten Sie, dass MySQL in manchen F�llen keinen Index benutzt, selbst
wenn einer verf�gbar w�re. Einige solcher F�lle sind hier aufgef�hrt:

@itemize @bullet
@item
Wenn die Benutzung des Indexes erfordern w�rde, dass MySQL auf mehr als 30%
der Zeilen in der Tabelle zugreift. (In diesem Fall ist ein Tabellenscan
wahrscheinlich viel schneller, weil dieser weniger Festplattenzugriffe
braucht.) Beachten Sie, dass MySQL den Index dennoch benutzt, wenn eine
Anfrage @code{LIMIT} benutzt, um nur ein paar Zeilen abzufragen, weil er
dann schneller die wenigen Zeilen im Ergebnis finden kann.
@end itemize




@node Indexes, Multiple-column indexes, MySQL indexes, Optimising Database Structure
@c German node Indexe
@subsection Spalten-Indexe

@cindex Indexe, Spalten
@cindex Spalten, Indexe
@cindex Schl�ssel

Alle MySQL-Spaltentypen k�nnen indiziert werden. Die Benutzung von Indexen
auf den relevanten Spalten ist die beste Art, die Performance von
@code{SELECT}-Operationen zu verbessern.

Die maximale Anzahl von Schl�sseln und die maximale Index-L�nge ist durch
den Tabellen-Handler vorgegeben. @xref{Table types}. Bei allen
Tabellen-Handlern k�nnen Sie zumindest 16 Schl�ssel und eine
Gesamtindexl�nge von zumindest 256 Bytes haben.

Bei @code{CHAR}- und @code{VARCHAR}-Spalten k�nnen Sie ein Pr�fix einer
Spalte indexieren. Das ist viel schneller und erfordert weniger
Plattenspeicher als das Indexieren einer ganzen Spalte. Die Syntax, die im
@code{CREATE TABLE}-Statement benutzt wird, um ein Spaltenpr�fix zu
indexieren, sieht wie folgt aus:

@example
KEY index_name (spalten_name(laenge))
@end example

Das unten stehende Beispiel erzeugt einen Index auf die ersten 10 Zeichen
der @code{name}-Spalte:

@example
mysql> CREATE TABLE test (
           name CHAR(200) NOT NULL,
           KEY index_name (name(10)));
@end example

Bei @code{BLOB}- und @code{TEXT}-Spalten m�ssen Sie ein Pr�fix der Spalte
indexieren. Sie k�nnen nicht die gesamte Spalte indexieren.

Ab MySQL-Version 3.23.23 k�nnen Sie auch spezielle @strong{FULLTEXT}-Indexe
erzeugen. Sie werden f�r die Volltextsuche benutzt. Nur der
@code{MyISAM}-Tabellentyp unterst�tzt @code{FULLTEXT}-Indexe. Sie k�nnen
nur auf @code{VARCHAR}- und @code{TEXT}-Spalten erzeugt werden. Die
Indexierung erfolgt immer �ber die gesamte Spalte; teilweises Indexieren
wird nicht unterst�tzt. Siehe @ref{Fulltext Search} f�r Details.

@node Multiple-column indexes, Open tables, Indexes, Optimising Database Structure
@c German node Mehrspaltige Indexe
@subsection Mehrspaltige Indexe

@cindex mehrspaltige Indexe
@cindex Indexe, mehrspaltige
@cindex Schl�ssel, mehrspaltige

MySQL kann Indexe auf mehrfache Spalten erzeugen. Ein Index darf aus bis zu
15 Spalten bestehen. (Auf @code{CHAR}- und @code{VARCHAR}-Spalten k�nnen
Sie auch ein Pr�fix der Spalte als Teil eines Indexes benutzen).

Ein mehrspaltiger Index kann als sortiertes Array betrachtet werden, das
Werte enth�lt, die durch die Verkettung der Werte der indizierten Spalten
erzeugt werden.

MySQL benutzt mehrspaltige Indexe in einer Art, dass Anfragen schnell
werden, wenn Sie eine bekannte Menge f�r die erste Spalte des Indexes in
einer @code{WHERE}-Klausel angeben, selbst wenn Sie keine Werte f�r die
anderen Spalten angeben.

Angenommen, einen Tabelle wurde wie folgt erzeugt:

@example
mysql> CREATE TABLE test (
           id INT NOT NULL,
           nachname CHAR(30) NOT NULL,
           vorname CHAR(30) NOT NULL,
           PRIMARY KEY (id),
           INDEX name (nachname,vorname));
@end example

Dann ist der Index @code{name} ein Index �ber @code{nachname} und
@code{vorname}. Der Index wird f�r Anfragen benutzt, die Werte in einem
bekannten Bereich f�r @code{nachname} angeben, oder sowohl f�r
@code{nachname} als auch f�r und @code{vorname}.
Daher wird der @code{name}-Index in folgenden Anfragen benutzt:

@example
mysql> SELECT * FROM test WHERE nachname="Widenius";

mysql> SELECT * FROM test WHERE nachname="Widenius"
                          AND vorname="Michael";

mysql> SELECT * FROM test WHERE nachname="Widenius"
                          AND (vorname="Michael" OR vorname="Monty");

mysql> SELECT * FROM test WHERE nachname="Widenius"
                          AND vorname >="M" AND vorname < "N";
@end example

In folgenden Anfragen wird der @code{name}-Index jedoch NICHT benutzt:

@example
mysql> SELECT * FROM test WHERE vorname="Michael";

mysql> SELECT * FROM test WHERE nachname="Widenius"
                          OR vorname="Michael";
@end example

Weitere Informationen �ber die Art, wie MySQL Indexe benutzt, um die
Anfragen-Performance zu verbessern, finden Sie unter @ref{MySQL indexes, ,
MySQL-Indexe}.


@node Open tables, Table cache, Multiple-column indexes, Optimising Database Structure
@c German node Tabellen-Cache
@subsection Wie MySQL Tabellen �ffnet und schlie�t

@findex table_cache

@cindex Tabellen, �ffnen
@cindex Tabellen, schlie�en
@cindex �ffnen, Tabellen
@cindex schlie�en, Tabellen
@cindex Tabellen-Cache

@code{table_cache}, @code{max_connections} und @code{max_tmp_tables}
beeinflussen die maximale Anzahl von Dateien, die der Server offen halten
kann. Wenn Sie einen oder mehrere dieser Werte erh�hen, k�nnen Sie an eine
Begrenzung sto�en, die durch Ihr Betriebssystem in Bezug auf die Anzahl
offener Datei-Deskriptoren pro Prozess festgelegt wird. Diese Begrenzung
kann man jedoch auf vielen Systemen erh�hen. Sehen Sie im Handbuch Ihres
Betriebssystems nach, wie man das macht, weil die Methode, wie die
Begrenzung ge�ndert wird, sich von System zu System stark unterscheidet.

@code{table_cache} ist verwandt mit @code{max_connections}. F�r 200
gleichzeitig laufende Verbindungen sollten Sie zum Beispiel einen
Tabellen-Cache von mindestens @code{200 * n} haben, wobei @code{n} die
maximale Anzahl von Tabellen in einem Join ist. Zus�tzlich m�ssen Sie
einige externe Datei-Deskriptoren f�r tempor�re Tabellen und Dateien
reservieren.

Stellen Sie sicher, dass Ihr Betriebssystem die Anzahl offener
Datei-Deskriptoren handhaben kann, die durch die
@code{table_cache}-Einstellung impliziert wird. Wenn
@code{table_cache} zu hoch gesetzt wird, hat MySQL eventuell keine
Datei-Deskriptoren mehr und verweigert Verbindungen, f�hrt keine Anfragen
mehr aus und l�uft sehr unzuverl�ssig. Beachten Sie auch, dass der
MyISAM-Tabellen-Handler zwei Datei-Deskriptoren f�r jede einzelne offene
Tabelle ben�tigt. Sie k�nnen die Anzahl von Datei-Deskriptoren, die f�r
MySQL verf�gbar sind, in der @code{--open-files-limit=#}-Startoption
angeben. @xref{Not enough file handles}.

Der Cache offener Tabellen kann bis auf @code{table_cache} anwachsen
(Vorgabewert 64; das kann mit der @code{-O Tabellen-Cache=#}-Option f�r
@code{mysqld} ge�ndert werden). Eine Tabelle wird nie geschlossen, ausser
wen der Cache voll ist und ein anderer Thread versucht, eine Tabelle zu
�ffnen, oder wenn Sie @code{mysqladmin refresh} oder @code{mysqladmin
flush-tables} benutzen.

Wenn sich der Tabellen-Cache f�llt, benutzt der Server folgenden Prozedur,
um einen Cache-Eintrag f�r die Benutzung zu finden:

@itemize @bullet
@item
Tabellen, die momentan nicht in Benutzung sind, werden freigegeben, in der
Reihenfolge der k�rzlich am wenigsten benutzten Tabellen.

@item
Wenn der Cache voll ist und keine Tabellen freigegeben werden k�nnen, aber
eine neue Tabelle ge�ffnet werden muss, wird der Cache tempor�r wie
ben�tigt vergr��ert.

@item
Wenn der Cache gerade im Zustand tempor�rer Erweiterung ist und eine
Tabelle vom Zustand benutzt in den Zustand nicht benutzt wechselt, wird die
Tabelle geschlossen und vom Cache freigesetzt.
@end itemize

Eine Tabelle wird f�r jeden gleichzeitigen Zugriff ge�ffnet. Das bedeutet,
dass die Tabelle zweimal ge�ffnet werden muss, wenn Sie zwei Threads haben,
die auf dieselbe Tabelle zugreifen oder einen Thread, der auf die Tabelle
zweimal in derselben Anfrage zugreift (mit @code{AS}). Das erste �ffnen
jeder Tabelle ben�tigt nur einen Datei-Deskriptor. Der zus�tzliche
Deskriptor wird f�r die Index-Datei ben�tigt; dieser Deskriptor wird
mit allen Threads geteilt (shared).

Wenn Sie eine Tabelle mit dem @code{HANDLER tabelle OPEN}-Statement �ffnen,
wird dem Thread ein dediziertes Tabellenobjekt zugewiesen. Diese
Tabellenobjekt wird nicht mit anderen Threads geteilt und wird solange
nicht geschlossen, bis der Thread @code{HANDLER tabelle CLOSE} aufruft oder
stirbt.
@xref{INSERT}.

Sie k�nnen pr�fen, ob Ihr Tabellen-Cache zu klein ist, indem Sie die
mysqld-Variable @code{opened_tables} ansehen. Wenn diese recht Gro� ist,
selbst wenn Sie nicht viele @code{FLUSH TABLES} ausgef�hrt haben, sollten
Sie Ihren Tabellen-Cache vergr��ern. @xref{SHOW STATUS}.


@node Table cache, Creating many tables, Open tables, Optimising Database Structure
@c German node Viele Tabellen erzeugen
@subsection Nachteile der Erzeugung gro�er Mengen von Tabellen in derselben Datenbank

@cindex Tabellen, zu viele

Wenn Sie viele Dateien in einem Verzeichnis haben, werden open-, close- und
create-Operationen langsam. Wenn Sie ein @code{SELECT}-Statements auf viele
unterschiedliche Tabellen ausf�hren, gibt es ein bisschen Overhead, wenn
der Tabellen-Cache voll ist, weil f�r jede Tabelle, die ge�ffnet wird, eine
andere geschlossen werden muss. Sie k�nnen diese Overhead verringern, indem
Sie den Tabellen-Cache gr��er machen.


@node Creating many tables,  , Table cache, Optimising Database Structure
@c German node Offene Tabellen
@subsection Warum gibt es so viele offene Tabellen?

@cindex Tabellen, offene
@cindex offene Tabellen

Wenn Sie @code{mysqladmin status} ausf�hren, werden Sie etwa folgendes
sehen:

@example
Uptime: 426 Running Threads: 1 Questions: 11082 Reloads: 1 Open Tables: 12
@end example

Das kann etwas verwirrend sein, wenn Sie nur 6 Tabellen haben.

MySQL ist multi-threaded, daher kann er viele Anfragen auf dieselbe Tabelle
simultan verarbeiten. Um das Problem zu minimieren, dass zwei Threads
verschiedene Zust�nde in Bezug auf dieselbe Datei haben, wird die Tabelle
unabh�ngig f�r jeden gleichzeitigen Thread ge�ffnet. Das ben�tigt etwas
Arbeitsspeicher und einen externen Datei-Deskriptor f�r die Daten-Datei.
Der Index-Datei-Deskriptor wird mit allen Threads geteilt.


@node Optimising the Server, Disk issues, Optimising Database Structure, MySQL Optimisation
@c German node Optimierung des Servers
@section Optimierung des MySQL-Servers




@menu
* System::                      
* Server parameters::           
* Compile and link options::    
* Memory use::                  
* DNS::                         
* SET OPTION::                  
@end menu

@node System, Server parameters, Optimising the Server, Optimising the Server
@c German node System
@subsection System / Kompilierzeitpunkt und Tuning der Startparameter

@cindex Kompilieren, Optimierung
@cindex System-Optimierung
@cindex Startparameter, tunen

Wir fangen mit den Dingen auf Systemebene an, weil einige dieser
Entscheidungen sehr fr�h getroffen werden m�ssen. In anderen F�llen mag ein
kurzer Blick auf diesen Teil ausreichen, weil er nicht so wichtig f�r
gro�e Verbesserungen ist. Es ist jedoch immer nett, ein Gef�hl daf�r zu
bekommen, wie viel man gewinnen kann, wenn man Dinge auf dieser Ebene
�ndert.

Es ist wirklich wichtig, dass vorgabem��ige Betriebssystem zu kennen! Um
das meiste aus Mehrprozessor-Maschinen herauszuholen, sollte man Solaris
benutzen (weil die Threads wirklich gut funktionieren) oder Linux (weil der
2.2-Kernel wirklich gute Mehrprozessor-Unterst�tzung bietet). Linux hat auf
32-Bit-Maschinen vorgabem��ig eine Dateigr��enbeschr�nkung von 2 GB. Das
wird hoffentlich bald behoben, wenn neue Dateisysteme herausgebracht werden
(XFS/Reiserfs). Wenn Sie dringen Unterst�tzung f�r gr��ere Datei als 2 GB
auf Linux-Intel-32-Bit ben�tigen, sollten Sie den LFS-Patch f�r das
ext2-Dateisystem holen.

Weil wir MySQL noch nicht auf allzu vielen Plattformen in einer
Produktionsumgebung getestet haben, empfehlen wir, dass Sie Ihre geplante
Plattform testen, bevor Sie sich daf�r entscheiden.

@cindex Sperren
Weitere Tipps:
@itemize @bullet
@item
Wenn Sie genug Arbeitsspeicher haben, k�nnten Sie alle Swap-Ger�te
entfernen. Einige Betriebssysteme benutzen in bestimmten Zusammenh�ngen ein
Swap-Ger�t, selbst wenn Sie freien Arbeitsspeicher haben.
@item
Benutzen Sie die @code{--skip-locking}-MySQL-Option, um externe Sperren zu
vermeiden. Beachten Sie, dass das die Funktionalit�t von MySQL nicht
tangiert, solange Sie nur einen Server laufen lassen. Denken Sie lediglich
daran, den Server herunterzufahren (oder die relevanten Teile zu sperren),
bevor Sie @code{myisamchk} laufen lassen. Auf manchen Systemen ist diese
Umschaltung zwingend erforderlich, weil externes Sperren in keinem Fall
funktioniert.

Die @code{--skip-locking}-Option ist vorgabem��ig angeschaltet, wenn Sie
mit MIT-pThreads kompilieren, weil @code{flock()} von MIT-pThreads nicht
vollst�ndig auf allen Plattformen unterst�tzt wird. Auch f�r Linux ist es
vorgabem��ig angeschaltet, weil Linux-Dateisperren bis jetzt nicht
zuverl�ssig funktionieren.

Der einzige Fall, wo Sie @code{--skip-locking} nicht benutzen k�nnen, sit,
wenn Sie mehrfache MySQL-@emph{Server} (nicht Clients) auf denselben Daten
laufen lassen, oder wenn Sie @code{myisamchk} auf eine Tabelle ausf�hren,
ohne zuerst die @code{mysqld}-Server-Tabellen auf Platte zur�ckzuschreiben
und zu sperren.

Sie k�nnen immer noch @code{LOCK TABLES} / @code{UNLOCK TABLES} benutzen,
selbst wenn Sie @code{--skip-locking} benutzen.
@end itemize


@node Server parameters, Compile and link options, System, Optimising the Server
@c German node Serverparameter
@subsection Serverparameter tunen

@cindex Parameter, Server
@cindex @code{mysqld}-Server, Puffer-Gr��en
@cindex Puffer-Gr��en, @code{mysqld}-Server
@cindex Startparameter

Sie erhalten die Puffer-Gr��en, die der @code{mysqld}-Server benutzt, mit
diesem Befehl:

@example
shell> mysqld --help
@end example

@cindex @code{mysqld}-Optionen
@cindex Variablen, @code{mysqld}
Dieser Befehl erzeugt eine Auflistung aller @code{mysqld}-Optionen und
konfigurierbaren Variablen. Die Ausgabe enth�lt die Vorgabewerte und sieht
etwa wie folgt aus:

@example
Possible variables for option --set-variable (-O) are:
back_log              current value: 5
bdb_cache_size        current value: 1048540
binlog_cache_size     current_value: 32768
connect_timeout       current value: 5
delayed_insert_timeout  current value: 300
delayed_insert_limit  current value: 100
delayed_queue_size    current value: 1000
flush_time            current value: 0
interactive_timeout   current value: 28800
join_buffer_size      current value: 131072
key_buffer_size       current value: 1048540
lower_case_tabelles  current value: 0
long_query_time       current value: 10
max_allowed_packet    current value: 1048576
max_binlog_cache_size current_value: 4294967295
max_connections       current value: 100
max_connect_errors    current value: 10
max_delayed_threads   current value: 20
max_heap_table_size   current value: 16777216
max_join_size         current value: 4294967295
max_sort_length       current value: 1024
max_tmp_tables        current value: 32
max_write_lock_count  current value: 4294967295
myisam_sort_buffer_size  current value: 8388608
net_buffer_length     current value: 16384
net_retry_count       current value: 10
net_read_timeout      current value: 30
net_write_timeout     current value: 60
query_buffer_size     current value: 0
record_buffer         current value: 131072
record_rnd_buffer     current value: 131072
slow_launch_time      current value: 2
sort_buffer           current value: 2097116
table_cache           current value: 64
thread_concurrency    current value: 10
tmp_table_size        current value: 1048576
thread_stack          current value: 131072
wait_timeout          current value: 28800
@end example

Wenn aktuell ein @code{mysqld}-Server l�uft, k�nnen Sie feststellen, welche
Werte er f�r die Variablen tats�chlich benutzt, wenn Sie diesen Befehl
ausf�hren:

@example
shell> mysqladmin variables
@end example

Sie finden eine komplette Beschreibung aller Variablen im @code{SHOW
VARIABLES}-Abschnitt dieses Handbuchs. @xref{SHOW VARIABLES}.

Wenn Sie @code{SHOW STATUS} eingeben, k�nnen Sie einige statistische
Informationen des Servers sehen. @xref{SHOW STATUS}.

MySQL benutzt Algorithmen, die sehr skalierbar sind, daher k�nnen Sie
�blicherweise mit sehr wenig Arbeitsspeicher fahren. Wenn Sie MySQL jedoch
mehr Speicher geben, erzielen Sie damit normalerweise auch bessere
Performance.

Wenn Sie einen MySQL-Server tunen, sind die zwei wichtigsten Variablen
@code{key_buffer_size} und @code{table_cache}. Sie sollten zun�chst sicher
sein, dass diese beiden richtig gesetzt sind, bevor Sie versuchen, irgend
eine der anderen Variablen zu �ndern.

Wenn Sie viel Arbeitsspeicher haben (>= 256 MB) und viele Tabellen und
maximale Performance bei einer m��igen Anzahl von Clients haben wollen,
sollten Sie etwas wie das Folgende benutzen:

@example
shell> safe_mysqld -O key_buffer=64M -O table_cache=256 \
           -O sort_buffer=4M -O record_buffer=1M &
@end example

Wenn Sie nur 128 MB und nur wenige Tabellen haben, aber viele
Sortiervorg�nge durchf�hren, k�nnen Sie etwas wie das Folgende benutzen:

@example
shell> safe_mysqld -O key_buffer=16M -O sort_buffer=1M
@end example

Wenn Sie wenig Arbeitsspeicher und viele Verbindungen haben, k�nnen Sie
etwas wie das Folgende benutzen:

@example
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \
           -O record_buffer=100k &
@end example

Oder sogar:

@example
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \
           -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
@end example

Wenn Sie @code{GROUP BY} oder @code{ORDER BY} auf Dateien anwenden, die
gr��er als Ihr verf�gbarer Arbeitsspeicher sind, sollten Sie den Wert von
@code{record_rnd_buffer} heraufsetzen, um das Lesen von Zeilen nach
Sortiervorg�ngen zu beschleunigen.

Wenn Sie MySQL installiert haben, enth�lt das
@file{Support-files}-Verzeichnis einige unterschiedliche
@code{my.cnf}-Beispiel-Dateien: @file{my-huge.cnf}, @file{my-large.cnf},
@file{my-medium.cnf} und @file{my-small.cnf}. Diese k�nnen Sie als
Grundlage nehmen, um Ihr System zu optimieren.

Wenn es sehr viele Verbindungen gibt, k�nnen ``Swapping-Probleme''
auftauchen, wen Sie @code{mysqld} nicht so konfiguriert haben, dass er f�r
jede Verbindung sehr wenig Speicher benutzt. @code{mysqld} bringt nat�rlich
bessere Leistungsdaten, wenn Sie genug Speicher f�r alle Verbindungen
haben.

Beachten Sie, dass �nderungen einer Option f�r @code{mysqld} sich nur auf
diese Instanz des Servers auswirken.

Um die Auswirkung einer Parameter�nderung zu sehen, geben Sie folgendes
ein:

@example
shell> mysqld -O key_buffer=32m --help
@end example

Stellen Sie sicher, dass die @code{--help}-Option zuletzt kommt, ansonsten
wird die Auswirkung jeglicher Optionen, die danach auf der Kommandozeile
kommen, in der Ausgabe nicht gezeigt.
output.


@node Compile and link options, Memory use, Server parameters, Optimising the Server
@c German node Kompilier- und Link-Optionen
@subsection Wie Kompilieren und Linken die Geschwindigkeit von MySQL beeinflusst

@cindex Linken, Geschwindigkeit
@cindex Kompilieren, Geschwindigkeit
@cindex Geschwindigkeit, Kompilieren
@cindex Geschwindigkeit, Linken

Die meisten der folgenden Tests wurden mit den MySQL-Benchmarks unter Linux
durchgef�hrt, aber sie sollten einen guten Anhaltspunkt f�r andere
Betriebssysteme und Auslastungen geben.

Sie erhalten die schnellste ausf�hrbare Datei, wenn Sie mit @code{-static}
linken.

Unter Linux erhalten Sie den schnellsten Code, wenn Sie mit @code{pgcc} und
@code{-O3} kompilieren. Um @file{sql_yacc.cc} mit diesen Optionen zu
kompilieren, brauchen Sie etwa 200 MB Arbeitsspeicher, weil @code{gcc/pgcc}
viel Speicher ben�tigt, um alle Funktionen inline zu machen. Sie sollten
beim Konfigurieren von MySQL auch @code{CXX=gcc} setzen, um das
Einschlie�en der @code{libstdc++}-Bibliothek zu vermeiden (die nicht
ben�tigt wird). Beachten Sie, dass bei einigen Version von @code{pgcc} der
erzeugte Code nur auf echten Pentium-Prozessoren l�uft, selbst wenn Sie in
den Compiler-Optionen angeben, dass Sie wollen, dass der Code auf alle
Prozessoren vom Typ x586 l�uft (wie AMD).

Einfach durch die Benutzung eines besseren Compilers und / oder besserer
Compiler-Optionen k�nnen Sie eine 10-30%-ige Geschwindigkeitssteigerung in
Ihrer Applikation erhalten. Das ist besonders wichtig, wenn Sie den
SQL-Server selbst kompilieren!

Wir haben sowohl Cygnus CodeFusion als auch Fujitsu-Compiler getestet, aber
es stellte sich heraus, dass keiner von beiden ausreichend Bug-frei war,
damit MySQL mit angeschalteten Optimierungen kompiliert werden konnte.

Wenn Sie MySQL kompilieren, sollten Sie nur Unterst�tzung f�r die
Zeichens�tze einschlie�en, die Sie benutzen werden (Option
@code{--with-charset=xxx}). Die Standard-MySQL-Bin�rdistributionen werden
mit Unterst�tzung f�r alle Zeichens�tze kompiliert.

Hier ist eine Auflistung einiger Messungen, die wir durchgef�hrt haben:
@itemize @bullet
@item
Wenn Sie @code{pgcc} benutzen und alles mit @code{-O6} kompilieren, ist der
@code{mysqld}-Server 1% schneller als mit @code{gcc} 2.95.2.

@item
Wenn Sie dynamisch linken (ohne @code{-static}), ist das Ergebnis unter
Linux 13% langsamer. Beachten Sie, dass Sie dennoch dynamisch gelinkte
MySQL-Bibliotheken benutzen k�nnen. Nur beim Server ist das kritisch in
Bezug auf Performance.

@item
Wenn Sie Ihre @code{mysqld}-Bin�rdatei mit @code{strip libexec/mysqld}
strippen, ist die resultierende Bin�rdatei bis zu 4% schneller.

@item
Wenn Sie sich �ber TCP/IP statt �ber Unix-Sockets verbinden, ist das auf
demselben Computer 7,5% langsamer. (Wenn Sie sich zu @code{localhost}
verbinden, benutzt MySQL vorgabem��ig Sockets.)

@item
Wenn Sie sich �ber TCP/IP von einem anderen Computer �ber ein
100-MBit-Ethernet verbinden, ist das 8% bis 11% langsamer.

@item
Wenn Sie mit @code{--with-debug=full} kompilieren, verlangsamen sich die
meisten Anfragen um 20%, manche Anfragen jedoch werden wesentlich langsamer
(der MySQL-Benchmarks zeigte 35%). Wenn Sie @code{--with-debug} benutzen,
betr�gt die Verlangsamung nur 15%. Wenn Sie eine @code{mysqld}-Version, die
mit @code{--with-debug=full} kompiliert wurde, mit @code{--skip-safemalloc}
starten, ist die Geschwindigkeit etwa dasselbe, als wenn Sie mit
@code{--with-debug} konfigurieren.

@item
Auf einer Sun SPARCstation 20 ist SunPro C++ 4.2 5% schneller als
@code{gcc} 2.95.2.

@item
Das Kompilieren mit @code{gcc} 2.95.2 f�r ultrasparc mit der Option
@code{-mcpu=v8 -Wa,-xarch=v8plusa} ergibt 4% mehr Performance.

@item
Auf Solaris 2.5.1 sind MIT-pThreads 8% bis 12% langsamer als Solaris-native
Threads, auf einem Einprozessorsystem. Bei mehr Last / Prozessoren sollte
der Unterschied gr��er werden.

@item
Laufenlassen mit @code{--log-bin} macht @strong{MySQL} 1% langsamer.

@item
Wenn beim Kompilieren unter Linux-x86 mit gcc keine Frame-Pointers
@code{-fomit-frame-pointer} oder @code{-fomit-frame-pointer -ffixed-ebp}
verwendet werden, ist @code{mysqld} 1% bis 4% schneller.
@end itemize

Die MySQL-Linux-Distribution, die von MySQL AB zur Verf�gung gestellt wird,
wurde fr�her mit @code{pgcc} kompiliert, aber wir mussten zum normalen gcc
zur�ck gehen, weil es einen Bug in @code{pgcc} gibt, der Code erzeugt, der
nicht auf AMD l�uft. Wir werden gcc solange benutzen, bis dieser Bug
behoben ist. Bis dahin k�nnen Sie, falls Sie keine AMD-Maschine haben, eine
schnellere Bin�rdatei erhalten, wenn Sie mit @code{pgcc} kompilieren. Die
Standard-MySQL-Linux-Bin�rdatei wird statisch gelinkt, um sie schneller und
portierbarer zu machen.


@node Memory use, DNS, Compile and link options, Optimising the Server
@c German node Speicherbenutzung
@subsection Wie MySQL Speicher benutzt

@cindex Speicherbenutzung

Die unten stehende Liste zeigt einige M�glichkeiten, wie der
@code{mysqld}-Server Speicher benutzt. Wo es zutrifft, wird der Name der
f�r die Speicherbenutzung relevanten Servervariablen angegeben.

@itemize @bullet
@item
Der Schl�ssel-Puffer (Variable @code{key_buffer_size}) wird von allen
Threads geteilt. Andere Puffer, die vom Server benutzt werden, werden bei
Bedarf zugewiesen. @xref{Server parameters}.

@item
Jede Verbindung benutzt etwas Thread-spezifischen Platz: Einen Stack
(Vorgabe 64 KB, Variable @code{thread_stack}), einen Verbindungspuffer
(Variable @code{net_buffer_length}) und a Ergebnispuffer (Variable
@code{net_buffer_length}). Die Verbindungspuffer und Ergebnispuffer werden
bei Bedarf dynamisch bis zu @code{max_allowed_packet} vergr��ert. Wenn
eine Anfrage l�uft, wird auch eine Kopie der aktuellen Anfragezeichenkette
zugewiesen.

@item
Alle Threads teilen sich denselben grundlegenden Speicher.

@item
Nur die komprimierten ISAM- / MyISAM-Tabellen werden Speicher-gemappt. Das
liegt daran, dass der 32-Bit-Adressraum von 4 GB f�r die meisten gro�en
Tabellen nicht Gro� genug ist. Wenn Systeme mit 64-Bit-Adressraum
gebr�uchlicher werden, werden wir vielleicht eine allgemeine Unterst�tzung
f�r Speicher-Mapping hinzuf�gen.

@item
Jeder Anfrage, die einen sequentiellen Scan �ber eine Tabelle durchf�hrt,
wird ein Lesepuffer zugewiesen (Variable @code{record_buffer}).

@item
Wenn Zeilen in 'zuf�lliger' Reihenfolge gelesen werden (zum Beispiel nach
einem Sortiervorgang), wird ein Zufalls-Lesepuffer zugewiesen, um
Suchvorg�nge auf Festplatte zu vermeiden. (Variable @code{record_rnd_buffer}).

@item
Alle Joins werden in einem Durchgang durchgef�hrt und die meisten Joins
k�nnen sogar ohne Benutzung einer tempor�ren Tabelle durchgef�hrt werden.
Die meisten tempor�ren Tabellen sind Speicher-basierende (HEAP-) Tabellen.
Tempor�re Tabellen mit gro�er Datensatzl�nge (berechnet als Summe aller
Spaltenl�ngen) oder die @code{BLOB}-Spalten enthalten, werden auf
Festplatte gespeichert.

Ein Problem in MySQL-Versionen vor Version 3.23.2 ist, dass Sie den Fehler 
@code{The table tabelle is full} erhalten, wenn die Gr��e der HEAP-Tabelle
@code{tmp_table_size} �berschreitet. In neueren Versionen wird dies so
gehandhabt, dass die Speicher-basierende (HEAP-) Tabelle bei Bedarf
automatisch in eine Festplatten-basierende Tabelle (MyISAM) umgewandelt
wird. Um das Problem zu umgehen, k�nnen Sie die Gr��e von tempor�ren
Tabellen durch Setzen der @code{tmp_table_size}-Option f�r @code{mysqld}
�ndern, oder durch Setzen der SQL-Option @code{SQL_BIG_TABLES} im
Client-Programm.  @xref{SET OPTION, , @code{SET OPTION}}. In MySQL-Version
3.20 war die maximale Gr��e der tempor�ren Tabelle
@code{record_buffer*16}. Wenn Sie also diese Version benutzen, m�ssen Sie
den Wert von @code{record_buffer} herauf setzen. Sie k�nnen @code{mysqld}
auch mit der @code{--big-tables}-Option starten, um tempor�re Tabellen
immer auf Festplatte zu speichern. Das wird jedoch die Geschwindigkeit
vieler komplizierter Anfragen beeinflussen.

@item
Den meisten Sortier-Anfragen werden ein Sortierpuffer und 0 bis 2 tempor�re
Dateien zugewiesen, abh�ngig von der Gr��e der Ergebnismenge.
@xref{Temporary files}.

@item
Fast alles Parsen und Berechnen wird in einem lokalen Speicherbereich
durchgef�hrt. F�r kleine Sachen wird kein Speicher-Overhead ben�tigt, und
das normale, langsame Zuweisen und Freimachen von Speicher wird vermieden.
Speicher wird nur f�r unerwartet lange Zeichenketten zugewiesen (das wird
mit @code{malloc()} und @code{free()} gemacht).

@item
Jede Index-Datei wird einmal ge�ffnet. Die Daten-Datei wird einmal f�r
jeden gleichzeitig laufenden Thread ge�ffnet. F�r jeden gleichzeitigen
Thread wird eine Tabellenstruktur, Spaltenstrukturen f�r jede Spalte und
ein Puffer der Gr��e @code{3 * n} zugewiesen, wobei @code{n} die maximale
Zeilenl�nge ist (@code{BLOB}-Spalten werden nicht mitgerechnet). Eine
@code{BLOB}-Spalte benutzt 5 bis 8 Bytes plus die L�nge der
@code{BLOB}-Daten. Der @code{ISAM}- / @code{MyISAM}-Tabellen-Handler
benutzt einen zus�tzlichen Zeilenpuffer f�r internen Gebrauch.

@item
Bei jeder Tabelle, die @code{BLOB}-Spalten enth�lt, wird ein Puffer
dynamisch vergr��ert, um gr��ere @code{BLOB}-Werte einzulesen. Wenn Sie
eine Tabelle scannen, wird ein Puffer so Gro� wie der gr��te
@code{BLOB}-Wert zugewiesen.

@item
Tabellen-Handler f�r alle Tabellen in Benutzung werden in einem Cache
gespeichert und als FIFO verwaltet. Normalerweise hat der Cache 64
Eintr�ge. Wenn eine Tabelle gleichzeitig von zwei laufenden Threads
benutzt wurde, enth�lt der Cache zwei Eintr�ge f�r die Tabelle.
@xref{Open tables}.

@item
Ein @code{mysqladmin flush-tables}-Befehl schlie�t alle Tabellen, die
nicht in Benutzung sind, und kennzeichnet alle Tabellen in Benutzung als zu
schlie�en, sobald der aktuell ausf�hrende Thread fertig ist. Das setzt
effektiv den meisten benutzten Speicher frei.
@end itemize

@code{ps} und andere System-Status-Programme berichten vielleicht, dass
@code{mysqld} viel Arbeitsspeicher benutzt. Das kann durch Thread-Stacks
auf verschiedenen Speicheradressen verursacht werden. @code{ps} der
Solaris-Version zum Beispiel z�hlt den unbenutzten Speicher zwischen Stacks
zum benutzten Speicher hinzu. Das k�nnen Sie best�tigen, wenn Sie den
verf�gbaren Swap mit @code{swap -s} �berpr�fen. Wir haben @code{mysqld} mit
kommerziellen Memory-Leak-Detektoren getestet, daher sollte es keine
Memory-Leaks geben.


@node DNS, SET OPTION, Memory use, Optimising the Server
@c German node DNS
@subsection Wie MySQL DNS benutzt

@cindex DNS
@cindex Caching von Hostnamen

Wenn sich ein neuer Thread mit @code{mysqld} verbindet, erzeugt
@code{mysqld} einen neuen Thread, um die Anfrage zu handhaben. Dieser
Thread pr�ft zuerst, ob der Hostname im Hostnamen-Cache ist. Falls nicht,
ruft der Thread @code{gethostbyaddr_r()} und @code{gethostbyname_r()} auf,
um den Hostname aufzul�sen.

Wenn das Betriebssystem die oben genannten Thread-sicheren Aufrufe nicht
unterst�tzt, sperrt der Thread ein Mutex und ruft statt dessen
@code{gethostbyaddr()} und @code{gethostbyname()} auf. Beachten Sie, dass
in diesem Fall kein anderer Thread andere Hostnamen aufl�sen kann, die
nicht im Hostnamen-Cache sind, bis der erste Thread fertig ist.

Sie k�nnen das DNS-Nachschlagen von Hostnamen (DNS-Lookup) abschalten,
indem Sie @code{mysqld} mit @code{--skip-name-resolve} starten. In diesem
Fall k�nnen Sie jedoch in den MySQL-Berechtigungstabellen nur IP-Nummern
verwenden.

Wenn Sie ein sehr langsames DNS und viele Hosts haben, k�nnen Sie mehr
Performance erzielen, wenn Sie entweder das DNS-Nachschlagen von Hostnamen
(DNS-Lookup) abschalten (mit @code{--skip-name-resolve}) oder
@code{HOST_CACHE_SIZE} (Vorgabe: 128) erh�hen und @code{mysqld}
neu kompilieren.

Sie k�nnen den Hostnamen-Cache mit @code{--skip-host-cache} abschalten. Sie
k�nnen den Hostnamen-Cache mit @code{FLUSH HOSTS} oder @code{mysqladmin
flush-hosts} l�schen.

Wenn Sie keine Verbindungen �ber @code{TCP/IP} zulassen wollen, starten Sie
@code{mysqld} mit @code{--skip-networking}.


@node SET OPTION,  , DNS, Optimising the Server
@c German node SET OPTION
@subsection @code{SET}-Syntax

@findex SET OPTION

@example
SET [OPTION] SQL_VALUE_OPTION= wert, ...
@end example

@code{SET OPTION} setzt verschiedene Optionen, die die Arbeitsweise des
Servers oder Ihrer Clients beeinflussen. Jede Option, die Sie setzen,
bleibt in Kraft, bis die aktuelle Sitzung beendet wird, oder bis Sie die
Option auf einen anderen Wert setzen.

@table @code
@item characterset zeichensatz_name | DEFAULT
Das mappt alle Zeichenketten von und zum Client auf das angegebene Mapping.
Momentan ist die einzige Option f�r @code{zeichensatz_name}
@code{cp1251_koi8}, aber Sie k�nnen leicht neue Mappings hinzuf�gen, indem
Sie die @file{sql/convert.cc}-Datei in der MySQL-Quelldistribution
editieren. Das vorgabem��ige Mapping kann durch Setzen des
@code{zeichensatz_name}-Werts auf @code{DEFAULT} wieder hergestellt
werden.

Beachten Sie, dass sich die Syntax f�r das Setzen der
@code{characterset}-Option von der Syntax f�r das Setzen anderer Optionen
unterscheidet.

@item PASSWORD = PASSWORD('ein_passwort')
@cindex Passw�rter, setzen
Setzt das Passwort f�r den aktuellen Benutzer. Jeder nicht anonyme Benutzer
kann sein eigenes Passwort �ndern!

@item PASSWORD FOR benutzer = PASSWORD('ein_passwort')
Setzt das Passwort f�r einen bestimmten Benutzer auf dem aktuellen
Server-Host. Das kann nur ein Benutzer mit Zugriff auf die
@code{mysql}-Datenbank tun. Der Benutzer sollte im
@code{user@@hostname}-Format eingegeben werden, wobei @code{user} und
@code{hostname} exakt so sind, wie sie in den @code{User}- und
@code{Host}-Spalten des @code{mysql.user}-Tabelleneintrags aufgelistet
sind. Wenn Sie zum Beispiel in den Spalten @code{User} und @code{Host} die
Eintr�ge @code{'bob'} und @code{'%.loc.gov'} haben wollen, schreiben Sie:

@example
mysql> SET PASSWORD FOR bob@@"%.loc.gov" = PASSWORD("newpass");

oder

mysql> UPDATE mysql.user SET password=PASSWORD("newpass") where user="bob' und host="%.loc.gov";
@end example

@item SQL_AUTO_IS_NULL = 0 | 1
Falls auf @code{1} gesetzt (Vorgabe), wird mit folgendem Konstrukt die
letzte eingef�gte Zeile einer Tabelle mit einer auto_increment-Zeile
gefunden:
@code{WHERE auto_increment_spalte IS NULL}. Das wird von einigen
ODBC-Programme wie Access benutzt.

@item AUTOCOMMIT= 0 | 1
Falls auf @code{1} gesetzt, werden alle �nderungen einer Tabelle auf einmal
durchgef�hrt. Um eine Transaktion aus mehreren Befehlen anzufangen, m�ssen
Sie das @code{BEGIN}-Statement benutzen. @xref{COMMIT}. Falls auf @code{0}
gesetzt, m�ssen Sie @code{COMMIT} / @code{ROLLBACK} benutzen, um diese
Transaktion zu akzeptieren / zu widerrufen. @xref{COMMIT}. Beachten Sie,
dass MySQL nach dem Umschalten vom @code{AUTOCOMMIT}-Modus zum
@code{AUTOCOMMIT}-Modus ein automatisches @code{COMMIT} auf alle offenen
Transaktionen durchf�hrt.

@item SQL_BIG_TABLES = 0 | 1
@cindex table is full
Falls auf @code{1} gesetzt, werden alle tempor�ren Tabellen auf Platte
statt im Arbeitsspeicher gespeichert. Das ist etwas langsamer, aber Sie
erhalten nicht den Fehler @code{The table tabelle is full}, wenn Sie gro�e
@code{SELECT}-Operationen ausf�hren, die eine gro�e tempor�re Tabelle
erfordern. Der Vorgabewert f�r eine neue Verbindung ist @code{0} (das
hei�t, tempor�re Tabellen im Arbeitsspeicher benutzen).

@item SQL_BIG_SELECTS = 0 | 1
Falls auf @code{0} gesetzt, bricht MySQL ab, wenn ein @code{SELECT} versucht
wird, das wahrscheinlich sehr lange dauern wird. Das ist n�tzlich, wenn ein
unratsames @code{WHERE}-Statement abgesetzt wurde. Ein gro�e Anfrage ist
definiert als ein @code{SELECT}, das wahrscheinlich mehr als
@code{max_join_size} Zeilen untersuchen muss. Der Vorgabewert f�r eine neue
Verbindung ist @code{1} (was alle @code{SELECT}-Statements zul��t).

@item SQL_BUFFER_RESULT = 0 | 1
@code{SQL_BUFFER_RESULT} erzwingt, dass das Ergebnis von @code{SELECT}'s in
eine tempor�re Tabelle geschrieben wird. Das hilft MySQL, die
Tabellensperren fr�hzeitig aufzuheben, und ist hilfreich in F�llen, wo es
lange dauert, das Ergebnis an den Client zu senden.

@item SQL_LOW_PRIORITY_UPDATES = 0 | 1
Falls auf @code{1} gesetzt, warten alle @code{INSERT}-, @code{UPDATE}-,
@code{DELETE}- und @code{LOCK TABLE WRITE}-Statements, bis es kein
anh�ngiges @code{SELECT} oder @code{LOCK TABLE READ} f�r die betroffene
Tabelle gibt.

@item SQL_MAX_JOIN_SIZE = wert | DEFAULT
Nicht zulassen, dass @code{SELECT}s, die wahrscheinlich mehr als
@code{value} Zeilenkombinationen untersuchen m�ssen, ausgef�hrt werden.
Wenn Sie diesen Wert setzen, k�nnen Sie @code{SELECT}s abfangen, bei denen
Schl�ssel nicht korrekt verwendet werden und die wahrscheinlich sehr lange
dauern. Wenn dieser Wert auf etwas anderes als @code{DEFAULT} gesetzt wird,
wird der @code{SQL_BIG_SELECTS}-Flag zur�ckgesetzt. Wenn Sie den
@code{SQL_BIG_SELECTS}-Flag wieder setzen, wird die
@code{SQL_MAX_JOIN_SIZE}-Variable ignoriert. Sie k�nnen f�r diese Variable
einen Vorgabewert setzen, wenn Sie @code{mysqld} mit @code{-O
max_join_size=#} starten.

@item SQL_SAFE_UPDATES = 0 | 1
Falls auf @code{1} gesetzt, bricht MySQL ab, wenn ein @code{UPDATE} oder
@code{DELETE} versucht wird, das keinen Schl�ssel oder kein @code{LIMIT} in
der @code{WHERE}-Klausel benutzt. Das erm�glicht das Abfangen falscher
Aktualisierungen, wenn SQL-Befehle von Hand eingegeben werden.

@item SQL_SELECT_LIMIT = wert | DEFAULT
Die maximale Anzahl von Datens�tzen, die von @code{SELECT}-Statements
zur�ckgegeben werden. Wenn ein @code{SELECT} eine @code{LIMIT}-Klausel hat,
hat das @code{LIMIT} Vorrang vor dem Wert von @code{SQL_SELECT_LIMIT}. Der
Vorgabewert f�r eine neue Verbindung ist ``unbegrenzt.'' Wenn Sie diese
Begrenzung ge�ndert haben, kann der Vorgabewert wieder hergestellt werden,
indem Sie einen @code{SQL_SELECT_LIMIT}-Wert von @code{DEFAULT} verwenden.

@item SQL_LOG_OFF = 0 | 1
Falls auf @code{1} gesetzt, wird f�r diesen Client kein Loggen ins
Standard-Log durchgef�hrt, wenn der Client die
@strong{process}-Berechtigung hat. Das betrifft nicht die
Update-Log-Datei!

@item SQL_LOG_UPDATE = 0 | 1
Falls auf @code{0} gesetzt, wird f�r diesen Client kein Loggen in die
Update-Log-Datei durchgef�hrt, wenn der Client die
@strong{process}-Berechtigung hat. Das betrifft nicht das Standard-Log!

@item SQL_QUOTE_SHOW_CREATE = 0 | 1
Falls auf @code{1} gesetzt, setzt @code{SHOW CREATE TABLE} Tabellen- und
Spaltennamen in Anf�hrungszeichen. Das ist vorgabem��ig
@strong{angeschaltet}, damit Replikation von Tabellen mit merkw�rdigen
Spaltennamen funktioniert. @ref{SHOW CREATE TABLE, , @code{SHOW CREATE TABLE}}.

@item TIMESTAMP = zeitstempel_wert | DEFAULT
Setzt die Zeit f�r diesen Client. Das wird benutzt, um den
Original-Zeitstempel zu erhalten, wenn sie die Update-Log-Datei benutzen,
um Zeilen wiederherzustellen. @code{zeitstempel_wert} sollte ein
UNIX-Epoche-Zeitstempel sein, kein MySQL-Zeitstempel.

@item LAST_INSERT_ID = #
Setzt den Wert, der von @code{LAST_INSERT_ID()} zur�ckgegeben wird. Dieser
wird in der Update-Log-Datei gespeichert, wenn Sie @code{LAST_INSERT_ID()}
in einem Befehl benutzen, der eine Tabelle aktualisiert.

@item INSERT_ID = #
Setzt den Wert, der von einem folgenden @code{INSERT}- oder @code{ALTER
TABLE}-Befehl benutzt wird, wenn ein @code{AUTO_INCREMENT}-Wert eingef�gt
wird. Das wird haupts�chlich zusammen mit der Update-Log-Datei benutzt.
@end table






@node Disk issues,  , Optimising the Server, MySQL Optimisation
@c German node Festplatte
@section Festplatte, Anmerkungen

@cindex Festplatten, Anmerkungen
@cindex Performance, Anmerkungen zur Festplatte

@itemize @bullet
@item
Wie bereits erw�hnt sind Suchvorg�nge auf der Festplatte ein gro�er
Performance-Flaschenhals. Die Probleme werden mehr und mehr deutlich, wenn
die Datenmenge w�chst, so dass effizientes Caching unm�glich wird. Bei
gro�en Datenbanken, in denen Sie auf Daten mehr oder weniger zuf�llig
zugreifen, k�nnen Sie sicher davon ausgehen, dass Sie zumindest eine
Plattenzugriff brauchen, um zu lesen, und eine Reihe weiterer
Plattenzugriffe, um Dinge zu schreiben. Um dieses Problem zu minimieren,
benutzen Sie Platten mit geringen Zugriffszeiten!

@item
Erh�hen Sie die Anzahl verf�gbarer Festplattenscheiben (und verringern Sie
dadurch den Such-Overhead), indem Sie entweder Dateien auf andere Platten
symbolisch verkn�pfen (SymLink) oder die Platten 'stripen'.

@table @strong
@item Using Symbolische Links
Das bedeutet, dass Sie die Index- und / oder Daten-Datei(en) aus dem
normalen Daten-Verzeichnis auf eine andere Festplatte verkn�pfen (die auch
'gestriped' sein kann). Das macht sowohl den Suchvorgang als auch die
Lesezeiten besser (wenn die Platten nicht f�r andere Dinge benutzt werden).
@xref{Symbolic links}.

@cindex Stripen, Definition
@item Stripen
'Stripen' hei�t, dass Sie viele Festplatten haben und den ersten Block
auf die erste Platte legen, den zweiten Block auf die zweite Platte und den
n-ten Block auf die n-te Platte usw. Das bedeutet, wenn Ihre normale
Datengr��e weniger als die Stripe-Gr��e ist (oder perfekt passt), dass
Sie wesentlich bessere Performance erhalten. Beachten Sie, dass Stripen
sehr stark vom Betriebssystem und von der Stripe-Gr��e abh�ngig ist.
Machen Sie Benchmark-Tests Ihrer Applikation mit unterschiedlichen
Stripe-Gr��en. @xref{Custom Benchmarks}.

Beachten Sie, dass der Geschwindigkeitsunterschied f�r das Stripen
@strong{sehr} stark vom Parameter abh�ngig ist. Abh�ngig davon, wie Sie den
Stripe-Parameter setzen und von der Anzahl von Festplatten erhalten Sie
Unterschiede in der Gr��enordnung von Faktoren. Beachten Sie, dass Sie
entscheiden m�ssen, ob Sie f�r zuf�llige oder sequentielle Zugriffe
optimieren.
@end table

@item
Aus Gr�nden der Zuverl�ssigkeit sollten sie vielleicht RAID 0 + 1 nehmen
(Stripen + Spiegeln), doch in diesem Fall brauchen Sie 2 * n Laufwerke, um
n Datenlaufwerke zu haben. Das ist wahrscheinlich die beste Option, wenn
Sie genug Geld daf�r haben! Sie m�ssen jedoch eventuell zus�tzlich in
Software f�r die Verwaltung von Volumes investieren, um das effizient zu
handhaben.

@item
Eine gute Option ist es, nicht ganz so wichtige Daten (die wieder
hergestellt werden k�nnen) auf RAID-0-Platten zu halten, w�hrend wirklich
wichtige Daten (wie Host-Informationen und Log-Dateien) auf einer RAID-0+1-
oder RAID-N-Platte gehalten werden. RAID-N kann ein Problem darstellen,
wenn Sie viele Schreibzugriffe haben, weil Zeit ben�tigt wird, die
Parit�tsbits zu aktualisieren.

@item
Sie k�nnen auch den Parameter f�r das Dateisystem setzen, das die Datenbank
benutzt. Eine einfache �nderung ist, das Dateisystem mit der noatime-Option
zu mounten. Das bringt es dazu, das Aktualisieren der letzten Zugriffszeit
in der Inode zu �berspringen und vermeidet dadurch einige
Platten-Suchzugriffe.

@item
Unter Linux k�nnen Sie viel mehr Performance erhalten (bis zu 100% unter
Last ist nicht ungew�hnlich), wenn Sie hdpram benutzen, um die
Schnittstelle Ihrer Festplatte zu konfigurieren! Das folgende Beispiel
sollte recht gute hdparm-Optionen f�r MySQL (und wahrscheinlich viele
andere Applikationen) darstellen:

@example
hdparm -m 16 -d 1
@end example

Beachten Sie, dass Performance und Zuverl�ssigkeit beim oben Genannten von
Ihrer Hardware abh�ngen, daher empfehlen wir sehr, dass Sie Ihr System
gr�ndlich testen, nachdem Sie @code{hdparm} benutzt haben! Sehen Sie in der
Handbuchseite (ManPage) von @code{hdparm} nach weiteren Informationen! Wenn
@code{hdparm} nicht vern�nftig benutzt wird, kann das Ergebnis eine
Besch�digung des Dateisystems sein. Machen Sie eine Datensicherung von
allem, bevor Sie experimentieren!

@item
Auf vielen Betriebssystemen k�nnen Sie die Platten mit dem 'async'-Flag
mounten, um das Dateisystem auf asynchrone Aktualisierung zu setzen. Wenn
Ihr Computer ausreichend stabil ist, sollte Ihnen das mehr Performance
geben, ohne zu viel Zuverl�ssigkeit zu opfern. (Dieser Flag ist unter Linux
vorgabem��ig angeschaltet.)

@item
Wenn Sie nicht wissen m�ssen, wann auf eine Datei zuletzt zugegriffen
wurden (was auf einem Datenbank-Server nicht wirklich n�tig ist), k�nnen
Sie Ihr Dateisystem mit dem noatime-Flag mounten.
@end itemize



@menu
* Symbolic links::              
@end menu

@node Symbolic links,  , Disk issues, Disk issues
@c German node Symbolische Links
@subsection Symbolische Links benutzen

@cindex Symbolische Links
@cindex Links, symbolische

Sie k�nnen Tabellen und Datenbanken vom Datenbank-Verzeichnis an andere
Stellen verschieben und sie mit symbolischen Links auf neue Speicherorte
ersetzen. Das k�nnten Sie zum Beispiel tun, um eine Datenbank auf ein
Dateisystem mit mehr freiem Speicherplatz zu verlagern oder um die
Geschwindigkeit Ihres System durch Verteilen Ihrer Tabellen auf
unterschiedliche Platten zu steigern.

Die empfohlene Art, das zu tun, ist, nur Datenbanken auf unterschiedliche
Platten per SymLink zu verkn�pfen, und das bei Tabellen nur im Notfall zu
tun.

@cindex Datenbanken, Symbolische Links


@menu
* Symbolic links to databases::  
* Symbolic links to tables::    
@end menu

@node Symbolic links to databases, Symbolic links to tables, Symbolic links, Symbolic links
@c German node Symbolische Links auf Datenbanken
@subsubsection Benutzung symbolischer Links f�r Datenbanken

Um eine Datenbank per SymLink zu verkn�pfen, legt man zuerst ein
Verzeichnis auf einer Platte mit freiem Speicherplatz an und erzeugt dann
einen SymLink vom MySQL-Datenbank-Verzeichnis aus darauf:

@example
shell> mkdir /dr1/datenbanken/test
shell> ln -s /dr1/datenbanken/test mysqld-datadir
@end example

MySQL unterst�tzt nicht das Verkn�pfen eines Verzeichnisses zu mehrfachen
Datenbanken. Wenn Sie ein Datenbank-Verzeichnis mit einem symbolischen Link
ersetzen, funktioniert das solange gut, wie Sie keinen symbolischen Link
zwischen Datenbanken machen. Angenommen, Sie haben eine Datenbank
@code{datenbank1} unter dem MySQL-Daten-Verzeichnis und machen dann einen
Symlink @code{datenbank2}, der auf @code{datenbank1} zeigt:

@example
shell> cd /pfad/zu/datadir
shell> ln -s datenbank1 datenbank2
@end example

Jetzt erscheint f�r jede Tabelle @code{tabelle_a} in @code{datenbank1} auch
eine Tabelle @code{tabelle_a} in @code{datenbank2}. Wenn ein Thread
@code{datenbank1.tabelle_a} aktualisiert und ein anderer Thread
@code{datenbank2.tabelle_a} aktualisiert, gibt es Probleme.

Wenn Sie das wirklich brauchen, m�ssen Sie folgenden Code in
@file{mysys/mf_format.c} �ndern:

@example
if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
@end example

zu:

@example
if (1)
@end example

Unter Windows k�nnen Sie interne symbolische Links auf Verzeichnisse
benutzen, indem Sie MySQL mit @code{-DUSE_SYMDIR} kompilieren. Das erlaubt
Ihnen, verschiedene Datenbanken auf verschiedene Platte zu legen.
@xref{Windows symbolic links}.


@node Symbolic links to tables,  , Symbolic links to databases, Symbolic links
@c German node Symbolische Links auf Tabellen
@subsubsection Benutzung symbolischer Links f�r Tabellen

@cindex Datenbanken, Symbolische Links

Vor MySQL 4.0 konnten Sie Tabellen nicht per SymLink verkn�pfen, wenn Sie
nicht sehr sorgf�ltig dabei vorgingen. Das Problem liegt darin, dass bei
@code{ALTER TABLE}, @code{REPAIR TABLE} oder @code{OPTIMIZE TABLE} auf eine
per Symlink verkn�pfte Datei die SymLinks entfernt und durch die
Original-Dateien verkn�pft werden. Das geschieht, weil beim obigen Befehl
eine tempor�re Datei im Datenbank-Verzeichnis erzeugt wird, und wenn der
Befehl ausgef�hrt ist, die Original-Datei durch die tempor�re Datei
ersetzt wird.

Sie sollten Tabellen auf Systemen, die keinen vollst�ndig funktionierenden
@code{realpath()}-Aufruf haben, nicht per SymLink verkn�pfen. (Zumindest
Linux und Solaris unterst�tzen @code{realpath()}.)

In MySQL 4.0 werden Symlinks nur f�r @code{MyISAM}-Tabellen vollst�ndig
unterst�tzt. Bei anderen Tabellentypen erhalten Sie wahrscheinlich
merkw�rdige Probleme, wenn Sie einen der obigen Befehle ausf�hren.

Die Handhabung symbolischer Links in MySQL 4.0 funktioniert auf folgende
Art (das gilt meist nur f�r @code{MyISAM}-Tabellen):

@itemize @bullet
@item
Im Daten-Verzeichnis liegen immer die Tabellendefinitionsdatei und die
Daten-/Index-Dateien.

@item
Sie k�nnen die Index-Datei und die Daten-Datei unabh�ngig voneinander auf
unterschiedliche Verzeichnisse per SymLink verkn�pfen.

@item
Das Erzeugen der SymLinks kann durch das Betriebssystem (wenn @code{mysqld}
nicht l�uft) oder mit dem @code{INDEX/DATA
directory="pfad-zum-verzeichnis"}-Befehl in @code{CREATE TABLE}
durchgef�hrt werden. @xref{CREATE TABLE}.

@item
@code{myisamchk} ersetzt keinen Symlink mit der Index-/Datendatei, sondern
arbeitet direkt mit den Dateien, auf die die SymLinks verweisen. Jegliche
tempor�re Dateien werden im selben Verzeichnis erzeugt, wo die
Daten-/Index-Datei ist.

@item
Wenn Sie eine Tabelle l�schen, die Symlinks benutzt, werden sowohl der
Symlink als auch die Datei, auf die der SymLink zeigt, gel�scht. Das ist
ein guter Grund daf�r, @code{mysqld} NICHT als Root laufen zu lassen und
niemandem zu erlauben, Schreibzugriff auf die MySQL-Datenbankverzeichnisse
zu haben.

@item
Wenn Sie eine Tabelle mit @code{ALTER TABLE RENAME} umbenennen und nicht
die Datenbank �ndern, wird der Symlink im Datenbank-Verzeichnis auf den
neuen Namen umbenannt und die Daten-/Index-Datei wird entsprechend
umbenannt.

@item
Wenn Sie @code{ALTER TABLE RENAME} benutzen, um eine Tabelle in eine andere
Datenbank zu verschieben, wird die Tabelle in das andere
Datenbank-Verzeichnis verschoben und die alten SymLinks und die Dateien,
auf die sie zeigen, werden gel�scht.

@item
Wenn Sie keine Symlinks benutzen, sollten Sie die
@code{--skip-symlink}-Option f�r @code{mysqld} benutzen, damit niemand eine
Datei ausserhalb des @code{mysqld} Daten-Verzeichnisses l�schen oder
umbenennen kann.
@end itemize

Dinge, die noch nicht unterst�tzt werden:

@cindex TODO, SymLinks
@itemize @bullet
@item
@code{ALTER TABLE} ignoriert alle @code{INDEX/DATA directory="pfad"}-Optionen.
@item
@code{CREATE TABLE} berichtet nicht, wenn eine Tabelle symbolische Links hat.
@item
@code{mysqldump} gibt die Information �ber symbolische Links nicht in der Ausgabe aus.
@item
@code{BACKUP TABLE} und @code{RESTORE TABLE} respektieren keine symbolischen Links.
@end itemize


@node Reference, Table types, MySQL Optimisation, Top
@c German node Referenz
@chapter MySQL-Sprachreferenz


MySQL hat eine sehr komplexe, aber intuitive und leicht zu erlernende
SQL-Schnittstelle. Dieses Kapitel beschreibt die verschiedenen Befehle,
Typen und Funktionen, die Sie kennen m�ssen, um MySQL effizient und
effektiv zu benutzen. Dieses Kapitel dient auch als Referenz f�r die
gesamte in MySQL beinhaltete Funktionalit�t. Um dieses Kapitel effektiv zu
nutzen, sollten Sie unter den verschiedenen Stichworten nachschlagen.


@menu
* Language Structure::          
* Column types::                
* Functions::                   
* Data Manipulation::           
* Data Definition::             
* Basic User Commands::         
* Transactional Commands::      
* Fulltext Search::             
* Query Cache::                 
@end menu

@node Language Structure, Column types, Reference, Reference
@c German node Sprachstruktur
@section Sprachstruktur



@menu
* Literals::                    
* Legal names::                 
* Name case sensitivity::       
* Variables::                   
* Comments::                    
* Reserved words::              
@end menu

@node Literals, Legal names, Language Structure, Language Structure
@c German node Literale
@subsection Literale: Wie Zeichenketten und Zahlen geschrieben werden

@cindex Zeichenketten, Definition
@cindex Zeichenketten, Fluchtzeichen (Escape-Zeichen)
@cindex Literale
@cindex Fluchtzeichen (Escape-Zeichen)
@cindex Backslash, Fluchtzeichen (Escape-Zeichen)



Dieser Abschnitt beschreibt die verschiedenen Arten, in MySQL Zeichenketten
und Zahlen zu schreiben. Ebenfalls enthalten sind die verschiedenen Nuancen
und Fallstricke, in denen man sich bei den grundlegenden Datentypen von
MySQL verfangen kann.


@menu
* String syntax::               
* Number syntax::               
* Hexadecimal values::          
* NULL values::                 
@end menu

@node String syntax, Number syntax, Literals, Literals
@c German node Zeichenketten-Syntax
@subsubsection Zeichenketten

Eine Zeichenkette ist eine Folge von Zeichen, die entweder von Apostrophs
(einfachen Anf�hrungszeichen, @samp{'}) oder (doppelten) Anf�hrungszeichen
(@samp{"}) umgeben ist (nur einfache Anf�hrungszeichen, wenn Sie MySQL im
ANSI-Modus laufen lassen). Beispiele:

@example
'eine Zeichenkette'
"eine weitere Zeichenkette"
@end example

Innerhalb einer Zeichenkette haben bestimmte Folgen eine spezielle
Bedeutung. Jede dieser Folgen f�ngt mit einem Backslash (@samp{\}) an,
bekannt als @emph{Fluchtzeichen (Escape-Zeichen)}. MySQL erkennt folgende
Flucht-Folgen (Escape-Folgen):

@c these aren't really Funktionen, aber that's wahrscheinlich the most reasonable index
@table @code
@findex \0 (ASCII 0)
@findex NUL
@item \0
Ein ASCII-0- (@code{NUL}) Zeichen.

@findex \' (Apostroph)
@findex single quote (\')
@item \'
Ein Apostroph- (@samp{'}) Zeichen.

@findex \" (Anf�hrungszeichen)
@findex Anf�hrungszeichen (\")
@item \"
Ein Anf�hrungszeichen (@samp{"}).

@findex \b (R�ckschritt, Backspace)
@findex backspace (\b)
@item \b
Ein R�ckschritt- (Backspace-) Zeichen.

@findex \n (neue Zeile)
@findex newline (\n)
@item \n
Ein Neue-Zeile- (Newline-) Zeichen.

@findex \r (Wagenr�cklauf (carriage return))
@findex return (\r)
@findex Wagenr�cklauf (carriage return) (\r)
@item \r
Ein Wagenr�cklauf- (carriage return) Zeichen.

@findex \t (Tabulator)
@findex tab (\t)
@item \t
Ein Tabulator-Zeichen.

@findex \z (Steuerung-Z) ASCII(26)
@findex (Steuerung-Z) \z
@item \z
ASCII(26) (Steuerung-Z). Dieses Zeichen kann kodiert werden, um das Problem
zu umgehen, dass ASCII(26) unter Windows f�r Dateiende (END-OF-FILE) steht.
(ASCII(26) verursacht Probleme, wenn Sie @code{mysql Datenbank < Dateiname}
benutzen.)

@findex \\ (Fluchtzeichen, Escape-Zeichen)
@findex escape (\\)
@item \\
Ein Backslash- (@samp{\}) Zeichen.

@c German FIX added space before %
@findex % (Platzhalterzeichen)
@findex Wild card character (%)
@item \%
Ein @samp{%}-Zeichen. Dieses wird benutzt, um nach literalen Instanzen von
@samp{%} in Zusammenh�ngen zu suchen, wo @samp{%} ansonsten als
Platzhalterzeichen interpretiert werden w�rde.
@xref{String comparison functions}.

@findex _ (Platzhalterzeichen)
@findex Wild card character (_)
@item \_
Ein @samp{_}-Zeichen. Dieses wird benutzt, um nach literalen Instanzen von
@samp{_} in Zusammenh�ngen zu suchen, wo @samp{_} ansonsten als
Platzhalterzeichen interpretiert werden w�rde.
@xref{String comparison functions}.
@end table

Beachten Sie, dass bei der Benutzung von @samp{\%} oder @samp{\_} in
einigen Zeichenketten-Zusammenh�ngen diese die Zeichenketten @samp{\%} und
@samp{\_} und nicht @samp{%} und @samp{_} zur�ckgeben.

@cindex Anf�hrungszeichen, in Zeichenketten
@noindent
Es gibt verschiedene M�glichkeiten, Anf�hrungszeichen innerhalb einer
Zeichenkette zu schreiben:

@itemize @bullet
@item
Ein @samp{'} innerhalb einer Zeichenkette, die mit @samp{'} begrenzt wird,
kann als @samp{''} geschrieben werden.

@item
Ein @samp{"} innerhalb einer Zeichenkette, die @samp{"} begrenzt wird, kann
als @samp{""} geschrieben werden.

@item
Sie k�nnen dem Anf�hrungszeichen ein Fluchtzeichen (Escape-Zeichen)
(@samp{\}) voranstellen.

@item
Ein @samp{'} innerhalb einer Zeichenkette, die mit @samp{"} begrenzt wird,
braucht keine spezielle Behandlung und muss nicht verdoppelt oder escapet
werden. In gleicher Weise ben�tigt @samp{"} innerhalb einer Zeichenkette,
die mit @samp{'} begrenzt wird, keine spezielle Behandlung.
@end itemize

Die unten stehenden @code{SELECT}-Statements zeigen, wie Quoten und Escapen
funktionieren:

@example
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "Das\nsind\nvier\nZeilen";
+--------------------+
| Das
sind
vier
Zeilen |
+--------------------+
@end example

@cindex Bin�rdaten quoten

Wenn Sie Bin�rdaten in eine @code{BLOB}-Spalte einf�gen, m�ssen folgende
Zeichen durch Flucht-Folgen repr�sentiert werden:
@table @code
@item NUL
ASCII 0. Dieses geben Sie als @samp{\0} ein (ein Backslash und ein
ASCII-@samp{0}-Zeichen).
@item \
ASCII 92, Backslash. Das geben Sie als @samp{\\} ein.
@item '
ASCII 39, Apostroph. Das geben Sie als @samp{\'} ein.
@item "
ASCII 34, Anf�hrungszeichen. Das geben Sie als @samp{\"} ein.
@end table

@cindex Quoten
@cindex @code{BLOB}, Bin�rdaten einf�gen
@findex mysql_escape_string()
@findex DBI->quote
Wenn Sie C-Code schreiben, k�nnen Sie die C-API-Funktion
@code{mysql_escape_string()} f�r Fluchtzeichen (Escape-Zeichen) f�r das
@code{INSERT}-Statement benutzen. @xref{C API function overview}. In Perl
k�nnen Sie die @code{quote}-Methode des @code{DBI}-Pakets benutzen, um
Sonderzeichen in die korrekten Flucht-Folgen umzuwandeln.
@xref{Perl DBI Class, , Perl-@code{DBI}-Klasse}.

Sie sollten auf jede Zeichenkette, die eins der oben erw�hnten
Sonderzeichen enthalten k�nnte, eine der Flucht-Funktionen anwenden!


@node Number syntax, Hexadecimal values, String syntax, Literals
@c German node Zahlen-Syntax
@subsubsection Zahlen

@cindex Zahlen
@cindex g�ltige Zahlen, Beispiele
@cindex Ganzzahlen
@cindex Flie�kommazahlen
@cindex negative Werte

Ganzzahlen werden als Folge von Ziffern repr�sentiert. Flie�kommazahlen
benutzen @samp{.} als Dezimalseparator. Jedem Zahlentyp kann @samp{-}
vorangestellt werden, um einen negativen Wert anzuzeigen.

Beispiele g�ltiger Ganzzahlen:

@example
1221
0
-32
@end example

Beispiele g�ltiger Flie�kommazahlen:

@example
294.42
-32032.6809e+10
148.00
@end example

Eine Ganzzahl kann in einem Flie�komma-Zusammenhang benutzt werden, sie
wird dann als die �quivalente Flie�kommazahl interpretiert.


@node Hexadecimal values, NULL values, Number syntax, Literals
@c German node Hexadezimale Werte
@subsubsection Hexadezimale Werte

@tindex hexadezimale Werte

MySQL unterst�tzt hexadezimale Werte. In Zahlen-Zusammenh�ngen
funktionieren diese wie eine Ganzzahl (64-Bit-Genauigkeit). Im
Zeichenketten-Zusammenhang funktionieren sie wie eine bin�re Zeichenkette,
wobei jedes Paar hexadezimaler Ziffern in ein Zeichen umgewandelt wird:

@example
mysql> SELECT x'FF'
       -> 255
mysql> SELECT 0xa+0;
       -> 10
mysql> select 0x5061756c;
       -> Paul
@end example

Die x'hexadezimale_zeichenkette'-Syntax (neu in Version 4.0) basiert auf
ANSI-SQL. Die 0x-Syntax basiert auf ODBC. Hexadezimale Zeichenketten werden
oft von ODBC benutzt, um Werte f�r BLOB-Spalten anzugeben.


@node NULL values,  , Hexadecimal values, Literals
@c German node NULL-Werte
@subsubsection @code{NULL}-Werte

@tindex NULL-Wert

Der @code{NULL}-Wert bedeutet ``keine Daten'' und unterscheidet sich von
Werten wie @code{0} bei numerischen Typen oder der leeren Zeichenkette bei
Zeichenkettentypen. @xref{Problems with NULL, , Probleme mit @code{NULL}}.

@code{NULL} kann durch @code{\N} repr�sentiert werden, wenn Sie die
Textdatei-Import- oder Exportformate (@code{LOAD DATA INFILE}, @code{SELECT
... INTO OUTFILE}) benutzen. @xref{LOAD DATA, , @code{LOAD DATA}}.


@node Legal names, Name case sensitivity, Literals, Language Structure
@c German node Erlaubte Namen
@subsection Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen

@cindex Namen
@cindex erlaubte Namen
@cindex Datenbanken, Namen
@cindex Tabellen, Namen
@cindex Indexe, Namen
@cindex Spalten, Namen
@cindex Aliase, Namen



Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen folgen in MySQL
alle denselben Regeln.

@tindex Bezeichner, quoten
@tindex Quoten von Bezeichnern
@tindex `
@tindex "
Beachten Sie, dass sich die Regeln ab MySQL-Version 3.23.6 ge�ndert haben,
als das Quoten von Bezeichnern (f�r Datenbank-, Tabellen- und Spaltennamen)
eingef�hrt wurde, mit @samp{`}. @samp{"} funktioniert ebenfalls, um
Bezeichner zu quoten, wenn Sie im ANSI-Modus fahren. @xref{ANSI mode}.

@multitable @columnfractions .15 .15 .70
@item @strong{Bezeichner} @tab @strong{Maximale L�nge} @tab @strong{Erlaubte Zeichen}
@item Datenbank @tab 64 @tab Jedes Zeichen, dass f�r ein Verzeichnis erlaubt ist, ausser @samp{/} oder @samp{.}.
@item Tabelle @tab 64 @tab Jedes Zeichen, dass f�r einen Dateinamen erlaubt ist, ausser @samp{/} oder @samp{.}.
@item Spalte @tab 64 @tab Alle Zeichen.
@item Alias @tab 255 @tab Alle Zeichen.
@end multitable

Hinzuzuf�gen ist, dass Sie ASCII(0), ASCII(255) oder das Quote-Zeichen in
einem Bezeichner nicht verwenden d�rfen.

Beachten Sie, dass, falls der Bezeichner ein reserviertes Wort ist oder
Sonderzeichen enth�lt, er bei der Benutzung immer in @code{`} angegeben
sein muss:

@example
SELECT * from `select` where `select`.id > 100;
@end example

In vorherigen Versionen von MySQL sind die Namensregeln wie folgt:

@itemize @bullet
@item
Ein Name muss aus alphanumerischen Zeichen des aktuellen Zeichensatzes
bestehen und darf dar�ber hinaus @samp{_} und @samp{$} enthalten. Der
vorgabem��ige Zeichensatz ist ISO-8859-1 Latin1; dass kann durch die
@code{--default-character-set}-Option f�r @code{mysqld} ge�ndert werden.
@xref{Character sets}.

@item
Ein Name kann mit jedem Zeichen anfangen, das in einem Namen erlaubt ist.
Insbesondere kann ein Name auch mit einer Zahl anfangen (das ist in vielen
anderen Datenbanksystemen anders!). Jedoch kann ein Namen nicht @emph{nur}
aus Zahlen bestehen.

@item
Sie k�nnen das @samp{.}-Zeichen in Namen nicht benutzen, weil es benutzt
wird, um das Format zu erweitern, mit dem man auf Spalten verweisen kann
(siehe unten).
@end itemize

Es wird empfohlen, dass Sie keine Namen wie @code{1e} verwenden, weil ein
Ausdruck wie @code{1e+1} mehrdeutig ist. Er kann als der Ausdruck @code{1e
+ 1} oder als die Zahl @code{1e+1} interpretiert werden.

In MySQL k�nnen Sie in folgender Form auf Spalten verweisen:

@multitable @columnfractions .35 .65
@item @strong{Spaltenverweis} @tab @strong{Bedeutung}
@item @code{spalten_name} @tab Spalte des Namens @code{spalten_name} einer
beliebigen, in der Anfrage verwendeten Tabelle.
@item @code{tabelle.spalten_name} @tab Spalte des Namens
@code{spalten_name} der Tabelle @code{tabelle} der aktuellen Datenbank.
@item @code{datenbank.tabelle.spalten_name} @tab Spalte des Namens
@code{spalten_name} der Tabelle @code{tabelle} der Datenbank
@code{datenbank}. Diese Form ist ab MySQL-Version 3.22 verf�gbar.
@item
@code{`spalte`} @tab Eine Spalte, die ein reserviertes Wort ist oder
Sonderzeichen enth�lt.
@end multitable

Das @code{tabelle}- oder @code{datenbank.tabelle}-Pr�fix m�ssen Sie bei
einem Spaltenverweis in einem Statement nicht angeben, es sei denn, der
Verweis w�re ansonsten doppeldeutig. Nehmen Sie zum Beispiel an, die
Tabellen @code{t1} und @code{t2} enthielten beide jeweils eine Spalte
@code{c} und Sie verweisen auf @code{c} in einem @code{SELECT}-Statement,
das sowohl @code{t1} als auch @code{t2} benutzt. In diesem Fall ist
@code{c} mehrdeutig, weil es innerhalb der im Statement benutzten Tabellen
nicht eindeutig ist. Daher m�ssen Sie angeben, welche Tabelle Sie meinen,
indem Sie @code{t1.c} oder @code{t2.c} schreiben. �hnliches gilt, wenn Sie
aus einer Tabelle @code{t} in Datenbank @code{datenbank1} und von eine
Tabelle @code{t} in Datenbank @code{datenbank2} abrufen. Dann m�ssen Sie
auf Spalten in diesen Tabellen als @code{datenbank1.t.spalten_name} und
@code{datenbank2.t.spalten_name} verweisen.

@cindex ODBC Kompatibilit�t
@cindex Kompatibilit�t, mit ODBC
Die Syntax @code{.tabelle} bedeutet die Tabelle @code{tabelle} in der
aktuellen Datenbank. Diese Syntax wird aus Gr�nden der ODBC-Kompatibilit�t
akzeptiert, weil einige ODBC-Programme Tabellenname ein @samp{.}-Zeichen
voranstellen.


@node Name case sensitivity, Variables, Legal names, Language Structure
@c German node Gro�-/Kleinschreibung in Namen
@subsection Gro�-/Kleinschreibung in Namen

@cindex Namen, Gro�-/Kleinschreibung
@cindex Gro�-/Kleinschreibung, in Namen
@cindex Datenbanknamen, Gro�-/Kleinschreibung
@cindex Tabellennamen, Gro�-/Kleinschreibung
@cindex Spaltennamen, Gro�-/Kleinschreibung
@cindex Aliasnamen, Gro�-/Kleinschreibung

In MySQL entsprechen Datenbanken und Tabellen Verzeichnissen und Dateien
innerhalb dieser Verzeichnisse. Folglich h�ngt die Gro�-/Kleinschreibung
davon ab, wie das zugrunde liegende Betriebssystem die
Gro�-/Kleinschreibung von Datenbank- und Tabellennamen festlegt. Das
bedeutet, dass Datenbank- und Tabellennamen unter Unix von der
Gro�-/Kleinschreibung abh�ngen und unter Windows nicht.
@xref{Extensions to ANSI}.

@strong{HINWEIS:} Obwohl die Gro�-/Kleinschreibung f�r Datenbank- und
Tabellennamen unter Windows keine Rolle spielt, sollten Sie nicht auf eine
angegebene Datenbank oder Tabelle innerhalb derselben Anfrage mit
unterschiedlicher Schreibweise verweisen. Folgende Anfrage w�rde nicht
funktionieren, weil sie auf eine Tabelle sowohl mit @code{meine_tabelle}
als auch mit @code{MEINE_TABELLE} verweist:

@example
mysql> SELECT * FROM meine_tabelle WHERE MEINE_TABELLE.spalte=1;
@end example

Spaltennamen h�ngen in keinem Fall von der verwendeten
Gro�-/Kleinschreibung ab.

Aliase auf Tabellen h�ngen von der Gro�-/Kleinschreibung ab. Folgende
Anfrage w�rde nicht funktionieren, weil sie auf den Alias sowohl mit
@code{a} als auch mit @code{A} verweist:

@example
mysql> SELECT spalten_name FROM tabelle AS a
           WHERE a.spalten_name = 1 OR A.spalten_name = 2;
@end example

Aliase auf Spalten h�ngen nicht von der verwendeten Gro�-/Kleinschreibung
ab.

Wenn Sie Probleme damit haben, sich an die Schreibweise von Tabellennamen zu
erinnern, halten Sie sich an eine durchgehende Konvention. Benutzen Sie zum
Beispiel bei der Erzeugung von Datenbanken und Tabellen Kleinschreibung in
Namen.

Eine M�glichkeit, dieses Problem zu vermeiden, ist, @code{mysqld} mit
@code{-O lower_case_tabelles=1} zu starten. Vorgabem��ig ist diese Option
1 unter Windows und 0 unter Unix.

Wenn @code{lower_case_tabelles} 1 ist, wandelt MySQL alle Tabellennamen in
Kleinschreibung um, sowohl beim Speichern als auch beim Nachschlagen. Wenn
Sie diese Option �ndern, beachten Sie, dass Sie zuerst Ihre alten
Tabellennamen in Kleinschreibung umwandeln m�ssen, bevor Sie @code{mysqld}
starten.


@node Variables, Comments, Name case sensitivity, Language Structure
@c German node Variablen
@subsection Benutzer-Variablen

@cindex Variablen, Benutzer-
@cindex Benutzer-Variablen
@cindex Namen, Variablen

MySQL unterst�tzt Thread-spezifische Variablen mit der
@code{@@variablename}-Syntax. Eine Variable kann aus alphanumerischen
Zeichen des aktuellen Zeichensatzes sowie aus @samp{_}, @samp{$} und
@samp{.} bestehen. Der vorgabem��ige Zeichensatz ist ISO-8859-1 Latin1;
das kann mit der @code{--default-character-set}-Option f�r @code{mysqld}
ge�ndert werden. @xref{Character sets}.

Variablen m�ssen nicht initialisiert werden. Sie enthalten vorgabem��ig
@code{NULL} und k�nnen Ganzzahl-, Real- oder Zeichenketten-Werte speichern.
Alle Variablen f�r einen Thread werden automatisch freigegeben, wenn der
Thread beendet wird.

Sie k�nnen eine Variable mit der @code{SET}-Syntax setzen:

@example
SET @@variable= @{ ganzzahl_ausdruck | realzahl_ausdruck | zeichenketten_ausdruck @} [,@@variable= ...].
@end example

Sie k�nnen eine Variable in einem Ausdruck auch mit der
@code{@@variable:=expr}-Syntax setzen:

@example
select @@t1:=(@@t2:=1)+@@t3:=4,@@t1,@@t2,@@t3;
+----------------------+------+------+------+
| @@t1:=(@@t2:=1)+@@t3:=4 | @@t1  | @@t2  | @@t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+
@end example

(Wir mussten hier die @code{:=}-Syntax benutzen, weil @code{=} f�r
Vergleiche reserviert ist.)

Benutzer-Variablen k�nnen benutzt werden, wo Ausdr�cke erlaubt sind.
Beachten Sie, dass das momentan keine Zusammenh�nge einschlie�t, in denen
explizit Zahlen erforderlich sind, wie in der @code{LIMIT}-Klausel eines
@code{SELECT}-Statements oder der @code{IGNORE Anzahl LINES}-Klausel eines
@code{LOAD DATA}-Statements.

@strong{HINWEIS:}  In einem @code{SELECT}-Statement wird jeder Ausdruck
erst dann ausgewertet, wenn er an den Client geschickt wird. Das hei�t,
dass Sie in der @code{HAVING}-, @code{GROUP BY}- oder @code{ORDER
BY}-Klausel nicht auf einen Ausdruck verweisen k�nnen, der Variablen
beinhaltet, die nicht im @code{SELECT}-Teil gesetzt wurden. Folgendes
Statement zum Beispiel funktioniert erwartungsgem�� NICHT:

@example
SELECT (@@aa:=id) AS a, (@@aa+3) AS b FROM tabelle HAVING b=5;
@end example

Der Grund ist, dass @code{@@aa} nicht den Wert der aktuellen Zeile enth�lt,
sondern den Wert von @code{id} der vorher akzeptierten Zeile.



@node Comments, Reserved words, Variables, Language Structure
@c German node Kommentare
@subsection Kommentar-Syntax

@findex Kommentar-Syntax

@cindex Kommentare, hinzuf�gen

Der MySQL-Server die Kommentar-Stile @code{# bis Zeilenende}, @code{-- bis
Zeilenende} und @code{/* mittendrin oder mehrzeilig */}:

@example
mysql> select 1+1;     # Dieser Kommentar geht bis zum Zeilenende
mysql> select 1+1;     -- Dieser Kommentar geht bis zum Zeilenende
mysql> select 1 /* Das ist ein Kommentar mittendrin */ + 1;
mysql> select 1+
/*
Das ist ein
mehrzeiliger
Kommentar
*/
1;
@end example

Beachten Sie, dass Sie beim Kommentarstil @code{--} mindestens ein
Leerzeichen hinter @code{--} setzen m�ssen!

Obwohl der Server die Kommentar-Syntax wie beschrieben versteht, gibt es
einige Einschr�nkungen in der Art, wie der @code{mysql}-Client @code{/* ...
*/}-Kommentare parst:

@itemize @bullet
@item
Einfache und doppelte Anf�hrungszeichen werden genommen, um den Anfang
einer Zeichenkette zu bestimmen, selbst innerhalb eines Kommentars. Wenn
die Zeichenkette nicht durch ein zweites Anf�hrungszeichen innerhalb des
Kommentars abgeschlossen wird, bemerkt der Parser nicht, dass der Kommentar
zuende ist. Wenn Sie @code{mysql} interaktiv ausf�hren, sehen Sie, dass
@code{mysql} verwirrt ist, weil sich die Eingabeaufforderung von
@code{mysql>} zu to @code{'>} oder @code{">} �ndert.

@item
Ein Semikolon wird genommen, um das Ende des aktuellen SQL-Statements
kenntlich zu machen. Alles Folgende wird als Anfang des n�chsten Statements
aufgefasst.
@end itemize

Diese Einschr�nkungen gelten sowohl, wenn Sie @code{mysql} interaktiv
ausf�hren und wenn Sie Befehle in eine Datei schreiben und @code{mysql} mit
@code{mysql < some-file} anweisen, seine Eingaben aus dieser Datei zu
lesen.

MySQL unterst�tzt nicht den ANSI-SQL-Kommentarstil @samp{--} ohne
nachfolgendes Leerzeichen. @xref{ANSI diff comments}.


@node Reserved words,  , Comments, Language Structure
@c German node Reservierte W�rter
@subsection Ist MySQL pingelig hinsichtlich reservierter W�rter?

@cindex Schl�sselw�rter
@cindex reservierte W�rter, Ausnahmen

Ein h�ufiges Problem r�hrt daher, dass versucht wird, eine Tabelle mit
Spaltennamen zu erzeugen, den die Namen von Datentypen oder in MySQL
eingebauten Funktionen entsprechen, wie @code{TIMESTAMP} oder @code{GROUP}.
Sie d�rfen das tun (beispielsweise ist @code{ABS} ein zul�ssiger
Spaltenname), aber es sind dann keine Leerzeichen zwischen einem
Funktionsname und der @samp{(} erlaubt, wenn Sie Funktionen benutzen, deren
Namen auch Spaltennamen sind.

Folgende W�rter sind in MySQL explizit reserviert. Die meisten davon sind
in ANSI-SQL92 als Spalten- und / oder Tabellennamen verboten (zum Beispiel
@code{group}). Einige wenige sind reserviert, weil MySQL sie ben�tigt und
(momentan) einen @code{yacc}-Parser benutzt:

@c This ist fixed von including the symbols Tabelle von lex.h here und then running
@c fix-mysql-reserved-words in emacs (or let David do it):
@c (defun fix-mysql-reserved-words ()
@c  (interactive)
@c  (let ((cnt 0))
@c    (insert "\n@item ")
@c    (while (looking-at "[ \t]*{ +\"\\([^\"]+\\)\"[ \t]*,.*\n")
@c      (replace-match "@code{\\1}")
@c      (incf cnt)
@c      (if (> cnt 3)
@c 	  (progn
@c 	    (setf cnt 0)
@c 	    (insert "\n@item "))
@c 	(insert " @tab ")))))
@c But remove the non alphanumeric Eintr�ge von Hand first.
@c Updated after 3.23.4 990928 von David

@multitable @columnfractions .25 .25 .25 .25
@item @code{action} @tab @code{add} @tab @code{aggregate} @tab @code{all}
@item @code{alter} @tab @code{after} @tab @code{and} @tab @code{as}
@item @code{asc} @tab @code{avg} @tab @code{avg_row_length} @tab @code{auto_increment}
@item @code{between} @tab @code{bigint} @tab @code{bit} @tab @code{binary}
@item @code{blob} @tab @code{bool} @tab @code{both} @tab @code{by}
@item @code{cascade} @tab @code{case} @tab @code{char} @tab @code{character}
@item @code{change} @tab @code{check} @tab @code{checksum} @tab @code{column}
@item @code{columns} @tab @code{comment} @tab @code{constraint} @tab @code{create}
@item @code{cross} @tab @code{current_date} @tab @code{current_time} @tab @code{current_timestamp}
@item @code{data} @tab @code{database} @tab @code{databases} @tab @code{date}
@item @code{datetime} @tab @code{day} @tab @code{day_hour} @tab @code{day_minute}
@item @code{day_second} @tab @code{dayofmonth} @tab @code{dayofweek} @tab @code{dayofyear}
@item @code{dec} @tab @code{decimal} @tab @code{default} @tab @code{delayed}
@item @code{delay_key_write} @tab @code{delete} @tab @code{desc} @tab @code{describe}
@item @code{distinct} @tab @code{distinctrow} @tab @code{double} @tab @code{drop}
@item @code{end} @tab @code{else} @tab @code{escape} @tab @code{escaped}
@item @code{enclosed} @tab @code{enum} @tab @code{explain} @tab @code{exists}
@item @code{fields} @tab @code{file} @tab @code{first} @tab @code{float}
@item @code{float4} @tab @code{float8} @tab @code{flush} @tab @code{foreign}
@item @code{from} @tab @code{for} @tab @code{full} @tab @code{Funktion}
@item @code{global} @tab @code{grant} @tab @code{grants} @tab @code{group}
@item @code{having} @tab @code{heap} @tab @code{high_priority} @tab @code{hour}
@item @code{hour_minute} @tab @code{hour_second} @tab @code{hosts} @tab @code{identified}
@item @code{ignore} @tab @code{in} @tab @code{index} @tab @code{infile}
@item @code{inner} @tab @code{insert} @tab @code{insert_id} @tab @code{int}
@item @code{integer} @tab @code{interval} @tab @code{int1} @tab @code{int2}
@item @code{int3} @tab @code{int4} @tab @code{int8} @tab @code{into}
@item @code{if} @tab @code{is} @tab @code{isam} @tab @code{join}
@item @code{key} @tab @code{keys} @tab @code{kill} @tab @code{last_insert_id}
@item @code{leading} @tab @code{left} @tab @code{length} @tab @code{like}
@item @code{lines} @tab @code{limit} @tab @code{load} @tab @code{local}
@item @code{lock} @tab @code{logs} @tab @code{long} @tab @code{longblob}
@item @code{longtext} @tab @code{low_priority} @tab @code{max} @tab @code{max_rows}
@item @code{match} @tab @code{mediumblob} @tab @code{mediumtext} @tab @code{mediumint}
@item @code{middleint} @tab @code{min_rows} @tab @code{minute} @tab @code{minute_second}
@item @code{modify} @tab @code{month} @tab @code{monthname} @tab @code{myisam}
@item @code{natural} @tab @code{numeric} @tab @code{no} @tab @code{not}
@item @code{null} @tab @code{on} @tab @code{optimize} @tab @code{option}
@item @code{optionally} @tab @code{or} @tab @code{order} @tab @code{outer}
@item @code{outfile} @tab @code{pack_keys} @tab @code{partial} @tab @code{password}
@item @code{precision} @tab @code{primary} @tab @code{procedure} @tab @code{process}
@item @code{processlist} @tab @code{privileges} @tab @code{read} @tab @code{real}
@item @code{references} @tab @code{reload} @tab @code{regexp} @tab @code{rename}
@item @code{replace} @tab @code{restrict} @tab @code{returns} @tab @code{revoke}
@item @code{rlike} @tab @code{row} @tab @code{rows} @tab @code{second}
@item @code{select} @tab @code{set} @tab @code{show} @tab @code{shutdown}
@item @code{smallint} @tab @code{soname} @tab @code{sql_big_tables} @tab @code{sql_big_selects}
@item @code{sql_low_priority_updates} @tab @code{sql_log_off} @tab @code{sql_log_update} @tab @code{sql_select_limit}
@item @code{sql_small_result} @tab @code{sql_big_result} @tab @code{sql_warnings} @tab @code{straight_join}
@item @code{starting} @tab @code{status} @tab @code{string} @tab @code{table}
@item @code{tables} @tab @code{temporary} @tab @code{terminated} @tab @code{text}
@item @code{then} @tab @code{time} @tab @code{timestamp} @tab @code{tinyblob}
@item @code{tinytext} @tab @code{tinyint} @tab @code{trailing} @tab @code{to}
@item @code{type} @tab @code{use} @tab @code{using} @tab @code{unique}
@item @code{unlock} @tab @code{unsigned} @tab @code{update} @tab @code{usage}
@item @code{values} @tab @code{varchar} @tab @code{variables} @tab @code{varying}
@item @code{varbinary} @tab @code{mit} @tab @code{write} @tab @code{when}
@item @code{where} @tab @code{year} @tab @code{year_month} @tab @code{zerofill}
@end multitable

Folgende Symbole (aus der obigen Tabelle) sind von ANSI-SQL verboten, aber
von MySQL als Spalten- und Tabellennamen zugelassen. Der Grund ist, dass
einige davon sehr nat�rliche Namen sind und viele Leute diese bereits in
Benutzung haben.

@itemize @bullet
@item @code{ACTION}
@item @code{BIT}
@item @code{DATE}
@item @code{ENUM}
@item @code{NO}
@item @code{TEXT}
@item @code{TIME}
@item @code{TIMESTAMP}
@end itemize


@node Column types, Functions, Language Structure, Reference
@c German node Spaltentypen
@section Spaltentypen

@cindex Spalten, Typen
@cindex Typen, Spalten

MySQL unterst�tzt eine Reihe von Spaltentypen, die in drei Kategorien
eingeteilt werden k�nnen: numerische Typen, Datums- und Zeit-Typen und
Zeichenketten-Typen. Dieser Abschnitt gibt zuerst einen �berblick �ber die
verf�gbaren Typen und fasst den Speicherbedarf jedes Spaltentyps zusammen.
Danach folgt eine detaillierter Beschreibung der Eigenschaften der Typen
jeder Kategorie. Die detailliertere Beschreibung sollte wegen zus�tzlicher
Informationen �ber bestimmte Spaltentypen herangezogen werden, wie zu den
erlaubten Formaten, in denen Sie Werte festlegen k�nnen.

Die von MySQL unterst�tzten Spaltentypen sind unten aufgef�hrt. Folgende
Code-Buchstaben werden in der Beschreibung benutzt:

@cindex Anzeigebreite
@cindex Gr��e, Anzeigebreite
@cindex Ziffern
@cindex Dezimalpunkt
@cindex Klammern, eckige
@cindex eckige Klammern
@table @code
@item M
Gibt die maximale Anzeigebreite an. Die gr��te erlaubte Anzeigebreite ist
255.

@item D
Trifft auf Flie�komma-Typen zu und bezeichnet die Anzahl von Ziffern nach
dem Dezimalpunkt. Der gr��te m�gliche Wert ist 30, aber er sollte nicht
gr��er sein als @code{M}-2.
@end table

Eckige Klammern (@samp{[} und @samp{]}) geben Teile der Typ-Festlegung an,
die optional sind.

@tindex Typen

@c The @w{-Anzahl} stuff keeps a linebreak von occurring between
@c the - und Anzahl.

Wenn Sie @code{ZEROFILL} f�r eine Spalte angeben, beachten Sie, dass MySQL
der Spalte automatisch ein @code{UNSIGNED}-Attribut hinzuf�gt.

@table @code
@tindex TINYINT
@item TINYINT[(M)] [UNSIGNED] [ZEROFILL]

Eine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist @code{-128}
bis @code{127}. Der vorzeichenlose Bereich ist @code{0} to @code{255}.

@tindex SMALLINT
@item SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

Eine kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist @code{-32768} bis
@code{32767}. Der vorzeichenlose Bereich ist @code{0} bis @code{65535}.

@tindex MEDIUMINT
@item MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

A Ganzzahl mittlerer Gr��e. Der vorzeichenbehaftete Bereich ist
@code{-8388608} bis @code{8388607}. Der vorzeichenlose Bereich ist @code{0}
bis @code{16777215}.

@tindex INT
@item INT[(M)] [UNSIGNED] [ZEROFILL]

Eine Ganzzahl normaler Gr��e. Der vorzeichenbehaftete Bereich ist
@code{-2147483648} bis @code{2147483647}. Der vorzeichenlose Bereich ist
@code{0} bis @code{4294967295}.

@tindex INTEGER
@item INTEGER[(M)] [UNSIGNED] [ZEROFILL]

Ein Synonym f�r @code{INT}.

@tindex BIGINT
@item BIGINT[(M)] [UNSIGNED] [ZEROFILL]

Eine gro�e Ganzzahl. Der vorzeichenbehaftete Bereich ist
@code{-9223372036854775808} bis @code{9223372036854775807}. Der
vorzeichenlose Bereich ist @code{0} bis @code{18446744073709551615}.

Einiger Dinge sollten Sie sich bei @code{BIGINT}-Spalten bewusst sein:

@itemize @bullet
@item
@cindex Rundungsfehler
Weil alle arithmetischen Berechnungen mit vorzeichenbehafteten
@code{BIGINT}- oder @code{DOUBLE}-Werten durchgef�hrt werden, sollten Sie
keine vorzeichenlosen Ganzzahlen gr��er als @code{9223372036854775807} (63
Bits) benutzen, ausser bei Bit-Funktionen! Wenn Sie das doch tun, k�nnen
einige der letzten Ziffern im Ergebnis falsch sein, weil Rundungsfehler
beim Umwandeln von @code{BIGINT} in @code{DOUBLE} auftreten.

MySQL 4.0 kann @code{BIGINT} in folgenden F�llen handhaben:
@itemize @bullet
@item
Benutzen Sie Ganzzahlen, um gro�e vorzeichenlose Wert in einer
@code{BIGINT}-Spalte zu speichern.
@item
Bei @code{MIN(gro�e_ganzzahl_spalte)} und
@code{MAX(gro�e_ganzzahl_spalte)}.
@item
Bei der Benutzung der Operatoren (@code{+}, @code{-}, @code{*} usw.), wenn
beide Operanden Ganzzahlen sind.
@end itemize

@item
Sie k�nnen immer einen genauen Ganzzahlwert in einer @code{BIGINT}-Spalte
speichern, wenn Sie sie als Zeichenkette speichern, denn in diesem Fall
wird diese nicht zwischendurch als Double dargestellt.
@item
@samp{-}, @samp{+} und @samp{*} benutzen arithmetische
@code{BIGINT}-Berechnungen, wenn beide Argumente @code{INTEGER}-Werte sind!
Das hei�t, wenn Sie zwei Ganzzahlen multiplizieren (oder Ergebnisse von
Funktionen, die Ganzzahlen zur�ckgeben), erhalten Sie vielleicht
unerwartete Ergebnisse, wenn das Ergebnis gr��er als
@code{9223372036854775807} ist.
@end itemize

@cindex Flie�kommazahl
@tindex FLOAT
@tindex FLOAT(genauigkeit)
@item FLOAT(genauigkeit) [ZEROFILL]

Eine Flie�kommazahl. Kann nicht vorzeichenlos sein. @code{genauigkeit} ist
@code{<=24} bei einer Flie�kommazahl einfacher Genauigkeit und zwischen 25
und 53 bei einer Flie�kommazahl doppelter Genauigkeit. Diese Typen sind
wie die unten beschriebenen @code{FLOAT} und @code{DOUBLE}-Typen.
@code{FLOAT(X)} hat denselben Wertebereich wie die entsprechenden
@code{FLOAT}- und @code{DOUBLE}-Typen, jedoch ist die Anzeigebreite und die
Anzahl der Dezimalstellen undefiniert.

In MySQL-Version 3.23 ist das ein echter Flie�kommawert. In fr�heren
MySQL-Versionen hat @code{FLOAT(genauigkeit)} immer 2 Dezimalstellen.

Beachten Sie, dass bei der Benutzung von @code{FLOAT} unerwartete Probleme
auftreten k�nnen, weil alle Berechnungen in MySQL mit doppelter Genauigkeit
durchgef�hrt werden. @xref{No matching rows}.

@cindex ODBC-Kompatibilit�t
@cindex Kompatibilit�t, mit ODBC
Diese Syntax steht wegen der ODBC-Kompatibilit�t zur Verf�gung.

@tindex FLOAT
@tindex FLOAT(M,D)
@item FLOAT[(M,D)] [ZEROFILL]

Eine kleine Flie�kommazahl (einfacher Genauigkeit). Kann nicht
vorzeichenlos sein. Der Wertebereich umfasst @code{@w{-3.402823466E+38}}
bis @code{@w{-1.175494351E-38}}, @code{0} und @code{@w{1.175494351E-38}}
bis @code{3.402823466E+38}. M ist die Anzeigebreite und D ist die Anzahl
von Dezimalstellen. @code{FLOAT} ohne Argument oder mit einem Argument <=
24 steht f�r eine Flie�kommazahl einfacher Genauigkeit.

@tindex DOUBLE
@tindex FLOAT(genauigkeit)
@item DOUBLE[(M,D)] [ZEROFILL]

Eine normal gro�e Flie�kommazahl (doppelter Genauigkeit). Kann nicht
vorzeichenlos sein. Der Wertebereich umfasst
@code{@w{-1.7976931348623157E+308}} bis
@code{@w{-2.2250738585072014E-308}}, @code{0} und
@code{2.2250738585072014E-308} bis @code{1.7976931348623157E+308}. M ist
die Anzeigebreite und D ist die Anzahl von Dezimalstellen. @code{DOUBLE}
ohne Argument oder @code{FLOAT(X)} mit 25 <= X <= 53 steht f�r eine
Flie�kommazahl doppelter Genauigkeit.

@tindex DOUBLE PRECISION
@tindex REAL
@item DOUBLE PRECISION[(M,D)] [ZEROFILL]
@itemx REAL[(M,D)] [ZEROFILL]

Synonyme f�r @code{DOUBLE}.

@tindex DECIMAL
@item DECIMAL[(M[,D])] [ZEROFILL]

Eine unkomprimierte Flie�kommazahl. Kann nicht vorzeichenlos sein. Verh�lt
sich wie eine @code{CHAR}-Spalte: ``Unkomprimiert'' bedeutet, dass die Zahl
als Zeichenkette gespeichert wird, wobei ein Zeichen f�r jede Ziffer des
Wertes steht. Der Dezimalpunkt und, bei negativen Zahlen, das
@samp{-}-Zeichen, werden in M nicht mitgez�hlt (aber hierf�r wird Platz
reserviert). Wenn @code{D} 0 ist, haben Werte keinen Dezimalpunkt oder
Bruchteil. Der maximale Wertebereich von @code{DECIMAL}-Werte ist derselbe
wie f�r @code{DOUBLE}, aber der tats�chliche Wertebereich einer gegebenen
@code{DECIMAL}-Spalte kann durch die Auswahl von @code{M} und @code{D}
eingeschr�nkt sein.

Wenn @code{D} weggelassen wird, wird es auf 0 gesetzt. Wenn @code{M}
ausgelassen wird, wird es auf 10 gesetzt.

Beachten Sie, dass in MySQL-Version 3.22 das @code{M}-Argument den Platz
f�r das Vorzeichen und den Dezimalpunkt beinhaltete!

@tindex NUMERIC
@item NUMERIC(M,D) [ZEROFILL]

Synonym f�r @code{DECIMAL}.

@tindex DATE
@item DATE

Ein Datum. Der unterst�tzte Wertebereich ist @code{'1000-01-01'} bis
@code{'9999-12-31'}. MySQL zeigt @code{DATE}-Werte im
@code{'YYYY-MM-DD'}-Format an, gestattet jedoch, @code{DATE}-Spalten Werte
entweder als Zeichenketten oder als Zahlen zuzuweisen. @xref{DATETIME}.

@tindex DATETIME
@item DATETIME

Eine Datums-/Zeit-Kombination. Der unterst�tzte Wertebereich ist
@code{'1000-01-01 00:00:00'} bis @code{'9999-12-31 23:59:59'}. MySQL zeigt
@code{DATETIME}-Werte im @code{'YYYY-MM-DD HH:MM:SS'}-Format an, gestattet
jedoch, @code{DATETIME}-Spalten Werte entweder als Zeichenketten oder als
Zahlen zuzuweisen.
@xref{DATETIME}.

@tindex TIMESTAMP
@item TIMESTAMP[(M)]

Ein Zeitstempel. Der Wertebereich ist @code{'1970-01-01 00:00:00'} bis
irgendwann im Jahr @code{2037}. MySQL zeigt @code{TIMESTAMP}-Werte im
@code{YYYYMMDDHHMMSS}-, @code{YYMMDDHHMMSS}-, @code{YYYYMMDD}- oder
@code{YYMMDD}-Format an, abh�ngig davon, ob @code{M} @code{14} (oder
fehlend), @code{12}, @code{8} oder @code{6} ist, gestattet aber, dass Sie
@code{TIMESTAMP}-Spalten Werte entweder als Zeichenketten oder als Zahlen
zuweisen. Eine @code{TIMESTAMP}-Spalte ist n�tzlich, um Datum und Zeit
einer @code{INSERT}- oder @code{UPDATE}-Operation zu speichern, weil sie
automatisch auf das Datum und die Zeit der j�ngsten Operation gesetzt wird,
wenn Sie nicht selbst einen Wert zuweisen. Sie k�nnen sie auch auf das
aktuelle Datum und die aktuelle Zeit setzen, indem Sie einen
@code{NULL}-Wert zuweisen. @xref{Date and time types}.

Ein @code{TIMESTAMP} wird immer mit 4 Bytes gespeichert. Das
@code{M}-Argument betrifft nur die Anzeige der @code{TIMESTAMP}-Spalte.

Beachten Sie, dass @code{TIMESTAMP(X)}-Spalten, bei denen X 8 oder 14 ist,
als Zahlen interpretiert werden, w�hrend andere @code{TIMESTAMP(X)}-Spalten
als Zeichenketten interpretiert werden. Das soll lediglich sicherstellen,
dass Sie Tabellen mit diesen Typen verl�sslich dumpen und wiederherstellen
k�nnen! @xref{DATETIME}.

@tindex TIME
@item TIME

Ein Zeit-Typ. Der Wertebereich ist @code{'-838:59:59'} bis
@code{'838:59:59'}. MySQL zeigt @code{TIME}-Werte im
@code{'HH:MM:SS'}-Format an, gestattet aber, @code{TIME}-Spalten Werte
entweder als Zeichenketten oder als Zahlen zuweisen. @xref{TIME}.

@tindex YEAR
@item YEAR[(2|4)]

Ein Jahr in 2- oder 4-Ziffernformat (Vorgabe ist 4-Ziffern). Die zul�ssigen
Werte reichen von @code{1901} bis @code{2155} sowie @code{0000} im
4-Ziffern-Jahresformat, und von 1970 bis 2069 beim 2-Ziffernformat (70 bis
69). MySQL zeigt @code{YEAR}-Werte im @code{YYYY}-Format an, gestattet
aber, @code{YEAR}-Spalten Werte entweder als Zeichenketten oder als Zahlen
zuweisen. (Der @code{YEAR}-Typ ist neu seit MySQL-Version 3.22.).
@xref{YEAR}.

@tindex NATIONAL CHAR
@tindex NCHAR
@tindex CHAR
@tindex CHARACTER
@item [NATIONAL] CHAR(M) [BINARY]

Eine Zeichenkette fester L�nge, die beim Speichern rechts stets mit
Leerzeichen bis zur angegebenen L�nge aufgef�llt wird. Der Wertebereich von
@code{M} ist 1 bis 255 Zeichen. Leerzeichen am Ende werden beim Abruf des
Wertes entfernt. @code{CHAR}-Werte werden nach dem vorgabem��igen
Zeichensatz ohne Ber�cksichtigung der Gro�-/Kleinschreibung sortiert und
verglichen, es sei denn, dass Schl�sselwort @code{BINARY} wird angegeben.

@code{NATIONAL CHAR} (Kurzform @code{NCHAR}) ist die Art, wie ANSI-SQL bei
einer CHAR-Spalte festlegt, dass der vorgabem��ige Zeichensatz verwendet
werden soll. Das ist der Vorgabewert in MySQL.

@code{CHAR} ist eine Abk�rzung f�r @code{CHARACTER}.

MySQL erlaubt das Anlegen einer Spalte des Typs @code{CHAR(0)}. Das ist
haupts�chlich n�tzlich, wenn Sie mit alten Applikationen kompatibel sein
m�ssen, die auf die Existenz einer Spalte vertrauen, den Wert aber nicht
tats�chlich benutzen. Es ist ebenfalls nett, um eine Spalte anzulegen, die
nur 2 Werte annehmen kann: Eine @code{CHAR(0)}, die nicht als @code{NOT
NULL} definiert ist, belegt nur 1 Bit und kann 2 Werte annehmen:
@code{NULL} oder @code{""}. @xref{CHAR}.

@tindex CHARACTER VARYING
@tindex CHAR VARYING
@tindex VARCHAR
@item [NATIONAL] VARCHAR(M) [BINARY]

Eine Zeichenkette variabler L�nge. @strong{HINWEIS:} Leerzeichen am Ende
werden bei der Speicherung des Wertes entfernt (das unterscheidet den Typ
von der ANSI-SQL-Spezifikation). Der Wertebereich von @code{M} ist 1 bis
255 Zeichen. @code{VARCHAR}-Werte werden nach dem vorgabem��igen
Zeichensatz ohne Ber�cksichtigung der Gro�-/Kleinschreibung sortiert und
verglichen, es sei denn, dass Schl�sselwort @code{BINARY} wird angegeben.
@xref{Silent column changes}.

@code{VARCHAR} ist eine Abk�rzung f�r @code{CHARACTER VARYING}.
@xref{CHAR}.

@tindex TINYBLOB
@tindex TINYTEXT
@item TINYBLOB
@itemx TINYTEXT

Eine @code{BLOB}- oder @code{TEXT}-Spalte mit einer maximalen L�nge von 255
(2^8 - 1) Zeichen. @xref{Silent column changes}. @xref{BLOB}.

@tindex BLOB
@tindex TEXT
@item BLOB
@itemx TEXT

Eine @code{BLOB}- oder @code{TEXT}-Spalte mit einer maximalen L�nge von
65535 (2^16 - 1) Zeichen. @xref{Silent column changes}. @xref{BLOB}.

@tindex MEDIUMBLOB
@tindex MEDIUMTEXT
@item MEDIUMBLOB
@itemx MEDIUMTEXT

Eine @code{BLOB}- oder @code{TEXT}-Spalte mit einer maximalen L�nge von
16777215 (2^24 - 1) Zeichen. @xref{Silent column changes}.
@xref{BLOB}.

@tindex LONGBLOB
@tindex LONGTEXT
@item LONGBLOB
@itemx LONGTEXT

Eine @code{BLOB}- oder @code{TEXT}-Spalte mit einer maximalen L�nge von
4294967295 (2^32 - 1) Zeichen. @xref{Silent column changes}.
Beachten Sie, dass Sie nicht den gesamten Wertebereich dieses Typs benutzen
k�nnen, weil das Client-Server-Protokoll und MyISAM-Tabellen momentan eine
Beschr�nkungen auf 16 MB pro Kommunikationspaket / Tabellenzeile haben.
@xref{BLOB}.

@tindex ENUM
@item ENUM('wert1','wert2',...)

An Aufz�hlung. Ein Zeichenkettenobjekt, das nur einen Wert haben kann, der
aus den Auflistungswerten @code{'wert1'}, @code{'wert2'}, @code{...},
@code{NULL} oder dem speziellen @code{""}-Fehlerwert ausgew�hlt wird. Eine
@code{ENUM} kann maximal 65535 unterschiedliche Werte haben. @xref{ENUM}.

@tindex SET
@item SET('wert1','wert2',...)

Eine Reihe. Ein Zeichenkettenobjekt, das 0 oder mehr Werte haben kann, von
denen jeder aus den Auflistungswerten @code{'wert1'}, @code{'wert2'},
@code{...} ausgew�hlt werden muss. Eine @code{SET} kann maximal 64 Elemente
haben. @xref{SET}.
@end table



@menu
* Numeric types::               
* Date and time types::         
* String types::                
* Choosing types::              
* Other-vendor column types::   
* Storage requirements::        
@end menu

@node Numeric types, Date and time types, Column types, Column types
@c German node Numerische Typen
@subsection Numerische Typen

MySQL unterst�tzt alle numerischen Typen von ANSI/ISO-SQL92. Diese Typen
beinhalten die exakten numerischen Datentypen (@code{NUMERIC},
@code{DECIMAL}, @code{INTEGER} und @code{SMALLINT}) sowie die
n�herungsweisen numerischen Datentypen (@code{FLOAT}, @code{REAL} und
@code{DOUBLE PRECISION}). Das Schl�sselwort @code{INT} ist ein Synonym f�r
@code{INTEGER} und das Schl�sselwort @code{DEC} ist ein Synonym f�r
@code{DECIMAL}.

Die @code{NUMERIC}- und @code{DECIMAL}-Typen sind in MySQL als derselbe Typ
implementiert, wie es vom SQL92-Standard zugelassen ist. Sie werden f�r
Werte benutzt, bei denen es wichtig ist, die exakte Genauigkeit zu
bewahren, zum Beispiel bei monet�ren Daten. Wenn Sie eine Spalte mit einem
dieser Typen deklarieren, k�nnen Genauigkeit und Bereich festgelegt werden
(und werden das �blicherweise auch). Beispiel:

@example
    gehalt DECIMAL(9,2)
@end example

In diesem Beispiel repr�sentiert @code{9} (@code{genauigkeit}) die Anzahl
signifikanter Dezimalziffern, die f�r Werte gespeichert werden, und
@code{2} (@code{bereich}) repr�sentiert die Anzahl von Ziffern, die nach
dem Dezimalpunkt gespeichert werden. In diesem Fall liegt der Wertebereich,
der in der @code{gehalt}-Spalte gespeichert werden kann, deswegen zwischen
@code{-9999999.99} und @code{9999999.99}. 
(MySQL kann tats�chlich Zahlen bis zu @code{9999999.99} in dieser Spalte
speichern, weil er nicht das Vorzeichen f�r positive Zahlen speichern
muss).

In ANSI/ISO-SQL92 ist die Syntax @code{DECIMAL(p)} �quivalent zu
@code{DECIMAL(p,0)}. Gleicherma�en ist die Syntax @code{DECIMAL}
�quivalent zu @code{DECIMAL(p,0)}, wobei es der Implementation �berlassen
bleibt, den Wert von @code{p} festzulegen. MySQL unterst�tzt momentan keine
dieser abweichenden Formen der @code{DECIMAL}- / @code{NUMERIC}-Datentypen.
Das ist im Allgemeinen kein ernstes Problem, weil der haupts�chliche Nutzen
dieser Typen darin liegt, sowohl Genauigkeit als auch Bereich explizit
steuern zu k�nnen.

@code{DECIMAL}- und @code{NUMERIC}-Werte sind als Zeichenketten gespeichert
statt als Flie�kommazahlen, um die dezimale Genauigkeit dieser Werte zu
bewahren. Ein Zeichen wird benutzt f�r jede Ziffer des Werts, den
Dezimalpunkt (wenn @code{bereich} > 0) und das @samp{-}-Zeichen (f�r
negative Zahlen). Wenn @code{bereich} 0 ist, enthalten @code{DECIMAL}- und
@code{NUMERIC}-Werte weder Dezimalpunkt noch Bruchteil.

Der maximale Wertebereich von @code{DECIMAL}- und @code{NUMERIC}-Werten ist
derselbe wie f�r @code{DOUBLE}, aber der tats�chliche Wertebereich einer
gegebenen @code{DECIMAL}- oder @code{NUMERIC}-Spalte kann durch
@code{genauigkeit} oder @code{bereich} f�r eine gegebene Spalte beschr�nkt
werden. Wenn einer solchen Spalte ein Wert mit mehr Ziffern nach dem
Dezimalpunkt zugewiesen wird, als durch @code{bereich} zugelassen, wird der
Wert auf diesen @code{bereich} gerundet. Wenn einer @code{DECIMAL}- oder
@code{NUMERIC}-Spalte ein Wert zugewiesen wird, dessen Gr��e den
Wertebereich �berschreitet, der von der festgelegten (oder vorgabem��igen)
@code{genauigkeit} und @code{bereich} festgelegt wird, speichert MySQL den
Wert des entsprechenden Endpunkts des Wertebereichs.

Als Erweiterung zum ANSI/ISO-SQL92-Standard unterst�tzt MySQL auch die
Ganzzahltypen @code{TINYINT}, @code{MEDIUMINT} und @code{BIGINT}, wie oben
aufgelistet. Ein andere Erweiterung wird von MySQL unterst�tzt, um optional
die Anzeigebreite eines Ganzzahlwerts in Klammern festzulegen, die auf das
Basis-Schl�sselwort des Typs folgen (zum Beispiel @code{INT(4)}). Die
optionale Breitenspezifizierung wird benutzt, um die Anzeige von Werten,
deren Breite geringer ist als f�r die Spalte festgelegt, linksseitig mit
Leerzeichen aufzuf�llen. Das begrenzt allerdings nicht den Wertebereich,
der in der Spalte gespeichert werden kann, noch die Anzahl von Ziffern, die
bei Werten angezeigt werden, die die angegebene Breite f�r die Spalte
�berschreiten. In Verbindung mit dem optionalen Erweiterungsattribut
@code{ZEROFILL} wird - statt vorgabem��ig mit Leerzeichen - mit Nullen
aufgef�llt. Bei einer Spalte zum Beispiel, die als @code{INT(5) ZEROFILL}
deklariert wurde, wird @code{4} als @code{00004} dargestellt. Beachten Sie,
dass Werte in einer Ganzzahlspalte, die gr��er sind als die Anzeigebreite,
Probleme bei der Erzeugung tempor�rer Tabellen f�r einige komplizierte
Joins durch MySQL auftreten k�nnen, weil MySQL in diesen F�llen darauf
vertraut, dass die Daten in die Original-Spaltenbreite passten.

Alle Ganzzahl-Typen k�nnen ein optionales (Nicht-Standard-) Attribut
@code{UNSIGNED} haben. Vorzeichenlose Werte k�nnen daf�r benutzt werden,
nur positive Zahlen in einer Spalte zuzulassen, wenn Sie eine Wertebereich
brauchen, der etwas gr��er ausf�llt.

Der @code{FLOAT}-Typ wird benutzt, um n�herungsweise numerische Datentypen
zu repr�sentieren. Der ANSI/ISO-SQL92-Standard erlaubt eine optionale
Festlegung der Genauigkeit (aber nicht den Wertebereich des Exponenten) in
Bits, gefolgt vom Schl�sselwort @code{FLOAT} in Klammern. Die
MySQL-Implementation unterst�tzt ebenfalls diese optionale
Genauigkeitsfestlegung. Wenn das Schl�sselwort @code{FLOAT} f�r einen
Spaltentyp ohne Genauigkeitsfestlegung benutzt wird, benutzt MySQL 4 Bytes,
um die Werte zu speichern. Eine abweichende Syntax wird ebenfalls
unterst�tzt, wobei zwei Zahlen in Klammern dem @code{FLOAT}-Schl�sselwort
folgen. Mit dieser Option legt die erste Zahl wie gehabt den Speicherbedarf
f�r den Wert in Bytes fest, und die zweite Zahl legt die Anzahl von Ziffern
fest, die nach dem Dezimalpunkt gespeichert und angezeigt werden sollen
(wie bei @code{DECIMAL} und @code{NUMERIC}). Wenn MySQL in einer solchen
Spalte einen Wert mit mehr Dezimalziffern nach dem Dezimalpunkt speichern
soll als f�r die Spalte festgelegt, wird der Wert beim Speichern gerundet,
um die zus�tzlichen Ziffern zu entfernen.

Die @code{REAL}- und @code{DOUBLE PRECISION}-Typen akzeptieren keine
Genauigkeitsfestlegungen. Als Erweiterung zum ANSI/ISO-SQL92-Standard
erkennt MySQL @code{DOUBLE} als ein Synonym f�r den @code{DOUBLE
PRECISION}-Typ. Im Gegensatz zur Anforderung des Standard, dass die
Genauigkeit f�r @code{REAL} kleiner sein muss als die f�r @code{DOUBLE
PRECISION}, implementiert MySQL beide als 8-Byte-Flie�kommawerte doppelter
Genauigkeit (wenn er nicht im ``ANSI-Modus'' l�uft). F�r maximale
Portabilit�t sollte Code, der die Speicherung n�herungsweiser numerischer
Daten erfordert, @code{FLOAT} oder @code{DOUBLE PRECISION} ohne Festlegung
der Genauigkeit oder Anzahl von Dezimalstellen benutzen.

Wenn ein Wert in einer numerischen Spalte gespeichert werden soll, der
ausserhalb des erlaubten Wertebereichs des Spaltentyps ist, schneidet MySQL
den Wert auf den entsprechenden Endpunkt des Wertebereichs ab und speichert
statt dessen diesen Wert.

Der Wertebereich einer @code{INT}-Spalte ist zum Beispiel
@code{-2147483648} bis @code{2147483647}. Wenn Sie versuchen,
@code{-9999999999} in eine @code{INT}-Spalte einzuf�gen, wird der Wert auf
den unteren Endpunkt des Bereichs abgeschnitten, und es wird
@code{-2147483648} gespeichert. Gleicherma�en wird beim Einf�gen in eine
solche Spalte nicht @code{9999999999}, sondern @code{2147483647}
gespeichert.

Wenn die @code{INT}-Spalte @code{UNSIGNED} ist, ist die Gr��e des
Wertebereichs dieselbe, aber ihre Endpunkte verschieben sich zu @code{0}
und @code{4294967295}. Wenn Sie versuchen, @code{-9999999999} bzw.
@code{9999999999} zu speichern, werden die in der Spalte gespeicherten
Werte statt dessen zu @code{0} bzw. @code{4294967296}.

Umwandlungen, die aufgrund von Abschneiden geschehen, werden als
``Warnungen'' bei @code{ALTER TABLE}, @code{LOAD DATA INFILE},
@code{UPDATE} und in mehrzeiligen @code{INSERT}-Statements berichtet.


@node Date and time types, String types, Numeric types, Column types
@c German node Datums- und Zeit-Typen
@subsection Datums- und Zeit-Typen

@cindex Typen, Datum und Zeit
@cindex Datums- und Zeit-Typen



Die Datums- und Zeit-Typen sind @code{DATETIME}, @code{DATE},
@code{TIMESTAMP}, @code{TIME} und @code{YEAR}. Jeder dieser Typen hat einen
zul�ssigen Wertebereich sowie einen ``0''-Wert, der benutzt wird, wenn Sie
einen wirklich unzul�ssigen Wert speichern. Beachten Sie, dass MySQL es
zul��t, dass Sie bestimmte 'nicht ganz' zul�ssige Datumswerte speichern,
zum Beispiel @code{1999-11-31}. Der Grund hierf�r ist, dass wir meinen,
dass es in der Verantwortung der Applikation liegt, Datums�berpr�fungen
vorzunehmen, und nicht beim SQL-Server. Um Datumspr�fungen 'schnell' zu
machen, �berpr�ft MySQL nur, dass der Monat im Bereich 0 bis 12 liegt und
der Tag im Bereich 0 bis 31. Diese Bereiche sind deshalb so definiert, weil
es MySQL zul��t, dass Sie in einer @code{DATE}- oder
@code{DATETIME}-Spalte Datumsangaben speichern, bei denen der Tag oder
Monat-Tag 0 sind. Das ist extrem n�tzlich f�r Applikationen, die einen
Geburtstag speichern m�ssen, dessen exaktes Datum unbekannt ist. In diesem
Fall k�nnen Sie einfach Datumsangaben wie @code{1999-00-00} oder
@code{1999-01-00} speichern. (Sie k�nnen nicht erwarten, von Funktionen wie
@code{DATE_SUB()} oder @code{DATE_ADD} f�r solche Datumsangaben korrekte
Werte zu erhalten.)

Einige allgemeine �berlegungen, die man im Kopf behalten sollte, wenn man
mit Datums- und Zeit-Typen arbeitet:

@itemize @bullet
@item
MySQL ruft Werte f�r einen gegebenen Datums- oder Zeit-Typ in einem
Standard-Format ab, versucht aber, eine Vielzahl von Formaten zu
interpretieren, die Sie bereit stellen (wenn Sie zum Beispiel einen Wert
angeben, der zugewiesen oder mit einem Datums- oder Zeit-Typ verglichen
werden soll). Dennoch werden nur die in den folgenden Abschnitten
beschriebenen Formate unterst�tzt. Es wird davon ausgegangen, dass Sie
zul�ssige Werte bereitstellen; und es k�nnen unvorhersehbare Ergebnisse
zustande kommen, wenn Sie Werte in anderen Formaten angeben.

@item
Obwohl MySQL versucht, Werte in verschiedenen Formaten zu interpretieren,
erwartet er immer, dass der Jahresanteil von Datumswerten ganz links steht.
Datumsangaben m�ssen in der Reihenfolge Jahr - Monat - Tag gemacht werden
(zum Beispiel @code{'98-09-04'}) statt in der Reihenfolge Monat - Tag -
Jahr oder Tag - Monat - Jahr, die anderswo h�ufig gebraucht werden (zum
Beispiel @code{'09-04-98'}, @code{'04-09-98'}).

@item
MySQL wandelt einen Datums- oder Zeitwert automatisch in eine Zahl um, wenn
der Wert in einem numerischen Zusammenhang benutzt wird, und umgekehrt.

@item
Wenn MySQL auf einen Datums- oder Zeitwert trifft, der ausserhalb des
Wertebereichs oder in sonstiger Weise f�r den Typ nicht zul�ssig ist (siehe
Anfang dieses Abschnitts), wird der Wert zum ``0''-Wert dieses Typs
umgewandelt. (Die Ausnahme ist, dass @code{TIME}-Werte ausserhalb des
Wertebereichs auf den entsprechenden Endpunkt des @code{TIME}-Wertebereichs
abgeschnitten werden.) Die unten stehende Tabelle zeigt das Format des
``0''-Werts f�r jeden Typ:

@multitable @columnfractions .3 .7
@item @strong{Spaltentyp} @tab @strong{``0''-Wert}
@item @code{DATETIME}      @tab @code{'0000-00-00 00:00:00'}
@item @code{DATE}          @tab @code{'0000-00-00'}
@item @code{TIMESTAMP}     @tab @code{00000000000000} (L�nge abh�ngig von der Anzeigebreite)
@item @code{TIME}          @tab @code{'00:00:00'}
@item @code{YEAR}          @tab @code{0000}
@end multitable

@item
Die ``0''-Werte sind speziell, aber Sie k�nnen diese explizit speichern
oder auf sie verweisen, indem Sie die in der Tabelle dargestellten Werte
benutzen. Sie k�nnen das auch mit den Werten @code{'0'} oder @code{0}
machen, die leichter zu schreiben sind.

@item
``0''-Datums- oder -Zeitwerte, die �ber @strong{MyODBC} benutzt werden,
werden in @strong{MyODBC}-Version 2.50.12 und h�her automatisch in
@code{NULL} umgewandelt, weil ODBC solche Werte nicht handhaben kann.
@end itemize


@menu
* Y2K issues::                  
* DATETIME::                    
* TIME::                        
* YEAR::                        
@end menu

@node Y2K issues, DATETIME, Date and time types, Date and time types
@c German node Jahr 2000
@subsubsection Jahr-2000-Probleme und Datumstypen

@cindex Jahr-2000-Probleme
@cindex Datumstypen, Jahr-2000-Probleme

MySQL selbst ist Jahr-2000-konform (Jahr-2000-sicher,
@pxref{Year 2000 compliance}), aber Eingabewerte, die an MySQL
�bergeben werden, sind das m�glicherweise nicht. Jede Eingabe von
Jahreswerten mit 2 Ziffern ist mehrdeutig, weil das Jahrhundert unbekannt
ist. Solche Werte m�ssen in 4-stellige Form umgedeutet werden, weil MySQL
Jahre intern mit 4 Ziffern speichert.

Bei @code{DATETIME}-, @code{DATE}-, @code{TIMESTAMP}- und @code{YEAR}-Typen
interpretiert MySQL Datumsangaben mit mehrdeutigen Jahreswerten nach
folgenden Regeln:

@itemize @bullet
@item
Jahreswerte im Bereich @code{00 bis 69} werden in @code{2000 bis 2069}
umgewandelt.

@item
Jahreswerte im Bereich @code{70 bis 99} werden in @code{1970 bis 1999}
umgewandelt.
@end itemize

Denken Sie daran, dass diese Regeln nur eine vern�nftige Sch�tzung dessen
bedeuten, was die Daten tats�chlich darstellen sollen. Wenn die von MySQL
benutzten Heuristiken keine korrekten Werte ergeben, m�ssen Sie eindeutige
Eingaben in Form 4-stelliger Jahreswerte bereit stellen.

@code{ORDER BY} sortiert 2-stellige @code{YEAR/DATE/DATETIME}-Typen
korrekt.

Beachten Sie, dass einige Funktionen wie @code{MIN()} und @code{MAX()} ein
@code{TIMESTAMP / DATE} in eine Zahl umwandeln. Das hei�t, dass ein
Zeitstempel mit einer 2-stelligen Jahresangabe bei diesen Funktionen nicht
korrekt funktioniert. Das kann in diesem Fall dadurch behoben werden, dass
der @code{TIMESTAMP / DATE} in ein 4-stelliges Jahresformat umgewandelt
wird, oder etwas wie @code{MIN(DATE_ADD(zeitstempel,INTERVAL 0 DAYS))}
benutzt wird.


@node DATETIME, TIME, Y2K issues, Date and time types
@c German node DATETIME
@subsubsection Die @code{DATETIME}-, @code{DATE}- und @code{TIMESTAMP}-Typen

@tindex DATETIME
@tindex DATE
@tindex TIMESTAMP

Die @code{DATETIME}-, @code{DATE}- und @code{TIMESTAMP}-Typen sind
verwandt. Dieser Abschnitt beschreibt ihre Charakteristiken, wo sie sich
�hnlich sind und wo sie sich unterscheiden.

Der @code{DATETIME}-Typ wird benutzt, wenn Sie Werte brauchen, die sowohl
Datums- als auch Zeitinformationen beinhalten. MySQL ruft
@code{DATETIME}-Werte ab und zeigt sie an im @code{'YYYY-MM-DD
HH:MM:SS'}-Format. Der unterst�tzte Wertebereich ist @code{'1000-01-01
00:00:00'} bis @code{'9999-12-31 23:59:59'}. (``Unterst�tzt'' hei�t, dass
fr�here Werte zwar funktionieren k�nnen, dass es aber keine Garantie daf�r
gibt.)

Der @code{DATE}-Typ wird benutzt, wenn Sie nur einen Datumswert brauchen,
ohne Zeitanteil. MySQL ruft @code{DATE}-Werte ab und zeigt sie an im
@code{'YYYY-MM-DD'}-Format. Der unterst�tzte Wertebereich ist
@code{'1000-01-01'} bis @code{'9999-12-31'}.

Der @code{TIMESTAMP}-Typ ist ein Typ, den Sie daf�r benutzen k�nnen, um
@code{INSERT}- oder @code{UPDATE}-Operationen mit dem aktuellen Datum und
der aktuellen Zeit zu stempeln. Wenn Sie mehrfache @code{TIMESTAMP}-Spalten
haben, wird nur die erste automatisch aktualisiert.

Die automatische Aktualisierung der @code{TIMESTAMP}-Spalte geschieht unter
einer der folgenden Bedingungen:

@itemize @bullet
@item
Die Spalte wird in einem @code{INSERT}- oder @code{LOAD DATA
INFILE}-Statement nicht explizit angegeben.
@item
Die Spalte wird in einem @code{UPDATE}-Statement nicht explizit angegeben,
aber ein anderer Spaltenwert �ndert sich. (Beachten Sie, dass ein
@code{UPDATE}, das eine Spalte auf einen Wert setzt, den diese bereits hat,
nicht dazu f�hrt, dass die @code{TIMESTAMP}-Spalte aktualisiert wird, weil
MySQL das Aktualisieren in einem solchen Fall auf Effizienzgr�nden
ignoriert.)
@item
Wenn Sie die @code{TIMESTAMP}-Spalte explizit auf @code{NULL} setzen.
@end itemize

@code{TIMESTAMP}-Spalten abgesehen von der ersten k�nnen ebenfalls auf das
aktuelle Datum und die aktuelle Zeit gesetzt werden. Setzen Sie die Spalte
einfach auf @code{NULL} oder auf @code{NOW()}.

Sie k�nnen jede @code{TIMESTAMP}-Spalte auf einen Wert setzen, der vom
aktuellen Datum und der aktuellen Zeit abweicht, indem Sie sie explizit auf
den gew�nschten Wert setzen. Das gilt sogar f�r die erste
@code{TIMESTAMP}-Spalte. Sie k�nnen diese Eigenschaft benutzen, wenn Sie
einen @code{TIMESTAMP} auf das aktuelle Datum und die aktuelle Zeit setzen
wollen, wenn Sie eine Zeile erzeugen, nicht aber, wenn die Zeile sp�ter
aktualisiert wird:

@itemize @bullet
@item
Lassen Sie MySQL die Spalte setzen, wenn die Zeile erzeugt wird. Das
initialisiert sie auf das aktuelle Datum und die aktuelle Zeit.

@item
Wenn Sie nachfolgende Aktualisierungen anderer Spalten in der Zeile
durchf�hren, setzen Sie die @code{TIMESTAMP}-Spalte explizit auf ihren
aktuellen Wert.
@end itemize

Auf der anderen Seite finden Sie vielleicht mindestens so einfach, eine
@code{DATETIME}-Spalte zu benutzen, die Sie auf @code{NOW()}
initialisieren, wenn die Zeile erzeugt wird, und die Sie bei nachfolgenden
Aktualisierungen nicht anfassen.

@code{TIMESTAMP}-Werte haben einen Wertebereich von 1970 bis irgendwann im
Jahr 2037, bei einer Aufl�sung von einer Sekunde. Werte werden als Zahlen
angezeigt.

Das Format, in dem MySQL @code{TIMESTAMP}-Werte abruft und anzeigt, h�ngt
von der Anzeigebreite ab, wie in der obigen Tabelle dargestellt. Das
`volle' @code{TIMESTAMP}-Format ist 14 Ziffern, aber
@code{TIMESTAMP}-Spalten k�nnen mit k�rzeren Anzeigebreiten angelegt
werden:

@multitable @columnfractions .3 .7
@item @strong{Spaltentyp}  @tab @strong{Anzeigeformat}
@item @code{TIMESTAMP(14)}  @tab @code{YYYYMMDDHHMMSS}
@item @code{TIMESTAMP(12)}  @tab @code{YYMMDDHHMMSS}
@item @code{TIMESTAMP(10)}  @tab @code{YYMMDDHHMM}
@item @code{TIMESTAMP(8)}   @tab @code{YYYYMMDD}
@item @code{TIMESTAMP(6)}   @tab @code{YYMMDD}
@item @code{TIMESTAMP(4)}   @tab @code{YYMM}
@item @code{TIMESTAMP(2)}   @tab @code{YY}
@end multitable

Alle @code{TIMESTAMP}-Spalten haben dieselbe Speichergr��e, unabh�ngig von
der Anzeigebreite. Die gebr�uchlichsten Anzeigebreiten sind 6, 8, 12 und
14. Sie k�nnen zur Zeit der Tabellenerzeugung beliebige Anzeigebreiten
festlegen, aber Werte von 0 oder gr��er als 14 werden auf 14 gesetzt.
Ungerade Werte im Bereich von 1 bis 13 werden auf die n�chst h�here gerade
Zahl gesetzt.

Sie k�nnen @code{DATETIME}-, @code{DATE}- und @code{TIMESTAMP}-Werte mit
folgenden Formaten festlegen:

@itemize @bullet
@item
Als eine Zeichenkette im @code{'YYYY-MM-DD HH:MM:SS'}- oder @code{'YY-MM-DD
HH:MM:SS'}-Format. Eine ``entspannte'' Syntax ist zugelassen - jedes
Satzzeichen kann als Begrenzer zwischen Datumsanteilen oder Zeitanteilen
verwendet werden. Beispielsweise sind @code{'98-12-31 11:30:45'},
@code{'98.12.31 11+30+45'}, @code{'98/12/31 11*30*45'} und
@code{'98@@12@@31 11^30^45'} �quivalent.

@item
Als eine Zeichenkette im @code{'YYYY-MM-DD'}- oder
@code{'YY-MM-DD'}-Format. Auch hier ist eine ``entspannte'' Syntax
zugelassen. Beispielsweise sind @code{'98-12-31'}, @code{'98.12.31'},
@code{'98/12/31'} und @code{'98@@12@@31'} �quivalent.

@item
Als eine Zeichenkette ohne Begrenzer im @code{'YYYYMMDDHHMMSS'}- oder
@code{'YYMMDDHHMMSS'}-Format, vorausgesetzt, die Zeichenkette ergibt als
Datum einen Sinn. @code{'19970523091528'} und @code{'970523091528'}
beispielsweise werden als @code{'1997-05-23 09:15:28'} interpretiert, aber
@code{'971122129015'} ist unzul�ssig (es hat einen Minutenanteil, der
keinen Sinn ergibt) und wird in @code{'0000-00-00 00:00:00'} umgewandelt.

@item
Als eine Zeichenkette ohne Begrenzer im @code{'YYYYMMDD'}- oder
@code{'YYMMDD'}-Format, vorausgesetzt, die Zeichenkette ergibt als Datum
einen Sinn. @code{'19970523'} und @code{'970523'} werden als
@code{'1997-05-23'} interpretiert, aber @code{'971332'} ist unzul�ssig (es
hat einen Monatsanteil und einen Tagesanteil, der keinen Sinn ergibt) und
wird in @code{'0000-00-00'} umgewandelt.

@item
Als eine Zahl im @code{YYYYMMDDHHMMSS}- oder @code{YYMMDDHHMMSS}-Format,
vorausgesetzt, die Zahl ergibt als Datum einen Sinn. @code{19830905132800}
und @code{830905132800} zum Beispiel werden als @code{'1983-09-05
13:28:00'} interpretiert.

@item
Als eine Zahl im @code{YYYYMMDD}- oder @code{YYMMDD}-Format, vorausgesetzt,
die Zahl ergibt als Datum einen Sinn. @code{19830905} und @code{830905} zum
Beispiel werden als @code{'1983-09-05'} interpretiert.

@item
Als Ergebnis einer Funktion, die einen Wert zur�ckgibt, der in einem
@code{DATETIME}-, @code{DATE}- oder @code{TIMESTAMP}-Zusammenhang einen
Sinn ergibt, wie @code{NOW()} oder @code{CURRENT_DATE}.
@end itemize

Unzul�ssige @code{DATETIME}-, @code{DATE}- oder @code{TIMESTAMP}-Werte
werden in den ``0''-Wert des jeweiligen Typs umgewandelt (@code{'0000-00-00
00:00:00'}, @code{'0000-00-00'} oder @code{00000000000000}).

Bei Werten, die als Zeichenketten angegeben werden, die Begrenzer f�r
Datumsanteile enthalten, ist es nicht notwendig, zwei Ziffern f�r Monats-
oder Tageswerte anzugeben, die weniger als @code{10} sind.
@code{'1979-6-9'} ist dasselbe wie @code{'1979-06-09'}. Gleicherma�en ist
es bei Zeichenketten, die Begrenzer f�r Zeitanteile enthalten, nicht
notwendig, zwei Ziffern f�r Stunden-, Monats- oder Sekundenwerte anzugeben,
die weniger als @code{10} sind. @code{'1979-10-30 1:2:3'} ist dasselbe wie
@code{'1979-10-30 01:02:03'}.

Werte, die als Zahlen angegeben sind, sollten 6, 8, 12 oder 14 Ziffern lang
sein. Wenn die Zahl 8 oder 14 Ziffern lang ist, wird angenommen, dass sie
im @code{YYYYMMDD}- oder @code{YYYYMMDDHHMMSS}-Format ist und dass das Jahr
durch die ersten 4 Ziffern angegeben wird. Wenn die Zahl 6 oder 12 Ziffern
lang ist, wird angenommen, dass sie im @code{YYMMDD}- oder
@code{YYMMDDHHMMSS}-Format ist und dass das Jahr durch die ersten 2 Ziffern
angegeben wird. Zahlen, die nicht diesen L�ngen entsprechen, werden
interpretiert, als ob sie mit f�hrenden Nullen auf die n�chst m�gliche
L�nge gebracht worden w�ren.

@cindex nicht begrenzte Zeichenketten
@cindex Zeichenketten, non-delimited
Werte, die als nicht begrenzte Zeichenketten angegeben werden, werden
interpretiert, indem ihre L�nge als gegeben angenommen wird. Wenn die
Zeichenkette 8 oder 14 Zeichen lang ist, wird angenommen, dass das Jahr
durch die ersten 4 Zeichen angegeben wird. Ansonsten wird angenommen, dass
das Jahr durch die ersten 2 Zeichen angegeben wird. Die Zeichenkette wird
von links nach rechts interpretiert, um die Jahres-, Monats-, Tages-,
Stunden- und Sekundenwerte zu finden, f�r so viele Anteile, wie in der
Zeichenkette vorkommen. Das bedeutet, dass Sie keine Zeichenketten benutzen
sollten, die weniger als 6 Zeichen haben. Wenn Sie zum Beispiel
@code{'9903'} angeben, in der Annahme, dass das M�rz 1999 darstellt, werden
Sie feststellen, dass MySQL einen ``0''-Datumswert in Ihre Tabelle einf�gt.
Das liegt daran, dass die Jahres- und Monatswerte @code{99} und @code{03}
sind, aber der Tagesanteil fehlt (0), so dass der Wert kein zul�ssiges
Datum darstellt.

@code{TIMESTAMP}-Spalten speichern zul�ssige Werte mit der vollen
Genauigkeit, mit der der Wert angegeben wurde, unabh�ngig von der
Anzeigebreite. Das hat mehrere Auswirkungen:

@itemize @bullet
@item
Geben Sie immer Jahr, Monat und Tag an, selbst wenn Ihre Spaltentypen
@code{TIMESTAMP(4)} oder @code{TIMESTAMP(2)} sind. Ansonsten w�re der Wert
kein zul�ssiges Datum und @code{0} w�rde gespeichert werden.

@item
Wenn Sie @code{ALTER TABLE} benutzen, um eine enge @code{TIMESTAMP}-Spalte
breiter zu machen, werden Informationen angezeigt, die vorher ``versteckt''
waren.

@item
Gleicherma�en f�hrt das Verengen einer @code{TIMESTAMP}-Spalte nicht dazu,
dass Informationen verloren gehen, ausser in dem Sinn, dass weniger
Informationen dargestellt werden, wenn die Werte angezeigt werden.

@item
Obwohl @code{TIMESTAMP}-Werte mit voller Genauigkeit gespeichert werden,
ist die einzige Funktion, die direkt mit dem zugrunde liegenden
gespeicherten Wert arbeitet, @code{UNIX_TIMESTAMP()}. Alle anderen
Funktionen arbeiten mit dem formatierten, abgerufenen Wert. Das bedeutet,
Sie k�nnen keine Funktionen wie @code{HOUR()} oder @code{SECOND()}
benutzen, wenn nicht auch der relevante Teil des @code{TIMESTAMP}-Werts im
formatierten Werte enthalten ist. Wenn zum Beispiel der @code{HH}-Teil
einer @code{TIMESTAMP}-Spalte nicht angezeigt wird, wenn die Anzeigebreite
nicht mindestens 10 betr�gt, wird der Versuch, @code{HOUR()} auf k�rzere
@code{TIMESTAMP}-Werte anzuwenden, unsinnige Ergebnisse erzeugen.
@end itemize

Bis zu einem gewissen Grad k�nnen Sie einem Objekt eines Datumstyp Werte
eines anderen Datumstyps zuweisen. Jedoch kann eine �nderung des Wertes
oder ein Informationsverlust eintreten:

@itemize @bullet
@item
Wenn Sie einem @code{DATETIME}- oder @code{TIMESTAMP}-Objekt einen
@code{DATE}-Wert zuweisen, wird der Zeitanteil im Ergebniswert auf
@code{'00:00:00'} gesetzt, weil der @code{DATE}-Wert keine
Zeitinformationen enth�lt.

@item
Wenn Sie einem @code{DATE}-Objekt einen @code{DATETIME}- oder
@code{TIMESTAMP}-Wert zuweisen, wird der Zeitanteil des Ergebniswerts
gel�scht, weil der @code{DATE}-Typ keine Zeitinformationen speichert.

@item
Denken Sie daran, dass @code{DATETIME}-, @code{DATE}- und
@code{TIMESTAMP}-Werte zwar in denselben Formaten angegeben werden k�nnen,
dass die Typen jedoch nicht alle denselben Wertebereich haben.
@code{TIMESTAMP}-Werte zum Beispiel k�nnen nicht fr�her als @code{1970}
oder sp�ter als @code{2037} sein. Das bedeutet, dass ein Datum wie
@code{'1968-01-01'}, was als @code{DATETIME} oder @code{DATE}-Wert zul�ssig
w�re, kein g�ltiger @code{TIMESTAMP}-Wert ist und in @code{0} umgewandelt
wird, wenn er einem solchen Objekt zugewiesen wird.
@end itemize

@cindex Probleme, Datumswerte
@cindex Datumswerte, Probleme
Seien Sie auf der Hut vor Fallstricken, wenn Sie Datumswerte angeben:

@itemize @bullet
@item
Das entspannte Format l��t Werte als Zeichenketten zu, die t�uschen
k�nnen. Ein Wert wie @code{'10:11:12'} zum Beispiel sieht wegen des
@samp{:}-Begrenzers wie ein Zeitwert aus, wird er aber in einem
Datums-Zusammenhang benutzt, wird er als das Datum @code{'2010-11-12'}
interpretiert. Der Wert @code{'10:45:15'} wird in @code{'0000-00-00'}
umgewandelt, weil @code{'45'} kein zul�ssiger Monat ist.

@item
Jahreswerte, die als zwei Ziffern angegeben werden, sind mehrdeutig, weil
das Jahrhundert unbekannt ist. 
unknown.  MySQL interpretiert 2-stellige Jahreswerte nach folgenden Regeln:

@itemize @minus
@item
Jahreswerte im Bereich @code{00 bis 69} werden in @code{2000 bis 2069}
umgewandelt.

@item
Jahreswerte im Bereich @code{70 bis 99} werden in @code{1970 bis 1999}
umgewandelt.
@end itemize
@end itemize


@node TIME, YEAR, DATETIME, Date and time types
@c German node TIME
@subsubsection Der @code{TIME}-Typ

@tindex TIME

MySQL ruft @code{TIME}-Werte ab und zeigt sie an im
@code{'HH:MM:SS'}-Format (oder @code{'HHH:MM:SS'}-Format f�r gro�e
Stundenwerte). @code{TIME}-Werte rangieren von @code{'-838:59:59'} bis
@code{'838:59:59'}. Der Grund daf�r, dass der Stundenanteil so Gro� sein
kann, liegt darin, dass der @code{TIME}-Typ nicht nur benutzt werden kann,
um die Tageszeit zu repr�sentieren (wobei die Stunden weniger als 24 sein
m�ssen), sondern auch abgelaufene Zeit oder ein Zeitintervall zwischen zwei
Ereignissen (was viel gr��er als 24 Stunden oder sogar negativ sein kann).

Sie k�nnen @code{TIME}-Werte in einer Vielzahl von Formaten angeben:

@itemize @bullet
@item
Als eine Zeichenkette im @code{'D HH:MM:SS.bruchteil'}-Format. (Beachten
Sie, dass MySQL bislang nicht den Bruchteil f�r die TIME-Spalte speichert.)
Man kann auch folgende ``entspannte'' Syntax benutzen:

@code{HH:MM:SS.bruchteil}, @code{HH:MM:SS}, @code{HH:MM}, @code{D HH:MM:SS},
@code{D HH:MM}, @code{D HH} oder @code{SS}. Hierbei ist @code{D} Tage
zwischen 0 und 33.

@item
Als eine Zeichenkette ohne Begrenzer im @code{'HHMMSS'}-Format,
vorausgesetzt, dass diese als Zeitangabe einen Sinn ergibt. @code{'101112'}
zum Beispiel wird als @code{'10:11:12'} interpretiert, aber @code{'109712'}
ist unzul�ssig (es hat einen Minutenanteil, der keinen Sinn ergibt) und
wird in @code{'00:00:00'} umgewandelt.

@item
Als eine Zahl im @code{HHMMSS}-Format, vorausgesetzt, dass diese als
Zeitangabe einen Sinn ergibt. @code{101112} zum Beispiel wird als
@code{'10:11:12'} interpretiert. Folgende alternativen Formate werden
ebenfalls verstanden: @code{SS}, @code{MMSS}, @code{HHMMSS},
@code{HHMMSS.bruchteil}. Beachten Sie, dass MySQL bislang noch nicht den
Bruchteil speichert.

@item
Als Ergebnis einer Funktion, die einen Wert zur�ck gibt, der in einem
@code{TIME}-Zusammenhang akzeptabel ist, wie @code{CURRENT_TIME}.
@end itemize

Bei @code{TIME}-Werten, die als Zeichenketten angegeben sind, die einen
Begrenzer f�r den Zeitanteil beinhalten, ist es nicht notwendig, zwei
Ziffern f�r Stunden-, Minuten- oder Sekunden-Werte anzugeben, die weniger
als @code{10} sind. @code{'8:3:2'} ist dasselbe wie @code{'08:03:02'}.

Seien Sie vorsichtig damit, einer @code{TIME}-Spalte ``kurze''
@code{TIME}-Werte zuzuweisen. Ohne Semikolon interpretiert MySQL Werte
unter der Annahme, dass die am weitesten rechts stehenden Ziffern Sekunden
repr�sentieren. (MySQL interpretiert @code{TIME}-Werte als vergangene Zeit
statt als Tageszeit.) Sie k�nnten zum Beispiel denken, dass @code{'1112'}
und @code{1112} @code{'11:12:00'} bedeuten (12 Minuten nach 11 Uhr), aber
MySQL interpretiert sie als @code{'00:11:12'} (11 Minuten, 12 Sekunden).
Gleicherma�en wird @code{'12'} und @code{12} als @code{'00:00:12'}
interpretiert. @code{TIME}-Werte mit Semikolon werden statt dessen immer
als Tageszeit interpretiert. Das hei�t, @code{'11:12'} bedeutet
@code{'11:12:00'}, nicht @code{'00:11:12'}.

Werte, die ausserhalb des @code{TIME}-Wertebereichs liegen, ansonsten aber
zul�ssig sind, werden auf den entsprechenden Endpunkt des Wertebereichs
abgeschnitten. @code{'-850:00:00'} bzw. @code{'850:00:00'} werden in
@code{'-838:59:59'} bzw. @code{'838:59:59'} umgewandelt.

Unzul�ssige @code{TIME}-Werte werden in @code{'00:00:00'} umgewandelt.
Beachten Sie, dass es keine M�glichkeit gibt zu unterscheiden, wenn ein
Wert von @code{'00:00:00'} in einer Tabelle gespeichert ist, ob dieser
origin�r als @code{'00:00:00'} eingegeben wurde oder ob es ein unzul�ssiger
Wert war, weil @code{'00:00:00'} selbst ein zul�ssiger @code{TIME}-Wert
ist.


@node YEAR,  , TIME, Date and time types
@c German node YEAR
@subsubsection Der @code{YEAR}-Typ

@tindex YEAR

Der @code{YEAR}-Typ ist ein 1-Byte-Typ, der f�r die Darstellung von Jahren
benutzt wird.

MySQL ruft @code{YEAR}-Werte ab und speichert sie im @code{YYYY}-Format.
Der Wertebereich ist @code{1901} bis @code{2155}.

Sie k�nnen @code{YEAR}-Werte in einer Vielzahl von Formaten angeben:

@itemize @bullet
@item
Als vierstellige Zeichenkette im Wertebereich von @code{'1901'} bis
@code{'2155'}.

@item
Als vierstellige Zahl im Wertebereich von @code{1901} bis @code{2155}.

@item
Als zweistellige Zeichenkette im Wertebereich von @code{'00'} bis
@code{'99'}. Werte in den Bereichen von @code{'00'} bis @code{'69'} und
@code{'70'} bis @code{'99'} werden in @code{YEAR}-Werte in den Bereichen
von @code{2000} bis @code{2069} und @code{1970} bis @code{1999}
umgewandelt.

@item
Als zweistellige Zahl im Wertebereich von @code{1} bis @code{99}. Werte in
den Bereichen von @code{1} bis @code{69} und @code{70} bis @code{99} werden
in @code{YEAR}-Werte in den Bereichen von @code{2001} bis @code{2069} und
@code{1970} bis @code{1999} umgewandelt. Beachten Sie, dass der
Wertebereich f�r zweistellige Zahlen sich geringf�gig vom Wertebereich f�r
zweistellige Zeichenketten unterscheidet, weil Sie 0 nicht direkt als Zahl
eingeben k�nnen und sie dann als @code{2000} interpretiert wird. Sie
@emph{m�ssen} sie als Zeichenkette @code{'0'} oder @code{'00'} angeben,
oder sie wird als @code{0000} interpretiert.

@item
Als Ergebnis einer Funktion, die einen Wert zur�ck gibt, der in einem
@code{YEAR}-Zusammenhang akzeptabel ist, wie @code{NOW()}.
@end itemize

Unzul�ssige @code{YEAR}-Werte werden in @code{0000} umgewandelt.


@node String types, Choosing types, Date and time types, Column types
@c German node Zeichenketten-Typen
@subsection Zeichenketten-Typen

@cindex Typen, Zeichenketten
@cindex Zeichenketten-Typen

@tindex CHAR
@tindex VARCHAR



Die Zeichenketten-Typen sind @code{CHAR}, @code{VARCHAR}, @code{BLOB},
@code{TEXT}, @code{ENUM} und @code{SET}.  Dieser Abschnitt beschreibt, wie
diese Typen funktionieren, ihren Speicherbedarf und wie sie in Anfragen
benutzt werden.


@menu
* CHAR::                        
* BLOB::                        
* ENUM::                        
* SET::                         
@end menu

@node CHAR, BLOB, String types, String types
@c German node CHAR
@subsubsection Die @code{CHAR}- und @code{VARCHAR}-Typen

Die @code{CHAR}- und @code{VARCHAR}-Typen sind �hnlich, unterscheiden sich
aber in der Art, wie sie gespeichert und abgerufen werden.

Die L�nge einer @code{CHAR}-Spalte wird auf die L�nge festgelegt, die Sie
bei der Erzeugung der Tabelle angeben. Die L�nge kann zwischen 1 und 255
variieren. (Ab MySQL-Version 3.23 kann die L�nge zwischen 0 und 255
liegen.) Wenn @code{CHAR}-Werte gespeichert werden, werden sie am rechten
Ende bis zur festgelegten L�nge mit Leerzeichen aufgef�llt. Wenn
@code{CHAR}-Werte abgerufen werden, werden die Leerzeichen am Ende
entfernt.

Werte in @code{VARCHAR}-Spalten sind Zeichenketten variabler L�nge. Sie
k�nnen eine @code{VARCHAR}-Spalte mit jeder L�nge zwischen 1 und 255
deklarieren, genau wie f�r @code{CHAR}-Spalten. Im Gegensatz zu @code{CHAR}
werden @code{VARCHAR}-Werte jedoch nur mit so vielen Zeichen wie n�tig
gespeichert, plus 1 Byte, um die L�nge zu speichern. Die Werte werden nicht
aufgef�llt; statt dessen werden Leerzeichen am Ende beim Speichern
entfernt. (Diese Entfernung von Leerzeichen weicht von der
ANSI-SQL-Spezifikation ab.)

Wenn Sie einer @code{CHAR}- oder @code{VARCHAR}-Spalte einen Wert zuweisen,
der die maximale Spaltenl�nge �berschreitet, wird der Wert so zurecht
geschnitten, das er passt.

Die unten stehende Tabelle stellt die Unterschiede zwischen den beiden
Spaltentypen dar, indem das Ergebnis der Speicherung unterschiedlicher
Zeichenkettenwerte in @code{CHAR(4)}- und @code{VARCHAR(4)}-Spalten gezeigt
wird:

@c Need to use @(space) to make sure second Spaltenwerte retain spacing
@c in output f�r Tabelle below.

@multitable @columnfractions .2 .15 .2 .2 .25
@item @strong{Wert}  @tab @code{CHAR(4)}     @tab @strong{Speicherbedarf} @tab @code{VARCHAR(4)} @tab @strong{Speicherbedarf}
@item @code{''}       @tab @code{'@ @ @ @ '} @tab 4 Bytes @tab @code{''} @tab 1 Byte
@item @code{'ab'}     @tab @code{'ab@ @ '}   @tab 4 Bytes @tab @code{'ab'} @tab 3 Bytes
@item @code{'abcd'}   @tab @code{'abcd'}     @tab 4 Bytes @tab @code{'abcd'} @tab 5 Bytes
@item @code{'abcdefgh'} @tab @code{'abcd'}     @tab 4 Bytes @tab @code{'abcd'} @tab 5 Bytes
@end multitable

Die Werte, die aus den @code{CHAR(4)}- und @code{VARCHAR(4)}-Spalten
abgerufen werden, sind in jedem Fall gleich, weil Leerzeichen am Ende von
@code{CHAR}-Spalten beim Abruf entfernt werden.

Werte in @code{CHAR}- und @code{VARCHAR}-Spalten werden unabh�ngig von der
Gro�-/Kleinschreibung sortiert und verglichen, es sei denn, beim Erzeugen
der Tabelle wurde das @code{BINARY}-Attribut festgelegt. Das
@code{BINARY}-Attribut bedeutet, dass Spaltenwerte abh�ngig von der
Gro�-/Kleinschreibung in �bereinstimmung mit der ASCII-Reihenfolge der
Maschine sortiert und verglichen werden, auf der der MySQL-Server l�uft.
@code{BINARY} beeinflusst nicht, wie die Spalte gespeichert oder abgerufen
wird.

Das @code{BINARY}-Attribut ist 'klebrig', das hei�t, dass der gesamte
Ausdruck als ein @code{BINARY}-Wert verglichen wird, sobald eine
@code{BINARY}-Spalte im Ausdruck benutzt wird.

MySQL �ndert eventuell 'still' den Typ von @code{CHAR}- oder
@code{VARCHAR}-Spalten bei der Tabellenerzeugung.
@c German FIX unwrapped @xref
@xref{Silent column changes}.


@node BLOB, ENUM, CHAR, String types
@c German node BLOB
@subsubsection Die @code{BLOB}- und @code{TEXT}-Typen

@tindex BLOB
@tindex TEXT

Ein @code{BLOB} ist gro�es Bin�robjekt (Binary Large OBject), das eine
variable Menge von Daten enthalten kann. Die vier @code{BLOB}-Typen
@code{TINYBLOB}, @code{BLOB}, @code{MEDIUMBLOB} und @code{LONGBLOB}
unterscheiden sich nur hinsichtlich der maximalen L�nge der Werte, die sie
aufnehmen k�nnen.
@xref{Storage requirements}.

Die vier @code{TEXT}-Typen @code{TINYTEXT}, @code{TEXT},
@code{MEDIUMTEXT} und @code{LONGTEXT} entsprechen den vier
@code{BLOB}-Typen und haben dieselben maximalen L�ngen und denselben
Speicherbedarf. Der einzige Unterschied zwischen @code{BLOB}- und
@code{TEXT}-Typen ist, dass beim Sortieren und Vergleichen bei
@code{BLOB}-Werten Gro�-/Kleinschreibung ber�cksichtigt wird, bei
@code{TEXT}-Werten dagegen nicht. Mit anderen Worten ist ein @code{TEXT}
ein @code{BLOB} ohne Ber�cksichtigung der Gro�-/Kleinschreibung.

Wenn Sie einer @code{BLOB}- oder @code{TEXT}-Spalte einen Wert zuweisen,
der die maximale L�nge des Spaltentyps �berschreitet, wird der Wert so
zurecht geschnitten, dass er passt.

In fast jeder Hinsicht k�nnen Sie eine @code{TEXT}-Spalte als eine
@code{VARCHAR}-Spalte betrachten, die so Gro� sein kann, wie Sie wollen.
Gleicherma�en k�nnen Sie eine @code{BLOB}-Spalte als eine @code{VARCHAR
BINARY}-Spalte betrachten. Die Unterschiede sind:

@itemize @bullet
@item
Seit MySQL-Version 3.23.2 k�nnen Sie Indexe auf @code{BLOB}- und
@code{TEXT}-Spalten anlegen. �ltere Versionen von MySQL unterst�tzten das
nicht.

@item
Leerzeichen am Ende werden beim Speichern von @code{BLOB}- und
@code{TEXT}-Spalten nicht wie bei @code{VARCHAR}-Spalten entfernt.

@item
@cindex Vorgabewerte, @code{BLOB}- und @code{TEXT}-Spalten
@cindex @code{BLOB}-Spalten, Vorgabewerte
@cindex @code{TEXT}-Spalten, Vorgabewerte
@code{BLOB}- und @code{TEXT}-Spalten k�nnen keine @code{DEFAULT}-Werte
haben.
@end itemize

@strong{MyODBC} definiert @code{BLOB}-Werte als @code{LONGVARBINARY} und
@code{TEXT}-Werte als @code{LONGVARCHAR}.

Weil @code{BLOB}- und @code{TEXT}-Werte extrem lang sein k�nnen, treffen
Sie bei der Benutzung eventuell auf Beschr�nkungen:

@itemize @bullet
@item
Wenn Sie @code{GROUP BY} oder @code{ORDER BY} f�r @code{BLOB}- oder
@code{TEXT}-Spalten benutzen wollen, m�ssen Sie den Spaltenwert in ein
Objekt fester L�nge umwandeln. Standardm��ig wird das mit der
@code{SUBSTRING}-Funktion gemacht. Beispiel:

@example
mysql> select kommentar from tabelle,substring(kommentar,20) as substr
       ORDER BY substr;
@end example

Wenn Sie das nicht tun, werden nur die ersten @code{max_sort_length} Bytes
der Spalte beim Sortieren benutzt. Der Vorgabewert von
@code{max_sort_length} ist 1024; dieser Wert kann mit der @code{-O}-Option
ge�ndert werden, wenn der @code{mysqld}-Server gestartet wird. Sie k�nnen
auf einen Ausdruck, der @code{BLOB}- oder @code{TEXT}-Werte enth�lt,
gruppieren, indem Sie die Spaltenposition angeben oder ein Alias benutzen:

@example
mysql> select id,substring(blob_spalte,1,100) from tabelle
           GROUP BY 2;
mysql> select id,substring(blob_spalte,1,100) as b from tabelle
           GROUP BY b;
@end example

@item
Die maximale Gr��e eines @code{BLOB}- oder @code{TEXT}-Objekts wird durch
seinen Typ festgelegt, aber der gr��te Wert, den Sie tats�chlich zwischen
Client und Server �bertragen k�nnen, wird von der Menge verf�gbaren
Arbeitsspeichers und der Gr��e des Kommunikationspuffers festgelegt. Sie
k�nnen die Nachrichtenpuffergr��e �ndern, m�ssen das aber auf beiden
Seiten, also beim Client und beim Server, tun. @xref{Server parameters}.
@end itemize

Beachten Sie, dass intern jeder @code{BLOB}- oder @code{TEXT}-Wert durch
ein separat zugewiesenes Objekt dargestellt wird. Das steht im Gegensatz zu
allen anderen Spaltentypen, f�r die Speicherplatz einmal pro Spalte
zugewiesen wird, wenn die Tabelle ge�ffnet wird.


@node ENUM, SET, BLOB, String types
@c German node ENUM
@subsubsection Der @code{ENUM}-Typ

@tindex ENUM

Ein @code{ENUM} ist ein Zeichenketten-Objekt, dessen Wert normalerweise aus
einer Liste zul�ssiger Werte ausgesucht wird, die explizit bei der
Spaltenspezifizierung bei der Tabellenerzeugung aufgez�hlt werden.

Der Wert kann unter bestimmten Umst�nden auch die leere Zeichenkette
(@code{""}) oder @code{NULL} sein:

@itemize @bullet
@item
Wenn Sie in eine @code{ENUM} einen ung�ltigen Wert einf�gen (das ist eine
Zeichenkette, die es in der Auflistung zugelassener Werte nicht gibt), wird
statt dessen die leere Zeichenkette als spezieller Fehlerwert eingef�gt.
Diese Zeichenkette kann von einer 'normalen' leeren Zeichenkette dadurch
unterschieden werden, dass diese Zeichenkette den numerischen Wert 0 hat.
Mehr dazu sp�ter.

@item
Wenn ein @code{ENUM} als @code{NULL} deklariert ist, ist @code{NULL}
ebenfalls ein zul�ssiger Wert f�r die Spalte und der Vorgabewert ist
@code{NULL}. Wenn ein @code{ENUM} als @code{NOT NULL} deklariert ist, ist
der Vorgabewert das erste Element der Auflistung erlaubter Werte.
@end itemize

Jeder Aufz�hlungswert hat einen Index:

@itemize @bullet
@item
Werte der Auflistung zul�ssiger Elemente in der Spaltenspezifikation fangen
mit 1 an.

@item
Der Indexwert des Fehlerwerts leere Zeichenkette ist 0. Folglich k�nnen Sie
folgendes @code{SELECT}-Statement benutzen, um Zeilen zu finden, denen
unzul�ssige @code{ENUM}-Werte zugewiesen wurden:

@example
mysql> SELECT * FROM tabelle WHERE enum_spalte=0;
@end example

@item
Der Index des @code{NULL}-Werts ist @code{NULL}.
@end itemize

Wenn beispielsweise eine Spalte als @code{ENUM("eins", "zwei", "drei")}
festgelegt wurde, kann sie einen der unten dargestellen Werte besitzen. Der
Index jedes Werts wird auch dargestellt:

@multitable @columnfractions .2 .8
@item @strong{Wert} @tab @strong{Index}
@item @code{NULL}    @tab @code{NULL}
@item @code{""}      @tab 0
@item @code{"eins"}   @tab 1
@item @code{"zwei"}   @tab 2
@item @code{"drei"} @tab 3
@end multitable

Eine Aufz�hlung kann maximal 65535 Elemente enthalten.

Gro�-/Kleinschreibung ist irrelevant, wenn Sie einer @code{ENUM}-Spalte
Werte zuweisen. Jedoch haben Werte, die sp�ter aus der Spalte abgerufen
werden, dieselbe Gro�-/Kleinschreibung wie die Werte, die f�r die
Festlegung zul�ssiger Werte bei der Tabellenerzeugung verwendet wurden.

Wenn Sie eine @code{ENUM} in einem numerischen Zusammenhang benutzen, wird
der Index des Spaltenwerts zur�ckgegeben. Sie k�nnen beispielsweise
numerische Werte aus einer @code{ENUM}-Spalte wie folgt abrufen:

@example
mysql> SELECT enum_spalte+0 FROM tabelle;
@end example

Wenn Sie eine Zahl in eine @code{ENUM} speichern, wird die Zahl als Index
behandelt und der gespeicherte Wert ist das Aufz�hlungselement mit diesem
Index. (Das funktioniert jedoch nicht bei @code{LOAD DATA}, was alle
Eingaben als Zeichenketten behandelt.)

@code{ENUM}-Werte werden in der Reihenfolge sortiert, wie die
Aufz�hlungselemente bei der Spaltenspezifizierung eingegeben wurden. (Mit
anderen Worten werden @code{ENUM}-Werte nach ihren Indexzahlen sortiert.)
So wird beispielsweise @code{"a"} vor @code{"b"} einsortiert bei
@code{ENUM("a", "b")}, aber @code{"b"} wird vor @code{"a"} einsortiert bei
@code{ENUM("b", "a")}. Die leere Zeichenkette wird vor nicht leeren
Zeichenketten und @code{NULL}-Werte vor allen anderen Aufz�hlungswerten
einsortiert.

Wenn Sie alle m�glichen Werte einer @code{ENUM}-Spalte erhalten wollen,
benutzen Sie: @code{SHOW COLUMNS FROM tabelle LIKE enum_spalte} und gehen
die @code{ENUM}-Definition in der zweiten Spalte durch.


@node SET,  , ENUM, String types
@c German node SET
@subsubsection Der @code{SET}-Typ

@tindex SET

Ein @code{SET} ist ein Zeichenketten-Objekt, das 0 oder mehr Werte haben
kann, wovon jedes aus einer Auflistung zul�ssiger Werte stammen muss, die
bei der Tabellenerzeugung festgelegt wurden. @code{SET}-Spaltenwerte, die
aus mehrfachen SET-Elementen bestehen, werden angegeben, indem die Elemente
durch Kommas (@samp{,}) getrennt werden. Daraus ergibt sich, dass
@code{SET}-Elemente selbst keine Kommas enthalten d�rfen.

Eine Spalte beispielsweise, die als @code{SET("eins", "zwei") NOT NULL}
festgelegt wurde, kann folgende Werte haben:

@example
""
"eins"
"zwei"
"eins,zwei"
@end example


Eine @code{SET} kann maximal 64 unterschiedliche Elemente besitzen.

MySQL speichert @code{SET}-Werte numerisch, wobei das niedrigste Bit in der
Reihenfolge der gespeicherten Werte dem ersten SET-Element entspricht. Wenn
Sie einen @code{SET}-Wert in einem numerischen Zusammenhang abrufen, hat
der abgerufene Werte Bits gesetzt, die den SET-Elementen, aus denen sich
der Spaltenwert zusammensetzt, entspricht. Beispielsweise k�nnen Sie
numerische Werte aus einer @code{SET}-Spalte wie folgt abrufen:

@example
mysql> SELECT set_spalte+0 FROM tabelle;
@end example

Wenn in einer @code{SET}-Spalte eine Zahl gespeichert wird, legen die Bits,
die in der bin�ren Darstellung der Zahl gesetzt sind, die SET-Elemente im
Spaltenwert fest. Angenommen, eine Spalte ist als
@code{SET("a","b","c","d")} festgelegt, dann haben die Elemente folgende
Bitwerte:

@multitable @columnfractions .2 .2 .6
@item @code{SET} @strong{Element} @tab @strong{Dezimalwert} @tab @strong{Bin�rwert}
@item @code{a} @tab @code{1} @tab @code{0001}
@item @code{b} @tab @code{2} @tab @code{0010}
@item @code{c} @tab @code{4} @tab @code{0100}
@item @code{d} @tab @code{8} @tab @code{1000}
@end multitable

Wenn Sie dieser Spalte einen Wert von @code{9} zuweisen, ist das bin�r
@code{1001}. Daher werden der erste und der vierte @code{SET}-Wert, die
Elemente @code{"a"} und @code{"d"}, ausgew�hlt, und der Ergebniswert ist
@code{"a,d"}.

Bei einem Wert, der mehr als ein @code{SET}-Element enth�lt, spielt es
keine Rolle, in welcher Reihenfolge die Elemente aufgelistet sind, wenn Sie
den Wert einf�gen. Es spielt ebenfalls keine Rolle, wie oft ein gegebenes
Element im Wert aufgelistet ist. Wenn der Wert sp�ter abgerufen wird,
erscheint jedes Element im Wert einmal, wobei die Elemente in der
Reihenfolge erscheinen, in der sie bei der Tabellenerzeugung festgelegt
wurden. Wenn eine Spalte beispielsweise als @code{SET("a","b","c","d")}
festgelegt ist, erscheinen @code{"a,d"}, @code{"d,a"} und
@code{"d,a,a,d,d"} als @code{"a,d"}, wenn sie abgerufen werden.

@code{SET}-Werte werden numerisch sortiert. @code{NULL}-Werte werden vor
Nicht-@code{NULL}-@code{SET}-Werten einsortiert.

Normalerweise f�hrt man @code{SELECT} auf eine @code{SET}-Spalte mit dem
@code{LIKE}-Operator oder der @code{FIND_IN_SET()}-Funktion aus:

@example
mysql> SELECT * FROM tabelle WHERE set_spalte LIKE '%wert%';
mysql> SELECT * FROM tabelle WHERE FIND_IN_SET('wert',set_spalte)>0;
@end example

Aber auch folgendes funktioniert:

@example
mysql> SELECT * FROM tabelle WHERE set_spalte = 'wert1,wert2';
mysql> SELECT * FROM tabelle WHERE set_spalte & 1;
@end example

Das erste dieser Statements sucht nach einer exakten �bereinstimmung, das
zweite sucht Werte, die das erste SET-Element enthalten.

Wenn Sie alle m�glichen Werte einer @code{SET}-Spalte erhalten wollen,
benutzen Sie: @code{SHOW COLUMNS FROM tabelle LIKE set_spalte} und gehen
die @code{SET}-Definition in der zweiten Spalte durch.


@node Choosing types, Other-vendor column types, String types, Column types
@c German node Typen ausw�hlen
@subsection Den richtigen Typ f�r eine Spalte ausw�hlen

@cindex Typen, Spalten
@cindex Typen ausw�hlen

Um m�glichst effizient zu speichern, benutzen Sie in jedem Fall den
pr�zisesten Typ. Wenn zum Beispiel eine Ganzzahl-Spalte f�r Werte im
Bereich zwischen @code{1} und @code{99999} benutzt wird, ist
@code{MEDIUMINT UNSIGNED} der beste Typ.

Akkurate Darstellung monet�rer Werte ist ein h�ufiges Problem. In MySQL
sollten Sie den @code{DECIMAL}-Typ benutzen. Dieser wird als Zeichenkette
gepeichert, weshalb kein Genauigkeitsverlust auftreten sollte. Wenn
Genauigkeit nicht allzu wichtig ist, sollte auch der @code{DOUBLE}-Typ
ausreichen.

Um hohe Pr�zision zu erzielen, k�nnen Sie immer auch in einen Festkommawert
umwandeln, der in einer @code{BIGINT} gespeichert wird. Das erlaubt Ihnen,
alle Berechnungen mit Ganzzahlen durchzuf�hren und die Ergebnisse nur wenn
notwendig in Flie�kommawerte zur�ckzuwandeln.


@node Other-vendor column types, Storage requirements, Choosing types, Column types
@c German node Spaltentypen anderer Hersteller
@subsection Spaltentypen anderer Datenbanken benutzen

@cindex Typen, Portabilit�t
@cindex Portabilit�t, Typen
@cindex Spalten, andere Typen

Um es einfacher zu machen, Code zu verwenden, der f�r SQL-Implementationen
anderer Hersteller geschrieben wurde, ordnet (mappt) MySQL Spaltentypen zu
wie in unten stehender Tabelle dargestellt. Diese Mappings machen es
leichter, Tabellendefinitionen anderer Datenbanken nach MySQL zu
verschieben:

@multitable @columnfractions .4 .6
@item @strong{Typ anderer Hersteller}   @tab @strong{MySQL-Typ}
@item @code{BINARY(NUM)}		@tab @code{CHAR(NUM) BINARY}
@item @code{CHAR VARYING(NUM)}		@tab @code{VARCHAR(NUM)}
@item @code{FLOAT4}			@tab @code{FLOAT}
@item @code{FLOAT8}			@tab @code{DOUBLE}
@item @code{INT1}			@tab @code{TINYINT}
@item @code{INT2}			@tab @code{SMALLINT}
@item @code{INT3}			@tab @code{MEDIUMINT}
@item @code{INT4}			@tab @code{INT}
@item @code{INT8}			@tab @code{BIGINT}
@item @code{LONG VARBINARY}		@tab @code{MEDIUMBLOB}
@item @code{LONG VARCHAR}		@tab @code{MEDIUMTEXT}
@item @code{MIDDLEINT}			@tab @code{MEDIUMINT}
@item @code{VARBINARY(NUM)}		@tab @code{VARCHAR(NUM) BINARY}
@end multitable

Dass Zuordnen (Mapping) von Spaltentypen geschieht bei der Erzeugung der
Tabelle. Wenn Sie eine Tabelle mit Typen erzeugen, die von anderen
Herstellern benutzt werden, und dann ein @code{DESCRIBE tabelle}-Statement
absetzen, zeigt MySQL die Tabellenstruktur mit den �quivalenten MySQL-Typen
an.


@node Storage requirements,  , Other-vendor column types, Column types
@c German node Speicherbedarf
@subsection Speicherbedarf von Spaltentypen

@cindex Speicherbedarf, Spaltentyp
@cindex Spalten, Speicherbedarf

Der Speicherbedarf jedes Spaltentyps, der von MySQL unterst�tzt wird, ist
unten nach Kategorie sortiert aufgelistet:

@cindex numerische Typen
@cindex Typen, numerische

@subsubheading Speicherbedarf f�r numerische Typen

@multitable @columnfractions .5 .5
@item @strong{Spaltentyp} @tab @strong{Speicherbedarf}
@item @code{TINYINT}       @tab 1 Byte
@item @code{SMALLINT}      @tab 2 Bytes
@item @code{MEDIUMINT}     @tab 3 Bytes
@item @code{INT}           @tab 4 Bytes
@item @code{INTEGER}       @tab 4 Bytes
@item @code{BIGINT}        @tab 8 Bytes
@item @code{FLOAT(X)}      @tab 4, wenn X <= 24, oder 8, wenn 25 <= X <= 53
@item @code{FLOAT}         @tab 4 Bytes
@item @code{DOUBLE}        @tab 8 Bytes
@item @code{DOUBLE PRECISION} @tab 8 Bytes
@item @code{REAL}         @tab 8 Bytes
@item @code{DECIMAL(M,D)} @tab @code{M+2} Bytes, wenn D > 0, @code{M+1} Bytes, wenn D = 0 (@code{D}+2, wenn @code{M < D})
@item @code{NUMERIC(M,D)} @tab @code{M+2} Bytes, wenn D > 0, @code{M+1} Bytes, wenn D = 0 (@code{D}+2, wenn @code{M < D})
@end multitable

@cindex Datumstypen
@cindex Zeittypen
@cindex Typen, Datum
@cindex Typen, Zeit

@subsubheading Speicherbedarf f�r Datums- und Zeit-Typen

@multitable @columnfractions .5 .5
@item @strong{Spaltentyp} @tab @strong{Speicherbedarf}
@item @code{DATE}          @tab 3 Bytes
@item @code{DATETIME}      @tab 8 Bytes
@item @code{TIMESTAMP}     @tab 4 Bytes
@item @code{TIME}          @tab 3 Bytes
@item @code{YEAR}          @tab 1 Byte
@end multitable

@subsubheading Speicherbedarf f�r Zeichenketten-Typen

@multitable @columnfractions .5 .5
@item @strong{Spaltentyp} @tab @strong{Speicherbedarf}
@item @code{CHAR(M)} @tab @code{M} Bytes, @code{1 <= M <= 255}
@item @code{VARCHAR(M)} @tab @code{L}+1 Bytes, wobei @code{L <= M} und
@code{1 <= M <= 255}
@item @code{TINYBLOB}, @code{TINYTEXT} @tab @code{L}+1 Bytes,
wobei @code{L} < 2^8
@item @code{BLOB}, @code{TEXT} @tab @code{L}+2 Bytes,
wobei @code{L} < 2^16
@item @code{MEDIUMBLOB}, @code{MEDIUMTEXT} @tab @code{L}+3 Bytes,
wobei @code{L} < 2^24
@item @code{LONGBLOB}, @code{LONGTEXT} @tab @code{L}+4 Bytes,
wobei @code{L} < 2^32
@item @code{ENUM('wert1','wert2',...)} @tab 1 oder 2 Bytes, abh�ngig von
der Anzahl der Aufz�hlungswerte (65535 Werte maximal)
@item @code{SET('wert1','wert2',...)} @tab 1, 2, 3, 4 oder 8 Bytes,
abh�ngig von der Anzahl von SET-Elementen (64 Elemente maximal)
@end multitable

@cindex @code{BLOB}, Gr��e
@cindex @code{TEXT}, Gr��e
@cindex @code{VARCHAR}, Gr��e
@code{VARCHAR} und die @code{BLOB}- und @code{TEXT}-Typen sind Typen
variabler L�nge, bei denen der Speicherbedarf von der tats�chlichen L�nge
der Spaltenwerte abh�ngt (in der vorstehenden Tabelle dargestellt durch
@code{L}) statt von der maximal m�glichen Gr��e des Typs.
@code{VARCHAR(10)} zum Beispiel kann eine Zeichenkette mit einer maximalen
L�nge von 10 Zeichen enthalten. Der tats�chliche Speicherbedarf ist die
L�nge der Zeichenkette (@code{L}) plus 1 Byte, um die L�nge zu speichern.
Bei der Zeichenkette @code{'abcd'} ist @code{L} 4 und der Speicherbedarf 5
Bytes.

Die @code{BLOB}- und @code{TEXT}-Typen ben�tigen 1, 2, 3 oder 4 Bytes, um
die L�nge des Spaltenwerts zu speichern, abh�ngig von der maximal m�glichen
L�nge des Typs.  @xref{BLOB}.

Wenn eine Tabelle irgend welche Spaltentypen variabler L�nge enth�lt, ist
das Datensatzformat ebenfalls von variabler L�nge. Beachten Sie, dass MySQL
bei der Erzeugung einer Tabelle unter bestimmten Umst�nden eine Spalte
eines Typs variabler L�nge in einen Typ fester L�nge umwandelt, und
umgekehrt. @xref{Silent column changes}.

@cindex ENUM, Gr��e
Die Gr��e eines @code{ENUM}-Objekts h�ngt von der Anzahl unterschiedlicher
Aufz�hlungswerte ab. Bei Aufz�hlungen mit bis zu 255 m�glichen Werten wird
1 Byte benutzt, bei Aufz�hlungen mit bis zu 65535 Werten 2 Bytes.
@xref{ENUM}.

@cindex SET, Gr��e
Die Gr��e eines @code{SET}-Objekts h�ngt von der Anzahl unterschiedlicher
SET-Elemente ab. Wenn die SET-Gr��e @code{N} ist, belegt das Objekt
@code{(N+7)/8} Bytes, gerundet auf 1, 2, 3, 4 oder 8 Bytes. Ein @code{SET}
kann maximal 64 Elemente besitzen. @xref{SET}.


@node Functions, Data Manipulation, Column types, Reference
@c German node Funktionen
@section Funktionen f�r die Benutzung in @code{SELECT}- und @code{WHERE}-Klauseln

@cindex Funktionen f�r @code{SELECT} und @code{WHERE}-Klauseln

Ein @code{select_ausdruck} oder eine @code{where_definition} in einem
SQL-Statement kann aus jedem beliebigen Ausdruck bestehen, der die unten
beschriebenen Funktionen benutzt.

Ein Ausdruck, der @code{NULL} enth�lt, erzeugt immer einen
@code{NULL}-Wert, wenn es in der Dokumentation f�r die Operatoren und
Funktionen, die im Ausdruck vorkommen, nicht anders beschrieben ist.

@strong{HINWEIS:} Zwischen Funktionsname und der folgenden Klammer darf
kein Leerraum stehen. Das hilft dem MySQL-Parser, zwischen
Funktionsaufrufen und Tabellen- oder Spaltenverweisen zu unterscheiden, die
denselben Namen haben wie eine Funktion. Leerzeichen um Argumente herum
sind dagegen zul�ssig.

Sie k�nnen MySQL zwingen, Leerzeichen nach dem Funktionsnamen zu
akzeptieren, indem Sie @code{mysqld} mit @code{--ansi} starten oder
@code{CLIENT_IGNORE_SPACE} bei @code{mysql_connect()}, benutzen, aber in
diesem Fall werden alle Funktionsnamen zu reservierten W�rtern.
@xref{ANSI mode}.

@need 2000

Der K�rze zuliebe sind die Ausgaben des @code{mysql}-Programms in gek�rzter
Form dargestellt. Daher wird

@example
mysql> select MOD(29,9);
+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+
1 rows in set (0.00 sec)
@end example

wie folgt dargestellt:

@example
mysql> select MOD(29,9);
        -> 2
@end example



@menu
* Non-typed Operators::         
* String functions::            
* Numeric Functions::           
* Date and time functions::     
* Other Functions::             
* Group by functions::          
@end menu

@node Non-typed Operators, String functions, Functions, Functions
@c German node Nicht typenspezifische Operatoren
@subsection Nicht typenspezifische Operatoren und Funktionen



@menu
* Parentheses::                 
* Comparison Operators::        
* Logical Operators::           
* Control flow functions::      
@end menu

@node Parentheses, Comparison Operators, Non-typed Operators, Non-typed Operators
@c German node Klammer
@subsubsection Klammer

@findex () (Klammern)
@findex Klammern ( und )

@cindex Funktionen, Gruppierungs-
@cindex Gruppierung, Ausdr�cke

@example
( ... )
@end example

Benutzen Sie Klammern, um die Reihenfolge der Auswertung in einem Ausdruck
zu erzwingen. Beispiel:

@example
mysql> select 1+2*3;
        -> 7
mysql> select (1+2)*3;
        -> 9
@end example



@node Comparison Operators, Logical Operators, Parentheses, Non-typed Operators
@c German node Vergleichsoperatoren
@subsubsection Vergleichsoperatoren

@findex Vergleichsoperatoren

@cindex Casts
@cindex Typumwandlungen

Vergleichsoperationen ergeben einen Wert von @code{1} (TRUE), @code{0}
(FALSE) oder @code{NULL}. Diese Funktionen funktionieren sowohl bei Zahlen
als auch bei Zeichenketten. Zeichenketten werden bei Bedarf automatisch in
Zahlen und Zahlen in Zeichenketten umgewandelt (wie in Perl oder PHP).

MySQL f�hrt Vergleiche nach folgenden Regeln durch:

@itemize @bullet
@item
Wenn ein oder beide Argumente @code{NULL} sind, ist das Ergebnis des
Vergleichs @code{NULL}, ausser beim @code{<=>} Operator.

@item
Wenn beide Argumente in einer Vergleichsoperation Zeichenketten sind,
werden sie als Zeichenketten verglichen.

@item
Wenn beide Argumente Ganzzahlen sind, werden sie als Ganzzahlen verglichen.

@item
Hexadezimale Werte werden als bin�re Zeichenketten behandelt, wenn sie
nicht mit einer Zahl verglichen werden.

@item
@cindex ODBC-Kompatibilit�t
@cindex Kompatibilit�t, mit ODBC
Wenn eins der Argumente eine @code{TIMESTAMP}- oder @code{DATETIME}-Spalte
ist und das andere Argument eine Konstante, wird die Konstante in einen
Zeitstempel umgewandelt, bevor der Vergleich durchgef�hrt wird. Das wird
gemacht, um ODBC-freundlicher zu sein.

@item
In allen anderen F�llen werden die Argumente als Flie�kommazahlen
verglichen.
@end itemize

Vorgabem��ig werden Zeichenketten-Vergleiche unabh�ngig von der verwendeten
Gro�-/Kleinschreibung durchgef�hrt, indem der aktuelle Zeichensatz benutzt
wird (vorgabem��ig ISO-8859-1 Latin1, der auch f�r englisch exzellent
funktioniert).

Die unten stehenden Beispiele erl�utern die Umwandlung von Zeichenketten in
Zahlen f�r Vergleichsoperationen:

@example
mysql> SELECT 1 > '6x';
         -> 0
mysql> SELECT 7 > '6x';
         -> 1
mysql> SELECT 0 > 'x6';
         -> 0
mysql> SELECT 0 = 'x6';
         -> 1
@end example

@table @code
@findex = (gleich)
@findex gleich (=)
@item =
Gleich:
@example
mysql> select 1 = 0;
        -> 0
mysql> select '0' = 0;
        -> 1
mysql> select '0.0' = 0;
        -> 1
mysql> select '0.01' = 0;
        -> 0
mysql> select '.01' = 0.01;
        -> 1
@end example

@findex <> (ungleich)
@findex ungleich (<>)
@findex != (ungleich)
@findex ungleich (!=)
@item <>
@itemx !=
Ungleich:
@example
mysql> select '.01' <> '0.01';
        -> 1
mysql> select .01 <> '0.01';
        -> 0
mysql> select 'zapp' <> 'zappp';
        -> 1
@end example

@findex <= (kleiner oder gleich)
@findex kleiner oder gleich (<=)
@item <=
Kleiner oder gleich:
@example
mysql> select 0.1 <= 2;
        -> 1
@end example

@findex < (kleiner als)
@findex kleiner als (<)
@item <
Kleiner als:
@example
mysql> select 2 < 2;
        -> 0
@end example

@findex >= (gr��er oder gleich)
@findex gr��er oder gleich (>=)
@item >=
Gr��er oder gleich:
@example
mysql> select 2 >= 2;
        -> 1
@end example

@findex > (gr��er als)
@findex gr��er als (>)
@item >
Gr��er als:
@example
mysql> select 2 > 2;
        -> 0
@end example

@cindex @code{NULL}, testen auf Null
@findex <=> (Gleich)
@item <=>
Null-sicheres gleich:
@example
mysql> select 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1 1 0
@end example

@cindex @code{NULL}, testen auf Null
@findex IS NULL
@findex IS NOT NULL
@item IS NULL
@itemx IS NOT NULL
Testet, ob eine Wert @code{NULL} ist oder nicht:
@example
mysql> select 1 IS NULL, 0 IS NULL, NULL IS NULL;
        -> 0 0 1
mysql> select 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
        -> 1 1 0
@end example

@findex BETWEEN ... AND
@item ausdruck BETWEEN min AND max
Wenn @code{ausdruck} gr��er oder gleich @code{min} ist und @code{ausdruck}
kleiner oder gleich @code{max} ist, gibt @code{BETWEEN} @code{1} zur�ck,
andernfalls @code{0}. Das ist �quivalent zum Ausdruck @code{(min <=
ausdruck AND ausdruck <= max)}, wenn alle Argumente vom selben Typ sind.
Das erste Argument (@code{ausdruck}) legt fest, wie der Vergleich
durchgef�hrt wird:

@itemize @bullet
@item
Wenn @code{ausdruck} eine @code{TIMESTAMP}-, @code{DATE}- oder
@code{DATETIME}-Spalte ist, werden @code{MIN()} und @code{MAX()} im selben
Format formatiert als w�ren sie Konstanten.
@item
Wenn @code{ausdruck} ein Zeichenketten-Ausdruck ohne Ber�cksichtigung der
Gro�-/Kleinschreibung ist, wird ein Zeichenkettenvergleich ohne
Ber�cksichtigung der Gro�-/Kleinschreibung durchgef�hrt.
@item
Wenn @code{ausdruck} ein Zeichenketten-Ausdruck mit Ber�cksichtigung der
Gro�-/Kleinschreibung ist, wird ein Zeichenkettenvergleich mit
Ber�cksichtigung der Gro�-/Kleinschreibung durchgef�hrt.
@item
Wenn @code{ausdruck} ist ein Ganzzahl-Ausdruck ist, wird ein
Ganzzahlvergleich durchgef�hrt.
@item
Ansonsten wird ein Flie�kommazahlenvergleich durchgef�hrt.
@end itemize

@example
mysql> select 1 BETWEEN 2 AND 3;
        -> 0
mysql> select 'b' BETWEEN 'a' AND 'c';
        -> 1
mysql> select 2 BETWEEN 2 AND '3';
        -> 1
mysql> select 2 BETWEEN 2 AND 'x-3';
        -> 0
@end example

@findex IN
@item ausdruck IN (wert,...)
Gibt @code{1} zur�ck, wenn @code{ausdruck} einen Wert hat, der in der
@code{IN}-Liste enthalten ist, ansonsten @code{0}. Wenn alle Werte
Konstanten sind, werden alle Werte gem�� dem Typ von @code{ausdruck}
ausgewertet und sortiert. Danach wird ein Element mittels bin�rer Suche
gesucht. Das hei�t, dass @code{IN} sehr schnell ist, wenn die
@code{IN}-Werteliste ausschlie�lich aus Konstanten besteht. Wenn
@code{ausdruck} ein Zeichenketten-Ausdruck mit Ber�cksichtigung der
Gro�-/Kleinschreibung ist, wird der Zeichenkettenvergleich unter
Ber�cksichtigung der Gro�-/Kleinschreibung durchgef�hrt:

@example
mysql> select 2 IN (0,3,5,'wefwf');
        -> 0
mysql> select 'wefwf' IN (0,3,5,'wefwf');
        -> 1
@end example

@findex NOT IN
@item ausdruck NOT IN (wert,...)
Dasselbe wie @code{NOT (ausdruck IN (wert,...))}.

@findex ISNULL()
@item ISNULL(ausdruck)
Wenn @code{ausdruck} @code{NULL} ist, gibt @code{ISNULL()} @code{1} zur�ck,
ansonsten @code{0}:
@example
mysql> select ISNULL(1+1);
        -> 0
mysql> select ISNULL(1/0);
        -> 1
@end example

Beachten Sie, dass ein Vergleich von @code{NULL}-Werten mit @code{=} immer
UNWAHR ergibt!

@cindex @code{NULL}, testen auf Null
@findex COALESCE()
@item COALESCE(liste)
Gibt das erste Nicht-@code{NULL}-Element in der Liste zur�ck:

@example
mysql> select COALESCE(NULL,1);
        -> 1
mysql> select COALESCE(NULL,NULL,NULL);
        -> NULL
@end example

@findex INTERVAL()
@item INTERVAL(N,N1,N2,N3,...)
Gibt @code{0} zur�ck, wenn @code{N} < @code{N1}, @code{1}, wenn @code{N} <
@code{N2} usw. Alle Argumente werden als Ganzzahlen behandelt. Es ist
erforderlich, dass @code{N1} < @code{N2} < @code{N3} < @code{...} <
@code{Nn} ist, damit diese Funktion korrekt funktioniert. Das liegt daran,
dass eine (sehr schnelle) bin�re Suche benutzt wird:

@example
mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);
        -> 3
mysql> select INTERVAL(10, 1, 10, 100, 1000);
        -> 2
mysql> select INTERVAL(22, 23, 30, 44, 200);
        -> 0
@end example
@end table

Wenn Sie eine Zeichenkette, die Gro�-/Kleinschreibung nicht
ber�cksichtigt, mit einem der Standard-Operatoren vergleichen (@code{=},
@code{<>}..., aber nicht @code{LIKE}), werden Leerzeichen am Ende
ignoriert:

@example
mysql> select "a" ="A ";
        -> 1
@end example


@node Logical Operators, Control flow functions, Comparison Operators, Non-typed Operators
@c German node Logische Operatoren
@subsubsection Logische Operatoren

@findex Logische Funktionen
@findex Funktionen, logische

Alle logischen Funktionen geben @code{1} (TRUE), @code{0} (FALSE) oder
@code{NULL} (unbekannt, was in den meisten F�llen dasselbe wie FALSE ist)
zur�ck:

@table @code
@findex NOT, logisch
@findex ! (logisch NOT)
@item NOT
@itemx !
Logisch NOT. Gibt @code{1} zur�ck, wenn das Argument @code{0} ist,
ansonsten @code{0}.
Ausnahme: @code{NOT NULL} gibt @code{NULL} zur�ck:
@example
mysql> select NOT 1;
        -> 0
mysql> select NOT NULL;
        -> NULL
mysql> select ! (1+1);
        -> 0
mysql> select ! 1+1;
        -> 1
@end example
Das letzte Beispiel gibt @code{1} zur�ck, weil der Ausdruck auf dieselbe
Art ausgewertet wird wie @code{(!1)+1}.

@findex OR, logisch
@findex || (logisch OR)
@item OR
@itemx ||
Logisch OR. Gibt @code{1} zur�ck, wenn eins der Argumente nicht @code{0}
und nicht @code{NULL} ist:
@example
mysql> select 1 || 0;
        -> 1
mysql> select 0 || 0;
        -> 0
mysql> select 1 || NULL;
        -> 1

@end example

@findex AND, logisch
@findex && (logisch AND)
@item AND
@itemx &&
Logisch AND. Gibt @code{0} zur�ck, wenn eins der Argumente @code{0} oder
@code{NULL} ist, ansonsten @code{1}:
@example
mysql> select 1 && NULL;
        -> 0
mysql> select 1 && 0;
        -> 0
@end example
@end table


@node Control flow functions,  , Logical Operators, Non-typed Operators
@c German node Ablaufsteuerungsfunktionen
@subsubsection Ablaufsteuerungsfunktionen

@findex Ablaufsteuerungsfunktionen
@findex Funktionen, Ablaufsteuerung

@table @code
@cindex @code{NULL}, testen auf Null
@findex IFNULL()
@item IFNULL(ausdruck1,ausdruck2)
Wenn @code{ausdruck1} nicht @code{NULL} ist, gibt @code{IFNULL()}
@code{ausdruck1} zur�ck, ansonsten @code{ausdruck2}. @code{IFNULL()} gibt
einen numerischen oder einen Zeichenketten-Wert zur�ck, je nachdem, in
welchem Zusammenhang es benutzt wird:
@example
mysql> select IFNULL(1,0);
        -> 1
mysql> select IFNULL(NULL,10);
        -> 10
mysql> select IFNULL(1/0,10);
        -> 10
mysql> select IFNULL(1/0,'ja');
        -> 'ja'
@end example

@findex NULLIF()
@item NULLIF(ausdruck1,ausdruck2)
Wenn @code{ausdruck1 = ausdruck2} wahr ist, gibt die Funktion @code{NULL}
zur�ck, ansonsten @code{ausdruck1}. Das ist dasselbe wie @code{CASE WHEN x
= y THEN NULL ELSE x END}:
@example
mysql> select NULLIF(1,1);
        -> NULL
mysql> select NULLIF(1,2);
        -> 1
@end example

Beachten Sie, dass @code{ausdruck1} in MySQL zweimal ausgewertet wird, wenn
die Argumente gleich sind.

@findex IF()
@item IF(ausdruck1,ausdruck2,ausdruck3)
Wenn @code{ausdruck1} TRUE ist (@code{ausdruck1 <> 0} und @code{ausdruck1
<> NULL}), gibt @code{IF()} @code{ausdruck2} zur�ck, ansonsten
@code{ausdruck3}. @code{IF()} gibt einen numerischen oder einen
Zeichenketten-Wert zur�ck, je nachdem, in welchem Zusammenhang es benutzt
wird:

@example
mysql> select IF(1>2,2,3);
        -> 3
mysql> select IF(1<2,'ja','nein');
        -> 'ja'
mysql> select IF(strcmp('test','test1'),'nein','ja');
        -> 'nein'
@end example

@code{ausdruck1} wird als Ganzzahlwert ausgewertet, woraus folgt, dass Sie
das Testen auf Flie�komma- oder Zeichenketten-Werte mit einer
Vergleichsoperation durchf�hren sollten:

@example
mysql> select IF(0.1,1,0);
        -> 0
mysql> select IF(0.1<>0,1,0);
        -> 1
@end example

Im ersten Fall gibt @code{IF(0.1)} @code{0} zur�ck, weil @code{0.1} in
einen Ganzzahlwert umgewandelt wird, wodurch es auf @code{IF(0)} getestet
wird. Das ist vielleicht nicht das, was Sie erwarten. Im zweiten Fall
testet der Vergleich den Original-Flie�kommawert, um zu sehen, ob er nicht
0 ist. Das Ergebnis des Vergleichs wird als Ganzzahl benutzt.

Der vorgabem��ige R�ckgabewert von @code{IF()} (der eine Rolle spielen
kann, wenn er in einer tempor�ren Tabelle gespeichert wird), wird in
MySQL-Version 3.23 wie folgt berechnet:

@multitable @columnfractions .55 .45
@item @strong{Ausdruck} @tab @strong{R�ckgabewert}
@item ausdruck2 oder ausdruck3 gibt Zeichenkette zur�ck @tab Zeichenkette
@item ausdruck2 oder ausdruck3 gibt Flie�kommawert zur�ck @tab Flie�kommawert
@item ausdruck2 oder ausdruck3 gibt Ganzzahl zur�ck @tab Ganzzahl
@end multitable

@findex CASE
@item CASE wert WHEN [vergleichs-wert] THEN ergebnis [WHEN [vergleichs-wert] THEN ergebnis ...] [ELSE ergebnis] END
@item CASE WHEN [bedingung] THEN ergebnis [WHEN [bedingung] THEN ergebnis ...] [ELSE ergebnis] END

Die erste Version gibt @code{ergebnis} zur�ck, wo
@code{wert=vergleichs-wert}. Die zweite Version gibt das Ergebnis f�r die
erste Bedingung zur�ck, die WAHR ist. Wenn es keinen �bereinstimmenden
Ergebniswert gab, wird das Ergebnis nach @code{ELSE} zur�ckgegeben. Wenn es
keinen @code{ELSE}-Teil gibt, wird @code{NULL} zur�ckgegeben:

@example
mysql> SELECT CASE 1 WHEN 1 THEN "eins" WHEN 2 THEN "zwei" ELSE "mehr" END;
       -> "eins"
mysql> SELECT CASE WHEN 1>0 THEN "wahr" ELSE "unwahr" END;
       -> "wahr"
mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
       -> NULL
@end example
@end table

Der Typ des R�ckgabewerts (@code{INTEGER}, @code{DOUBLE} oder
@code{STRING}) ist derselbe wie der Typ des ersten zur�ckgegebenen Werts
(der Ausdruck nach dem ersten @code{THEN}).


@node String functions, Numeric Functions, Non-typed Operators, Functions
@c German node Zeichenketten-Funktionen
@subsection Zeichenketten-Funktionen

@findex Zeichenketten-Funktionen
@findex Funktionen, Zeichenketten

Funktionen f�r Zeichenkettenwerte geben @code{NULL} zur�ck, wenn die L�nge
des Ergebnisses gr��er w�re als der
@code{max_allowed_packet}-Serverparameter. @xref{Server parameters}.

Bei Funktionen, die mit Zeichenkettenpositionen arbeiten, wird die erste
Position als 1 gez�hlt.

@table @code
@findex ASCII()
@item ASCII(zeichenkette)
Gibt den ASCII-Code-Wert des �u�ersten linken Zeichens der Zeichenkette
@code{zeichenkette} zur�ck. Gibt @code{0} zur�ck, wenn @code{zeichenkette}
die leere Zeichenkette ist. Gibt @code{NULL} zur�ck, wenn
@code{zeichenkette} @code{NULL} ist:

@example
mysql> select ASCII('2');
        -> 50
mysql> select ASCII(2);
        -> 50
mysql> select ASCII('dx');
        -> 100
@end example

Siehe auch @code{ORD()}-Funktion.

@findex ORD()
@item ORD(zeichenkette)
Wenn das �u�erste linke Zeichen der Zeichenkette @code{zeichenkette} ein
Multi-Byte-Zeichen ist, gibt diese Funktion den Code des
Multi-Byte-Zeichens zur�ck, indem der ASCII-Code-Wert des Zeichens in
folgendem Format zur�ckgegeben wird:
@code{((erstes byte ASCII code)*256+(zweites byte ASCII code))[*256+drittes byte ASCII code...]}.
Wenn das �u�erste linke Zeichen kein Multi-Byte-Zeichen ist, wird derselbe
Wert wie bei der @code{ASCII()}-Funktion zur�ckgegeben:

@example
mysql> select ORD('2');
        -> 50
@end example

@findex CONV()
@item CONV(N,von_basis,zu_basis)
Wandelt Zahlen zwischen verschiedenen Zahlsystemen um. Gibt eine
Zeichenkettendarstellung der Zahl @code{N} zur�ck, umgewandelt von Basis
@code{von_basis} zu Basis @code{zu_basis}. Gibt @code{NULL} zur�ck, wenn
irgend ein Argument @code{NULL} ist. Das Argument @code{N} wird als
Ganzzahl interpretiert, kann aber als Ganzzahl oder Zeichenkette angegeben
werden. Die kleinste Basis ist @code{2} und die gr��te Basis @code{36}.
Wenn @code{zu_basis} eine negative Zahl ist, wird @code{N} als
vorzeichenbehaftete Zahl betrachtet. Ansonsten wird @code{N} als
vorzeichenlos behandelt. @code{CONV} arbeitet mit 64-Bit-Genauigkeit:

@example
mysql> select CONV("a",16,2);
        -> '1010'
mysql> select CONV("6E",18,8);
        -> '172'
mysql> select CONV(-17,10,-18);
        -> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
        -> '40'
@end example

@findex BIN()
@item BIN(N)
Gibt eine Zeichenkettendarstellung des Bin�rwerts von @code{N} zur�ck,
wobei @code{N} eine @code{BIGINT}-Zahl ist. Das ist �quivalent zu
@code{CONV(N,10,2)}. Gibt @code{NULL} zur�ck, wenn @code{N} @code{NULL}
ist:

@example
mysql> select BIN(12);
        -> '1100'
@end example

@findex OCT()
@item OCT(N)
Gibt eine Zeichenkettendarstellung des Oktalwerts von @code{N} zur�ck,
wobei @code{N} eine @code{BIGINT}-Zahl ist. Das ist �quivalent zu
@code{CONV(N,10,8)}. Gibt @code{NULL} zur�ck, wenn @code{N} @code{NULL}
ist:

@example
mysql> select OCT(12);
        -> '14'
@end example

@findex HEX()
@item HEX(N)
Gibt eine Zeichenkettendarstellung des hexadezimalen Werts von @code{N}
zur�ck, wobei @code{N} eine @code{BIGINT}-Zahl ist. Das ist �quivalent zu
@code{CONV(N,10,16)}. Gibt @code{NULL} zur�ck, wenn @code{N} @code{NULL}
ist:

@example
mysql> select HEX(255);
        -> 'FF'
@end example

@findex CHAR()
@item CHAR(N,...)
@code{CHAR()} interpretiert die Argumente als Ganzzahlen und gibt eine
Zeichenkette zur�ck, die aus den Zeichen besteht, die durch die
ASCII-Code-Werte dieser Ganzzahlen gegeben sind. @code{NULL}-Werte werden
�bersprungen:

@example
mysql> select CHAR(77,121,83,81,'76');
        -> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
        -> 'MMM'
@end example

@findex CONCAT()
@item CONCAT(zeichenkette1,zeichenkette2,...)
Gibt die Zeichenkette zur�ck, die durch die Verkettung der Argumente
entsteht. Gibt @code{NULL} zur�ck, wenn irgend ein Argument @code{NULL}
ist. Kann mehr als 2 Argumente haben. Ein numerisches Argument wird in die
�quivalente Zeichenkettenform umgewandelt:

@example
mysql> select CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
        -> NULL
mysql> select CONCAT(14.3);
        -> '14.3'
@end example

@findex CONCAT_WS()
@item CONCAT_WS(trennzeichen, zeichenkette1, zeichenkette2,...)

@code{CONCAT_WS()} steht f�r CONCAT mit Trennzeichen und ist eine spezielle
Form von @code{CONCAT()}. Das erste Argument ist das Trennzeichen f�r die
restlichen Argumente. Das Trennzeichen kann eine Zeichenkette sein, so wie
die �brigen Argumente. Wenn das Trennzeichen @code{NULL} ist, ist das
Ergebnis @code{NULL}. Die Funktion �berspringt jegliche @code{NULL}s und
leere Zeichenketten nach dem Trennzeichen-Argument. Das Trennzeichen wird
zwischen den zu verkn�pfenden Zeichenketten hinzugef�gt:

@example
mysql> select CONCAT_WS(",","Vorname","Zweiter Vorname","Nachname");
       -> 'Vorname,Zweiter Vorname,Nachname'
mysql> select CONCAT_WS(",","Vorname",NULL,"Nachname");
       -> 'Vorname,Nachname'
@end example

@findex LENGTH()
@findex OCTET_LENGTH()
@findex CHAR_LENGTH()
@findex CHARACTER_LENGTH()
@item LENGTH(zeichenkette)
@itemx OCTET_LENGTH(zeichenkette)
@itemx CHAR_LENGTH(zeichenkette)
@itemx CHARACTER_LENGTH(zeichenkette)
Gibt die L�nge der Zeichenkette @code{zeichenkette} an:

@example
mysql> select LENGTH('text');
        -> 4
mysql> select OCTET_LENGTH('text');
        -> 4
@end example

Beachten Sie, dass bei @code{CHAR_LENGTH()} Multi-Byte-Zeichen nur einmal
gez�hlt werden.

@findex LOCATE()
@findex POSITION()
@item LOCATE(teilzeichenfolge,zeichenkette)
@itemx POSITION(teilzeichenfolge IN zeichenkette)
Gibt die Position des ersten Auftretens der Teilzeichenfolge
@code{teilzeichenfolge} in der Zeichenkette @code{zeichenkette} an. Gibt
@code{0} zur�ck, wenn @code{teilzeichenfolge} nicht in @code{zeichenkette}
enthalten ist:

@example
mysql> select LOCATE('bar', 'foobarbar');
        -> 4
mysql> select LOCATE('xbar', 'foobar');
        -> 0
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex LOCATE()
@item LOCATE(teilzeichenfolge,zeichenkette,position)
Gibt die Position des ersten Auftretens der Teilzeichenfolge
@code{teilzeichenfolge} in der Zeichenkette @code{zeichenkette} ab Position
@code{position} an. Gibt @code{0} zur�ck, wenn @code{teilzeichenfolge}
nicht in @code{zeichenkette} enthalten ist:

@example
mysql> select LOCATE('bar', 'foobarbar',5);
        -> 7
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex INSTR()
@item INSTR(zeichenkette,teilzeichenfolge)
Gibt die Position des ersten Auftretens der Teilzeichenfolge
@code{teilzeichenfolge} in der Zeichenkette @code{zeichenkette} an. Das ist
dasselbe wie @code{LOCATE()} mit zwei Argumenten, ausser dass die Argumente
vertauscht sind:

@example
mysql> select INSTR('foobarbar', 'bar');
        -> 4
mysql> select INSTR('xbar', 'foobar');
        -> 0
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex LPAD()
@item LPAD(zeichenkette,laenge,fuellzeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, links aufgef�llt mit der
Zeichenkette @code{fuellzeichenkette}, bis @code{zeichenkette}
@code{laenge} Zeichen lang ist. Wenn @code{zeichenkette} l�nger als
@code{laenge} ist, wird sie auf @code{laenge} Zeichen verk�rzt.

@example
mysql> select LPAD('hi',4,'??');
        -> '??hi'
@end example

@findex RPAD()
@item RPAD(zeichenkette,laenge,fuellzeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, rechts aufgef�llt mit der
Zeichenkette @code{fuellzeichenkette}, bis @code{zeichenkette}
@code{laenge} Zeichen lang ist. Wenn @code{zeichenkette} l�nger als
@code{laenge} ist, wird sie auf @code{laenge} Zeichen verk�rzt.

@example
mysql> select RPAD('hi',5,'?');
        -> 'hi???'
@end example

@findex LEFT()
@item LEFT(zeichenkette,laenge)
Gibt die �u�ersten linken @code{laenge} Zeichen der Zeichenkette
@code{zeichenkette} zur�ck:

@example
mysql> select LEFT('foobarbar', 5);
        -> 'fooba'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex RIGHT()
@item RIGHT(zeichenkette,laenge)
Gibt die �u�ersten rechten @code{laenge} Zeichen der Zeichenkette
@code{zeichenkette} zur�ck:

@example
mysql> select RIGHT('foobarbar', 4);
        -> 'rbar'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex SUBSTRING()
@findex MID()
@item SUBSTRING(zeichenkette,position,laenge)
@itemx SUBSTRING(zeichenkette FROM position FOR laenge)
@itemx MID(zeichenkette,position,laenge)
Gibt eine @code{laenge} Zeichen lange Teilzeichenfolge der Zeichenkette
@code{zeichenkette} ab Position @code{position} zur�ck. Die abweichende
Form, die @code{FROM} benutzt, ist ANSI-SQL92-Syntax:

@example
mysql> select SUBSTRING('Heinzholger',5,6);
        -> 'zholge'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex SUBSTRING()
@item SUBSTRING(zeichenkette,position)
@item SUBSTRING(zeichenkette FROM position)
Gibt eine Teilzeichenfolge der Zeichenkette @code{zeichenkette} ab Position
@code{position} zur�ck:

@example
mysql> select SUBSTRING('Heinzholger',5);
        -> 'zholger'
mysql> select SUBSTRING('foobarbar' FROM 4);
        -> 'barbar'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex SUBSTRING_INDEX()
@item SUBSTRING_INDEX(zeichenkette,begrenzer,zaehler)
Gibt die Teilzeichenfolge von Zeichenkette @code{zeichenkette} vor
@code{zaehler} Vorkommen des Begrenzers @code{begrenzer} zur�ck. Wenn
@code{zaehler} positiv ist, wird alle links vom letzten Begrenzer
zur�ckgegeben (von links gez�hlt). Wenn @code{zaehler} negativ ist, wird
alles rechts vom letzten Begrenzer (von rechts gez�hlt) zur�ckgegeben:

@example
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex LTRIM()
@item LTRIM(zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der f�hrende
Leerzeichen entfernt wurden:

@example
mysql> select LTRIM('  barbar');
        -> 'barbar'
@end example

@findex RTRIM()
@item RTRIM(zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der Leerzeichen am
Ende entfernt wurden:

@example
mysql> select RTRIM('barbar   ');
        -> 'barbar'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex TRIM()
@item TRIM([[BOTH | LEADING | TRAILING] [entfernzeichenkette] FROM] zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der alle
@code{entfernzeichenkette}-Pr�fixe und / oder -Suffixe entfernt wurden.
Wenn keiner der Spezifizierer @code{BOTH}, @code{LEADING} oder
@code{TRAILING} angegeben wird, wird @code{BOTH} angenommen. Wenn
@code{entfernzeichenkette} nicht angegeben ist, werden Leerzeichen entfernt:

@example
mysql> select TRIM('  bar   ');
        -> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex SOUNDEX()
@item SOUNDEX(zeichenkette)
Gibt eine Soundex-Zeichenkette von @code{zeichenkette} zur�ck. Zwei
Zeichenketten, die fast gleich klingen, sollten identische
Soundex-Zeichenketten haben. Eine Standard-Soundex-Zeichenkette ist 4
Zeichen lang, aber die @code{SOUNDEX()}-Funktion gibt eine beliebig lange
Zeichenkette zur�ck. Sie k�nnen @code{SUBSTRING()} auf das Ergebnis
anwenden, um eine Standard-Soundex-Zeichenkette zu erhalten. Alle nicht
alphanumerischen Zeichen in der angegebenen Zeichenkette werden ignoriert.
Alle internationalen alphabetischen Zeichen ausserhalb des Wertebereichs A
bis Z werden als Vokale behandelt:

@example
mysql> select SOUNDEX('Hello');
        -> 'H400'
mysql> select SOUNDEX('Quadratically');
        -> 'Q36324'
@end example

@findex SPACE()
@item SPACE(N)
Gibt eine Zeichenkette zur�ck, die aus @code{N} Leerzeichen besteht:

@example
mysql> select SPACE(6);
        -> '      '
@end example

@findex REPLACE()
@item REPLACE(zeichenkette,von_zeichenkette,zu_zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der alle Vorkommen
der Zeichenkette @code{von_zeichenkette} durch die Zeichenkette
@code{zu_zeichenkette} ersetzt wurden:

@example
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex REPEAT()
@item REPEAT(zeichenkette,zaehler)
Gibt eine Zeichenkette zur�ck, die aus der Zeichenkette @code{zeichenkette}
besteht, die @code{zaehler} mal wiederholt wurde. Wenn @code{zaehler <= 0}
ist, wird eine leere Zeichenkette zur�ckgegeben. Gibt @code{NULL} zur�ck,
wenn @code{zeichenkette} oder @code{zaehler} @code{NULL} sind:

@example
mysql> select REPEAT('MySQL', 3);
        -> 'MySQLMySQLMySQL'
@end example

@findex REVERSE()
@item REVERSE(zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} in umgedrehter Reihenfolge der
Zeichen zur�ck:

@example
mysql> select REVERSE('abc');
        -> 'cba'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex INSERT()
@item INSERT(zeichenkette,position,laenge,neue_zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, wobei eine
Teilzeichenfolge ab Position @code{position} mit @code{laenge} Zeichen
L�nge durch die Zeichenkette @code{neue_zeichenkette} ersetzt wurde:

@example
mysql> select INSERT('Heinzholger', 6, 4, 'DIET');
        -> 'HeinzDIETer'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex ELT()
@item ELT(N,zeichenkette1,zeichenkette2,zeichenkette3,...)
Gibt @code{zeichenkette1} zur�ck, wenn @code{N} = @code{1} ist,
@code{zeichenkette2}, wenn @code{N} = @code{2} ist usw.. Gibt @code{NULL}
zur�ck, wenn @code{N} kleiner als @code{1} oder gr��er als die Anzahl von
Argumenten ist. @code{ELT()} ist das Komplement von @code{FIELD()}:

@example
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'
@end example

@findex FIELD()
@item FIELD(zeichenkette,zeichenkette1,zeichenkette2,zeichenkette3,...)
Gibt den Index von @code{zeichenkette} in der Liste @code{zeichenkette1},
@code{zeichenkette2}, @code{zeichenkette3}, @code{...} zur�ck. Gibt
@code{0} zur�ck, wenn @code{zeichenkette} nicht gefunden wird.
@code{FIELD()} ist das Komplement von @code{ELT()}:

@example
mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0
@end example

@findex FIND_IN_SET()
@item FIND_IN_SET(zeichenkette,zeichenkettenliste)
Gibt einen Wert @code{1} bis @code{N} zur�ck, wenn die Zeichenkette
@code{zeichenkette} in der Liste @code{zeichenkettenliste} ist, die aus
@code{N} Teilzeichenfolgen besteht. Eine Zeichenkettenliste ist eine
Zeichenkette, die aus Teilzeichenfolgen zusammen gesetzt ist, die durch
@samp{,}-Zeichen getrennt sind. Wenn das erste Argument eine
Zeichenketten-Konstante ist und das zweite eine Spalte des Typs @code{SET},
wird die @code{FIND_IN_SET()}-Funktion optimiert, Bit-Arithmetik zu
benutzen! Gibt @code{0} zur�ck, wenn @code{zeichenkette} nicht in
@code{zeichenkettenliste} ist oder wenn @code{zeichenkettenliste} die leere
Zeichenkette ist. Gibt @code{NULL} zur�ck, wenn eines oder beide Argumente
@code{NULL} sind. Diese Funktion funktioniert nicht korrekt, wenn das erste
Argument ein @samp{,} enth�lt:

@example
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2
@end example

@findex MAKE_SET()
@item MAKE_SET(bits,zeichenkette1,zeichenkette2,...)
Gibt einen Satz (eine Zeichenkette, die Teilzeichenfolgen enth�lt, die
durch @samp{,} getrennt sind) zur�ck, der aus Zeichenketten besteht, die
das entsprechende Bit in @code{bits} gesetzt haben. @code{zeichenkette1}
entspricht Bit 0, @code{zeichenkette2} Bit 1 usw. @code{NULL}-Zeichenketten
in @code{zeichenkette1}, @code{zeichenkette2} usw. werden nicht an das
Ergebnis angeh�ngt:

@example
mysql> SELECT MAKE_SET(1,'a','b','c');
        -> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hallo','liebe','welt');
        -> 'hallo,welt'
mysql> SELECT MAKE_SET(0,'a','b','c');
        -> ''
@end example

@findex EXPORT_SET()
@item EXPORT_SET(bits,an,aus,[trennzeichen,[anzahl_bits]])
Gibt eine Zeichenkette zur�ck, in der Sie f�r jedes bit, das in 'bit'
gesetzt ist, eine 'an'-Zeichenkette erhalten, und f�r jedes zur�ckgesetzte
Bit eine 'aus'-Zeichenkette. Jede Zeichenkette wird mit 'trennzeichen'
getrennt (vorgabem��ig ','), und nur die 'anzahl_bits' (vorgabem��ig 64)
von 'bits' wird benutzt:

@example
mysql> select EXPORT_SET(5,'Y','N',',',4)
        -> Y,N,Y,N
@end example

@findex LCASE()
@findex LOWER()
@item LCASE(zeichenkette)
@itemx LOWER(zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der alle Zeichen in
Kleinschreibung gem�� dem aktuellen Zeichensatz-Mapping (Vorgabe ist
ISO-8859-1 Latin1) umgewandelt wurden:

@example
mysql> select LCASE('HEINZholger');
        -> 'heinzholger'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex UCASE()
@findex UPPER()
@item UCASE(zeichenkette)
@itemx UPPER(zeichenkette)
Gibt die Zeichenkette @code{zeichenkette} zur�ck, bei der alle Zeichen in
Gro�schreibung gem�� dem aktuellen Zeichensatz-Mapping (Vorgabe ist
ISO-8859-1 Latin1) umgewandelt wurden:

@example
mysql> select UCASE('Hej');
        -> 'HEJ'
@end example

Diese Funktion ist Multi-Byte-sicher.

@findex FILE
@findex LOAD_FILE()
@item LOAD_FILE(datei)
Liest die Datei @code{datei} und gibt den Dateiinhalt als Zeichenkette
zur�ck. Die Datei muss auf dem Server sein, Sie m�ssen den vollen Pfadnamen
zur Datei angeben und Sie m�ssen die @strong{file}-Berechtigung besitzen.
Die Datei muss von allen lesbar sein und kleiner als
@code{max_allowed_packet}.

Wenn die Datei nicht existiert oder aus den oben genannten Gr�nden nicht
gelesen werden kann, gibt die Funktion @code{NULL} zur�ck:

@example
mysql> UPDATE tabelle
           SET blob_spalte=LOAD_FILE("/tmp/bild")
           WHERE id=1;
@end example
@end table

Wenn Sie nicht MySQL-Version 3.23 benutzen, m�ssen Sie das Lesen der Datei
innerhalb Ihrer Applikation durchf�hren und ein @code{INSERT}-Statement
erzeugen, um die Datenbank mit der Dateiinformation zu aktualisieren. Eine
Art, das zu tun, finden Sie - wenn Sie die MySQL++-Bibliothek benutzen -
unter
@uref{http://www.mysql.com/documentation/mysql++/mysql++-examples.html}.

MySQL konvertiert Zahlen bei Bedarf automatisch in Zeichenketten, und
umgekehrt:

@example
mysql> SELECT 1+"1";
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'
@end example

Wenn Sie eine Zahl explizit in eine Zeichenkette umwandeln wollen,
�bergeben Sie sie als Argument an @code{CONCAT()}.

Wenn in einer Zeichenketten-Funktion eine bin�re Zeichenkette als Argument
angegeben wird, ist die resultierende Zeichenkette ebenfalls eine bin�re
Zeichenkette. Eine Zahl, die in eine Zeichenkette umgewandelt wird, wird
als bin�re Zeichenkette behandelt. Das betrifft nur Vergleichsoperationen.



@menu
* String comparison functions::  
* Case Sensitivity Operators::  
@end menu

@node String comparison functions, Case Sensitivity Operators, String functions, String functions
@c German node Zeichenketten-Vergleichsfunktionen
@subsubsection Zeichenketten-Vergleichsfunktionen

@findex Zeichenketten-Vergleichsfunktionen
@findex Funktionen, Zeichenketten-Vergleich

@cindex Gro�-/Kleinschreibung, in Zeichenketten-Vergleichen
@cindex Zeichenketten-Vergleiche, Gro�-/Kleinschreibung

Normalerweise wird ein Vergleich unter Ber�cksichtigung der
Gro�-/Kleinschreibung durchgef�hrt, wenn irgend ein Ausdruck in einem
Zeichenkettenvergleich abh�ngig von der verwendeten Gro�-/Kleinschreibung
ist.

@table @code
@findex LIKE
@item ausdruck LIKE muster [ESCAPE 'fluchtzeichen']
Mustervergleich, der den einfachen SQL-Vergleich mit regul�ren Ausdr�cken
benutzt. Gibt @code{1} (TRUE) oder @code{0} (FALSE) zur�ck. Bei @code{LIKE}
k�nnen Sie die folgenden zwei Platzhalterzeichen im Muster benutzen:

@multitable @columnfractions .1 .9
@item @code{%} @tab Entspricht einer beliebigen Anzahl von Zeichen, selbst 0 Zeichen
@item @code{_} @tab Entspricht genau einem Zeichen
@end multitable

@example
mysql> select 'David!' LIKE 'David_';
        -> 1
mysql> select 'David!' LIKE '%D%v%';
        -> 1
@end example

Um auf literale Instanzen des Platzhalterzeichens zu testen, stellen Sie
dem Zeichen ein Fluchtzeichen (Escape-Zeichen) voran. Wenn Sie das
@code{ESCAPE}-Zeichen nicht angeben, wird @samp{\} angenommen:

@multitable @columnfractions .1 .9
@item @code{\%} @tab Entspricht einem @code{%}-Zeichen
@item @code{\_} @tab Entspricht einem @code{_}-Zeichen
@end multitable

@example
mysql> select 'David!' LIKE 'David\_';
        -> 0
mysql> select 'David_' LIKE 'David\_';
        -> 1
@end example

Um ein anderes Fluchtzeichen (Escape-Zeichen) anzugeben, benutzen Sie die
@code{ESCAPE}-Klausel:

@example
mysql> select 'David_' LIKE 'David|_' ESCAPE '|';
        -> 1
@end example

Die folgenden beiden Statements zeigen, dass Zeichenketten-Vergleiche die
Gro�-/Kleinschreibung nicht ber�cksichtigen, solange nicht einer der
Operanden eine bin�re Zeichenkette ist:
case insensitive unless one of the operands ist a bin�re Zeichenkette:

@example
mysql> select 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
@end example

@code{LIKE} ist bei numerischen Ausdr�cken zul�ssig! (Das ist eine
MySQL-Erweiterung zum ANSI-SQL-@code{LIKE}.)

@example
mysql> select 10 LIKE '1%';
        -> 1
@end example

HINWEIS: Weil MySQL die C Escape-Syntax in Zeichenketten benutzt
(beispielsweise @samp{\n}), m�ssen Sie jedes @samp{\}-Zeichen, das Sie in
@code{LIKE}-Zeichenketten benutzen, verdoppeln. Um zum Beispiel nach
@samp{\n} zu suchen, geben Sie @samp{\\n} ein. Um nach @samp{\} zu suchen,
geben Sie @samp{\\\\} ein (die Backslashes werden einmal vom Parser
entfernt und noch einmal, wenn der Mustervergleich durchgef�hrt wird, so
dass letztlich ein einzelner Backslash �brig bleibt).

@findex NOT LIKE
@item ausdruck NOT LIKE muster [ESCAPE 'fluchtzeichen']
Dasselbe wie @code{NOT (ausdruck LIKE muster [ESCAPE 'fluchtzeichen'])}.

@cindex mSQL-Kompatibilit�t
@cindex Kompatibilit�t, mit mSQL
@findex REGEXP
@findex RLIKE
@item ausdruck REGEXP muster
@itemx ausdruck RLIKE muster
F�hrt einen Mustervergleich eines Zeichenkettenausdrucks @code{ausdruck}
gegen ein Muster @code{muster} durch. Das Muster kann ein erweiterter
regul�rer Ausdruck sein. @xref{Regexp}. Gibt @code{1} zur�ck, wenn
@code{ausdruck} mit @code{muster} �bereinstimmt, ansonsten @code{0}.
@code{RLIKE} ist ein Synonym f�r @code{REGEXP}, was aus Gr�nden der
@code{mSQL}-Kompatibilit�t zur Verf�gung steht. HINWEIS: Weil MySQL die
C-Escape-Syntax in Zeichenketten benutzt (beispielsweise @samp{\n}), m�ssen
Sie jeden @samp{\}, den Sie in Ihren @code{REGEXP}-Zeichenketten benutzen,
verdoppeln. Ab MySQL-Version 3.23.4 ber�cksichtigt @code{REGEXP} nicht die
verwendete Gro�-/Kleinschreibung f�r normale (nicht bin�re)
Zeichenketten:

@example
mysql> select 'Monty!' REGEXP 'm%y%%';
        -> 0
mysql> select 'Monty!' REGEXP '.*';
        -> 1
mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line';
        -> 1
mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A";
        -> 1  0
mysql> select "a" REGEXP "^[a-d]";
        -> 1
@end example

@item
@code{REGEXP} und @code{RLIKE} benutzen den aktuellen Zeichensatz
(vorgabem��ig ISO-8859-1 Latin1), wenn �ber den Typ eines Zeichens
entschieden wird.

@findex NOT REGEXP
@item ausdruck NOT REGEXP muster
@itemx ausdruck NOT RLIKE muster
Dasselbe wie @code{NOT (ausdruck REGEXP muster)}.

@findex STRCMP()
@item STRCMP(ausdruck1,ausdruck2)
@code{STRCMP()} gibt @code{0} zur�ck, wenn die Zeichenketten gleich sind,
@code{-1}, wenn das erste Argument kleiner als das zweite ist (nach der
aktuellen Sortierreihenfolge), und ansonsten @code{1}:

@example
mysql> select STRCMP('text', 'text2');
        -> -1
mysql> select STRCMP('text2', 'text');
        -> 1
mysql> select STRCMP('text', 'text');
        -> 0
@end example

@findex MATCH ... AGAINST()
@item MATCH (spalte1,spalte2,...) AGAINST (ausdruck)
@code{MATCH ... AGAINST()} wird f�r Volltextsuche benutzt und gibt die
Relevanz zur�ck - ein �hnlichkeitsma� zwischen dem Text in den Spalten
@code{(spalte1,spalte2,...)} und der Anfrage @code{ausdruck}. Die Relevanz
ist eine positive Flie�kommazahl. 0 Relevanz bedeutet keine �hnlichkeit.
Damit @code{MATCH ... AGAINST()} funktioniert, muss zuerst ein
@strong{FULLTEXT}-Index erzeugt werden. @xref{CREATE TABLE, , @code{CREATE TABLE}}. @code{MATCH ... AGAINST()} ist verf�gbar ab MySQL-Version 3.23.23.
F�r Details und Benutzungsbeispiele siehe @pxref{Fulltext Search}.
@end table


@node Case Sensitivity Operators,  , String comparison functions, String functions
@c German node Operatoren und Gro�-/Kleinschreibung
@subsubsection Gro�-/Kleinschreibung

@findex Casts

@cindex Cast-Operatoren
@cindex Operatoren, Cast-

@table @code
@findex BINARY
@item @code{BINARY}
Der @code{BINARY}-Operator macht die folgende Zeichenkette zu einer bin�ren
Zeichenkette. Das ist eine einfache M�glichkeit, einen Spaltenvergleich
zwangsweise in Abh�ngigkeit von der verwendeten Gro�-/Kleinschreibung
durchzuf�hren, selbst wenn die Spalte nicht als @code{BINARY} oder
@code{BLOB} definiert ist:
@example
mysql> select "a" = "A";
        -> 1
mysql> select BINARY "a" = "A";
        -> 0
@end example

@code{BINARY} wurde in MySQL-Version 3.23.0 eingef�hrt.

Beachten Sie, dass MySQL in manchen F�llen nicht in der Lage ist, den Index
effizient zu benutzen, wenn Sie eine indizierte Spalte zu @code{BINARY}
machen.
@end table

Wenn Sie ein Blob ohne Ber�cksichtigung der Gro�-/Kleinschreibung
vergleichen wollen, k�nnen Sie den Blob jederzeit in Gro�schreibung
umwandeln, bevor Sie den Vergleich durchf�hren:

@example
SELECT 'A' LIKE UPPER(blob_spalte) FROM tabelle;
@end example

Wir planen, bald Casting zwischen unterschiedlichen Zeichens�tzen
einzuf�hren, um Zeichenketten-Vergleiche noch flexibler zu machen.


@node Numeric Functions, Date and time functions, String functions, Functions
@c German node Numerische Funktionen
@subsection Numerische Funktionen



@menu
* Arithmetic functions::        
* Mathematical functions::      
@end menu

@node Arithmetic functions, Mathematical functions, Numeric Functions, Numeric Functions
@c German node Arithmetische Funktionen
@subsubsection Arithmetische Operationen

Es gibt die �blichen arithmetischen Operatoren. Beachten Sie, dass das
Ergebnis im Falle von @samp{-}, @samp{+} und @samp{*} mit
@code{BIGINT}-Genauigkeit (64-Bit) berechnet wird, wenn beide Argumente
Ganzzahlen sind!

@cindex Operationen, arithmetische
@cindex arithmetische Ausdr�cke
@table @code
@findex + (Addition)
@findex Addition (+)
@item +
Addition:
@example
mysql> select 3+5;
        -> 8
@end example

@findex - (Subtraktion)
@findex Subtraktion (-)
@item -
Subtraktion:
@example
mysql> select 3-5;
        -> -2
@end example

@findex * (Multiplikation)
@findex Multiplikation (*)
@item *
Multiplication:
@example
mysql> select 3*5;
        -> 15
mysql> select 18014398509481984*18014398509481984.0;
        -> 324518553658426726783156020576256.0
mysql> select 18014398509481984*18014398509481984;
        -> 0
@end example

Das Ergebnis des letzten Ausdrucks ist falsch, weil die
Ganzzahl-Multiplikation den 64-Bit-Wertebereich von
@code{BIGINT}-Berechnungen �berschreitet.

@findex / (Division)
@findex Division (/)
@item /
Division:
@example
mysql> select 3/5;
        -> 0.60
@end example

Division durch 0 erzeugt ein @code{NULL}-Ergebnis:

@example
mysql> select 102/(1-1);
        -> NULL
@end example

Eine Division wird nur dann mit @code{BIGINT}-Arithmetik berechnet, wenn
sie in einem Zusammenhang durchgef�hrt wird, in dem das Ergebnis in eine
Ganzzahl umgewandelt wird!
@end table


@node Mathematical functions,  , Arithmetic functions, Numeric Functions
@c German node Mathematische Funktionen
@subsubsection Mathematische Funktionen
Alle mathematischen Funktionen geben im Fehlerfall @code{NULL} zur�ck.

@findex mathematische Funktionen
@findex Funktionen, mathematische

@table @code
@findex - (un�res Minus)
@findex Minus, un�res (-)
@findex un�res Minus (-)
@item -
Un�res Minus. �ndert das Vorzeichen des Arguments:
@example
mysql> select - 2;
        -> -2
@end example

Wenn dieser Operator mit einer @code{BIGINT} benutzt wird, beachten Sie,
dass der R�ckgabewert eine @code{BIGINT} ist! Das bedeutet, dass Sie
@code{-} auf Ganzzahlen, die den Wert @code{-2^63} haben k�nnten, vermeiden
sollten!

@findex ABS()
@item ABS(X)
Gibt den absoluten Wert von @code{X} zur�ck:
@example
mysql> select ABS(2);
        -> 2
mysql> select ABS(-32);
        -> 32
@end example

Diese Funktion kann bei @code{BIGINT}-Werten sicher benutzt werden.

@findex SIGN()
@item SIGN(X)
Gibt das Vorzeichen des Arguments als @code{-1}, @code{0} oder @code{1}
zur�ck, abh�ngig davon, ob @code{X} negativ, 0 oder positiv ist:
@example
mysql> select SIGN(-32);
        -> -1
mysql> select SIGN(0);
        -> 0
mysql> select SIGN(234);
        -> 1
@end example

@findex MOD()
@c German FIX added space before %
@findex % (Modulo)
@findex Modulo (%)
@item MOD(N,M)
@c German FIX added space before %
@itemx %
Modulo (wie der @code{%}-Operator in C). Gibt den Rest von @code{N}
dividiert durch @code{M} zur�ck:
@example
mysql> select MOD(234, 10);
        -> 4
mysql> select 253% 7;
        -> 1
mysql> select MOD(29,9);
        -> 2
@end example

Diese Funktion kann bei @code{BIGINT}-Werten sicher benutzt werden.

@findex FLOOR()
@item FLOOR(X)
Gibt den gr��ten Ganzzahl-Wert zur�ck, der nicht gr��er als @code{X}
ist:
@example
mysql> select FLOOR(1.23);
        -> 1
mysql> select FLOOR(-1.23);
        -> -2
@end example

Beachten Sie, dass der R�ckgabewert in eine @code{BIGINT} umgewandelt
wird!

@findex CEILING()
@item CEILING(X)
Gibt den kleinsten Ganzzahl-Wert zur�ck, der nicht kleiner als @code{X}
ist:
@example
mysql> select CEILING(1.23);
        -> 2
mysql> select CEILING(-1.23);
        -> -1
@end example

Beachten Sie, dass der R�ckgabewert in eine @code{BIGINT} umgewandelt wird!

@findex ROUND()
@item ROUND(X)
Gibt das Argument @code{X} zur�ck, gerundet auf die n�chste Ganzzahl:
@example
mysql> select ROUND(-1.23);
        -> -1
mysql> select ROUND(-1.58);
        -> -2
mysql> select ROUND(1.58);
        -> 2
@end example

Beachten Sie, dass das Verhalten von @code{ROUND()} abh�ngig von der
C-Bibliothek-Implementation ist, wenn das Argument in der Mitte zwischen
zwei Ganzzahlen liegt. Einige runden auf die n�chste gerade Zahl, oder
immer nach oben, immer nach unten oder immer Richtung 0. Wenn Sie eine
bestimmte Art zu runden brauchen, sollten Sie statt dessen wohldefinierte
Funktionen wie @code{TRUNCATE()} oder @code{FLOOR()} benutzen.

@findex ROUND()
@item ROUND(X,D)
Gibt das Argument @code{X} zur�ck, gerundet auf eine Zahl mit @code{D}
Dezimalstellen. Wenn @code{D} @code{0} ist, hat das Ergebnis keinen
Dezimalpunkt oder Bruchteil:

@example
mysql> select ROUND(1.298, 1);
        -> 1.3
mysql> select ROUND(1.298, 0);
        -> 1
@end example

@findex EXP()
@item EXP(X)
Gibt den Wert @code{e} (die Basis des nat�rlichen Logarithmus) hoch
@code{X} zur�ck:
@example
mysql> select EXP(2);
        -> 7.389056
mysql> select EXP(-2);
        -> 0.135335
@end example
@findex LOG()
@item LOG(X)
Gibt den nat�rlichen Logarithmus von @code{X} zur�ck:
@example
mysql> select LOG(2);
        -> 0.693147
mysql> select LOG(-2);
        -> NULL
@end example
Wenn Sie den Logarithmus einer Zahl @code{X} zu einer beliebigen Basis
@code{B} errechnen wollen, benutzen Sie die Formel @code{LOG(X)/LOG(B)}.

@findex LOG10()
@item LOG10(X)
Gibt den Logarithmus zur Basis 10 von @code{X} zur�ck:
@example
mysql> select LOG10(2);
        -> 0.301030
mysql> select LOG10(100);
        -> 2.000000
mysql> select LOG10(-100);
        -> NULL
@end example

@findex POW()
@findex POWER()
@item POW(X,Y)
@itemx POWER(X,Y)
Gibt den Wert @code{X} hoch @code{Y} zur�ck:
@example
mysql> select POW(2,2);
        -> 4.000000
mysql> select POW(2,-2);
        -> 0.250000
@end example

@findex SQRT()
@item SQRT(X)
Gibt die nicht negative Quadratwurzel von @code{X} zur�ck:
@example
mysql> select SQRT(4);
        -> 2.000000
mysql> select SQRT(20);
        -> 4.472136
@end example

@findex PI()
@item PI()
Gibt den Wert PI zur�ck. Die vorgabem��ig angezeigte Anzahl von
Dezimalstellen ist 5, aber MySQL benutzt intern die volle doppelte
Genauigkeit f�r PI.
@example
mysql> select PI();
        -> 3.141593
mysql> SELECT PI()+0.000000000000000000;
        -> 3.141592653589793116
@end example

@findex COS()
@item COS(X)
Gibt den Cosinus von @code{X} zur�ck, wobei @code{X} in Radianten angegeben
wird:
@example
mysql> select COS(PI());
        -> -1.000000
@end example

@findex SIN()
@item SIN(X)
Gibt den Sinus von @code{X} zur�ck, wobei @code{X} in Radianten angegeben
wird:
@example
mysql> select SIN(PI());
        -> 0.000000
@end example

@findex TAN()
@item TAN(X)
Gibt den Tangens von @code{X} zur�ck, wobei @code{X} in Radianten angegeben
wird:
@example
mysql> select TAN(PI()+1);
        -> 1.557408
@end example

@findex ACOS()
@item ACOS(X)
Gibt den Arcuscosinus von @code{X} zur�ck, dass hei�t den Wert, dessen
Cosinus @code{X} ist. Gibt @code{NULL} zur�ck, wenn @code{X} nicht im
Bereich von @code{-1} bis @code{1} liegt:
@example
mysql> select ACOS(1);
        -> 0.000000
mysql> select ACOS(1.0001);
        -> NULL
mysql> select ACOS(0);
        -> 1.570796
@end example

@findex ASIN()
@item ASIN(X)
Gibt den Arcussinus von @code{X} zur�ck, das hei�t den Wert, dessen Sinus
@code{X} ist. Gibt @code{NULL} zur�ck, wenn @code{X} nicht im Bereich von
@code{-1} bis @code{1} liegt:
@example
mysql> select ASIN(0.2);
        -> 0.201358
mysql> select ASIN('foo');
        -> 0.000000
@end example

@findex ATAN()
@item ATAN(X)
Gibt den Arcustangens von @code{X} zur�ck, das hei�t den Wert, dessen
Tangens @code{X} ist:
@example
mysql> select ATAN(2);
        -> 1.107149
mysql> select ATAN(-2);
        -> -1.107149
@end example

@findex ATAN2()
@item ATAN2(Y,X)
Gibt den Arcustangens der beiden Variablen @code{X} und @code{Y} zur�ck.
Das �hnelt der Berechnung des Arcustangens von @code{Y / X}, ausser dass
die Vorzeichen beider Argumente benutzt werden, um den Quadranten des
Ergebnisses zu bestimmen:
@example
mysql> select ATAN(-2,2);
        -> -0.785398
mysql> select ATAN(PI(),0);
        -> 1.570796
@end example

@findex COT()
@item COT(X)
Gibt den Cotangens von @code{X} zur�ck:
@example
mysql> select COT(12);
        -> -1.57267341
mysql> select COT(0);
        -> NULL
@end example

@findex RAND()
@item RAND()
@itemx RAND(N)
Gibt eine Zufallszahl (Flie�kommawert) im Bereich von @code{0} bis
@code{1.0} zur�ck. Wenn ein Ganzzahl-Argument @code{N} angegeben wird, wird
es als Ausgangswert benutzt:
@example
mysql> select RAND();
        -> 0.5925
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND();
        -> 0.2079
mysql> select RAND();
        -> 0.7888
@end example
Sie k�nnen eine Spalte mit @code{RAND()}-Werten nicht in einer @code{ORDER
BY}-Klausel verwenden, weil @code{ORDER BY} die Spalte mehrfach auswerten
w�rde. In MySQL-Version 3.23 k�nnen Sie jedoch folgendes tun:
@code{SELECT * FROM tabelle ORDER BY RAND()}

Das ist n�tzlich, um eine Zufallsstichprobe aus @code{SELECT * FROM
tabelle1,tabelle2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000} zu
erhalten.

Beachten Sie, dass ein @code{RAND()} in einer @code{WHERE}-Klausel jedes
Mal von Neuem ausgewertet wird, wenn @code{WHERE} ausgef�hrt wird.

@findex LEAST()
@item LEAST(X,Y,...)
Mit zwei oder mehr Argumenten gibt die Funktion das kleinste Argument (das
mit dem niedrigsten Wert) zur�ck. Die Argumente werden nach folgenden
Regeln verglichen:

@itemize @bullet
@item
Wenn der R�ckgabewert in einem @code{INTEGER}-Zusammenhang benutzt wird
oder alle Argumente Ganzzahl-Werte sind, werden sie als Ganzzahlen
verglichen.

@item
Wenn der R�ckgabewert in einem @code{REAL}-Zusammenhang benutzt wird oder
alle Argumente Realzahlen sind, werden sie als Realzahlen verglichen.

@item
Wenn irgend ein Argument eine von der Gro�-/Kleinschreibung abh�ngige
Zeichenkette ist, werden die Argumente als Zeichenketten, die von der
Gro�-/Kleinschreibung abh�ngen, verglichen.

@item
In sonstigen F�llen werden die Argumente als Zeichenketten verglichen, die
nicht von der Gro�-/Kleinschreibung abh�ngen:
@end itemize

@example
mysql> select LEAST(2,0);
        -> 0
mysql> select LEAST(34.0,3.0,5.0,767.0);
        -> 3.0
mysql> select LEAST("B","A","C");
        -> "A"
@end example
In MySQL-Versionen vor Version 3.22.5 k�nnen Sie @code{MIN()} statt
@code{LEAST} benutzen.

@findex GREATEST()
@item GREATEST(X,Y,...)
Gibt das gr��te Argument (das mit dem h�chsten Wert) zur�ck. Die Argumente
werden nach denselben Regeln wie bei @code{LEAST} verglichen:
@example
mysql> select GREATEST(2,0);
        -> 2
mysql> select GREATEST(34.0,3.0,5.0,767.0);
        -> 767.0
mysql> select GREATEST("B","A","C");
        -> "C"
@end example
In MySQL-Versionen vor Version 3.22.5 k�nnen Sie @code{MAX()} statt
@code{GREATEST} benutzen.

@findex DEGREES()
@item DEGREES(X)
Gibt das Argument @code{X} zur�ck, von Radianten zu Grad umgewandelt:
@example
mysql> select DEGREES(PI());
        -> 180.000000
@end example

@findex RADIANS()
@item RADIANS(X)
Gibt das Argument @code{X} zur�ck, von Grad zu Radianten umgewandelt:
@example
mysql> select RADIANS(90);
        -> 1.570796
@end example

@findex TRUNCATE()
@item TRUNCATE(X,D)
Gibt die Zahl @code{X} zur�ck, auf @code{D} Dezimalstellen beschnitten.
Wenn @code{D} @code{0} ist, hat das Ergebnis keinen Dezimalpunkt oder
Bruchteil:
@example
mysql> select TRUNCATE(1.223,1);
        -> 1.2
mysql> select TRUNCATE(1.999,1);
        -> 1.9
mysql> select TRUNCATE(1.999,0);
        -> 1
@end example

Beachten Sie, dass Dezimalzahlen in Computern normalerweise nicht als
exakte Zahlen, sondern als Double-Werte gespeichert werden. Daher k�nnen
verwirrende Ergebnisse wie im folgenden Beispiel auftreten:

@cindex Rundungsfehler
@example
mysql> select TRUNCATE(10.28*100,0);
       -> 1027
@end example

Das Obige passiert, weil 10.28 tats�chlich als etwas wie
10.2799999999999999 gespeichert wird.
@end table


@node Date and time functions, Other Functions, Numeric Functions, Functions
@c German node Datums- und Zeit-Funktionen
@subsection Datums- und Zeit-Funktionen

@findex Datums- und Zeit-Funktionen
@findex Funktionen, Datums- und Zeit-

Eine Beschreibung des Wertebereichs aller Typen und der g�ltigen Formate
f�r Datums- und Zeitwerte finden Sie unter @ref{Date and time types}.

Hier ist ein Beispiel, das Datums-Funktionen benutzt. Die unten stehende
Anfrage w�hlt alle Datens�tze mit einem @code{datum_spalte}-Wert innerhalb
der letzten 30 Tage aus:

@example
mysql> SELECT etwas FROM tabelle
           WHERE TO_DAYS(NOW()) - TO_DAYS(datum_spalte) <= 30;
@end example

@table @code
@findex DAYOFWEEK()
@item DAYOFWEEK(datum)
Gibt den Wochentag-Index zur�ck.

F�r @code{datum} gilt: @code{1} = Sonntag, @code{2} = Montag, ... @code{7}
= Samstag). Diese Index-Werte entsprechen dem ODBC-Standard:

@example
mysql> select DAYOFWEEK('1998-02-03');
        -> 3
@end example

@findex WEEKDAY()
@item WEEKDAY(datum)
Gibt den Wochentag-Index f�r @code{datum} zur�ck (@code{0} = Montag,
@code{1} = Dienstag, ... @code{6} = Sonntag):

@example
mysql> select WEEKDAY('1997-10-04 22:23:00');
        -> 5
mysql> select WEEKDAY('1997-11-05');
        -> 2
@end example

@findex DAYOFMONTH()
@item DAYOFMONTH(datum)
Gibt den Tag des Monats f�r @code{datum} im Bereich @code{1} bis @code{31}
zur�ck:

@example
mysql> select DAYOFMONTH('1998-02-03');
        -> 3
@end example

@findex DAYOFYEAR()
@item DAYOFYEAR(datum)
Gibt den Tag des Jahres f�r @code{datum} im Bereich @code{1} bis @code{366}
zur�ck:

@example
mysql> select DAYOFYEAR('1998-02-03');
        -> 34
@end example

@findex MONTH()
@item MONTH(datum)
Gibt den Monat f�r @code{datum} im Bereich @code{1} bis @code{12} zur�ck:

@example
mysql> select MONTH('1998-02-03');
        -> 2
@end example

@findex DAYNAME()
@item DAYNAME(datum)
Gibt den Namen des Wochentags f�r @code{datum} zur�ck (auf englisch):

@example
mysql> select DAYNAME("1998-02-05");
        -> 'Thursday'
@end example

@findex MONTHNAME()
@item MONTHNAME(datum)
Gibt den Namen des Monats f�r @code{datum} zur�ck (auf englisch):

@example
mysql> select MONTHNAME("1998-02-05");
        -> 'February'
@end example

@findex QUARTER()
@item QUARTER(datum)
Gibt das Quartal des Jahres f�r @code{datum} im Bereich @code{1} bis
@code{4} zur�ck:

@example
mysql> select QUARTER('98-04-01');
        -> 2
@end example

@findex WEEK()
@item WEEK(datum)
@itemx WEEK(datum,erste)
Mit einem einzelnen Argument gibt diese Funktion die Woche f�r @code{datum}
im Bereich @code{0} bis @code{53} zur�ck (ja, es kann Anf�nge der Woche 53
geben), f�r Orte, in denen Sonntag der erste Wochentag ist. In der Form mit
zwei Argumenten gestattet @code{WEEK()} es, festzulegen, ob die Woche am
Sonntag oder am Montag beginnt. Die Woche beginnt am Sonntag, wenn das
zweite Argument @code{0} ist, und am Montag, wenn das zweite Argument
@code{1} ist:

@example
mysql> select WEEK('1998-02-20');
        -> 7
mysql> select WEEK('1998-02-20',0);
        -> 7
mysql> select WEEK('1998-02-20',1);
        -> 8
mysql> select WEEK('1998-12-31',1);
        -> 53
@end example

@findex YEAR()
@item YEAR(datum)
Gibt das Jahr f�r @code{datum} im Bereich @code{1000} bis @code{9999}
zur�ck:

@example
mysql> select YEAR('98-02-03');
        -> 1998
@end example

@item YEARWEEK(datum)
@itemx YEARWEEK(datum,erste)
Gibt Jahr und Woche f�r ein Datum zur�ck. Das zweite Argument funktioniert
genau wie das zweite Argument von @code{WEEK()}. Beachten Sie, dass das
Jahr sich in der ersten und letzten Woche des Jahres vom Jahr im
Datums-Argument unterscheiden kann:

@example
mysql> select YEARWEEK('1987-01-01');
        -> 198653
@end example

@findex HOUR()
@item HOUR(zeit)
Gibt die Stunde f�r @code{zeit} im Bereich @code{0} bis @code{23} zur�ck:

@example
mysql> select HOUR('10:05:03');
        -> 10
@end example

@findex MINUTE()
@item MINUTE(zeit)
Gibt die Minute f�r @code{zeit} im Bereich @code{0} bis @code{59} zur�ck:

@example
mysql> select MINUTE('98-02-03 10:05:03');
        -> 5
@end example

@findex SECOND()
@item SECOND(zeit)
Gibt die Sekunde f�r @code{zeit} im Bereich @code{0} bis @code{59} zur�ck:

@example
mysql> select SECOND('10:05:03');
        -> 3
@end example

@findex PERIOD_ADD()
@item PERIOD_ADD(P,N)
Z�hlt @code{N} Monate zur Periode @code{P} hinzu (im Format @code{YYMM}
oder @code{YYYYMM}). Gibt einen Wert im Format @code{YYYYMM} zur�ck.

Beachten Sie, dass das Perioden-Argument @code{P} @emph{kein} Datums-Wert
ist:

@example
mysql> select PERIOD_ADD(9801,2);
        -> 199803
@end example

@findex PERIOD_DIFF()
@item PERIOD_DIFF(P1,P2)
Gibt die Anzahl von Monaten zwischen den Perioden @code{P1} und @code{P2}
zur�ck. @code{P1} und @code{P2} sollten im Format @code{YYMM} oder
@code{YYYYMM} sein.

Beachten Sie, dass die Perioden-Argumente @code{P1} und @code{P2}
@emph{keine} Datumswerte sind:

@example
mysql> select PERIOD_DIFF(9802,199703);
        -> 11
@end example

@findex DATE_ADD()
@findex DATE_SUB()
@findex ADDDATE()
@findex SUBDATE()
@findex EXTRACT()
@item DATE_ADD(datum,INTERVAL ausdruck typ)
@itemx DATE_SUB(datum,INTERVAL ausdruck typ)
@itemx ADDDATE(datum,INTERVAL ausdruck typ)
@itemx SUBDATE(datum,INTERVAL ausdruck typ)

Diese Funktionen f�hren Datumsberechnungen durch. Sie wurden in
MySQL-Version 3.22 eingef�hrt. @code{ADDDATE()} und @code{SUBDATE()} sind
Synonyme f�r @code{DATE_ADD()} und @code{DATE_SUB()}.

In MySQL-Version 3.23 k�nnen Sie @code{+} und @code{-} anstelle von
@code{DATE_ADD()} und @code{DATE_SUB()} benutzen, wenn der Ausdruck auf der
rechten Seite eine DATE oder DATETIME-Spalte ist (siehe Beispiel).

@code{datum} ist ein @code{DATETIME}- oder @code{DATE}-Wert, der das
Anfangsdatum festlegt. @code{ausdruck} ist ein Ausdruck, der den
Intervallwert festlegt, der zum Anfangsdatum hinzugez�hlt oder von diesem
abgezogen wird. @code{ausdruck} ist eine Zeichenkette; sie kann mit einem
@samp{-} f�r negative Intervalle beginnen. @code{typ} ist ein
Schl�sselwort, das angibt, wie der Ausdruck interpretiert werden soll.

Die verwandte Funktion @code{EXTRACT(typ FROM datum)} gibt das
'typ'-Intervall des Datums zur�ck.

Folgende Tabelle zeigt, in welchem Zusammenhang die @code{typ}- und
@code{ausdruck}-Argumente stehen:

@multitable @columnfractions .5 .5
@item @code{typ} @strong{wert} @tab @strong{erwartet} @code{ausdruck} @strong{format}
@item @code{SECOND}        @tab @code{Sekunden}
@item @code{MINUTE}        @tab @code{Minuten}
@item @code{HOUR}          @tab @code{Stunden}
@item @code{DAY}           @tab @code{Tage}
@item @code{MONTH}         @tab @code{Monate}
@item @code{YEAR}          @tab @code{Jahre}
@item @code{MINUTE_SECOND} @tab @code{"Minuten:Sekunden"}
@item @code{HOUR_MINUTE}   @tab @code{"Stunden:Minuten"}
@item @code{DAY_HOUR}      @tab @code{"Tage Stunden"}
@item @code{YEAR_MONTH}    @tab @code{"Jahre-Monate"}
@item @code{HOUR_SECOND}   @tab @code{"Stunden:Minuten:Sekunden"}
@item @code{DAY_MINUTE}    @tab @code{"Tage Stunden:Minuten"}
@item @code{DAY_SECOND}    @tab @code{"Tage Stunden:Minuten:Sekunden"}
@end multitable

MySQL erlaubt beliebige Satzzeichen-Begrenzer im @code{ausdruck}-Format.
Die in der Tabelle gezeigten Begrenzer sind Vorschl�ge. Wenn das
@code{datum}-Argument ein @code{DATE}-Wert ist und Ihre Berechnungen nur
@code{YEAR}, @code{MONTH} und @code{DAY}-Anteile beinhalten (also keine
Zeit-Anteile), ist das Ergebnis ein @code{DATE}-Wert. Ansonsten ist das
Ergebnis ein @code{DATETIME}-Wert:

@example
mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
        -> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
        -> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
       -> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 SECOND);
        -> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL 1 DAY);
        -> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
                       INTERVAL "1:1" MINUTE_SECOND);
        -> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
                       INTERVAL "1 1:1:1" DAY_SECOND);
        -> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
                       INTERVAL "-1 10" DAY_HOUR);
        -> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
        -> 1997-12-02
@end example

Wenn Sie einen Intervallwert angeben, der zu kurz ist (nicht alle
Intervall-Anteile beinhaltet, die vom @code{typ}-Schl�sselwort erwartet
werden), nimmt MySQL an, dass Sie den �u�ersten linken Teil des
Intervallwerts ausgelassen haben. Wenn Sie beispielsweise einen @code{typ}
@code{DAY_SECOND} angeben, wird vom Wert von @code{ausdruck} erwartet, dass
dieser Tages-, Stunden-, Minuten- und Sekunden-Anteile enth�lt. Wenn Sie
einen Wert wie @code{"1:10"} angeben, nimmt MySQL an, dass die Tages- und
Stunden-Anteile fehlen und der Wert Minuten und Sekunden darstellt. Mit
anderen Worten wird @code{"1:10" DAY_SECOND} so interpretiert, dass es
�quivalent zu @code{"1:10" MINUTE_SECOND} ist. Das ist analog zur Weise,
wie MySQL @code{TIME}-Werte interpretiert, die eher vergangene Zeit als
Tageszeit darstellen.

Beachten Sie, dass ein Datumswert automatisch in einen DATETIME-Wert
umgewandelt wird, wenn Sie einen DATE-Wert zu etwas hinzuz�hlen oder von
etwas abziehen, das einen Zeit-Anteil hat:

@example
mysql> select date_add("1999-01-01", interval 1 day);
       -> 1999-01-02
mysql> select date_add("1999-01-01", interval 1 hour);
       -> 1999-01-01 01:00:00
@end example

Wenn Sie wirklich falsche Datumsangaben benutzen, ist das Ergebnis
@code{NULL}. Wenn Sie @code{MONTH}, @code{YEAR_MONTH} oder @code{YEAR}
hinzuz�hlen und das Datumsergebnis einen Tag hat, der gr��er ist als der
h�chste Tag f�r den neuen Monat, wird der Tag auf den h�chsten Tag des
neuen Monats angepasst:

@example
mysql> select DATE_ADD('1998-01-30', Interval 1 month);
        -> 1998-02-28
@end example

Beachten Sie, dass das Wort @code{INTERVAL} und das
@code{typ}-Schl�sselwort in den vorstehenden Beispielen nicht von der
verwendeten Gro�-/Kleinschreibung abh�ngen.

@findex EXTRACT()
@item EXTRACT(typ FROM datum)

Die @code{EXTRACT()}-Funktion benutzt dieselbe Art von
Intervalltyp-Spezifikatoren wie @code{DATE_ADD()} oder @code{DATE_SUB()},
extrahiert aber Anteile aus dem Datum, statt Datumsberechnungen
durchzuf�hren:

@example
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
       -> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
       -> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
       -> 20102
@end example

@findex TO_DAYS()
@item TO_DAYS(datum)
Gibt f�r ein Datum @code{datum} eine Tagesanzahl zur�ck (die Anzahl von
Tagen seit dem Jahr 0):

@example
mysql> select TO_DAYS(950501);
        -> 728779
mysql> select TO_DAYS('1997-10-07');
        -> 729669
@end example

@code{TO_DAYS()} ist nicht f�r die Benutzung mit Werten vor der Einf�hrung
des Gregorianischen Kalenders (1582) vorgesehen, weil es nicht die Tage
ber�cksichtigt, die verloren gingen, als der Kalender ge�ndert wurde.

@findex FROM_DAYS()
@item FROM_DAYS(N)
Gibt f�r eine Tagesanzahl @code{N} einen @code{DATE}-Wert zur�ck:

@example
mysql> select FROM_DAYS(729669);
        -> '1997-10-07'
@end example

@code{FROM_DAYS()} ist nicht f�r die Benutzung mit Werten vor der Einf�hrung
des Gregorianischen Kalenders (1582) vorgesehen, weil es nicht die Tage
ber�cksichtigt, die verloren gingen, als der Kalender ge�ndert wurde.

@findex DATE_FORMAT()
@item DATE_FORMAT(datum,format)
Formatiert den @code{datum}-Wert gem�� der @code{format}-Zeichenkette.
Folgende Spezifikatoren k�nnen in der @code{format}-Zeichenkette benutzt
werden:
@multitable @columnfractions .1 .6
@item @code{%M} @tab Monatsname auf englisch (@code{January} bis @code{December})
@item @code{%W} @tab Name des Wochentags auf englisch (@code{Sunday} bis @code{Saturday})
@item @code{%D} @tab Tag des Monats mit englischem Suffix (@code{1st}, @code{2nd}, @code{3rd} usw.)
@item @code{%Y} @tab Jahr, numerisch, 4 Ziffern
@item @code{%y} @tab Jahr, numerisch, 2 Ziffern
@item @code{%X} @tab Jahr der Woche, wobei Sonntag der erste Tag der Woche ist, numerisch, 4 Ziffern, benutzt mit '%V'
@item @code{%x} @tab Jahr der Woche, wobei Montag der erste Tag der Woche ist, numerisch, 4 Ziffern, benutzt mit '%v'
@item @code{%a} @tab Abgek�rzter Name des Wochentags auf englisch (@code{Sun}..@code{Sat})
@item @code{%d} @tab Tag des Monats, numerisch (@code{00} bis @code{31})
@item @code{%e} @tab Tag des Monats, numerisch (@code{0} bis @code{31})
@item @code{%m} @tab Monat, numerisch (@code{01} bis @code{12})
@item @code{%c} @tab Monat, numerisch (@code{1} bis @code{12})
@item @code{%b} @tab Abgek�rzter Monatsname auf englisch (@code{Jan} bis @code{Dec})
@item @code{%j} @tab Tag des Jahrs (@code{001} bis @code{366})
@item @code{%H} @tab Stunde (@code{00} bis @code{23})
@item @code{%k} @tab Stunde (@code{0} bis @code{23})
@item @code{%h} @tab Stunde (@code{01} bis @code{12})
@item @code{%I} @tab Stunde (@code{01} bis @code{12})
@item @code{%l} @tab Stunde (@code{1} bis @code{12})
@item @code{%i} @tab Minuten, numerisch (@code{00} bis @code{59})
@item @code{%r} @tab Uhrzeit, 12-Stunden-Format (@code{hh:mm:ss [AP]M})
@item @code{%T} @tab Uhrzeit, 24-Stunden-Format (@code{hh:mm:ss})
@item @code{%S} @tab Sekunden (@code{00} bis @code{59})
@item @code{%s} @tab Sekunden (@code{00} bis @code{59})
@item @code{%p} @tab @code{AM} oder @code{PM}
@item @code{%w} @tab Wochentag (@code{0}=Sonntag bis @code{6}=Samstag)
@item @code{%U} @tab Woche (@code{0} bis @code{53}), wobei Sonntag der erste Tag der Woche ist
@item @code{%u} @tab Woche (@code{0} bis @code{53}), wobei Montag der erste Tag der Woche ist
@item @code{%V} @tab Woche (@code{1} bis @code{53}), wobei Sonntag der erste Tag der Woche ist. Benutzt mit '%X'
@item @code{%v} @tab Woche (@code{1} bis @code{53}), wobei Montag der erste Tag der Woche ist. Benutzt mit '%x'
@item @code{%%} @tab Ein Literal @samp{%}.
@end multitable

Alle anderen Zeichen werden einfach ohne Interpretation ins Ergebnis
kopiert:

@example
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W%M%Y');
        -> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%D%y%a%d%m%b%j');
        -> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
                          '%H%k%I%r%T%S%w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> select DATE_FORMAT('1999-01-01', '%X%V');
        -> '1998 52'
@end example

Ab MySQL-Version 3.23 ist das @samp{%}-Zeichen vor
Format-Spezifikator-Zeichen erforderlich. In fr�heren Versionen von MySQL
war @samp{%} optional.

@findex TIME_FORMAT()
@item TIME_FORMAT(zeit,format)
Dieses wird benutzt wie die obige @code{DATE_FORMAT()}-Funktion, aber die
@code{format}-Zeichenkette darf nur die Spezifikatoren enthalten, die
Stunden, Minuten und Sekunden handhaben. Andere Spezifikatoren erzeugen
einen @code{NULL}-Wert oder @code{0}.

@findex CURDATE()
@findex CURRENT_DATE
@item CURDATE()
@itemx CURRENT_DATE
Gibt das Datum von heute im @code{'YYYY-MM-DD'}- oder
@code{YYYYMMDD}-format zur�ck, abh�ngig davon, ob die Funktion in einem
Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:

@example
mysql> select CURDATE();
        -> '1997-12-15'
mysql> select CURDATE() + 0;
        -> 19971215
@end example

@findex CURTIME()
@findex CURRENT_TIME
@item CURTIME()
@itemx CURRENT_TIME
Gibt die aktuelle Zeit als einen Wert im @code{'HH:MM:SS'}- oder
@code{HHMMSS}-format zur�ck, abh�ngig davon, ob die Funktion in einem
Zeichenketten- oder in einem numerischen Zusammenhang benutzt wird:

@example
mysql> select CURTIME();
        -> '23:50:26'
mysql> select CURTIME() + 0;
        -> 235026
@end example

@findex NOW()
@findex SYSDATE()
@findex CURRENT_TIMESTAMP
@item NOW()
@itemx SYSDATE()
@itemx CURRENT_TIMESTAMP
Gibt das aktuelle Datum und die aktuelle Zeit als einen Wert im
@code{'YYYY-MM-DD HH:MM:SS'}- oder @code{YYYYMMDDHHMMSS}-Format zur�ck,
abh�ngig davon, ob die Funktion in einem Zeichenketten- oder in einem
numerischen Zusammenhang benutzt wird:

@example
mysql> select NOW();
        -> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
        -> 19971215235026
@end example

@findex UNIX_TIMESTAMP()
@item UNIX_TIMESTAMP()
@itemx UNIX_TIMESTAMP(datum)
Ohne Argument aufgerufen gibt die Funktion einen Unix-Zeitstempel zur�ck
(Sekunden seit @code{'1970-01-01 00:00:00'} GMT). Wenn
@code{UNIX_TIMESTAMP()} mit einem @code{datum}-Argument aufgerufen wird,
gibt sie den Wert des Arguments als Sekunden seit @code{'1970-01-01
00:00:00'} GMT zur�ck. @code{datum} kann eine @code{DATE}-Zeichenkette,
eine @code{DATETIME}-Zeichenkette, ein @code{TIMESTAMP} oder eine Zahl im
Format @code{YYMMDD} oder @code{YYYYMMDD} in lokaler Zeit sein:

@example
mysql> select UNIX_TIMESTAMP();
        -> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580
@end example

Wenn @code{UNIX_TIMESTAMP} auf einer @code{TIMESTAMP}-Spalte benutzt wird,
erh�lt die Funktion den Wert direkt, ohne implizite
``zeichenkette-zu-unix-zeitstempel''-Umwandlung. Wenn Sie
@code{UNIX_TIMESTAMP()} einen falschen Wert oder einen Wert ausserhalb des
Wertebereichs angeben, gibt sie 0 zur�ck.

@findex FROM_UNIXTIME()
@item FROM_UNIXTIME(unix_zeitstempel)
Gibt das @code{unix_timestamp}-Argument als Wert im @code{'YYYY-MM-DD
HH:MM:SS'}- oder @code{YYYYMMDDHHMMSS}-Format zur�ck, abh�ngig davon, ob
die Funktion in einem Zeichenketten- oder in einem numerischen Zusammenhang
benutzt wird:

@example
mysql> select FROM_UNIXTIME(875996580);
        -> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
        -> 19971004222300
@end example

@findex FROM_UNIXTIME()
@item FROM_UNIXTIME(unix_zeitstempel,format)
Gibt das @code{unix_timestamp}-Argument als Wert zur�ck, der wie mit der
@code{format}-Zeichenkette angegeben formatiert ist. @code{format} kann
dieselben Spezifikatoren wie die @code{DATE_FORMAT()}-Funktion enthalten:

@example
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
                            '%Y%D%M%h:%i:%s%x');
        -> '1997 23rd December 03:43:30 x'
@end example

@findex SEC_TO_TIME()
@item SEC_TO_TIME(sekunden)
Gibt das @code{sekunden}-Argument, umgewandelt in Stunden, Minuten und
Sekunden, als Wert im @code{'HH:MM:SS'}- oder @code{HHMMSS}-Format zur�ck,
abh�ngig davon, ob die Funktion in einem Zeichenketten- oder in einem
numerischen Zusammenhang benutzt wird:

@example
mysql> select SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
        -> 3938
@end example

@findex TIME_TO_SEC()
@item TIME_TO_SEC(zeit)
Gibt das @code{zeit}-Argument, umgewandelt in Sekunden, zur�ck:

@example
mysql> select TIME_TO_SEC('22:23:00');
        -> 80580
mysql> select TIME_TO_SEC('00:39:38');
        -> 2378
@end example
@end table


@node Other Functions, Group by functions, Date and time functions, Functions
@c German node Weitere Funktionen
@subsection Weitere Funktionen



@menu
* Bit functions::               
* Miscellaneous functions::     
@end menu

@node Bit functions, Miscellaneous functions, Other Functions, Other Functions
@c German node Bit-Funktionen
@subsubsection Bit-Funktionen

@findex arithmetische Funktionen
@findex Bit-Funktionen
@findex Funktionen, arithmetische
@findex Funktionen, Bit-

MySQL benutzt @code{BIGINT}-Berechnungen (64-Bit) f�r Bit-Operationen, so
dass diese Operatoren einen maximalen Wertebereich von 64 Bits haben.

@table @code
@findex | (bitweises OR)
@findex OR, bitweises
@item |
Bitweises OR:
@example
mysql> select 29 | 15;
        -> 31
@end example

@findex & (bitweises AND)
@findex AND, bitweises
@item &
Bitweises AND:
@example
mysql> select 29 & 15;
        -> 13
@end example

@findex << (left shift)
@item <<
Verschiebt eine @code{BIGINT}-Zahl nach links:
@example
mysql> select 1 << 2;
        -> 4
@end example

@findex >> (right shift)
@item >>
Verschiebt eine @code{BIGINT}-Zahl nach rechts:
@example
mysql> select 4 >> 2;
        -> 1
@end example

@findex ~
@item ~
Invertiert alle Bits:
@example
mysql> select 5 & ~1;
        -> 4
@end example

@findex BIT_COUNT()
@item BIT_COUNT(N)
Gibt die Anzahl von Bits, die im Argument @code{N} gesetzt sind, zur�ck:
@example
mysql> select BIT_COUNT(29);
        -> 4
@end example
@end table


@node Miscellaneous functions,  , Bit functions, Other Functions
@c German node Verschiedene Funktionen
@subsubsection Verschiedene Funktionen

@findex Verschiedene Funktionen
@findex Funktionen, verschiedene

@table @code
@findex DATABASE()
@item DATABASE()
Gibt den aktuellen Datenbanknamen zur�ck:

@example
mysql> select DATABASE();
        -> 'test'
@end example

Wenn es keine aktuelle Datenbank gibt, gibt @code{DATABASE()} die leere
Zeichenkette zur�ck.

@findex USER()
@findex SYSTEM_USER()
@findex SESSION_USER()
@item USER()
@itemx SYSTEM_USER()
@itemx SESSION_USER()
Gibt den aktuellen MySQL-Benutzernamen zur�ck:

@example
mysql> select USER();
        -> 'heinzholger@@localhost'
@end example

Ab MySQL-Version 3.22.11 beinhaltet dieser Wert den Client-Hostnamen sowie
den Benutzernamen. Sie k�nnen nur den Benutzernamen-Anteil wie folgt
extrahieren (was funktioniert, ob der Wert nun einen Hostnamen-Anteil hat
oder nicht):

@example
mysql> select substring_index(USER(),"@@",1);
        -> 'heinzholger'
@end example

@findex PASSWORD()
@item PASSWORD(zeichenkette)

Berechnet eine Passwort-Zeichenkette aus dem Klartext-Passwort
@code{zeichenkette}. Diese Funktion wird benutzt, um MySQL-Passw�rter zum
Speichern in der @code{Password}-Spalte der
@code{user}-Berechtigungstabelle zu verschl�sseln:

@example
mysql> select PASSWORD('schlechtespasswort');
        -> '1ccbb34b4e2b2f95'
@end example

@cindex Passwort-Verschl�sselung, Umkehrbarkeit
Die @code{PASSWORD()}-Verschl�sselung ist nicht umkehrbar.

@code{PASSWORD()} f�hrt keine Passwort-Verschl�sselung in der Art durch,
wie Unix-Passw�rter verschl�sselt werden. Sie sollten nicht annehmen, dass
Ihr Unix-Passwort und Ihr MySQL-Passwort dasselbe sind. @code{PASSWORD()}
ergibt denselben verschl�sselten Wert, wie er in der Unix-Passwortdatei
gespeichert ist. Siehe @code{ENCRYPT()}.

@findex ENCRYPT()
@item ENCRYPT(zeichenkette[,salt])
Verschl�sselt @code{zeichenkette} unter Benutzung des
Unix-@code{crypt()}-Systemaufrufs. Das @code{salt}-Argument sollte eine
Zeichenkette mit zwei Zeichen sein (ab MySQL-Version 3.22.16 darf
@code{salt} l�nger als zwei Zeichen sein):

@example
mysql> select ENCRYPT("hello");
        -> 'VxuFAJXVARROc'
@end example

Wenn @code{crypt()} auf Ihrem System nicht verf�gbar ist, gibt
@code{ENCRYPT()} immer @code{NULL} zur�ck.

@code{ENCRYPT()} ignoriert alle ausser den ersten 8 Zeichen von
@code{zeichenkette}, zumindest auf einigen Systemen. Das wird durch den
zugrunde liegenden @code{crypt()}-Systemaufruf festgelegt.

@findex ENCODE()
@item ENCODE(zeichenkette,passwort_zeichenkette)
Verschl�sselt @code{zeichenkette}, indem @code{passwort_zeichenkette} als
Passwort benutzt wird. Um das Ergebnis zu entschl�sseln, benutzen Sie
@code{DECODE()}.

Das Ergebnis ist eine bin�re Zeichenkette derselben L�nge wie
@code{zeichenkette}. Wenn Sie sie in einer Spalte speichern wollen,
benutzen Sie eine @code{BLOB}-Spalte.

@findex DECODE()
@item DECODE(crypt_zeichenkette,passwort_zeichenkette)
Entschl�sselt die verschl�sselte Zeichenkette @code{crypt_zeichenkette},
indem @code{passwort_zeichenkette} als Passwort benutzt wird.
@code{crypt_zeichenkette} sollte eine Zeichenkette sein, die von
@code{ENCODE()} zur�ckgegeben wird.

@findex MD5()
@item MD5(zeichenkette)
Berechnet eine MD5-Pr�fsumme f�r die Zeichenkette. Der Wert wird als eine
32 Stellen lange hexadezimale Zahl zur�ckgegeben, die zum Beispiel als
Hash-Schl�ssel benutzt werden kann:

@example
mysql> select MD5("testing");
        -> 'ae2b1fca515949e5d54fb22b8ed95575'
@end example

Das ist ein "RSA Data Sicherheit, Inc. MD5 Message-Digest Algorithm".

@findex LAST_INSERT_ID([ausdruck])
@item LAST_INSERT_ID([ausdruck])
Gibt den letzten automatisch erzeugten Wert zur�ck, der in eine
@code{AUTO_INCREMENT}-Spalte eingef�gt wurde. @xref{mysql_insert_id,,
@code{mysql_insert_id()}}.

@example
mysql> select LAST_INSERT_ID();
        -> 195
@end example

Die letzte ID, die erzeugt wurde, wird im Server f�r jede Verbindung
separat gespeichert. Sie wird nicht durch andere Clients ge�ndert. Sie wird
nicht einmal ge�ndert, wenn Sie eine andere @code{AUTO_INCREMENT}-Spalte
mit einem nicht 'magischen' Wert aktualisieren (also einem Wert, der nicht
@code{NULL} und nicht @code{0} ist).

Wenn Sie viele Zeilen zugleich mit einem Insert-Statement einf�gen, gibt
@code{LAST_INSERT_ID()} den Wert f�r die erste eingef�gte Zeile zur�ck. Der
Grund daf�r liegt darin, dass es Ihnen dadurch erm�glicht wird, dasselbe
@code{INSERT}-Statement auf einfache Weise auf einem anderen Server zu
reproduzieren.

@cindex Zahlenfolgen-Emulation
Wenn @code{ausdruck} als Argument zu @code{LAST_INSERT_ID()} angegeben
wird, wird der Wert des Arguments  von der Funktion zur�ckgegeben, als
n�chster Wert gesetzt, der von @code{LAST_INSERT_ID()} zur�ckgegeben wird
und als n�chster auto_increment-Wert benutzt. Damit k�nnen Sie Zahlenfolgen
emulieren:

Erzeugen Sie zuerst die Tabelle:

@example
mysql> create table sequenz (id int not null);
mysql> insert into sequenz values (0);
@end example

Danach kann die Tabelle benutzt werden, um wie folgt Zahlenfolgen zu
erzeugen:

@example
mysql> update sequenz set id=LAST_INSERT_ID(id+1);
@end example

Sie k�nnen Zahlenfolgen erzeugen, ohne @code{LAST_INSERT_ID()} aufzurufen,
aber der Nutzen, die Funktion auf diese Art zu benutzen, liegt darin, dass
der ID-Wert im Server als letzter automatisch erzeugter Wert gehalten wird.
Sie k�nnen die neue ID auf dieselbe Art abrufen, wie Sie jeden anderen
normalen @code{AUTO_INCREMENT}-Wert in MySQL lesen w�rden.
@code{LAST_INSERT_ID()} (ohne Argument) zum Beispiel gibt die neue ID
zur�ck. Die C-API-Funktion @code{mysql_insert_id()} kann ebenfalls benutzt
werden, um den Wert zu erhalten.

Beachten Sie, dass Sie diese Funktion nicht benutzen k�nnen, um den Wert
von @code{LAST_INSERT_ID(ausdruck)} abzurufen, nachdem Sie andere
SQL-Statements wie @code{SELECT} oder @code{SET} ausgef�hrt haben, weil
@code{mysql_insert_id()} nur nach @code{INSERT}- und
@code{UPDATE}-Statements aktualisiert wird.


@findex FORMAT()
@item FORMAT(X,D)
Formatiert die Zahl @code{X} in ein Format wie @code{'#,###,###.##'},
gerundet auf @code{D} Dezimalstellen. Wenn @code{D} @code{0} ist, hat das
Ergebnis keinen Dezimalpunkt oder Bruchteil:

@example
mysql> select FORMAT(12332.123456, 4);
        -> '12,332.1235'
mysql> select FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> select FORMAT(12332.2,0);
        -> '12,332'
@end example

@findex VERSION()
@item VERSION()
Gibt eine Zeichenkette zur�ck, die die MySQL-Serverversion anzeigt:

@example
mysql> select VERSION();
        -> '3.23.13-log'
@end example

Wenn Ihre Versionsnummer mit @code{-log} endet, bedeutet das, dass Loggen
angeschaltet ist.

@findex CONNECTION_ID()
@item CONNECTION_ID()
Gibt die Verbindungskennnummer (@code{Thread_id}) f�r die Verbindung
zur�ck. Jede Verbindung hat ihre eigene eindeutige Kennnummer:

@example
mysql> select CONNECTION_ID();
        -> 1
@end example

@cindex Zeit�berschreitung (Timeout)
@findex GET_LOCK()
@item GET_LOCK(zeichenkette,zeitueberschreitung)
Versucht, eine Sperre mit dem Namen, der durch die Zeichenkette
@code{zeichenkette} angegeben wird, zu erlangen, mit einem Timeout von
@code{zeitueberschreitung} Sekunden. Gibt @code{1} zur�ck, wenn die Sperre
erfolgreich erlangt wurde, und @code{0}, wenn der Versuch wegen
Zeit�berschreitung abgebrochen wurde, oder @code{NULL}, wenn ein Fehler
auftrat (wenn zum Beispiel kein Arbeitsspeicher mehr frei ist oder der
Thread mit @code{mysqladmin kill} gekillt wurde). Eine Sperre wird
aufgehoben, wenn Sie @code{RELEASE_LOCK()} ausf�hren, einen neuen
@code{GET_LOCK()} ausf�hren oder der Thread beendet wird. Diese Funktion
kann benutzt werden, um Applikations-Sperren zu implementieren oder um
Datensatz-Sperren zu simulieren. Sie blockiert Anfragen von anderen Clients
nach Sperren mit demselben Namen; Clients, die sich auf einen angegebenen
Namen f�r die Sperr-Zeichenkette einigen, k�nnen die Zeichenkette benutzen,
um kooperatives beratendes Sperren (advisory locking) auszuf�hren:

@example
mysql> select GET_LOCK("lock1",10);
        -> 1
mysql> select GET_LOCK("lock2",10);
        -> 1
mysql> select RELEASE_LOCK("lock2");
        -> 1
mysql> select RELEASE_LOCK("lock1");
        -> NULL
@end example

Beachten Sie, dass der zweite @code{RELEASE_LOCK()}-Aufruf @code{NULL}
zur�ckgibt, weil die Sperre @code{"lock1"} automatisch durch den zweiten
@code{GET_LOCK()}-Aufruf aufgehoben wurde.

@findex RELEASE_LOCK()
@item RELEASE_LOCK(zeichenkette)
Hebt die Sperre auf, die durch die Zeichenkette @code{zeichenkette} benannt
ist, die mit @code{GET_LOCK()} erlangt wurde. Gibt @code{1} zur�ck, wenn
die Sperre aufgehoben wurde, und @code{0}, wenn die Sperre nicht durch
diesen Thread gemacht wurde (in diesem Fall wird die Sperre nicht
aufgehoben), oder @code{NULL}, wenn die benannte Sperre nicht existiert.
Die Sperre existiert nicht, wenn sie nie durch einen Aufruf von
@code{GET_LOCK()} erlangt wurde oder wenn sie bereits aufgehoben wurde.

@findex BENCHMARK()
@item BENCHMARK(zaehler,ausdruck)
Die @code{BENCHMARK()}-Funktion den Ausdruck @code{ausdruck} wiederholt
@code{zaehler} mal aus. Sie kann benutzt werden, um die Zeit zu ermitteln,
die MySQL ben�tigt, um den Ausdruck zu verarbeiten. Der Ergebniswert ist
immer @code{0}. Die Funktion ist f�r die Benutzung im @code{mysql}-Client
gedacht, der die Ausf�hrungszeiten von Anfragen zum Beispiel wie folgt
darstellt:

@example
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)
@end example

Die berichtete Zeit ist die am Client-Ende verstrichene Zeit, nicht die
Prozessorzeit am Server-Ende. Es ist ratsam, @code{BENCHMARK()} mehrere
Male auszuf�hren und das Ergebnis unter Ber�cksichtigung der Last, unter
der die Server-Maschine f�hrt, zu interpretieren.

@findex INET_NTOA()
@item INET_NTOA(ausdruck)
Gibt die Netzwerk-Adresse (4 oder 8 Bytes) f�r den numerischen Ausdruck
zur�ck:

@example
mysql> select INET_NTOA(3520061480);
       ->  "209.207.224.40"
@end example

@findex INET_ATON()
@item INET_ATON(ausdruck)
Gibt eine Ganzzahl zur�ck, die den numerischen Wert einer Netzwerk-Adresse
darstellt. Adressen k�nnen 4-Byte- oder 8-Byte-Adressen sein:

@example
mysql> select INET_ATON("209.207.224.40");
       ->  3520061480
@end example

Die erzeugte Zahl ist immer in Netzwerk-Byte-Reihenfolge; die obige Zahl
wird zum Beispiel errechnet als @code{209*255^3 + 207*255^2 + 224*255
+40}.

@findex MASTER_POS_WAIT()
@item MASTER_POS_WAIT(log_name, log_position)
Blockiert, bis der Slave w�hrend der Replikation die festgelegte Position
in der Master-Log-Datei erreicht. Wenn die Master-Information nicht
initialisiert wird, wird NULL zur�ckgegeben. Wenn der Slave nicht l�uft,
blockiert die Funktion und wartet, bis er gestartet wurde, und geht dann
hinter die angegebene Position. Wenn der Slave bereits hinter der
angegebenen Position ist, kehrt die Funktion sofort zur�ck. Der
R�ckgabewert ist die Anzahl von Log-Events, die sie warten muss, um bis zur
angegebenen Position zu kommen, oder NULL in Fehlerf�llen. N�tzlich f�r die
Steuerung der Master-Slave-Synchronisation, aber urspr�nglich geschrieben,
um das Testen der Replikation zu erleichtern.
@end table


@node Group by functions,  , Other Functions, Functions
@c German node GROUP-BY-Funktionen
@subsection Funktionen zur Benutzung bei @code{GROUP BY}-Klauseln

@findex GROUP-BY-Funktionen
@findex Funktionen, GROUP BY

Wenn Sie in einem Statement eine Gruppierungsfunktion benutzen, die
keine @code{GROUP BY}-Klausel enth�lt, ist das gleichbedeutend mit der
Gruppierung aller Zeilen.

@table @code
@findex COUNT()
@item COUNT(ausdruck)
Gibt die Anzahl der Zeilen mit Nicht-@code{NULL}-Werten zur�ck, die
durch ein @code{SELECT}-Statement abgerufen werden:

@example
mysql> select student.student_name,COUNT(*)
           from student,kurs
           where student.student_id=kurs.student_id
           GROUP BY student_name;

@end example

@code{COUNT(*)} ist insofern anders, als es die Anzahl der abgerufenen
Zeilen zur�ckgibt, egal ob sie @code{NULL}-Werte enthalten oder nicht.

@code{COUNT(*)} ist darauf optimiert, das Ergebnis sehr schnell
zur�ckzugeben, wenn es mittels eines @code{SELECT} von einer Tabelle
abruft, wenn keine weiteren Spalten abgerufen werden und es keine
@code{WHERE}-Klausel gibt. Beispiel:

@example
mysql> select COUNT(*) from student;
@end example

@findex COUNT(DISTINCT)
@findex DISTINCT
@item COUNT(DISTINCT ausdruck,[ausdruck...])
Gibt die Anzahl unterschiedlicher Nich-@code{NULL}-Werte zur�ck:

@example
mysql> select COUNT(DISTINCT ergebnisse) from student;
@end example

Bei MySQL erhalten Sie die Anzahl unterschiedlicher
Ausdruckskombinationen, die nicht NULL enthalten, indem Sie eine Liste
von Ausdr�cken angeben. In ANSI-SQL m�ssten Sie eine Verkettung aller
Ausdr�cke innerhalb von @code{CODE(DISTINCT ..)} angeben.

@findex AVG()
@item AVG(ausdruck)
Gibt den Durchschnittswert von @code{ausdruck} zur�ck:

@example
mysql> select student_name, AVG(test_ergebnis)
           from student
           GROUP BY student_name;
@end example

@findex MIN()
@findex MAX()
@item MIN(ausdruck)
@itemx MAX(ausdruck)
Gibt den kleinsten oder gr��ten Wert von @code{ausdruck} zur�ck.
@code{MIN()} und @code{MAX()} k�nnen Zeichenketten-Argumente aufnehmen
und geben in solchen F�llen den kleinsten oder gr��ten Zeichenketten-
Wert zur�ck. @xref{MySQL indexes}.

@example
mysql> select student_name, MIN(test_ergebnis), MAX(test_ergebnis)
           from student
           GROUP BY student_name;
@end example

@findex SUM()
@item SUM(ausdruck)
Gibt die Summe von @code{ausdruck} zur�ck. Beachten Sie, dass der
R�ckgabewert NULL ist, wenn die Ergebnismenge keine Zeilen hat!

@findex STD()
@findex STDDEV()
@cindex Oracle-Kompatibilit�t
@cindex Kompatibilit�t, mit Oracle
@item STD(ausdruck)
@itemx STDDEV(ausdruck)
Gibt die Standardabweichung von @code{ausdruck} zur�ck. Das ist eine
Erweiterung zu ANSI-SQL. Die @code{STDDEV()}-Form dieser Funktion wird
aus Gr�nden der Oracle-Kompatibilit�t zur Verf�gung gestellt.

@findex BIT_OR()
@item BIT_OR(ausdruck)
Gibt das bitweise @code{OR} aller Bits in @code{ausdruck} zur�ck. Die
Berechnung wird mit 64-Bit-(@code{BIGINT})-Genauigkeit durchgef�hrt.

@findex BIT_AND()
@item BIT_AND(ausdruck)
Gibt das bitweise @code{AND} aller Bits in @code{ausdruck} zur�ck. Die
Berechnung wird mit 64-Bit-(@code{BIGINT})-Genauigkeit durchgef�hrt.
@end table

@cindex @code{GROUP BY}, Erweiterungen zu ANSI-SQL
MySQL hat die Benutzung von @code{GROUP BY} erweitert. Sie k�nnen
Spalten oder Berechnungen im @code{SELECT}-Ausdruck angeben, die nicht
im @code{GROUP BY}-Teil erscheinen. Das steht f�r @emph{jeden m�glichen
Wert f�r diese Gruppe}. Das k�nnen Sie benutzen, um bessere Performance
zu erzielen, indem Sie Sortieren und Gruppieren unn�tiger Bestandteile
vermeiden. Zum Beispiel m�ssen Sie in folgender Anfrage nicht nach
@code{kunde.name} gruppieren:

@example
mysql> select bestellung.kunde_id,kunde.name,max(zahlungen)
       from bestellung,kunde
       where bestellung.kunde_id = kunde.kunde_id
       GROUP BY bestellung.kunde_id;
@end example

In ANSI-SQL m�ssten Sie der @code{GROUP BY}-Klausel @code{kunde.name}
hinzuf�gen. In MySQL ist der Name �berfl��ig, solange Sie nicht im
ANSI-Modus fahren.

@strong{Benutzen Sie dieses Feature nicht}, wenn die Spalten, die Sie im
@code{GROUP BY}-Teil auslassen, in der Gruppe nicht eindeutig sind!
Sonst erhalten Sie unvorhersagbare Ergebnisse.

In einigen F�llen k�nnen Sie @code{MIN()} und @code{MAX()} benutzen, um
einen bestimmten Spaltenwert zu erhalten, selbst wenn er nicht eindeutig
ist. Folgendes gibt den Wert von @code{spalte} aus der Zeile zur�ck, die
den kleinsten Wert in der @code{sortierung}-Spalte enth�lt:

@example
substr(MIN(concat(rpad(sortierung,6,' '),spalte)),7)
@end example

@node Data Manipulation, Data Definition, Functions, Reference
@c German node Datenmanipulation
@section Datenmanipulation: @code{SELECT}, @code{INSERT}, @code{UPDATE}, @code{DELETE}



@menu
* SELECT::                      
* HANDLER::                     
* INSERT::                      
* INSERT DELAYED::              
* UPDATE::                      
* DELETE::                      
* TRUNCATE::                    
* REPLACE::                     
* LOAD DATA::                   
@end menu

@node SELECT, HANDLER, Data Manipulation, Data Manipulation
@c German node SELECT
@subsection @code{SELECT}-Syntax

@findex SELECT

@c help SELECT
@example
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
       [HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
    select_ausdruck,...
    [INTO @{OUTFILE | DUMPFILE@} 'datei' export_optionen]
    [FROM tabellenreferenz
        [WHERE where_definition]
        [GROUP BY @{positive_ganzzahl | spalten_name | formel@} [ASC | DESC], ...]
        [HAVING where_definition]
        [ORDER BY @{positive_ganzzahl | spalten_name | formel@} [ASC | DESC] ,...]
        [LIMIT [offset,] zeilen]
        [PROCEDURE prozedur_name]
        [FOR UPDATE | LOCK IN SHARE MODE]]
@end example
@c help end

@code{SELECT} wird benutzt, um ausgew�hlte Zeilen aus einer oder mehreren
Tabellen abzurufen. @code{select_ausdruck} gibt die Spalten an, die Sie
abrufen wollen. @code{SELECT} kann auch benutzt werden, um Zeilen ohne
Bezug zu irgend einer Tabelle abzurufen. Beispiel:

@example
mysql> SELECT 1 + 1;
         -> 2
@end example

Alle benutzten Schl�sselw�rter m�ssen genau in der oben angegebenen
Reihenfolge genannt werden. Beispielsweise muss eine @code{HAVING}-Klausel
nach jeglicher @code{GROUP BY}-Klausel und vor jeglicher @code{ORDER
BY}-Klausel kommen.

@itemize @bullet

@item
@cindex Aliase, f�r Ausdr�cke
@cindex Ausdruck-Aliase
Einem @code{SELECT}-Ausdruck kann mit @code{AS} ein Alias zugewiesen
werden. Der Alias wird als Spaltenname verwendet und kann bei @code{ORDER
BY}- oder @code{HAVING}-Klauseln benutzt werden. Beispiel:

@example
mysql> select concat(nachname,', ',vorname) AS voller_name
    from tabelle ORDER BY voller_name;
@end example

@item
The @code{FROM tabellenreferenz}-Klausel gibt die Tabellen an, aus denen
Zeilen abgerufen werden sollen. Wenn Sie mehr als eine Tabelle auff�hren,
f�hren Sie einen Join durch. Informationen �ber die Join-Syntax finden Sie
unter @ref{JOIN, , @code{JOIN}}.

@item
Sie k�nnen auf eine Spalte als @code{spalten_name} verweisen, als
@code{tabelle.spalten_name} oder als @code{datenbank.tabelle.spalten_name}.
Sie m�ssen das @code{tabelle}- oder @code{datenbank.tabelle}-Pr�fix f�r
einen Spaltenverweis in einem @code{SELECT}-Statement nicht angeben, es sei
denn, der Verweis w�re ansonsten mehrdeutig. Sie @ref{Legal names}; hier
finden sich Beispiele von Mehrdeutigkeit, die erfordern, dass Sie
ausf�hrlichere Spaltenverweis-Formen benutzen.

@item
@cindex Aliase, f�r Tabellen
@cindex Tabellen-Aliase
Einem Tabellenverweis kann mit @code{tabelle [AS] alias_name} ein
Tabellen-Alias zugewiesen werden:

@example
mysql> select t1.name, t2.gehalt from angestellte AS t1, info AS t2
           where t1.name = t2.name;
mysql> select t1.name, t2.gehalt from angestellte t1, info t2
           where t1.name = t2.name;
@end example

@item
Auf Spalten, die f�r die Ausgabe ausgew�hlt wurden, kann in @code{ORDER
BY}- und @code{GROUP BY}-Klauseln mit Spaltennamen, Spalten-Aliasen oder
Spaltenpositionen verwiesen werden. Spaltenpositionen fangen mit 1 an:

@example
mysql> select hochschule, region, seed von tournament
           ORDER BY region, seed;
mysql> select hochschule, region AS r, seed AS s from turnier
           ORDER BY r, s;
mysql> select hochschule, region, seed from turnier
           ORDER BY 2, 3;
@end example

Um in absteigender Reihenfolge zu sortieren, f�gen Sie dem Namen der
Spalte das @code{DESC}-Schl�sselwort in the @code{ORDER BY}-Klausel hinzu
(descending, absteigend), nach der Sie sortieren. Die Vorgabe ist
aufsteigende Reihenfolge. Das k�nnen Sie auch explizit angeben, indem Sie
das @code{ASC}-Schl�sselwort verwenden.

@item
In der @code{WHERE}-Klausel k�nnen Sie beliebige Funktionen verwenden, die
MySQL unterst�tzt. @xref{Functions}.

@item
Die @code{HAVING}-Klausel kann auf jede Spalte oder jeden Alias verweisen,
die bzw. der im @code{select_ausdruck} genannt wurde. Die Klausel wird
zuletzt angewandt, direkt bevor Ergebnisse an den Client geschickt werden,
ohne jede Optimierung. Benutzen Sie kein @code{HAVING} f�r Dinge, die in
der @code{WHERE}-Klausel stehen sollten. Schreiben Sie beispielsweise nicht
folgendes:

@example
mysql> select spalten_name from tabelle HAVING spalten_name > 0;
@end example

Sondern statt dessen:

@example
mysql> select spalten_name from tabelle WHERE spalten_name > 0;
@end example

Ab MySQL-Version 3.22.5 k�nnen Sie Anfragen auch wie folgt schreiben:

@example
mysql> select user,max(gehalt) from benutzer
           group by benutzer HAVING max(gehalt)>10;
@end example

In �lteren MySQL-Versionen schreiben Sie statt dessen:

@example
mysql> select benutzer,max(gehalt) AS summe from benutzer
           group by benutzer HAVING summe>10;
@end example

@item
@code{SQL_SMALL_RESULT}, @code{SQL_BIG_RESULT}, @code{SQL_BUFFER_RESULT},
@code{STRAIGHT_JOIN} und @code{HIGH_PRIORITY} sind MySQL Erweiterungen zu
ANSI-SQL92.

@item
@code{HIGH_PRIORITY} gibt dem @code{SELECT} h�here Priorit�t als einem
Statement, das eine Tabelle aktualisiert. Sie sollten das nur f�r Anfragen
benutzen, die sehr schnell sind und sofort durchgef�hrt werden m�ssen. Eine
@code{SELECT HIGH_PRIORITY}-Anfrage l�uft, wenn die Tabelle eine
Lese-Sperre hat, selbst wenn es ein Update-Statement gibt, das darauf
wartet, dass die Tabelle freigegeben wird.

@item
@code{SQL_BIG_RESULT} kann bei @code{GROUP BY} oder @code{DISTINCT} benutzt
werden, um dem Optimierer mitzuteilen, dass das Ergebnis sehr viele Zeilen
haben wird. In diesem Fall benutzt MySQL bei Bedarf direkt
Festplatten-basierende tempor�re Tabellen. Ausserdem bevorzugt MySQL in
diesem Fall Sortieren vor dem Anlegen einer tempor�ren Tabelle mit einem
Schl�ssel auf den @code{GROUP BY}-Elementen.

@item
@cindex @code{GROUP BY}, Erweiterungen zu ANSI-SQL
Wenn Sie @code{GROUP BY} benutzen, werden die Ausgabe-Zeilen gem�� dem
@code{GROUP BY} sortiert, als h�tten Sie ein @code{ORDER BY} f�r alle
Felder im @code{GROUP BY} angegeben. MySQL hat @code{GROUP BY} erweitert,
so dass Sie daf�r auch @code{ASC} und @code{DESC} angeben k�nnen:

@example
SELECT a,COUNT(b) FROM tabelle GROUP BY a DESC
@end example

@item
MySQL hat die Benutzung von @code{GROUP BY} erweitert, um es Ihnen zu
gestatten, auch Felder auszuw�hlen, die nicht in der @code{GROUP
BY}-Klausel erw�hnt wurden. Wenn Sie nicht die Ergebnisse erhalten, die Sie
von Ihrer Anfrage erwarten, lesen Sie bitte die @code{GROUP
BY}-Beschreibung.

@item
@cindex Hinweise
@code{SQL_BUFFER_RESULT} erzwingt, dass das Ergebnis in eine tempor�re
Tabelle geschrieben wird. Das hilft MySQL, fr�hzeitig Tabellensperren
aufzuheben, und hilft in F�llen, in denen es lange dauert, das Ergebnis an
den Client zu senden.

@item
@cindex Hinweise
@code{SQL_SMALL_RESULT}, eine MySQL-spezifische Option, kann bei
@code{GROUP BY} oder @code{DISTINCT} benutzt werden, um dem Optimierer
mitzuteilen, dass der Ergebnissatz klein sein wird. In diesem Fall benutzt
MySQL schnelle tempor�re Tabellen, um die Ergebnistabelle zu speichern,
anstatt Sortieren zu benutzen. In MySQL-Version 3.23 sollte das
normalerweise nicht ben�tigt werden.

@item
@cindex Hinweise
@code{STRAIGHT_JOIN} zwingt den Optimierer, Tabellen in der Reihenfolge zu
verkn�pfen, in der sie in der @code{FROM}-Klausel aufgelistet sind. Sie
k�nnen das benutzen, um die Geschwindigkeit einer Anfrage zu erh�hen, wenn
der Optimierer Tabellen in nicht optimaler Reihenfolge verkn�pft.
@xref{EXPLAIN, , @code{EXPLAIN}}.

@item
Die @code{LIMIT}-Klausel wird benutzt, um die Anzahl von Zeilen, die vom
@code{SELECT}-Statement zur�ckgegeben werden, zu beschr�nken. @code{LIMIT}
erwartet ein oder zwei numerische Argumente.

Wenn zwei Argumente angegeben sind, legt das erste den Offset der ersten
Zeile fest, die zur�ckgegeben wird, und das zweite gibt die maximale Anzahl
von Zeilen an, die zur�ckgegeben werden. Der Offset der anf�nglichen Zeile
ist 0 (nicht 1):

@example
mysql> select * from tabelle LIMIT 5,10;  # Zeilen 6 bis 15 zur�ckgeben
@end example

Wenn ein Argument angegeben wird, stellt es die maximale Anzahl von Zeilen
dar, die zur�ckgegeben werden:

@example
mysql> select * from tabelle LIMIT 5;     # Die ersten 5 Zeilen zur�ckgeben
@end example

Mit anderen Worten ist @code{LIMIT n} �quivalent zu @code{LIMIT 0,n}.

@item
@tindex /etc/passwd
Die @code{SELECT ... INTO OUTFILE 'datei'}-Form von @code{SELECT} schreibt
die ausgew�hlten Zeilen in eine Datei. Die Datei wird auf dem Server-Host
erzeugt und darf nicht bereits bestehen (das verhindert unter anderem, dass
Datenbanktabellen und Dateien wie @file{/etc/passwd} zerst�rt werden). Sie
ben�tigen die @strong{file}-Berechtigung auf dem Server-Host, um diese Form
von @code{SELECT} auszuf�hren.

@code{SELECT ... INTO OUTFILE} ist haupts�chlich daf�r vorgesehen, um eine
Tabelle auf der Server-Maschine schnell zu dumpen. Wenn Sie die
resultierende Datei auf einem anderen Host als dem Server-Host haben
wollen, k�nnen Sie @code{SELECT ... INTO OUTFILE} nicht benutzen. In diesem
Fall sollten Sie statt dessen ein Client-Programm wie @code{mysqldump
--tab} oder @code{mysql -e "SELECT ..." > outfile} benutzen, um die Datei
zu erzeugen.

@code{SELECT ...  INTO OUTFILE} ist das Komplement von @code{LOAD DATA
INFILE}; die Syntax f�r den @code{export_optionen}-Teil des Statements
besteht aus denselben @code{FIELDS}- und @code{LINES}-Klauseln, die beim
@code{LOAD DATA INFILE}-Statement benutzt werden. @xref{LOAD DATA, ,
@code{LOAD DATA}}.

In der resultierenden Textdatei werden nur folgende Zeichen durch das
@code{ESCAPED BY}-Zeichen escapet:

@itemize @bullet
@item Das @code{ESCAPED BY}-Zeichen
@item Das erste Zeichen in @code{FIELDS TERMINATED BY}
@item Das erste Zeichen in @code{LINES TERMINATED BY}
@end itemize

Zus�tzlich wird @code{ASCII 0} in @code{ESCAPED BY}, gefolgt von 0
(@code{ASCII 48}), umgewandelt.

Der Grund hierf�r ist, dass Sie jegliche @code{FIELDS TERMINATED BY}-,
@code{ESCAPED BY}- oder @code{LINES TERMINATED BY}-Zeichen escapen M�SSEN,
um die Datei zuverl�ssig wieder einlesen zu k�nnen. @code{ASCII 0} wird
escapet, um das Lesen mit einigen Pagern zu erleichtern.

Weil sich die resultierende Datei nicht nach der SQL-Syntax richten muss,
muss nicht weiter escapet werden.

Im Folgenden ein Beispiel, wie man eine Datei in einem Format erh�lt, das
von vielen alten Programmen benutzt wird:

@example
SELECT a,b,a+b INTO OUTFILE "/tmp/resultat.text"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM tabelle;
@end example

@item
@findex DUMPFILE
Wenn Sie @code{INTO DUMPFILE} anstelle von @code{INTO OUTFILE} benutzen,
schreibt MySQL nur eine Zeile in die Datei, ohne jede Spalten- oder
Zeilen-Begrenzer und ohne jedes Escapen. Das ist n�tzlich, wenn Sie ein
Blob in eine Datei speichern wollen.

@item
Beachten Sie, dass jede Datei, die von @code{INTO OUTFILE} und @code{INTO
DUMPFILE} erzeugt wird, f�r alle Benutzer lesbar ist! Der Grund liegt
darin, dass der MySQL-Server keine Datei erzeugen kann, die jemandem
anderen geh�rt als dem Benutzer, unter dem er l�uft (Sie sollten
@code{mysqld} nie als Root laufen lassen), daher muss die Datei f�r
jedermann lesbar sein, damit Sie die Zeilen abrufen k�nnen.

@item
Wenn Sie @code{FOR UPDATE} bei einem Tabellen-Handler mit
Seiten-/Zeilen-Sperren benutzen, werden die untersuchten Zeilen
schreib-gesperrt.
@end itemize



@menu
* JOIN::                        
* UNION::                       
@end menu

@node JOIN, UNION, SELECT, SELECT
@c German node JOIN
@subsubsection @code{JOIN}-Syntax

@findex JOIN
@findex INNER JOIN
@findex CROSS JOIN
@findex LEFT JOIN
@findex LEFT OUTER JOIN
@findex NATURAL LEFT JOIN
@findex NATURAL LEFT OUTER JOIN
@findex RIGHT JOIN
@findex RIGHT OUTER JOIN
@findex NATURAL RIGHT JOIN
@findex NATURAL RIGHT OUTER JOIN
@findex STRAIGHT_JOIN

MySQL unterst�tzt folgende @code{JOIN}-Syntaxen f�r
@code{SELECT}-Statements:

@example
tabellen_verweis, tabellen_verweis
tabellen_verweis [CROSS] JOIN tabellen_verweis
tabellen_verweis INNER JOIN tabellen_verweis join_bedingung
tabellen_verweis STRAIGHT_JOIN tabellen_verweis
tabellen_verweis LEFT [OUTER] JOIN tabellen_verweis join_bedingung
tabellen_verweis LEFT [OUTER] JOIN tabellen_verweis
tabellen_verweis NATURAL [LEFT [OUTER]] JOIN tabellen_verweis
@{ oder tabellen_verweis LEFT OUTER JOIN tabellen_verweis ON bedingungs_ausdruck @}
tabellen_verweis RIGHT [OUTER] JOIN tabellen_verweis join_bedingung
tabellen_verweis RIGHT [OUTER] JOIN tabellen_verweis
tabellen_verweis NATURAL [RIGHT [OUTER]] JOIN tabellen_verweis
@end example

Wobei @code{tabellen_verweis} definiert ist als:
@example
tabelle [[AS] alias] [USE INDEX (schluessel_liste)] [IGNORE INDEX (schluessel_liste)]
@end example

Und @code{join_bedingung} definiert ist als:

@example
ON bedingungs_ausdruck |
USING (spalten_liste)
@end example

Sie sollten nie irgend welche Bedingungen im @code{ON}-Teil haben, die dazu
benutzt werden, um die Zeilen, die im Ergebnissatz auftauchen, zu
beschr�nken. Wenn Sie so etwas tun wollen, m�ssen Sie das in der
@code{WHERE}-Klausel tun.

Beachten Sie, dass vor Version 3.23.17 @code{INNER JOIN} keine
@code{join_bedingung} aufnahm!

@cindex ODBC-Kompatibilit�t
@cindex Kompatibilit�t, mit ODBC
Die letzte oben dargestellte @code{LEFT OUTER JOIN}-Syntax gibt es nur aus
Gr�nden der Kompatibilit�t mit ODBC:

@itemize @bullet
@item
Einem Tabellenverweis kann mit @code{tabelle AS alias_name} oder
@code{tabelle alias_name} ein Alias zugewiesen werden:

@example
mysql> select t1.name, t2.gehalt from angestellte AS t1, info AS t2
           where t1.name = t2.name;
@end example

@item
Der @code{ON}-Bedingungscode ist jeglicher Bedingungscode der Form, wie er
auch in einer @code{WHERE}-Klausel benutzt werden kann.

@item
Wenn es f�r die rechte Tabelle keinen �bereinstimmenden Datensatz im
@code{ON}- oder @code{USING}-Teil eines @code{LEFT JOIN} gibt, wird f�r die
rechte Tabelle eine Zeile benutzt, in der alle Spalten auf @code{NULL}
gesetzt sind. Das k�nnen Sie benutzen, um Datens�tze in einer Tabelle
herauszusuchen, die in einer anderen Tabelle kein Gegenst�ck haben:

@example
mysql> select tabelle1.* from tabelle1
           LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id
           where tabelle2.id is NULL;
@end example

Dieses Beispiel findet alle Zeilen in @code{tabelle1} mit einem
@code{id}-Wert, der in @code{tabelle2} nicht vorhanden ist (also alle
Zeilen in @code{tabelle1} ohne entsprechende Zeile in @code{tabelle2}).
Hierbei wird nat�rlich angenommen, dass @code{tabelle2.id} als @code{NOT
NULL} deklariert ist. @xref{LEFT JOIN optimisation}.

@item
Die @code{USING}-@code{(spalten_liste)}-Klausel nennt eine Auflistung von
Spalten, die in beiden Tabellen existieren m�ssen. Eine
@code{USING}-Klausel wie:

@example
A LEFT JOIN B USING (C1,C2,C3,...)
@end example

Ist definiert als semantisch identisch mit einem @code{ON}-Ausdruck wie
diesem:

@example
A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
@end example

@item
Der @code{NATURAL [LEFT] JOIN} zweier Tabellen ist definiert als semantisch
identisch �quivalent zu einem @code{INNER JOIN} oder einem @code{LEFT JOIN}
mit einer @code{USING}-Klausel, die alle Spalten nennt, die in beiden
Tabellen existieren.

@item
@code{RIGHT JOIN} funktioniert analog wie @code{LEFT JOIN}. Um Code
zwischen Datenbanken portabel zu halten, wird empfohlen, @code{LEFT JOIN}
anstelle von @code{RIGHT JOIN} zu benutzen.

@item
@cindex Hinweise
@code{STRAIGHT_JOIN} ist identisch mit @code{JOIN}, ausser dass die linke
Tabelle immer vor der rechten Tabelle gelesen wird. Das kann in den
(wenigen) F�llen benutzt werden, wo der Optimierer die Tabellen in die
falsche Reihenfolge bringt.

@item
@cindex Hinweise
Ab MySQL-Version 3.23.12 k�nnen Sie Hinweise dar�ber geben, welchen Index
MySQL benutzen sollte, wenn Informationen aus einer Tabelle abgerufen
werden. Das ist n�tzlich, wenn @code{EXPLAIN} zeigt, dass MySQL den
falschen Index benutzt. Indem Sie @code{USE INDEX (schluessel_liste)}
angeben, k�nnen Sie MySQL anweisen, nur einen der angegebenen Indexe zu
benutzen, um Zeilen in der Tabelle zu finden. Die alternative Syntax
@code{IGNORE INDEX (schluessel_liste)} kann benutzt werden, um MySQL
anzuweisen, einen bestimmten Index nicht zu benutzen.
@end itemize

Einige Beispiele:

@example
mysql> select * from tabelle1,tabelle2 where tabelle1.id=tabelle2.id;
mysql> select * from tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id;
mysql> select * from tabelle1 LEFT JOIN tabelle2 USING (id);
mysql> select * from tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id
           LEFT JOIN table3 ON tabelle2.id=table3.id;
mysql> select * from tabelle1 USE INDEX (schluessel1,schluessel2) WHERE schluessel1=1 und schluessel2=2 AND
       schluessel3=3;
mysql> select * from tabelle1 IGNORE INDEX (schluessel3) WHERE schluessel1=1 und schluessel2=2 AND
       schluessel3=3;
@end example

@xref{LEFT JOIN optimisation, , @code{LEFT JOIN}-Optimierung}.


@node UNION,  , JOIN, SELECT
@c German node UNION
@subsubsection @code{UNION}-Syntax

@findex UNION

@example
SELECT ....
UNION [ALL]
SELECT ....
  [UNION 
   SELECT ...]
@end example

@code{UNION} ist implementiert in MySQL 4.0.0.

@code{UNION} wird benutzt, um das Ergebnis vieler @code{SELECT}-Statements
in einem Ergebnissatz zu kombinieren.

Die @code{SELECT}-Befehle sind normale SELECT-Befehle, aber mit folgenden
Einschr�nkungen:

@itemize @bullet
@item
Nur der letzte @code{SELECT}-Befehl darf @code{INTO OUTFILE} enthalten.
@item
Nur der letzte @code{SELECT}-Befehl darf @code{ORDER BY} enthalten.
@end itemize

Wenn Sie das Schl�sselwort @code{ALL} f�r @code{UNION} nicht benutzen, sind
alle zur�ckgegebenen Zeilen eindeutig (unique), als h�tten Sie ein
@code{DISTINCT} f�r den gesamten Ergebnissatz gemacht. Wenn Sie @code{ALL}
angeben, erhalten Sie alle �bereinstimmenden Zeilen von allen benutzten
@code{SELECT}-Statements.

@node HANDLER, INSERT, SELECT, Data Manipulation
@c German node INSERT
@subsection @code{INSERT}-Syntax

@findex INSERT

@example
    INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tabelle [(spalten_name,...)]
        VALUES (ausdruck,...),(...),...
oder  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tabelle [(spalten_name,...)]
        SELECT ...
oder  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
        [INTO] tabelle
        SET spalten_name=ausdruck, spalten_name=ausdruck, ...

@end example

@code{INSERT} f�gt neue Zeilen in eine bestehende Tabelle ein. Die
@code{INSERT ... VALUES}-Form des Statements f�gt Zeilen basierend auf
explizit angegebenen Werten ein. Die @code{INSERT ... SELECT}-Form f�gt
Zeilen ein, die aus einer oder mehreren anderen Tabellen ausgew�hlt wurden.
Die @code{INSERT ... VALUES}-Form mit mehrfachen Wertelisten wird ab
MySQL-Version 3.22.5 unterst�tzt. Die @code{spalten_name=expression}-Syntax
wird ab MySQL-Version 3.22.10 unterst�tzt.

@code{tabelle} ist die Tabelle, in die Zeilen eingef�gt werden sollen. Die
Spaltennamenliste oder die @code{SET}-Klausel geben an, f�r welche Spalten
das Statement Werte angibt:

@itemize @bullet
@item
Wenn Sie keine Spaltenliste f�r @code{INSERT ... VALUES} oder @code{INSERT
... SELECT} angeben, m�ssen f�r alle Spalten Werte in der
@code{VALUES()}-Liste oder vom @code{SELECT} bereit stehen. Wenn Sie die
Reihenfolge der Tabellenspalten nicht kennen, benutzen Sie @code{DESCRIBE
tabelle}, um sie herauszufinden.

@item
Jede Spalte, die nicht explizit in einer Werteliste angegeben wird, wird
auf ihren Vorgabewert gesetzt. Wenn Sie beispielsweise eine Spaltenliste
angeben, die nicht alle Tabellenspalten nennt, werden unbenannte Spalten
auf ihre Vorgabewerte gesetzt. Die Zuweisung von Vorgabewerten ist in
@ref{CREATE TABLE, , @code{CREATE TABLE}} beschrieben.

@item
Ein @code{ausdruck} kann sich auf jede Spalte beziehen, die vorher in einer
Werteliste angegeben wurde. Beispielsweise k�nnen Sie folgendes eingeben:

@example
mysql> INSERT INTO tabelle (spalte1,spalte2) VALUES(15,spalte1*2);
@end example

Aber nicht das hier:

@example
mysql> INSERT INTO tabelle (spalte1,spalte2) VALUES(spalte2*2,15);
@end example

@item
Wenn Sie das Schl�sselwort @code{LOW_PRIORITY} angeben, wird die Ausf�hrung
von @code{INSERT} verz�gert, bis kein anderer Client mehr aus der Tabelle
liest. In diesem Fall muss der Client warten, bis das INSERT-Statement
fertig ist, was lange Zeit dauern kann, wenn die Tabelle stark benutzt
wird. Das ist im Gegensatz zu @code{INSERT DELAYED}, was den Client sofort
weitermachen l��t. @xref{INSERT DELAYED}. Beachten Sie, dass
@code{LOW_PRIORITY} normalerweise nicht bei @code{MyISAM}-Tabellen benutzt
werden sollte, weil dadurch gleichzeitige Einf�geoperationen verhindert
werden. @xref{MyISAM}.

@item
Wenn Sie das Schl�sselwort @code{IGNORE} in einem @code{INSERT} mit vielen
Wertezeilen angeben, werden alle Zeilen, die einen bestehenden
@code{PRIMARY}- oder @code{UNIQUE}-Schl�ssel duplizieren w�rden, ignoriert
und nicht eingef�gt. Wenn Sie @code{IGNORE} nicht angeben, wird die
Einf�geoperation abgebrochen, wenn es eine Zeile gibt, die einen
bestehenden Schl�sselwert duplizieren w�rde. Mit der C-API-Funktion
@code{mysql_info()} k�nnen Sie feststellen, wie viele Zeilen in die Tabelle
eingef�gt wurden.

@item
Wenn MySQL mit der @code{DONT_USE_DEFAULT_FIELDS}-Option konfiguriert
wurde, erzeugen @code{INSERT}-Statements einen Fehler, wenn Sie nicht
explizit Werte f�r alle Spalten angeben, die einen Nicht-@code{NULL}-Wert
erfordern. @xref{configure options,  , @code{configure}-Optionen}.

@item
Den Wert, der f�r eine @code{AUTO_INCREMENT}-Spalte benutzt wurde, finden
Sie mit der @code{mysql_insert_id}-Funktion heraus. @xref{mysql_insert_id,
, @code{mysql_insert_id()}}.
@end itemize

@findex mysql_info()
Wenn Sie ein @code{INSERT ... SELECT}- oder ein @code{INSERT ...
VALUES}-Statement mit mehrfachen Wertlisten benutzen, k�nnen Sie die
C-API-Funktion @code{mysql_info()} benutzen, um Informationen �ber die
Anfrage zu erhalten. Das Format der Informationszeichenkette ist unten
dargestellt:

@example
Records: 100 Duplicates: 0 Warnings: 0
@end example

@code{Duplicates} zeigt die Anzahl von Zeilen, die nicht eingef�gt werden
konnten, weil sie einen bestehenden eindeutigen Indexwert dupliziert
h�tten. @code{Warnings} zeigen die Anzahl von Versuchen, Spaltenwerte
einzuf�gen, die in irgend einer Weise problematisch waren. Warnungen
erfolgen unter folgenden Umst�nden:

@itemize @bullet
@item
Wenn @code{NULL} in eine Spalte eingef�gt wird, die als @code{NOT NULL}
deklariert ist. Die Spalte wird auf ihren Vorgabewert gesetzt.

@item
Wenn eine numerische Spalte auf einen Wert ausserhalb des Wertebereichs der
Spalte gesetzt wird. Der Wert wird auf den entsprechenden Endpunkt des
Bereichs abgeschnitten.

@item
Wenn eine numerische Spalte auf einen Wert wie @code{'10.34 a'} gesetzt
wird. Die unsinnigen Zeichen am Ende werden entfernt und der verbleibende
numerische Anteil eingef�gt. Wenn der Wert als Zahl �berhaupt keinen Sinn
ergibt, wird die Spalte auf @code{0} gesetzt.

@item
Wenn eine Zeichenkette in eine @code{CHAR}-, @code{VARCHAR}-, @code{TEXT}-
oder @code{BLOB}-Spalte eingef�gt wird, die die maximale L�nge der Spalte
�berschreitet. Der Wert wird auf die maximale Spaltenl�nge beschnitten.

@item
Wenn ein Wert in eine DATE- oder TIME-Spalte eingef�gt wird, der f�r den
Spaltentyp nicht zul�ssig ist. Die Spalte wird auf den entsprechenden
0-Wert f�r diesen Typ gesetzt.
@end itemize

@findex HANDLER
@node INSERT, INSERT DELAYED, HANDLER, Data Manipulation
@c German node HANDLER
@subsection @code{HANDLER}-Syntax

@example
HANDLER tabelle OPEN [ AS alias ]
HANDLER tabelle READ index @{ = | >= | <= | < @} (wert1, wert2, ... )  [ WHERE ... ] [LIMIT ... ]
HANDLER tabelle READ index @{ FIRST | NEXT | PREV | LAST @} [ WHERE ... ] [LIMIT ... ]
HANDLER tabelle READ @{ FIRST | NEXT @}  [ WHERE ... ] [LIMIT ... ]
HANDLER tabelle CLOSE
@end example

Das @code{HANDLER}-Statement erm�glicht direkten Zugriff auf die
MySQL-Tabellenschnittstelle unter Umgehung des SQL-Optimierers. Daher ist
es schneller als SELECT.

Die erste Form des @code{HANDLER}-Statements �ffnet eine Tabelle und macht
sie �ber die folgenden @code{HANDLER ... READ}-Routinen zug�nglich. Dieses
Tabellenobjekt wird nicht mit anderen Threads geteilt und wird nicht
geschlossen, bis der Thread @code{HANDLER tabelle CLOSE} aufruft oder
stirbt.

Die zweite Form holt eine (oder mehrere, festgelegt durch die
@code{LIMIT}-Klausel) Zeile, bei der der angegebene Index mit der Bedingung
�bereinstimmt und die @code{WHERE}-Bedingung erf�llt ist. Wenn der Index
aus mehreren Teilen besteht (also mehrere Spalten �berspannt), werden die
Werte in einer Komma-getrennten Liste angegeben, wobei es m�glich ist, nur
Werte f�r einige erste Spalten anzugeben.

Die dritte Form holt eine (oder mehrere, festgelegt durch die
@code{LIMIT}-Klausel) Zeile in Index-Reihenfolge aus der Tabelle, bei der
die @code{WHERE}-Bedingung erf�llt ist.

Die vierte Form (ohne Index-Angabe) holt eine (oder mehrere, festgelegt
durch die @code{LIMIT}-Klausel) Zeile in nat�rlicher Zeilenreihenfolge aus
der Tabelle (wie in der Daten-Datei gespeichert), bei der die
@code{WHERE}-Bedingung erf�llt ist. Das ist schneller als @code{HANDLER
tabelle READ index}, wenn ein kompletter Tabellen-Scan erw�nscht ist.

Die letzte Form schlie�t eine mit @code{HANDLER ... OPEN} ge�ffnete
Tabelle.

@code{HANDLER} ist in gewisser Hinsicht ein Statement auf niedriger Ebene
(Low-Level), dass zum Beispiel keine Konsistenz gew�hrleistet. Das hei�t,
@code{HANDLER ... OPEN} nimmt @strong{KEINEN} Schnappschuss der Tabelle auf
und sperrt die Tabelle @strong{NICHT}. Das bedeutet, dass nach
@code{HANDLER ... OPEN} Tabellendaten ver�ndert werden k�nnen (durch diesen
oder einen anderen Thread) und dass diese Ver�nderungen nur teilweise in
@code{HANDLER ... NEXT}- oder @code{HANDLER ... PREV}-Scans erscheinen.




@findex REPLACE ... SELECT
@findex INSERT ... SELECT



@menu
* INSERT SELECT::               
@end menu

@node INSERT SELECT,  , INSERT, INSERT
@c German node INSERT SELECT
@subsubsection @code{INSERT ... SELECT}-Syntax

@example
INSERT [LOW_PRIORITY] [IGNORE] [INTO] tabelle [(spalten_liste)] SELECT ...
@end example

Mit dem @code{INSERT ... SELECT}-Statement k�nnen Sie schnell viele Zeilen
aus einer oder mehreren anderen Tabellen einf�gen.

@example
INSERT INTO temporaere_tabelle2 (fldID) SELECT temporaere_tabelle1.fldOrder_ID FROM temporaere_tabelle1 WHERE
temporaere_tabelle1.fldOrder_ID > 100;
@end example

Folgende Bedingungen gelten f�r ein @code{INSERT ... SELECT}-Statement:

@c German FIX changed all @Minus to @minus
@itemize @minus
@item
Die Ziel-Tabelle des @code{INSERT}-Statements darf nicht in der
@code{FROM}-Klausel des @code{SELECT}-Teils der Anfrage erscheinen, weil es
in ANSI-SQL verboten ist, aus derselben Tabelle auszuw�hlen
(@code{SELECT}), in die eingef�gt wird. (Das Problem liegt darin, dass das
@code{SELECT} m�glicherweise Datens�tze finden w�rde, die fr�her w�hrend
desselben Laufs eingef�gt wurden. Wenn man Sub-Select-Klauseln verwendet,
k�nnte die Situation schnell sehr verwirrend werden!)

@item
@code{AUTO_INCREMENT}-Spalten funktionieren wie gehabt.

@item
Sie k�nnen die C-API-Funktion @code{mysql_info()} benutzen, um
Informationen �ber die Anfrage zu erhalten. @xref{INSERT}.

@item
Um sicherzustellen, dass die Update-Log-Datei/Bin�r-Log-Datei benutzt
werden kann, um die Original-Tabellenl�nge neu zu erzeugen, l��t MySQL
w�hrend @code{INSERT .... SELECT} keine gleichzeitigen Einf�geoperationen
zu.
@end itemize

Sie k�nnen nat�rlich @code{REPLACE} anstelle von @code{INSERT} benutzen, um
alte Zeilen zu �berschreiben.


@node INSERT DELAYED, UPDATE, INSERT, Data Manipulation
@c German node INSERT DELAYED
@subsection @code{INSERT DELAYED}-Syntax

@findex INSERT DELAYED
@findex DELAYED

@cindex INSERT DELAYED

@example
INSERT DELAYED ...
@end example

Die @code{DELAYED}-Option f�r das @code{INSERT}-Statement ist eine
MySQL-spezifische Option, die sehr n�tzlich ist, wenn Sie Clients haben,
die nicht warten k�nnen, bis das @code{INSERT} fertig ist. Die ist ein
h�ufiges Problem, wenn Sie MySQL zum Loggen benutzen und gelegentlich
@code{SELECT}- und @code{UPDATE}-Statements laufen lassen, die lange Zeit
ben�tigen. @code{DELAYED} wurde in MySQL-Version 3.22.15 eingef�hrt. Es ist
eine MySQL Erweiterung zu ANSI-SQL92.

@code{INSERT DELAYED} funktioniert nur bei @code{ISAM}- und
@code{MyISAM}-Tabellen. Beachten Sie: Weil @code{MyISAM}-Tabellen
gleichzeitige @code{SELECT} und @code{INSERT} unterst�tzen, wenn es keine
freien Bl�cke mitten in der Daten-Datei gibt, m�ssen Sie @code{INSERT
DELAYED} bei @code{MyISAM} nur sehr selten benutzen. @xref{MyISAM}.

Wenn Sie @code{INSERT DELAYED} benutzen, erh�lt der Client sofort ein Okay,
und die Zeile wird eingef�gt, wenn die Tabelle nicht mehr durch einen
anderen Thread in Benutzung ist.

Ein weiterer gro�er Vorteil von @code{INSERT DELAYED} ist, dass
Einf�geoperationen vieler Clients geb�ndelt und in einem Block geschrieben
werden. Das ist viel schneller als viele separate Inserts durchzuf�hren.

Beachten Sie, dass momentan die Zeilen in der Warteschlange solange nur im
Arbeitsspeicher gehalten werden, bis sie in die Tabelle eingef�gt sind. Das
hei�t, wenn Sie @code{mysqld} auf die harte Tour killen (@code{kill -9})
oder wenn @code{mysqld} unerwartet stirbt, sind Zeilen in der
Warteschlange, die noch nicht auf Festplatte geschrieben wurden, verloren!

Im Folgenden ist detailliert beschrieben, was geschieht, wenn Sie die
@code{DELAYED}-Option f�r @code{INSERT} oder @code{REPLACE} benutzen. In
dieser Beschreibung ist der ``Thread'' der Thread, der einen @code{INSERT
DELAYED}-Befehl empf�ngt. ``Handler'' ist der Thread, der alle @code{INSERT
DELAYED}-Statements f�r ein bestimmte Tabelle handhabt.

@itemize @bullet
@item
When ein Thread ein @code{DELAYED}-Statement f�r eine Tabelle ausf�hrt,
wird ein Handler-Thread erzeugt, um alle @code{DELAYED}-Statements f�r die
Tabelle auszuf�hren, wenn ein solcher Handler nicht schon existiert.

@item
Der Thread pr�ft, ob der Handler bereit eine @code{DELAYED}-Sperre erhalten
hat oder nicht. Wenn nicht, weist es den Handler-Thread an, das zu tun. Die
@code{DELAYED}-Sperre kann selbst dann erlangt werden, wenn ein anderer
Thread eine @code{READ}- oder @code{WRITE}-Sperre auf der Tabelle hat. Der
Handler wartet jedoch auf alle @code{ALTER TABLE}-Sperren oder @code{FLUSH
TABLES}, um sicherzustellen, dass die Tabellenstruktur aktuell ist.

@item
Der Thread f�hrt das @code{INSERT}-Statement aus, aber statt die Zeile in
die Tabelle zu schreiben stellt er eine Kopie der endg�ltigen Zeile in eine
Warteschlange, die vom Handler-Thread verwaltet wird. Alle Syntaxfehler
werden vom Thread erkannt und dem Client-Programm mitgeteilt.

@item
Der Client kann die Anzahl von Duplikaten oder den
@code{AUTO_INCREMENT}-Wert f�r die resultierende Zeile nicht mitteilen. Er
kann Sie vom Server nicht erhalten, weil das @code{INSERT} zur�ckkehrt,
bevor die Einf�geoperation fertig ist. Wenn Sie die C-API benutzen, gibt
die @code{mysql_info()}-Funktion aus demselben Grund nichts Sinnvolles
zur�ck.

@item
Die Update-Log-Datei wird vom Handler-Thread aktualisiert, wenn die Zeile
in die Tabelle eingef�gt wird. Im Falle des Einf�gens mehrerer Zeilen wird
die Update-Log-Datei aktualisiert, wenn die erste Zeile eingef�gt wird.

@item
Nachdem alle @code{delayed_insert_limit} Zeilen geschrieben wurden, pr�ft
der Handler, ob noch irgend welche @code{SELECT}-Statements anh�ngig sind
oder nicht. Falls ja, gestattet er diesen, ausgef�hrt zu werden, bevor
weiter gemacht wird.

@cindex delayed_insert_limit
@cindex timeout
@item
Wenn der Handler keine Zeilen mehr in seiner Warteschlange hat, wird die
Tabellensperre aufgehoben. Wenn innerhalb von @code{delayed_insert_timeout}
Sekunden keine neuen @code{INSERT DELAYED}-Befehle mehr empfangen werden,
beendet sich der Handler.

@item
Wenn mehr als @code{delayed_queue_size} Zeilen bereits in einer bestimmten
Handler-Warteschlange anh�ngig sind, wartet der Thread, der nach
@code{INSERT DELAYED} anfragt, bis es wieder Platz in der Warteschlange
gibt. Damit wird sichergestellt, dass der @code{mysqld}-Server nicht den
gesamten Arbeitsspeicher f�r die DELAYED-Warteschlange verbraucht.

@item
Der Handler-Thread zeigt sich in der MySQL-Prozessliste mit
@code{delayed_insert} in der @code{Command}-Spalte. Er wird gekillt, wenn
Sie einen @code{FLUSH TABLES}-Befehl ausf�hren oder ihn mit @code{KILL
Thread_id} killen. Er wird jedoch zuerst alle Zeilen in der Warteschlange
in die Tabelle schreiben, bevor er sich beendet. W�hrend dieser Zeit
akzeptiert er keine neuen @code{INSERT}-Befehle von anderen Threads mehr.
Wenn Sie danach einen @code{INSERT DELAYED}-Befehl ausf�hren, wird ein
neuer Handler-Thread erzeugt.

@item
Beachten Sie, dass oben Gesagtes bedeutet, dass @code{INSERT
DELAYED}-Befehle h�here Priorit�t haben als normale @code{INSERT}-Befehle,
wenn es einen @code{INSERT DELAYED}-Handler gibt, der bereits l�uft!
Andere Aktualisierungsbefehle m�ssen warten, bis die @code{INSERT
DELAYED}-Warteschlange leer ist, jemand den Handler-Thread killt (mit
@code{KILL Thread_id}) oder jemand @code{FLUSH TABLES} ausf�hrt.

@item
Die folgenden Status-Variablen stellen Informationen �ber @code{INSERT
DELAYED}-Befehle bereits:

@multitable @columnfractions .35 .65
@item @strong{Variable} @tab @strong{Bedeutung}
@item @code{Delayed_insert_thread} @tab Nummer des Handler-Threads
@item @code{Delayed_writes} @tab Anzahl der Zeilen, die mit @code{INSERT DELAYED} geschrieben wurden
@item @code{Not_flushed_delayed_rows} @tab Anzahl der Zeilen, die darauf warten, geschrieben zu werden
@end multitable

Sie k�nnen diese Variablen betrachten, wenn Sie ein @code{SHOW
STATUS}-Statement oder einen @code{mysqladmin extended-status}-Befehl
ausf�hren.
@end itemize

Beachten Sie, dass @code{INSERT DELAYED} langsamer ist als ein normales
INSERT, wenn die Tabelle nicht in Benutzung ist. Ausserdem gibt es einen
zus�tzlichen Overhead f�r den Server, um einen separaten Thread f�r jede
Tabelle zu handhaben, f�r die Sie @code{INSERT DELAYED} benutzen. Das
hei�t, Sie sollten @code{INSERT DELAYED} nur benutzen, wenn Sie es
wirklich ben�tigen!


@node UPDATE, DELETE, INSERT DELAYED, Data Manipulation
@c German node UPDATE
@subsection @code{UPDATE}-Syntax

@findex UPDATE

@example
UPDATE [LOW_PRIORITY] [IGNORE] tabelle
    SET spalten_name1=ausdruck1, [spalten_name2=ausdruck2, ...]
    [WHERE where_definition]
    [LIMIT #]
@end example

@code{UPDATE} aktualisiert Spalten in bestehenden Tabellenzeilen mit neuen
Werten. Die @code{SET}-Klausel gibt an, welche Spalten ge�ndert werden
sollen und welche Werte ihnen zugewiesen werden. Die @code{WHERE}-Klausel
legt - falls angegeben - fest, welche Zeilen aktualisiert werden sollen.
Ansonsten werden alle Zeile aktualisiert. Wenn die @code{ORDER BY}-Klausel
angegeben ist, werden die Zeilen in der angegebenen Reihenfolge
aktualisiert.

Wenn Sie das Schl�sselwort @code{LOW_PRIORITY} angeben, wird die Ausf�hrung
von @code{UPDATE} verz�gert, bis keine anderen Clients mehr aus der Tabelle
lesen.

Wenn Sie das Schl�sselwort @code{IGNORE} angeben, bricht das
UPDATE-Statement nicht ab, selbst wenn w�hrend der Aktualisierung Fehler
wegen doppelter Schl�sseleintr�ge auftreten. Zeilen, die Konflikte
verursachen w�rden, werden nicht aktualisiert.

Wenn Sie auf eine Spalte von @code{tabelle} in einem Ausdruck zugreifen,
benutzt @code{UPDATE} den momentanen Wert der Spalte. Folgendes Statement
zum Beispiel setzt die @code{age}-Spalte auf ihren momentanen Wert plus 1:

@example
mysql> UPDATE personen SET age=age+1;
@end example

@code{UPDATE}-Zuweisungen werden von links nach rechts ausgewertet.
Folgendes Statement zum Beispiel verdoppelt die @code{age}-Spalte und
inkrementiert sie danach:

@example
mysql> UPDATE personen SET age=age*2, age=age+1;
@end example

Wenn Sie eine Spalte auf einen Wert setzen, den sie momentan besitzt,
erkennt MySQL dies und aktualisiert sie nicht.

@findex mysql_info()
@code{UPDATE} gibt die Anzahl von Zeilen zur�ck, die tats�chlich ge�ndert
wurden. Ab MySQL-Version 3.22 gibt die C-API-Funktion @code{mysql_info()}
die Anzahl von Zeilen zur�ck, die �bereinstimmten und aktualisiert wurden,
und die Anzahl von Warnungen, die w�hrend @code{UPDATE} geschahen.

In MySQL-Version 3.23 k�nnen Sie @code{LIMIT #} benutzen, um
sicherzustellen, dass nur eine angegebene Anzahl von Zeilen ge�ndert wird.


@node DELETE, TRUNCATE, UPDATE, Data Manipulation
@c German node DELETE
@subsection @code{DELETE}-Syntax

@findex DELETE

@example
DELETE [LOW_PRIORITY | QUICK] FROM tabelle
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT zeilen]

oder

DELETE [LOW_PRIORITY | QUICK] tabelle[.*] [tabelle[.*] ...] FROM
tabellenverweis [WHERE where_definition]
@end example

@code{DELETE} l�scht Zeilen aus @code{tabelle}, die mit der in
@code{where_definition} angegebenen Bedingung �bereinstimmen, und gibt die
Anzahl der gel�schten Datens�tze zur�ck.

Wenn Sie @code{DELETE} ohne @code{WHERE}-Klausel angeben, werden alle
Zeilen gel�scht. Wenn Sie das im @code{AUTOCOMMIT}-Modus machen,
funktioniert es wie @code{TRUNCATE}. @xref{TRUNCATE}. In MySQL 3.23 gibt
@code{DELETE} ohne eine @code{WHERE}-Klausel als Anzahl von betroffenen
Datens�tzen 0 zur�ck.

Wenn Sie wissen wollen, wie viele Datens�tze tats�chlich gel�scht wurden,
wenn Sie alle Zeilen l�schen, und eine Geschwindigkeitseinbusse in Kauf
nehmen, k�nnen Sie ein @code{DELETE}-Statement folgender Form eingeben:

@example
mysql> DELETE FROM tabelle WHERE 1>0;
@end example

Beachten Sie, dass das VIEL langsamer als @code{DELETE FROM tabelle} ohne
@code{WHERE}-Klausel ist, weil es Zeilen eine nach der anderen l�scht.

Wenn Sie das Schl�sselwort @code{LOW_PRIORITY} angeben, wird die Ausf�hrung
von @code{DELETE} verz�gert, bis kein anderer Client mehr aus der Tabelle
liest.

Wenn Sie das Wort @code{QUICK} angeben, fasst der Tabellen-Handler w�hrend
des L�schvorgangs keine Index-Bl�tter (Index Leafs) zusammen, was bestimmte
Arten von L�schvorg�ngen beschleunigen kann.

In MyISAM-Tabellen werden gel�schte Datens�tze in einer verkn�pften Liste
verwaltet und nachfolgende @code{INSERT}-Operationen benutzen alte
Datensatzpositionen neu. Um unbenutzten Platz freizugeben und Dateigr��en
zu verringern, benutzen Sie das @code{OPTIMIZE TABLE}-Statement oder das
@code{myisamchk}-Dienstprogramm, um die Tabellen neu zu organisieren.
@code{OPTIMIZE TABLE} ist einfacher, aber @code{myisamchk} ist schneller.
Siehe @ref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}} und @ref{Optimisation}.

Das Multi-Tabellen-L�schformat wird ab MySQL 4.0.0 unterst�tzt.

Die Idee ist, dass nur �bereinstimmende Zeilen aus den Tabellen, die VOR
der @code{FROM}-Klausel stehen, gel�scht werden. Die Auswirkung ist, dass
Sie Zeilen aus vielen Tabellen zugleich l�schen k�nnen, sowie dass
zus�tzliche Tabellen zum Suchen benutzt werden.

Das @code{.*}-Zeichen nach den Tabellennamen ist nur aus Gr�nden der
Kompatibilit�t mit @code{Access} vorhanden:

@example
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
@end example

In diesem Fall werden �bereinstimmende Zeilen nur aus den Tabellen
@code{t1} und @code{t2} gel�scht.

@code{ORDER BY} und Benutzung mehrfacher Tabellen bei DELETE wird in MySQL
4.0 unterst�tzt.

Wenn eine @code{ORDER BY}-Klausel benutzt wird, werden die Zeilen in dieser
Reihenfolge gel�scht. Das ist nur in Verbindung mit @code{LIMIT} wirklich
sinnvoll. Beispiel:

@example
DELETE FROM logdatei
WHERE user = 'jcole'
ORDER BY zeitstempel
LIMIT 1
@end example

Das l�scht den �ltesten Eintrag (von @code{zeitstempel}), wo die Zeile mit
der @code{WHERE}-Klausel �bereinstimmt.

Die MySQL-spezifische @code{LIMIT rows}-Option f�r @code{DELETE} weist den
Server an, welche maximale Anzahl von Zeilen gel�scht wird, bevor die
Kontrolle an den Client zur�ck gegeben wird. Das kann benutzt werden um
sicherzustellen, dass ein bestimmter @code{DELETE}-Befehl nicht zu viel
Zeit beansprucht. Sie k�nnen den @code{DELETE}-Befehl einfach wiederholen,
bis die Anzahl betroffener Zeilen kleiner ist als der @code{LIMIT}-Wert.


@node TRUNCATE, REPLACE, DELETE, Data Manipulation
@c German node TRUNCATE
@subsection @code{TRUNCATE}-Syntax

@findex TRUNCATE

@example
TRUNCATE TABLE tabelle
@end example

In Version 3.23 wird @code{TRUNCATE TABLE} auf @code{COMMIT ; DELETE FROM
tabelle} gemappt. @xref{DELETE}.

Die Unterschiede zwischen @code{TRUNCATE TABLE} und @code{DELETE FROM ..}
sind:

@itemize @bullet
@item
TRUNCATE f�hrt ein L�schen und Neuerzeugen der Tabelle durch, was viel
schneller sit, als Zeilen eine nach der anderen zu l�schen.
@item
Nicht transaktionssicher. Sie erhalten einen Fehler, wenn Sie eine aktive
Transaktion haben oder eine aktive Tabellensperre.
@item
Gibt die Anzahl gel�schter Zeilen nicht zur�ck.
@item
Solange die Tabellendefinitionsdatei @file{tabelle.frm} g�ltig ist, kann
die Tabelle auf diese Weise neu erzeugt werden, selbst wenn die Daten- oder
Index-Dateien besch�digt wurden.
@end itemize

@code{TRUNCATE} ist eine Oracle-SQL-Erweiterung.

@node REPLACE, LOAD DATA, TRUNCATE, Data Manipulation
@c German node REPLACE
@subsection @code{REPLACE}-Syntax

@findex REPLACE

@example
    REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tabelle [(spalten_name,...)]
        VALUES (ausdruck,...),(...),...
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tabelle [(spalten_name,...)]
        SELECT ...
or  REPLACE [LOW_PRIORITY | DELAYED]
        [INTO] tabelle
        SET spalten_name=ausdruck, spalten_name=ausdruck,...
@end example

@code{REPLACE} funktioniert genau wie @code{INSERT}, ausser dass der alte
Datensatz gel�scht wird, bevor ein neuer eingef�gt wird, wenn ein alter
Datensatz in der Tabelle denselben Wert wie der neue auf einem eindeutigen
Index hat. @xref{INSERT, , @code{INSERT}}.

Mit anderen Worten k�nnen Sie auf die Werte einer alten Zeile nicht mit
einem @code{REPLACE}-Statement zugreifen. In einigen alten MySQL-Versionen
sah es so aus, als k�nnten Sie das tun, aber das war ein Bug und wurde
korrigiert.

Wenn man einen @code{REPLACE}-Befehl benutzt, gibt
@code{mysql_affected_rows()} 2 zur�ck, wenn die neue Zeile eine alte
ersetzte. Das liegt daran, dass in diesem Fall eine Zeile eingef�gt wurde
und dann das Duplikat gel�scht wurde.

Das macht es einfach zu �berpr�fen, ob @code{REPLACE} eine Zeile
hinzugef�gt oder eine ersetzt hat.


@node LOAD DATA,  , REPLACE, Data Manipulation
@c German node LOAD DATA
@subsection @code{LOAD DATA INFILE}-Syntax

@findex LOAD DATA INFILE

@example
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'datei.txt'
    [REPLACE | IGNORE]
    INTO TABLE tabelle
    [FIELDS
        [TERMINATED BY '\t']
        [[OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]
    ]
    [LINES TERMINATED BY '\n']
    [IGNORE Anzahl LINES]
    [(spalten_name,...)]
@end example

Das @code{LOAD DATA INFILE}-Statement liest Zeilen aus einer Textdatei in
eine Tabelle mit sehr hoher Geschwindigkeit. Wenn das
@code{LOCAL}-Schl�sselwort angegeben wird, wird die Datei vom Client-Host
gelesen. Wenn @code{LOCAL} nicht angegeben wird, muss die Datei auf dem
Server liegen. (@code{LOCAL} ist verf�gbar ab MySQL-Version 3.22.6.)

Aus Sicherheitsgr�nden m�ssen Dateien, die als auf dem Server liegende
Textdateien eingelesen werden, entweder im Datenbank-Verzeichnis liegen
oder von allen lesbar sein. Dar�ber hinaus brauchen Sie, wenn Sie
@code{LOAD DATA INFILE} mit Server-Dateien benutzen, die
@strong{file}-Berechtigung auf dem Server-Host. @xref{Privileges}.

Wenn Sie das Schl�sselwort @code{LOW_PRIORITY} angeben, wird das
@code{LOAD DATA}-Statement verz�gert, bis keine anderen Clients mehr aus
der Tabelle lesen.

Wenn Sie das Schl�sselwort @code{CONCURRENT} bei einer
@code{MyISAM}-Tabelle angeben, k�nnen andere Threads Daten aus der Tabelle
abrufen, w�hrend @code{LOAD DATA} ausgef�hrt wird. Die Benutzung dieser
Option beeinflusst nat�rlich die Performance von @code{LOAD DATA} ein
bisschen, selbst wenn kein anderer Thread die Tabelle zur gleichen Zeit
benutzt.

@code{LOCAL} ist etwas langsamer, als wenn der Server direkt auf die
Dateien zugreifen kann, weil die Inhalte der Datei vom Client-Host auf den
Server-Host �bertragen werden m�ssen. Auf der anderen Seite ben�tigen Sie
keine @strong{file}-Berechtigung, um lokale Dateien zu laden.

@c old version
Wenn Sie MySQL vor Version 3.23.24 benutzen, k�nnen Sie nicht aus einer
FIFO lesen, wenn Sie @code{LOAD DATA INFILE} benutzen. Wenn Sie aus einer
FIFO lesen m�ssen (zum Beispiel aus der Ausgabe von gunzip), benutzen Sie
statt dessen @code{LOAD DATA LOCAL INFILE}.

@cindex @code{mysqlimport}
Sie k�nnen Daten-Dateien auch mit dem @code{mysqlimport}-Dienstprogramm
laden; es arbeitet, indem es einen @code{LOAD DATA INFILE}-Befehl an den
Server schickt. Die @code{--local}-Option veranlasst @code{mysqlimport},
Daten-Dateien vom Client-Host zu lesen. Sie k�nnen die
@code{--compress}-Option angeben, um bessere Performance �ber langsame
Netzwerke zu erzielen, wenn der Client und der Server das komprimierte
Protokoll unterst�tzen.

Bei der Suche nach Dateien auf dem Server-Host geht der Server nach
folgenden Regeln vor:

@itemize @bullet
@item
Wenn ein absoluter Pfadname angegeben wird, benutzt der Server den
Pfadnamen so, wie er ist.

@item
Wenn ein relativer Pfadname mit einer oder mehreren f�hrenden Bestandteilen
angegeben wird, sucht der Server die Datei relativ zum Daten-Verzeichnis
des Servers.

@item
Wenn ein Dateiname ohne f�hrende Bestandteile angegeben wird, sucht der
Server die Datei im Datenbank-Verzeichnis der aktuellen Datenbank.
@end itemize

Beachten Sie, dass diese Regeln bedeuten, dass eine Datei, die als
@file{./meinedatei.txt} angegeben wird, aus dem Daten-Verzeichnis des
Servers gelesen wird, wohingegen eine Datei, die als @file{meinedatei.txt}
angegeben wird, aus dem Datenbank-Verzeichnis der aktuellen Datenbank
gelesen wird. Das folgende @code{LOAD DATA}-Statement beispielsweise liest
die Datei @file{daten.txt} aus dem Datenbank-Verzeichnis von
@code{datenbank1}, weil @code{datenbank1} die aktuelle Datenbank ist,
obwohl das Statement die Datei explizit in eine Tabelle in der
@code{datenbank2}-Datenbank l�dt:

@example
mysql> USE datenbank1;
mysql> LOAD DATA INFILE "daten.txt" INTO TABLE datenbank2.meine_tabelle;
@end example

Die @code{REPLACE}- und @code{IGNORE}-Schl�sselw�rter steuern die
Handhabung von Eingabe-Datens�tzen, die bestehende Datens�tze auf
eindeutigen Schl�sselwerten duplizieren. Wenn Sie @code{REPLACE} angeben,
ersetzen neue Zeilen bestehende Zeilen, die denselben eindeutigen
Schl�sselwert besitzen. Wenn Sie @code{IGNORE} angeben, werden
Eingabe-Zeilen, die eine bestehende Zeile auf einem Schl�sselwert
duplizieren, �bersprungen. Wenn Sie keine der beiden Optionen angeben,
tritt ein Fehler auf, wenn ein doppelter Schl�sselwert gefunden wird, und
der Rest der Textdatei wird ignoriert.

Wenn Sie Daten aus einer lokalen Datei mit dem @code{LOCAL}-Schl�sselwort
laden, hat der Server keine M�glichkeit, die �bertragung der Datei mitten
in einer Operation zu beenden. Daher ist das vorgabem��ige Verhalten
dasselbe, als wenn @code{IGNORE} angegeben w�re.

Wenn Sie @code{LOAD DATA INFILE} auf einer leeren @code{MyISAM}-Tabelle
benutzen, werden alle nicht eindeutigen Indexe in einem separaten Stapel
erzeugt (wie bei @code{REPAIR}). Das macht @code{LOAD DATA INFILE}
normalerweise viel schneller, wenn Sie viele Indexe haben.

@code{LOAD DATA INFILE} ist das Komplement von @code{SELECT ... INTO OUTFILE}.
@xref{SELECT, , @code{SELECT}}. Um Daten aus einer Datenbank in eine Datei
zu schreiben, benutzen Sie @code{SELECT ... INTO OUTFILE}. Um die Datei
zur�ck in die Datenbank zu lesen, benutzen Sie @code{LOAD DATA INFILE}. Die
Syntax der @code{FIELDS}- und @code{LINES}-Klauseln ist f�r beide Befehle
dieselbe. Beide Klauseln sind optional, aber @code{FIELDS} muss
@code{LINES} vorangehen, wenn beide angegeben werden.

Wenn Sie eine @code{FIELDS}-Klausel angeben, ist jede ihrer Unterklauseln 
(@code{TERMINATED BY}, @code{[OPTIONALLY] ENCLOSED BY} und @code{ESCAPED
BY}) ebenfalls optional, ausser dass Sie zumindest eine von ihnen angeben
m�ssen.

Wenn Sie keine @code{FIELDS}-Klausel benutzen, sind die Vorgabewerte
dieselben, als wenn Sie folgendes geschrieben h�tten:

@example
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
@end example

Wenn Sie keine @code{LINES}-Klausel angeben, sind die Vorgabewerte
dieselben, als wenn Sie folgendes geschrieben h�tten:

@example
LINES TERMINATED BY '\n'
@end example

Mit anderen Worten veranlassen die Vorgabewerte @code{LOAD DATA INFILE},
beim Lesen von Eingaben wie folgt zu arbeiten:

@itemize @bullet
@item
Zeilenbegrenzungen werden an Neue-Zeile-Zeichen gesucht (\n).

@item
Zeilen werden an Tabulatoren (\t) in Felder aufgeteilt.

@item
Es wird nicht davon ausgegangen, dass Felder in Anf�hrungszeichen
eingeschlossen sind.

@item
Tabulatoren, Neue-Zeile-Zeichen oder @samp{\}, denen ein @samp{\}-Zeichen
voran gestellt ist, werden als Literale interpretiert, die Teil des
Feldwerts sind.
@end itemize

Im Vergleich dazu veranlassen die Vorgabewerte von @code{SELECT ... INTO
OUTFILE} dieses, wie folgt zu arbeiten:

@itemize @bullet
@item
Zwischen Felder werden Tabulatoren (\t) geschrieben.

@item
Felder werden nicht in Anf�hrungsstriche geschrieben.

@item
@samp{\} wird benutzt, um Tabulator, Neue-Zeile-Zeichen oder @samp{\}
innerhalb von Feldwerten zu escapen.

@item
Am Ende von Zeilen werden Neue-Zeile-Zeichen (\n) geschrieben.
@end itemize

Beachten Sie, dass Sie @code{FIELDS ESCAPED BY '\\'} (mit zwei Backslashes)
schreiben m�ssen, damit der Wert als ein einzelner Backslash gelesen wird.

Die @code{IGNORE anzahl LINES}-Option kann benutzt werden, um eine
Kopfzeile aus Spaltennamen am Anfang der Datei zu ignorieren:

@example
mysql> LOAD DATA INFILE "/tmp/datei.txt" into Tabelle test IGNORE 1 LINES;
@end example

Wenn Sie @code{SELECT ... INTO OUTFILE} zusammen mit @code{LOAD DATA
INFILE} benutzen, um Daten aus einer Datenbank in eine Datei zu schreiben
und dann die Datei sp�ter zur�ck in die Datenbank zu lesen, m�ssen die
Optionen f�r die Behandlung von Feldern und Zeilen f�r beide Befehle
�bereinstimmen. Ansonsten interpretiert @code{LOAD DATA INFILE} die Inhalte
der Datei nicht korrekt. Angenommen, Sie benutzen @code{SELECT ... INTO
OUTFILE}, um eine Datei zu schreiben, deren Feldern durch Kommas begrenzt
sind:

@example
mysql> SELECT * INTO OUTFILE 'daten.txt'
           FIELDS TERMINATED BY ','
           FROM ...;
@end example

Um die Komma-begrenzte Datei wieder einzulesen, lautet das korrekte
Statement:

@example
mysql> LOAD DATA INFILE 'daten.txt' INTO TABLE tabelle2
           FIELDS TERMINATED BY ',';
@end example

Wenn Sie statt dessen versuchen, die Datei mit dem unten stehenden
Statement einzulesen, funktioniert das nicht, weil es @code{LOAD DATA
INFILE} anweist, nach Tabulatoren zwischen Feldern zu suchen:

@example
mysql> LOAD DATA INFILE 'daten.txt' INTO TABLE tabelle2
           FIELDS TERMINATED BY '\t';
@end example

Das wahrscheinliche Ergebnis ist, dass jede Eingabezeile als ein einzelnes
Feld interpretiert wird.

@code{LOAD DATA INFILE} kann auch benutzt werden, um Dateien aus externen
Quellen einzulesen. Eine Datei im dBASE-Format zum Beispiel hat Felder, die
durch Kommas getrennt und in Anf�hrungszeichens eingeschlossen sind. Wenn
Zeilen in der Datei von Neue-Zeile-Zeichen begrenzt sind, zeigt der unten
stehende Befehl die Feld- und Zeilen-Handhabungsoptionen, die f�r das Laden
der Datei benutzt werden:

@example
mysql> LOAD DATA INFILE 'daten.txt' INTO TABLE tabelle
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';
@end example

Jede der Feld- oder Zeilen-Handhabungsoptionen kann eine leere Zeichenkette
angeben (@code{''}). Wenn nicht leer, m�ssen die @code{FIELDS [OPTIONALLY]
ENCLOSED BY}- und @code{FIELDS ESCAPED BY}-Werte ein einzelnes Zeichen
sein. Die @code{FIELDS TERMINATED BY}- und @code{LINES TERMINATED BY}-Werte
k�nnen aus mehr als einem Zeichen bestehen. Um zum Beispiel Zeilen zu
schreiben, die durch Wagenr�cklauf-Neue-Zeile-Paare getrennt sind, oder um
eine Datei einzulesen, die solche Zeilen enth�lt, geben Sie eine
@code{LINES TERMINATED BY '\r\n'}-Klausel an.

Um beispielsweise eine Datei mit Witzen einzulesen, die durch @code{%%}
getrennt sind, k�nnen Sie folgendes eingeben:

@example
create table witze (a int not null auto_increment primary key, witz text not null);
load data infile "/tmp/witze.txt" into table witze fields terminated by "" lines terminated by "\n%%\n" (witz);
@end example

@code{FIELDS [OPTIONALLY] ENCLOSED BY} steuert die Art von
Anf�hrungszeichen von Feldern. Wenn Sie bei der Ausgabe (@code{SELECT ...
INTO OUTFILE}) das Wort @code{OPTIONALLY} auslassen, sind alle Felder vom
@code{ENCLOSED BY}-Zeichen eingeschlossen. Ein Beispiel einer solchen
Ausgabe (mit Kommas als Feldbegrenzern) ist unten dargestellt:

@example
"1","eine Zeichenkette","100.20"
"2","eine Zeichenkette, die ein Komma (,) enth�lt","102.20"
"3","eine Zeichenkette, die ein \" Anf�hrungszeichen enth�lt","102.20"
"4","eine Zeichenkette, die ein \", Anf�hrungszeichen und Komma (,) enth�lt","102.20"
@end example

Wenn Sie @code{OPTIONALLY} angeben, wird das @code{ENCLOSED BY}-Zeichen nur
benutzt, um @code{CHAR}- und @code{VARCHAR}-Felder zu umschlie�en:

@example
1,"eine Zeichenkette",100.20
2,"eine Zeichenkette mit einem , Komma",102.20
3,"eine Zeichenkette mit einem \" Anf�hrungszeichen",102.20
4,"eine Zeichenkette mit \", Anf�hrungszeichen und Komma",102.20
@end example

Beachten Sie, dass @code{ENCLOSED BY}-Zeichen innerhalb eines Feldwerts
escapet werden, indem ihnen das @code{ESCAPED BY}-Zeichen vorangestellt
wird. Beachten Sie auch, dass es bei der Angabe eines leeren empty
@code{ESCAPED BY}-Werts m�glich ist, Ausgaben zu erzeugen, die nicht
korrekt von @code{LOAD DATA INFILE} eingelesen werden k�nnen. Die oben
dargestellte Ausgabe zum Beispiel w�rde wie im Folgenden gezeigt
erscheinen, wenn das Fluchtzeichen (Escape-Zeichen) leer ist. Beachten Sie,
dass das zweite Feld der vierten Zeile nach dem Anf�hrungszeichen ein Komma
enth�lt, was (irrt�mlich) als Feldbegrenzer interpretiert wird:

@example
1,"eine Zeichenkette",100.20
2,"eine Zeichenkette mit einem , Komma",102.20
3,"eine Zeichenkette mit einem " Anf�hrungszeichen",102.20
4,"eine Zeichenkette mit ", Anf�hrungszeichen und Komma",102.20
@end example

F�r die Eingabe wird das @code{ENCLOSED BY}-Zeichen - falls vorhanden - vom
Ende von Feldwerten entfernt. (Das gilt, egal ob @code{OPTIONALLY}
angegeben ist oder nicht; @code{OPTIONALLY} hat keine Auswirkung auf die
Interpretation der Eingabe.) @code{ENCLOSED BY}-Zeichen, denen das
@code{ESCAPED BY}-Zeichen vorangestellt ist, werden als Teil des aktuellen
Feldwerts interpretiert. Zus�tzlich werden verdoppelte @code{ENCLOSED
BY}-Zeichen innerhalb von Feldern als ein einzelnes @code{ENCLOSED
BY}-Zeichen interpretiert, falls das Feld selbst mit diesem Zeichen
anf�ngt. Wenn beispielsweise @code{ENCLOSED BY '"'} angegeben wird, werden
Anf�hrungszeichen wie folgt behandelt:

@example
"Der ""BIG"" Boss"  -> Der "BIG" Boss
Der "BIG" Boss      -> Der "BIG" Boss
Der ""BIG"" Boss    -> Der ""BIG"" Boss
@end example

@code{FIELDS ESCAPED BY} steuert, wie Sonderzeichen geschrieben oder
gelesen werden. Wenn das @code{FIELDS ESCAPED BY}-Zeichen nicht leer ist,
wird es benutzt, um es bei der Ausgabe folgenden Zeichen voranzustellen:
@itemize @bullet
@item
Dem @code{FIELDS ESCAPED BY}-Zeichen
@item
Dem @code{FIELDS [OPTIONALLY] ENCLOSED BY}-Zeichen
@item
Dem ersten Zeichen von @code{FIELDS TERMINATED BY}- und @code{LINES
TERMINATED BY}-Werten
@item
ASCII @code{0} (was tats�chlich nach dem Fluchtzeichen (Escape-Zeichen)
als ASCII @code{'0'} geschrieben wird, nicht ein Byte mit Wert 0)
@end itemize

Wenn das @code{FIELDS ESCAPED BY}-Zeichen leer ist, werden keine Zeichen
escapet. Es ist wahrscheinlich keine gute Idee, ein leeres Fluchtzeichen
(Escape-Zeichen) anzugeben, insbesondere, wenn Feldwerte in Ihren Daten
irgend welche der Zeichen enthalten, die gerade aufgelistet wurden.

F�r die Eingabe werden, falls das @code{FIELDS ESCAPED BY}-Zeichen nicht
leer ist, Vorkommen dieses Zeichens entfernt, und die folgenden Zeichen
werden buchst�blich als Teil des Feldwerts genommen. Die Ausnahmen sind ein
escapetes @samp{0} oder @samp{N} (beispielsweise @code{\0} oder @code{\N},
wenn das Fluchtzeichen (Escape-Zeichen) @samp{\} ist). Diese Folgen werden
als ASCII-@code{0} interpretiert (ein Byte mit Wert 0) und @code{NULL}.
Siehe unten zu den Regeln der @code{NULL}-Handhabung.

Weitere Informationen �ber die @samp{\}-Escape-Syntax finden Sie unter
@ref{Literals}.

In bestimmten F�llen beeinflussen sich die Handhabungsoptionen f�r Felder
und Zeilen gegenseitig:

@itemize @bullet
@item
Wenn @code{LINES TERMINATED BY} eine leere Zeichenkette ist und
@code{FIELDS TERMINATED BY} nicht leer ist, werden Zeile auch durch
@code{FIELDS TERMINATED BY} begrenzt.
@item
Wenn die @code{FIELDS TERMINATED BY}- und @code{FIELDS ENCLOSED BY}-Werte
beide leer sind (@code{''}), wird ein Festzeilen- (nicht begrenztes) Format
benutzt. Beim Festzeilenformat werden keine Begrenzer zwischen Feldern
benutzt. Statt dessen werden Spaltenwerte geschrieben und gelesen, indem
die Anzeigebreite der Spalten benutzt wird. Wenn eine Spalte zum Beispiel
als @code{INT(7)} deklariert ist, werden Werte f�r die Spalte mit
7-Zeichen-Feldern geschrieben. Bei der Eingabe werden Werte f�r die Spalte
mit 7-Zeichen-Feldern bezogen. Festzeilenformate beeinflussen auch die
Handhabung von @code{NULL}-Werten (siehe unten). Beachten Sie, dass
Festgr��enformate nicht funktionieren, wenn Sie einen
Multi-Byte-Zeichensatz benutzen.
@end itemize

Die Handhabung von @code{NULL}-Werten variiert in Abh�ngigkeit von den
@code{FIELDS}- und @code{LINES}-Optionen, die Sie benutzen:

@itemize @bullet
@item
Bei den vorgabem��igen @code{FIELDS}- und @code{LINES}-Werten wird
@code{NULL} f�r die Ausgabe als @code{\N} geschrieben und @code{\N} als
@code{NULL} f�r die Eingabe gelesen (unter der Annahme, dass das
@code{ESCAPED BY}-Zeichen @samp{\} ist).

@item
Wenn @code{FIELDS ENCLOSED BY} nicht leer ist, wird ein Feld, das das
Literalwort @code{NULL} als seinen Wert enth�lt, als @code{NULL}-Wert
gelesen (das weicht ab vom Wort @code{NULL}, begrenzt durch @code{FIELDS
ENCLOSED BY}-Zeichen, was als die Zeichenkette @code{'NULL'} gelesen wird).

@item
Wenn @code{FIELDS ESCAPED BY} leer ist, wird @code{NULL} als das Wort
@code{NULL} gelesen.

@item
Beim Festzeilenformat (was auftritt, wenn sowohl @code{FIELDS TERMINATED
BY} als auch @code{FIELDS ENCLOSED BY} leer sind), wird @code{NULL} als
leere Zeichenkette geschrieben. Beachten Sie, dass das dazu f�hrt, dass
@code{NULL}-Werte und leere Zeichenketten in der Tabelle nicht mehr
unterscheidbar sind, wenn in die Datei geschrieben wird, weil sie beide als
leere Zeichenketten geschrieben werden. Wenn Sie in der Lage sein m�ssen,
diese zu unterscheiden, wenn Sie die Datei wieder einlesen, sollten Sie
kein Festzeilenformat benutzen.
@end itemize

Einige F�lle werden von @code{LOAD DATA INFILE} nicht unterst�tzt:
@itemize @bullet

@item
Festgr��enzeilen (@code{FIELDS TERMINATED BY} und @code{FIELDS ENCLOSED
BY} sind beide leer) und @code{BLOB}- oder @code{TEXT}-Spalten.

@item
Wenn Sie ein Trennzeichen angeben, das dasselbe wie ein anderes ist oder
einem anderen vorangestellt ist. @code{LOAD DATA INFILE} kann in diesem
Fall die Eingabe nicht korrekt interpretieren. Folgende
@code{FIELDS}-Klausel zum Beispiel w�rde Probleme bereiten:

@example
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
@end example

@item
Wenn @code{FIELDS ESCAPED BY} leer ist, f�hrt ein Feldwert, der ein
Vorkommen von @code{FIELDS ENCLOSED BY} oder @code{LINES TERMINATED BY}
gefolgt vom @code{FIELDS TERMINATED BY}-Wert enth�lt, dazu, dass @code{LOAD
DATA INFILE} mit dem Einlesen eines Feldes oder einer Zeile zu fr�h
aufh�rt. Das passiert, weil @code{LOAD DATA INFILE} nicht korrekt festlegen
kann, wo der Feld- oder Zeilenwert endet.
@end itemize

Das folgende Beispiel l�dt alle Spalten der @code{personen}-Tabelle:

@example
mysql> LOAD DATA INFILE 'personen.txt' INTO TABLE personen;
@end example

Es ist keine Felderliste angegeben, daher erwartet @code{LOAD DATA INFILE},
dass die Eingabefelder ein Feld f�r jede Tabellenspalte enthalten. Die
Vorgabewerte f�r @code{FIELDS} und @code{LINES}-Werte werden benutzt.

Wenn Sie Daten nur in einige Tabellenspalten einladen wollen, geben Sie
eine Felderliste an:

@example
mysql> LOAD DATA INFILE 'personen.txt'
           INTO TABLE personen (spalte1,spalte2,...);
@end example

Eine Felderliste m�ssen Sie ausserdem angeben, wenn die Reihenfolge der
Felder in der Eingabedatei von der Reihenfolge der Tabellenspalten
abweicht. Ansonsten kann MySQL nicht feststellen, wie er Eingabefelder
Tabellenspalten zuordnen soll.

Wenn eine Zeile zu wenige Felder hat, werden die Spalten, f�r die es kein
Eingabefeld gibt, auf ihre Vorgabewerte gesetzt. Die Zuweisung von
Vorgabewerten ist unter @ref{CREATE TABLE, , @code{CREATE TABLE}}
beschrieben.

Ein leerer Feldwert wird anders interpretiert als ein fehlender Feldwert:

@itemize @bullet
@item
Bei Zeichenketten-Typen wird die Spalte auf die leere Zeichenkette gesetzt.

@item
Bei numerischen Typen wird die Spalte auf @code{0} gesetzt.

@item
Bei Datums- und Zeit-Typen wird die Spalte auf den entsprechenden
``0''-Wert f�r den Typ gesetzt.
@xref{Date and time types}.
@end itemize

Beachten Sie, dass das dieselben Werte sind, die sich ergeben, wenn Sie
einer Zeichenkette explizit eine leere Zeichenkette zuweisen oder solches
f�r einen DATE- oder TIME-Type in einem @code{INSERT}- oder
@code{UPDATE}-Statement tun.

@code{TIMESTAMP}-Spalten werden nur dann auf das aktuelle Datum und die
aktuelle Zeit gesetzt, wenn es einen @code{NULL}-Wert f�r die Spalte gibt
oder (nur f�r die erste @code{TIMESTAMP}-Spalte) die
@code{TIMESTAMP}-Spalte in der Felderliste ausgelassen ist, wenn eine
Felderliste angegeben wird.

Wenn eine Eingabezeile zu viele Felder hat, werden die zus�tzlichen Felder
ignoriert und die Anzahl von Warnungen herauf gez�hlt.

@code{LOAD DATA INFILE} betrachtet alle Eingaben als Zeichenketten, daher
k�nnen Sie f�r @code{ENUM} oder @code{SET}-Spalten keine numerischen Werte
benutzen, wie Sie das bei @code{INSERT}-Statements tun k�nnen. Alle
@code{ENUM}- und @code{SET}-Werte m�ssen als Zeichenketten angegeben
werden!

@findex mysql_info()
Wenn Sie die C-API benutzen, k�nnen Sie Informationen �ber die Anfrage
durch den Aufruf der API-Funktion @code{mysql_info()} erhalten, wenn die
@code{LOAD DATA INFILE}-Anfrage beendet ist. Das Format der
Informationszeichenkette sieht wie folgt aus:

@example
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
@end example

Warnungen erfolgen unter denselben Umst�nden, als wenn Werte �ber das
@code{INSERT}-Statement (@pxref{INSERT, , @code{INSERT}}) eingef�gt werden,
ausser dass @code{LOAD DATA INFILE} zus�tzlich Warnungen erzeugt, wenn es
zu wenige oder zu viele Felder in der Eingabezeile gibt. Die Warnungen
werden nirgendwo gespeichert; die Anzahl von Warnungen kann daher nur als
Anhaltspunkt daf�r benutzt werden, ob alles gut ging. Wenn Sie Warnungen
erhalten und genau wissen wollen, warum Sie diese erhalten, besteht eine
M�glichkeit daf�r darin, @code{SELECT ... INTO OUTFILE} in eine andere
Datei zu benutzen und diese mit der Original-Eingabedatei zu vergleichen.

Wenn Sie wollen, dass @code{LOAD DATA} aus einer Pipe liest, k�nnen Sie
folgenden Trick benutzen:

@example
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x
mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
@end example

Wenn Sie eine MySQL-Version vor 3.23.25 benutzen, k�nnen Sie das nur mit
@code{LOAD DATA LOCAL INFILE} durchf�hren.

Weitere Informationen �ber die Effizienz von @code{INSERT} versus
@code{LOAD DATA INFILE} und M�glichkeiten, die Geschwindigkeit zu steigern,
finden Sie unter @code{LOAD DATA INFILE}, @xref{Insert speed}.


@node Data Definition, Basic User Commands, Data Manipulation, Reference
@c German node Datendefinition
@section Datendefinition: @code{CREATE}, @code{DROP}, @code{ALTER}



@menu
* CREATE DATABASE::             
* DROP DATABASE::               
* CREATE TABLE::                
* ALTER TABLE::                 
* RENAME TABLE::                
* DROP TABLE::                  
* CREATE INDEX::                
* DROP INDEX::                  
@end menu

@node CREATE DATABASE, DROP DATABASE, Data Definition, Data Definition
@c German node CREATE DATABASE
@subsection @code{CREATE DATABASE}-Syntax

@findex CREATE DATABASE

@example
CREATE DATABASE [IF NOT EXISTS] datenbank
@end example

@c German FIX unwrapped @ref
@code{CREATE DATABASE} erzeugt eine Datenbank mit dem angegebenen Namen.
Die Regeln f�r erlaubte Datenbanknamen finden Sie unter @ref{Legal names}.
Ein Fehler tritt auf, wenn die Datenbank bereits existiert und Sie
@code{IF NOT EXISTS} nicht angeben.

Datenbanken sind in MySQL als Verzeichnisse implementiert, die Dateien
enthalten, die den Tabellen in der Datenbank entsprechen. Weil es keine
Tabellen in einer Datenbank gibt, wenn diese erstmalig erzeugt wird,
erzeugt das @code{CREATE DATABASE}-Statement nur ein Verzeichnis unter dem
MySQL-Daten-Verzeichnis.

@cindex @code{mysqladmin}
Sie k�nnen auch mit @code{mysqladmin} Datenbanken erzeugen.
@xref{Client-Side Scripts}.


@node DROP DATABASE, CREATE TABLE, CREATE DATABASE, Data Definition
@c German node DROP DATABASE
@subsection @code{DROP DATABASE}-Syntax

@findex DROP DATABASE

@example
DROP DATABASE [IF EXISTS] datenbank
@end example

@code{DROP DATABASE} l�scht alle Tabellen in der Datenbank und l�scht die
Datenbank. Wenn Sie ein @code{DROP DATABASE} auf eine symbolisch verkn�pfte
Datenbank ausf�hren, werden sowohl der Link als auch die Original-Datenbank
gel�scht. @strong{Seien Sie mit diesem Befehl sehr vorsichtig!}

@code{DROP DATABASE} gibt die Anzahl von Dateien zur�ck, die aus dem
Datenbank-Verzeichnis entfernt wurden. Normalerweise ist das dreimal die
Anzahl der Tabellen, weil normalerweise jede Tabelle einer
@file{.MYD}-Datei, einer @file{.MYI}-Datei und einer @file{.frm}-Datei
entspricht.

Der @code{DROP DATABASE}-Befehl entfernt aus dem angegebenen
Datenbank-Verzeichnis alle Dateien mit folgenden Erweiterungen:

@multitable @columnfractions .25 .25 .25 .25
@item .BAK @tab .DAT @tab .HSH @tab .ISD
@item .ISM @tab .ISM @tab .MRG @tab .MYD
@item .MYI @tab .db  @tab .frm
@end multitable

Alle Unterverzeichnisse, die aus 2 Ziffern bestehen
(@code{RAID}-Verzeichnisse), werden ebenfalls gel�scht.

Ab MySQL-Version 3.22 k�nnen Sie die Schl�sselw�rter @code{IF EXISTS}
benutzen, um eine Fehlermeldung zu vermeiden, die erscheint, wenn die
Datenbank nicht existiert.

@cindex @code{mysqladmin}
Sie k�nnen Datenbanken auch mit @code{mysqladmin} l�schen.
@xref{Client-Side Scripts}.



@node CREATE TABLE, ALTER TABLE, DROP DATABASE, Data Definition
@c German node CREATE TABLE
@subsection @code{CREATE TABLE}-Syntax

@findex CREATE TABLE


@example
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tabelle [(create_definition,...)]
[tabellen_optionen] [select_statement]

create_definition:
  spalten_name typ [NOT NULL | NULL] [DEFAULT vorgabe_wert] [AUTO_INCREMENT]
            [PRIMARY KEY] [referenz_definition]
  oder    PRIMARY KEY (index_spalten_name,...)
  oder    KEY [index_name] (index_spalten_name,...)
  oder    INDEX [index_name] (index_spalten_name,...)
  oder    UNIQUE [INDEX] [index_name] (index_spalten_name,...)
  oder    FULLTEXT [INDEX] [index_name] (index_spalten_name,...)
  oder    [CONSTRAINT symbol] FOREIGN KEY index_name (index_spalten_name,...)
            [referenz_definition]
  oder    CHECK (ausdruck)

typ:
        TINYINT[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    SMALLINT[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    MEDIUMINT[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    INT[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    INTEGER[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    BIGINT[(laenge)] [UNSIGNED] [ZEROFILL]
  oder    REAL[(laenge,dezimalstellen)] [UNSIGNED] [ZEROFILL]
  oder    DOUBLE[(laenge,dezimalstellen)] [UNSIGNED] [ZEROFILL]
  oder    FLOAT[(laenge,dezimalstellen)] [UNSIGNED] [ZEROFILL]
  oder    DECIMAL(laenge,dezimalstellen) [UNSIGNED] [ZEROFILL]
  oder    NUMERIC(laenge,dezimalstellen) [UNSIGNED] [ZEROFILL]
  oder    CHAR(laenge) [BINARY]
  oder    VARCHAR(laenge) [BINARY]
  oder    DATE
  oder    TIME
  oder    TIMESTAMP
  oder    DATETIME
  oder    TINYBLOB
  oder    BLOB
  oder    MEDIUMBLOB
  oder    LONGBLOB
  oder    TINYTEXT
  oder    TEXT
  oder    MEDIUMTEXT
  oder    LONGTEXT
  oder    ENUM(wert1,wert2,wert3,...)
  oder    SET(wert1,wert2,wert3,...)

index_spalten_name:
        spalten_name [(laenge)]

referenz_definition:
        REFERENCES tabelle [(index_spalten_name,...)]
                   [MATCH FULL | MATCH PARTIAL]
                   [ON DELETE referenz_option]
                   [ON UPDATE referenz_option]

referenz_option:
        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

tabellen_optionen:
	TYPE = @{BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM @}
or	AUTO_INCREMENT = #
or	AVG_ROW_LENGTH = #
or	CHECKSUM = @{0 | 1@}
or	COMMENT = "string"
or	MAX_ROWS = #
or	MIN_ROWS = #
or	PACK_KEYS = @{0 | 1 | DEFAULT@}
or	PASSWORD = "string"
or	DELAY_KEY_WRITE = @{0 | 1@}
or      ROW_FORMAT= @{ default | dynamic | fixed | compressed @}
or	RAID_TYPE= @{1 | STRIPED | RAID0 @} RAID_CHUNKS=#  RAID_CHUNKSIZE=#
or	UNION = (tabelle,[tabelle...])
or	INSERT_METHOD= @{NO | FIRST | LAST @}
or      DATA directory="verzeichnis"
or      INDEX directory="verzeichnis"

select_statement:
	[IGNORE | REPLACE] SELECT ...  (jedes zul�ssige SELECT-Statement)
@end example

@code{CREATE TABLE} erzeugt eine Tabelle mit dem angegebenen Namen in der
aktuellen Datenbank. Die Regeln f�r erlaubte Tabellennamen finden Sie unter
@ref{Legal names}. Ein Fehler tritt auf, wenn es keine aktuelle
Datenbank gibt oder wenn die Tabelle bereits existiert.

Ab MySQL-Version 3.22 kann der Tabellenname als @code{datenbank.tabelle}
angegeben werden. Das funktioniert unabh�ngig davon, ob es eine aktuelle
Datenbank gibt oder nicht.

In MySQL-Version 3.23 k�nnen Sie das @code{TEMPORARY}-Schl�sselwort
benutzen, wenn Sie eine Tabelle erzeugen. Eine tempor�re Tabelle wird
automatisch gel�scht, wenn eine Verbindung stirbt und der Name sich auf die
Verbindung bezieht. Das bedeutet, dass zwei verschiedene Verbindungen beide
denselben tempor�ren Tabellenname benutzen k�nnen, oder miteinander oder
einer bestehenden Tabelle gleichen Namens in Konflikt zu geraten. (Die
bestehende Tabelle ist versteckt, bis die tempor�re Tabelle gel�scht wird.)

Ab MySQL-Version 3.23 k�nnen Sie die Schl�sselw�rter @code{IF NOT EXISTS}
benutzen, so dass kein Fehler auftritt, wenn die Tabelle bereits besteht.
Beachten Sie, dass keine �berpr�fung erfolgt, dass die Tabellenstrukturen
identisch sind.

Jede Tabelle @code{tabelle} wird durch einige Dateien im
Datenbank-Verzeichnis dargestellt. Im Falle von MyISAM-Tabellen erhalten
Sie:

@multitable @columnfractions .2 .8
@item @strong{Datei} @tab @strong{Zweck}
@item @code{tabelle.frm} @tab Tabellendefinitionsdatei (form)
@item @code{tabelle.MYD} @tab Daten-Datei
@item @code{tabelle.MYI} @tab Index-Datei
@end multitable

Weitere Information �ber die Eigenschaften der verschiedenen Spaltentypen
finden Sie unter @ref{Column types}:

@itemize @bullet
@item
Wenn weder @code{NULL} noch @code{NOT NULL} angegeben ist, wird die Spalte
behandelt, als wenn @code{NULL} angegeben worden w�re.

@item
Eine Ganzzahl-Spalte kann das zus�tzliche Attribut @code{AUTO_INCREMENT}
haben. Wenn Sie einen Wert von @code{NULL} (empfohlen) oder @code{0} in
eine @code{AUTO_INCREMENT}-Spalte einf�gen, wird die Spalte auf
@code{wert+1} gesetzt, wobei @code{wert} der gr��te momentan in der
Tabelle vorhandene Spaltenwert ist. @code{AUTO_INCREMENT}-Folgen fangen mit
@code{1} an. @xref{mysql_insert_id, , @code{mysql_insert_id()}}.

Wenn Sie eine Zeile l�schen, die den h�chsten Wert einer
@code{AUTO_INCREMENT}-Spalte enth�lt, wird der Wert bei einer @code{ISAM}-
oder @code{BDB}-Tabelle wieder verwendet, nicht aber bei einer
@code{MyISAM}- oder @code{InnoDB}-Tabelle. Wenn Sie alle Zeilen in der
Tabelle mit @code{DELETE FROM tabelle} (ohne ein @code{WHERE}) im
@code{AUTOCOMMIT}-Modus l�schen, f�ngt die Folge bei allen Tabellentypen
von Neuem an.

@strong{HINWEIS:} Es darf nur eine @code{AUTO_INCREMENT}-Spalte pro Tabelle
geben und diese muss indiziert sein. MySQL-Version 3.23 funktioniert
dar�ber hinaus nur korrekt, wenn die @code{AUTO_INCREMENT}-Spalte nur
positive Werte hat. Das Einf�gen einer negativen Zahl wird als Einf�gen
einer sehr gro�en positiven Zahl betrachtet. Damit werden
Genauigkeitsprobleme vermieden, wenn Zahlen vom positiven zum negativen
Bereich �bergehen. Ausserdem wird sichergestellt, dass man nicht
versehentlich eine @code{AUTO_INCREMENT}-Spalte erh�lt, die 0 enth�lt.

@cindex ODBC-Kompatibilit�t
@cindex Kompatibilit�t, mit ODBC
Um MySQL kompatibel mit einigen ODBC-Applikationen zu machen, k�nnen Sie
die letzte eingef�gte Zeile mit folgender Anfrage finden:

@example
SELECT * FROM tabelle WHERE auto_spalte IS NULL
@end example

@item
@code{NULL}-Werte werden bei @code{TIMESTAMP}-Spalten anders als bei
anderen Spaltentypen gehandhabt. Sie k�nnen @code{NULL} nicht wortgetreu in
einer @code{TIMESTAMP}-Spalte speichern: Wenn Sie die Spalte auf
@code{NULL} setzen, wird sie auf das aktuelle Datum und die aktuelle Zeit
gesetzt. Weil @code{TIMESTAMP}-Spalten sich auf diese Art verhalten,
treffen die @code{NULL}- und @code{NOT NULL}-Attribute nicht auf normale
Art zu und werden ignoriert, wenn Sie sie angeben.

Auf der anderen Seite berichtet der Server, um es f�r MySQL-Clients
leichter zu machen, @code{TIMESTAMP}-Spalten zu benutzen, dass solchen
Spalten @code{NULL}-Werte zugewiesen werden k�nnen (was stimmt), obwohl
@code{TIMESTAMP} nie wirklich einen @code{NULL}-Wert enthalten wird. Sie
k�nnen das sehen, wenn Sie @code{DESCRIBE tabelle} eingeben, um eine
Beschreibung Ihrer Tabelle zu erhalten.

Beachten Sie, dass das Setzen einer @code{TIMESTAMP}-Spalte auf @code{0}
nicht dasselbe ist wie das Setzen auf @code{NULL}, weil @code{0} ein
g�ltiger @code{TIMESTAMP}-Wert ist.

@item
Wenn kein @code{DEFAULT}-Wert f�r eine Spalte angegeben wird, weist MySQL
automatisch einen zu.

Wenn die Spalte @code{NULL} als Wert aufnehmen darf, ist der Vorgabewert
@code{NULL}.

Wenn die Spalte als @code{NOT NULL} deklariert ist, h�ngt der Vorgabewert
vom Spaltentyp ab:

@itemize @minus
@item
Bei numerischen Typen ausser denen, die mit dem
@code{AUTO_INCREMENT}-Attribut deklariert wurden, ist der Vorgabewert
@code{0}. Bei einer @code{AUTO_INCREMENT}-Spalte ist der Vorgabewert der
n�chste Wert in der Folge.

@item
Bei Datums- und Zeit-Typen ausser @code{TIMESTAMP} ist der Vorgabewert der
entsprechende 0-Wert f�r den Typ. Bei der ersten @code{TIMESTAMP}-Spalte
einer Tabelle ist der Vorgabewert das aktuelle Datum und die aktuelle Zeit.
@xref{Date and time types}.

@item
Bei Zeichenketten-Typen ausser @code{ENUM} ist der Vorgabewert die leere
Zeichenkette. Bei @code{ENUM} ist der Vorgabewert der erste
Aufz�hlungswert.
@end itemize

Vorgabewerte m�ssen Konstanten sein. Das hei�t zum Beispiel, dass Sie den
Vorgabewert einer DATE-Spalte nicht als Wert einer Funktion wie
@code{NOW()} oder @code{CURRENT_DATE} setzen k�nnen.

@item
@code{KEY} ist ein Synonym f�r @code{INDEX}.

@item
In MySQL darf ein @code{UNIQUE}-Schl�ssel nur unterschiedliche Werte haben.
Ein Fehler tritt auf, wenn Sie versuchen, eine neue Zeile hinzuzuf�gen, der
Schl�sselwert dem einer bestehenden Zeile entspricht.

@item
@tindex PRIMARY KEY
Ein @code{PRIMARY KEY} ist ein eindeutiger @code{KEY} mit der zus�tzlichen
Beschr�nkung, dass alle Schl�sselspalten als @code{NOT NULL} deklariert
sein m�ssen. In MySQL wird der Schl�ssel @code{PRIMARY} genannt. Eine
Tabelle darf nur einen @code{PRIMARY KEY} haben. Wenn Sie keinen
@code{PRIMARY KEY} haben und irgend welche Applikationen nach einem
@code{PRIMARY KEY} in Ihrer Tabelle verlangen, gibt MySQL den ersten
@code{UNIQUE}-Schl�ssel, der keinerlei @code{NULL}-Spalten hat, als
@code{PRIMARY KEY} zur�ck.

@item
Ein @code{PRIMARY KEY} kann ein mehrspaltiger Index sein. Sie k�nnen jedoch
keinen mehrspaltiger Index mit dem @code{PRIMARY KEY}-Schl�sselattribut in
einer Spaltenspezifikation erzeugen. Wenn Sie das tun, wird nur die erste
Spalte als @code{PRIMARY} gekennzeichnet. Sie m�ssen die @code{PRIMARY
KEY(index_spalten_name, ...)}-Syntax benutzen.

@item
Wenn der @code{PRIMARY}- oder @code{UNIQUE}-Schl�ssel aus nur einer Spalte
besteht und diese vom Typ Ganzzahl ist, k�nnen Sie auf sie auch als
@code{_rowid} verweisen (neu ab Version 3.23.11).

@item
Wenn Sie einem Index keinen Namen zuweisen, wird dem Index derselbe Name
zugewiesen wie der erste @code{index_spalten_name}, mit einem optionalen
Suffix (@code{_2}, @code{_3}, @code{...}), um ihn eindeutig zu machen. Sie
k�nnen die Indexnamen f�r eine Tabelle mit @code{SHOW INDEX FROM tabelle}
anzeigen. @xref{SHOW, , @code{SHOW}}.

@item
@cindex @code{NULL}-Werte und Indexe
@cindex Indexe und @code{NULL}-Werte
Nur der @code{MyISAM}-Tabellentyp unterst�tzt Indexe auf Spalten, die
@code{NULL}-Werte enthalten k�nnen. In anderen F�llen m�ssen Sie solche
Spalten als @code{NOT NULL} deklarieren, sonst tritt ein Fehler auf.

@item
Mit der @code{spalten_name(laenge)}-Syntax k�nnen Sie einen Index
festlegen, der nur einen Teil einer @code{CHAR}- oder @code{VARCHAR}-Spalte
enth�lt. Das kann die Index-Datei viel kleiner machen.
@xref{Indexes}.

@item
@cindex @code{BLOB}-Spalten, Indexierung
@cindex Indexe und @code{BLOB}-Spalten
@cindex @code{TEXT}-Spalten, Indexierung
@cindex Indexe und @code{TEXT}-Spalten
Nur der @code{MyISAM}-Tabellentyp unterst�tzt Indexierung auf @code{BLOB}-
und @code{TEXT}-Spalten. Wenn Sie einen Index auf eine @code{BLOB}- oder
@code{TEXT}-Spalte setzen, M�SSEN Sie immer die L�nge des Indexes angeben:
@example
CREATE TABLE test (blob_spalte BLOB, index(blob_spalte(10)));
@end example

@item
Wenn Sie @code{ORDER BY} oder @code{GROUP BY} bei einer @code{TEXT}- oder
@code{BLOB}-Spalte benutzen, werden nur die ersten @code{max_sort_length}
Bytes benutzt. @xref{BLOB,  , @code{BLOB}}.

@item
Ab MySQL-Version 3.23.23 k�nnen Sie auch spezielle @strong{FULLTEXT}-Indexe
erzeugen, Diese werden f�r Volltextsuche benutzt. Nur der
@code{MyISAM}-Tabellentyp unterst�tzt @code{FULLTEXT}-Indexe. Sie k�nnen
auf @code{VARCHAR}- und @code{TEXT}-Spalten erzeugt werden. Die Indexierung
erfolgt immer �ber die gesamte Spalte, teilweise Indexierung wird nicht
unterst�tzt. Siehe @ref{Fulltext Search} f�r Details zur Funktionsweise.

@item
Die @code{FOREIGN KEY}-, @code{CHECK}- und @code{REFERENCES}-Klauseln tun
momentan noch nichts. Die Syntax wird nur aus Gr�nden der Kompatibilit�t
bereit gestellt, um das Portieren von Code von anderen SQL-Servern zu
erleichtern und um Applikationen laufen zu lassen, die Tabellen mit
Referenzen erzeugen.
@c German FIX old ref was @xref{Fehlende Funktionen}.
@xref{ANSI diff Foreign Keys}.

@item
Jede @code{NULL}-Spalte ben�tigt ein zus�tzliches Bit, gerundet auf das
n�chste Byte.

@item
Die maximale Datensatzl�nge in Bytes kann wie folgt berechnet werden:

@example
Zeilenl�nge = 1
              + (Summe Spaltenl�ngen)
              + (Anzahl von NULL-Spalten + 7)/8
              + (Anzahl von Spalten variabler L�nge)
@end example

@item
Die @code{tabellen_optionen}- und @code{SELECT}-Optionen sind implementiert
ab MySQL-Version 3.23.

Die unterschiedlichen Tabellentypen sind:

@multitable @columnfractions .20 .80
@item BDB oder Berkeley_db @tab Transaktionssichere Tabellen mit Seitensperren (Page Locking). @xref{BDB}.
@item HEAP @tab Die Daten dieser Tabelle werden nur im Arbeitsspeicher gehalten. @xref{HEAP}.
@item ISAM @tab Der Original-Tabellen-Handler. @xref{ISAM}.
@item InnoDB @tab Transaktionssichere Tabellen mit Zeilensperren. @xref{InnoDB}.
@item MERGE @tab Eine Sammlung von MyISAM-Tabellen, die als eine Tabelle benutzt werden. @xref{MERGE}.
@item MRG_MERGE @tab Ein Alias f�r MERGE-Tabellen.
@item MyISAM @tab Der neue bin�re portable Tabellen-Handler, der ISAM ersetzt. @xref{MyISAM}.
@end multitable
@xref{Table types}.

Wenn ein Tabellentyp angegeben wird und dieser besondere Typ nicht
verf�gbar ist, w�hlt MySQL den Tabellentyp, der dem angegebenen am n�chsten
kommt. Wenn beispielsweise @code{TYPE=BDB} angegeben wird und die
Distribution von MySQL keine @code{BDB}-Tabellen unterst�tzt, wird die
Tabelle statt dessen als @code{MyISAM} erzeugt.

Die anderen Tabellenoptionen werden benutzt, um das Verhalten der Tabelle
zu optimieren. In den meisten F�llen m�ssen Sie keine davon angeben. Die
Optionen funktionieren bei allen Tabellentypen, falls nicht anders
angegeben:

@multitable @columnfractions .20 .80
@item @code{AUTO_INCREMENT} @tab Der n�chste auto_increment-Wert, den Sie f�r Ihre Tabelle setzen wollen (MyISAM).
@item @code{AVG_ROW_LENGTH} @tab N�herungsweise die durchschnittliche Zeilenl�nge Ihrer Tabelle. Diese Option m�ssen Sie nur f�r gro�e Tabellen mit unterschiedlich gro�en Datens�tzen setzen.
@item @code{CHECKSUM} @tab Setzen Sie diesen Wert auf 1, wenn Sie wollen, dass MySQL eine Pr�fsumme f�r alle Zeilen unterh�lt (macht die Tabelle ein bisschen langsamer bei der Aktualisierung, aber macht es einfacher, besch�digte Tabellen zu finden) (MyISAM).
@item @code{COMMENT} @tab Ein 60-Zeichen-Kommentar f�r Ihre Tabelle.
@item @code{MAX_ROWS} @tab Maximale Anzahl von Zeilen, die Sie in Ihrer Tabelle zu speichern planen.
@item @code{MIN_ROWS} @tab Minimale Anzahl von Zeilen, die Sie in Ihrer Tabelle zu speichern planen.
@item @code{PACK_KEYS} @tab Setzen Sie diesen Wert auf 1, wenn Sie einen kleineren Index erhalten wollen. Das macht Aktualisierungen �blicherweise langsamer und liest schneller (MyISAM, ISAM). Setzen auf 0 schaltet die Komprimierung von Schl�sseln ab. Setzen auf @code{DEFAULT} (MySQL 4.0) weist die Tabellen-Handler an, nur lange @code{CHAR}- / @code{VARCHAR}-Spalten zu packen.
@item @code{PASSWORD} @tab Verschl�sselt die @code{.frm}-Datei mit einem Passwort. Diese Option tut nichts in der Standard-MySQL-Version.
@item @code{DELAY_KEY_WRITE} @tab Setzen Sie diesen Wert auf 1, wenn Sie Schl�ssel-Tabellen-Aktualisierungen verz�gern wollen, bis die Tabelle geschlossen wird (MyISAM).
@item @code{ROW_FORMAT} @tab Definiert, wie die Zeilen gespeichert werden sollen. Momentan funktioniert diese Option nur bei MyISAM-Tabellen, die die @code{DYNAMIC}- und @code{FIXED}-Zeilenformate unterst�tzen. @xref{MyISAM table formats}.
@end multitable

Wenn Sie eine @code{MyISAM}-Tabelle benutzen, verwendet MySQL das Produkt
aus @code{max_rows * avg_row_length} um zu entscheiden, wie Gro� die
resultierende Tabelle sein wird. Wenn Sie keine der obigen Optionen
angeben, ist die maximale Gr��e f�r eine Tabelle 4 GB (oder 2 GB, wenn Ihr
Betriebssystem nur 2 GB-Tabellen unterst�tzt). Das geschieht, um
Zeigergr��en gering zu halten und um den Index kleiner und schneller zu
machen, wenn Sie nicht wirklich gro�e Dateien ben�tigen.

Wenn Sie @code{PACK_KEYS} nicht benutzen, ist die Vorgabe, nur
Zeichenketten zu komprimieren, nicht Zahlen. Wenn Sie @code{PACK_KEYS=1}
benutzen, werden auch Zahlen komprimiert.

Wenn Sie bin�re Zahlschl�ssel komprimieren, benutzt MySQL die
Pr�fix-Komprimierung. Das bedeutet, dass Sie nur dann einen Nutzen daraus
ziehen, wenn Sie Zahlen haben, die sich oft wiederholen. Pr�fix-Kompression
bedeutet, das jeder Schl�ssel ein zus�tzliches Byte ben�tigt, um
darzustellen, wie viele Bytes des vorherigen Schl�ssels f�r den n�chsten
Schl�ssel dieselben sind (beachten Sie, dass der Zeiger auf die Zeile in
der Reihenfolge 'hohes Byte zuerst' direkt nach dem Schl�ssel gespeichert
wird, um die Kompression zu verbessern). Das hei�t, wenn Sie viele gleiche
Schl�ssel auf zwei Zeilen hintereinander haben, werden alle folgenden
'gleichen' Schl�ssel �blicherweise nur 2 Bytes in Anspruch nehmen
(inklusive dem Zeiger auf die Zeile). Vergleichen Sie das mit dem
Normalfall, bei dem die folgenden Schl�ssel speicher_platz_fuer_schl�ssel +
zeiger_groesse beanspruchen (�blicherweise 4). Auf der anderen Seite
verlieren Sie 1 Byte pro Schl�ssel, wenn alle Schl�ssel v�llig
unterschiedlich sind, falls der Schl�ssel kein Schl�ssel ist, der
@code{NULL}-Werte haben kann (in diesem Fall wird die komprimierte
Schl�ssell�nge, die im selben Byte gespeichert ist, benutzt, um zu
kennzeichnen, ob ein Schl�ssel @code{NULL} ist).

@item
Wenn Sie ein @code{SELECT} nach dem @code{CREATE}-Statement angeben,
erzeugt MySQL neue Felder f�r alle Elemente im @code{SELECT}. Beispiel:

@example
mysql> CREATE TABLE test (a int not null auto_increment,
           primary key (a), key(b))
           TYPE=MyISAM SELECT b,c from test2;
@end example

Das erzeugt eine @code{MyISAM}-Tabelle mit drei Spalten a, b und c.
Beachten Sie, dass die Spalten des @code{SELECT}-Statements an die rechte
Seite der Tabelle angeh�ngt werden, nicht �berlappend. Nehmen wir folgendes
Beispiel:

@example
mysql> select * from foo;
+---+
| n |
+---+
| 1 |
+---+           

mysql> create table bar (m int) select n from foo;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0
 
mysql> select * from bar;
+------+---+
| m    | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)                           
@end example

F�r jede Zeile in Tabelle @code{foo} wird eine Zeile in @code{bar} mit den
Werten von @code{foo} und Vorgabewerten f�r die neuen Spalten eingef�gt.

@code{CREATE TABLE ... SELECT} erzeugt nicht automatisch irgend welche
Indexe. Das wird absichtlich gemacht, um den Befehl so flexibel wie m�glich
zu machen. Wenn Sie Indexe in der erzeugten Tabelle haben wollen, geben Sie
diese vor dem @code{SELECT}-Statement an:

@example
mysql> create table bar (unique (n)) select n von foo;
@end example

Wenn Fehler beim Kopieren der Daten in die Tabelle auftreten, wird diese
automatisch gel�scht.

Um sicherzustellen, dass die Update-Log-Datei/Bin�r-Log-Datei benutzt
werden kann, um die Original-Tabellen neu zu erzeugen, l��t MySQL keine
gleichzeitigen Einf�geoperationen w�hrend @code{CREATE TABLE .... SELECT}
zu.
@item
Die @code{RAID_TYPE}-Option hilft, die 2 GB- / 4 GB-Grenze f�r die
MyISAM-Daten-Datei zu durchbrechen (nicht f�r die Index-Datei), auf
Betriebssystemen, die keine gro�en Dateien unterst�tzen.
Sie erzielen mehr Geschwindigkeit vom I/O-Flaschenhals, wenn Sie die
@code{RAID}-Verzeichnisse auf unterschiedliche physikalische Platten legen.
@code{RAID_TYPE} funktioniert auf jedem Betriebssystem, solange Sie MySQL
mit @code{--with-raid} konfiguriert haben. Momentan ist der einzige
zul�ssige @code{RAID_TYPE} @code{STRIPED} (@code{1} und @code{RAID0} sind
Aliase daf�r).

Wenn Sie @code{RAID_TYPE=STRIPED} bei einer @code{MyISAM}-Tabelle angeben,
erzeugt @code{MyISAM} @code{RAID_CHUNKS}-Unterverzeichnisse namens 00, 01,
02 im Datenbank-Verzeichnis. In jedem dieser Verzeichnisse erzeugt
@code{MyISAM} eine @code{tabelle.MYD}. Wenn Sie Daten in die Daten-Datei
schreiben, mappt der @code{RAID}-Handler die ersten @code{RAID_CHUNKSIZE} *
1024 Bytes auf die erste Datei, die n�chsten @code{RAID_CHUNKSIZE} * 1024
Bytes auf die n�chste Datei usw.

@item
@code{UNION} wird benutzt, wenn Sie eine Sammlung identischer Tabelle als
eine benutzen wollen. Das funktioniert nur bei MERGE-Tabellen. @xref{MERGE}.

Momentan ben�tigen Sie @code{SELECT}-, @code{UPDATE}-
und-@code{DELETE}-Berechtigungen auf die Tabellen, die Sie auf eine
@code{MERGE}-Tabelle mappen. Alle gemappten Tabellen m�ssen sich in
derselben Datenbank wie die @code{MERGE}-Tabelle befinden.

@item
Wenn Sie Daten in eine @code{MERGE}-Tabelle einf�gen wollen, m�ssen Sie mit
@code{INSERT_METHOD} angeben, in welche Tabelle die Zeile eingef�gt werden
soll. @xref{MERGE}.

@item
In der erzeugten Tabelle wird der @code{PRIMARY}-Schl�ssel zuerst
platziert, gefolgt von allen @code{UNIQUE}-Schl�sseln und danach von den
normalen Schl�sseln. Das hilft dem MySQL-Optimierer zu priorisieren,
welcher Schl�ssel benutzt werden soll, und auch, Duplikate von
@code{UNIQUE}-Schl�sseln zu entdecken.

@item
Wenn Sie @code{DATA directory="verzeichnis"} oder @code{INDEX
directory="verzeichnis"} benutzen, k�nnen Sie angeben, wohin die
Tabellen-Handler ihre Tabellen- und Index-Dateien legen sollen. Das
funktioniert nur bei @code{MyISAM}-Tabellen in @code{MySQL} 4.0, wenn Sie
die @code{--skip-symlink}-Option nicht benutzen. @xref{Symbolic links to tables}.

@end itemize


@menu
* Silent column changes::       
@end menu

@node Silent column changes,  , CREATE TABLE, CREATE TABLE
@c German node Stille Spaltentyp-�nderungen
@subsubsection Stille Spaltentyp-�nderungen

@cindex Stille Spaltentyp-�nderungen

In einigen F�llen �ndert MySQL lautlos eine Spaltenspezifikation von der,
die in einem @code{CREATE TABLE}-Statement angegeben wurde. (Das kann auch
bei @code{ALTER TABLE} passieren.):

@itemize @bullet
@item
@code{VARCHAR}-Spalten mit einer L�nge kleiner 4 werden in @code{CHAR}
ge�ndert.

@item
Wenn irgend eine Spalte in einer Tabelle eine variable L�nge hat, hat im
Ergebnis jede Zeile eine variable L�nge. Wenn daher eine Tabelle irgend
welche Spalten variabler L�nge enth�lt (@code{VARCHAR}, @code{TEXT} oder
@code{BLOB}), werden alle @code{CHAR}-Spalten, die l�nger als drei Zeichen
sind, in @code{VARCHAR}-Spalten umgewandelt. Das beeinflusst die Benutzung
dieser Spalten in keiner Weise, denn in MySQL ist @code{VARCHAR} nur eine
andere Art, Zeichen zu speichern. MySQL f�hrt diese Umwandlung durch, weil
sie Platz spart und Tabellenoperationen schneller macht.
@xref{Table types}.

@item
@code{TIMESTAMP}-Anzeigebreiten m�ssen geradzahlig und im Bereich von 2 bis
14 sein. Wenn Sie eine Anzeigebreite von 0 oder gr��er als 14 angeben,
wird die Gr��e auf 14 gesetzt. Ungerade Werte im Bereich von 1 bis 13
werden auf den n�chst h�heren geraden Wert gesetzt.

@item
Sie k�nnen keinen echten @code{NULL}-Wert in einer @code{TIMESTAMP}-Spalte
speichern. Wenn Sie sie auf @code{NULL} setzen, wird sie auf das aktuelle
Datum und die aktuelle Zeit gesetzt. Weil sich @code{TIMESTAMP}-Spalten so
verhalten, treffen die Attribute @code{NULL} und @code{NOT NULL} nicht auf
normale Weise zu und werden ignoriert, wenn Sie sie angeben. @code{DESCRIBE
tabelle} zeigt dagegen immer an, dass einer @code{TIMESTAMP}-Spalte
@code{NULL}-Werte zugewiesen werden k�nnen.

@item
MySQL mappt bestimmte Spaltentypen, die von anderen
SQL-Datenbank-Herstellern benutzt werden, auf MySQL-Typen.
@xref{Other-vendor column types}.
@end itemize

Wenn Sie sehen wollen, ob MySQL einen anderen Spaltentyp als den, den Sie
angegeben haben, benutzt hat, geben Sie nach dem Erzeugen oder �ndern Ihrer
Tabelle ein @code{DESCRIBE tabelle}-Statement ein.

@cindex @code{myisampack}
Bestimmte andere Spaltentyp-�nderungen k�nnen auftreten, wenn Sie eine
Tabelle mit @code{myisampack} komprimieren. @xref{Compressed format}.


@node ALTER TABLE, RENAME TABLE, CREATE TABLE, Data Definition
@c German node ALTER TABLE
@subsection @code{ALTER TABLE}-Syntax

@findex ALTER TABLE

@example
ALTER [IGNORE] TABLE tabelle aenderungs_angabe [, aenderungs_angabe ...]

aenderungs_angabe:
        ADD [COLUMN] create_definition [FIRST | AFTER spalten_name]
  oder    ADD [COLUMN] (create_definition, create_definition,...)
  oder    ADD INDEX [index_name] (index_spalten_name,...)
  oder    ADD PRIMARY KEY (index_spalten_name,...)
  oder    ADD UNIQUE [index_name] (index_spalten_name,...)
  oder    ADD FULLTEXT [index_name] (index_spalten_name,...)
  or	ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_spalten_name,...)
            [referenz_definition]
  oder    ALTER [COLUMN] spalten_name @{SET DEFAULT literal | DROP DEFAULT@}
  oder    CHANGE [COLUMN] alter_spalten_name create_definition
  oder    MODIFY [COLUMN] create_definition
  oder    DROP [COLUMN] spalten_name
  oder    DROP PRIMARY KEY
  oder    DROP INDEX index_name
  oder    DISABLE KEYS
  oder    ENABLE KEYS
  oder    RENAME [TO] neue_tabelle
  oder    ORDER BY spalte
  oder    tabellen_optionen
@end example

Mit @code{ALTER TABLE} k�nnen Sie die Struktur einer bestehenden Tabelle
�ndern. Sie k�nnen beispielsweise Spalten hinzuf�gen oder l�schen, Indexe
erzeugen oder l�schen, den Typ bestehender Spalten �ndern oder Spalten oder
die Tabelle selbst umbenennen. Sie k�nnen auch den Kommentar f�r die
Tabelle und den Typ der Tabelle �ndern. @xref{CREATE TABLE, , @code{CREATE TABLE}}.

Wenn Sie @code{ALTER TABLE} benutzen, um eine Spaltenspezifikation zu
�ndern, und @code{DESCRIBE tabelle} anzeigt, dass die Spalte nicht ge�ndert
wurde, ist es m�glich, dass MySQL Ihre �nderungen aus einem der Gr�nde
ignoriert hat, die in @ref{Silent column changes} beschrieben sind.
Wenn Sie beispielsweise versuchen, eine @code{VARCHAR}-Spalte zu
@code{CHAR} zu �ndern, benutzt MySQL dennoch @code{VARCHAR}, wenn die
Tabelle weitere Spalten variabler L�nge enth�lt.

@code{ALTER TABLE} funktioniert mittels Anlegen einer tempor�ren Kopie der
Original-Tabelle. Die �nderungen werden an der Kopie durchgef�hrt, dann
wird die Original-Tabelle gel�scht und die neue umbenannt. Das wird so
durchgef�hrt, dass alle Aktualisierungen automatisch ohne irgend welche
fehlgeschlagenen Aktualisierungen an die neue Tabelle weitergeleitet
werden. W�hrend @code{ALTER TABLE} ausgef�hrt wird, ist die alte Tabelle
durch andere Clients lesbar. Aktualisierungen und Schreibvorg�nge in die
Tabelle werden angehalten, bis die neue Tabelle bereit ist.

Beachten Sie, dass MySQL immer eine tempor�re Tabelle anlegt, wenn Sie f�r
@code{ALTER TABLE} irgend eine Option ausser @code{RENAME} angeben, selbst
wenn die Daten eigentlich nicht kopiert werden m�ssten (zum Beispiel, wenn
Sie einen Spaltennamen �ndern). Wir planen, dass zu beheben, aber da man
@code{ALTER TABLE} normalerweise nicht ausf�hren muss, ist das auf unserer
TODO-Liste nicht sehr hoch angesetzt.

@itemize @bullet
@item
Um @code{ALTER TABLE} ausf�hren zu k�nnen, ben�tigen Sie @strong{ALTER}-,
@strong{INSERT}- und @strong{CREATE}-Berechtigungen f�r die Tabelle.

@item
@code{IGNORE} ist eine MySQL-Erweiterung zu ANSI-SQL92. Es steuert, wie
@code{ALTER TABLE} funktioniert, wenn es in der neuen Tabelle Duplikate auf
eindeutigen Schl�sseln gibt. Wenn @code{IGNORE} nicht angegeben wird, wird
das Kopieren abgebrochen und zur�ckgesetzt. Wenn @code{IGNORE} angegeben
wird, wird bei Zeilen mit Duplikaten auf einem eindeutigen Schl�ssel nur
die erste Zeile benutzt, die anderen werden gel�scht.

@item
Sie k�nnen mehrfache @code{ADD}-, @code{ALTER}-, @code{DROP}- und
@code{CHANGE}-Klauseln in einem einzigen @code{ALTER TABLE}-Statement
angeben. Das ist eine MySQL-Erweiterung zu ANSI-SQL92, welches nur eine
Klausel pro @code{ALTER TABLE}-Statement zul��t.

@item
@code{CHANGE spalten_name}, @code{DROP spalten_name} und @code{DROP INDEX}
sind MySQL-Erweiterungen zu ANSI-SQL92.

@item
@code{MODIFY} ist eine Oracle-Erweiterung zu @code{ALTER TABLE}.

@item
Das optionale Wort @code{COLUMN} kann weggelassen werden.

@item
Wenn Sie @code{ALTER TABLE tabelle RENAME TO neuer_name} ohne weitere
Optionen benutzen, benennt MySQL einfach die Dateien um, die der Tabelle
@code{tabelle} entsprechen. Es besteht keine Notwendigkeit, die tempor�re
Tabelle zu erzeugen. @xref{RENAME TABLE,, @code{RENAME TABLE}}.

@item
Ab @strong{MySQL 4.0} kann das obige Feature explizit aktiviert werden.
@code{ALTER TABLE ... DISABLE KEYS} veranlasst MySQL, mit dem Aktualisieren
nicht eindeutiger Indexe f�r die @code{MyISAM}-Tabelle aufzuh�ren. Dann
sollte @code{ALTER TABLE ... ENABLE KEYS} benutzt werden, um fehlende
Indexe wieder zu erzeugen. Weil MySQL das mit Algorithmen durchf�hrt, die
viel schneller sind als das Einf�gen von Schl�sseln nacheinander, kann das
Abschalten von Schl�sseln bei Masseneinf�geoperationen erheblich
Geschwindigkeitsvorteile bringen.

@item
@code{create_definition}-Klauseln benutzen dieselbe Syntax f�r @code{ADD}
und @code{CHANGE} wie bei @code{CREATE TABLE}.  Beachten Sie, dass diese
Syntax den Spaltenname beinhaltet, nicht nur den Spaltentyp.
@c German FIX unsplit @xref
@xref{CREATE TABLE, , @code{CREATE TABLE}}.

@item
Sie k�nnen eine Spalte mit einer @code{CHANGE alter_spalten_name
create_definition}-Klausel umbenennen. Um das zu tun, geben Sie den alten
und den neuen Spaltennamen und den Typ an, den die Spalte momentan hat. Um
beispielsweise eine @code{INTEGER}-Spalte von @code{a} nach @code{b}
umzubenennen, tun Sie folgendes:

@example
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
@end example

Wenn Sie einen Spaltentyp, nicht aber den Namen �ndern wollen, ben�tigt
@code{CHANGE} dennoch zwei Spaltennamen, selbst wenn sie dieselben sind.
Beispiel:

@example
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
@end example

Ab MySQL-Version 3.22.16a k�nnen Sie jedoch auch @code{MODIFY} benutzen, um
einen Spaltentyp ohne Umbenennung zu �ndern:

@example
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
@end example

@item
Wenn Sie @code{CHANGE} oder @code{MODIFY} benutzen, um eine Spalte zu
k�rzen, f�r die es einen Index auf einem Teil der Spalte gibt (wenn Sie zum
Beispiel einen Index auf den ersten 10 Zeichen einer @code{VARCHAR}-Spalte
haben), k�nnen Sie die Spalte nicht k�rzer als die Anzahl von Zeichen
machen, die indiziert sind.

@item
Wenn Sie versuchen, einen Spaltentyp mit @code{CHANGE} oder @code{MODIFY}
zu �ndern, versucht MySQL, Daten so umzuwandeln, dass sie so gut wie
m�glich zum neuen Typ passen.

@item
AB MySQL-Version 3.22 k�nnen Sie @code{FIRST} oder @code{ADD ... AFTER
spalten_name} benutzen, um eine Spalte an einer bestimmten Position
innerhalb einer Tabellenzeile einzuf�gen. Vorgabem��ig wird die Spalte am
Ende hinzugef�gt.

@findex ALTER COLUMN
@item
@code{ALTER COLUMN} gibt einen Vorgabewert f�r eine Spalte an oder entfernt
den alten Vorgabewert. Wenn der alte Vorgabewert entfernt wird und die
Spalte @code{NULL} sein darf, ist der neue Vorgabewert @code{NULL}. Wenn
die Spalte nicht @code{NULL} sein darf, weist MySQL einen Vorgabewert zu,
wie in @ref{CREATE TABLE, , @code{CREATE TABLE}} beschrieben.

@findex DROP INDEX
@item
@code{DROP INDEX} entfernt einen Index. Das ist eine MySQL-Erweiterung zu
ANSI-SQL92. @xref{DROP INDEX}.

@item
Wenn Spalten aus einer Tabelle gel�scht werden, werden sie auch aus
jeglichen Indexen entfernt, deren Teil sie sind. Wenn alle Spalten, aus
denen ein Index besteht, gel�scht werden, wird der Index ebenfalls
gel�scht.

@item
Wenn eine Tabelle nur eine Spalte enth�lt, kann die Spalte nicht gel�scht
werden. Wenn Sie beabsichtigen, die Tabelle zu entfernen, benutzen Sie
statt dessen @code{DROP TABLE}.

@findex DROP PRIMARY KEY
@item
@code{DROP PRIMARY KEY} l�scht den Prim�rschl�ssel. Wenn es keinen solchen
gibt, l�scht es den ersten @code{UNIQUE}-Index in der Tabelle. (MySQL
kennzeichnet den ersten @code{UNIQUE}-Schl�ssel als @code{PRIMARY KEY},
wenn @code{PRIMARY KEY} nicht explizit angegeben wurde.)

@findex UNIQUE
@findex PRIMARY KEY
Wenn Sie einen @code{UNIQUE INDEX} oder @code{PRIMARY KEY} zu einer Tabelle
hinzuf�gen, wird dieser vor jedem Nicht-@code{UNIQUE}-Index gespeichert, so
dass MySQL doppelte Schl�sseleintr�ge so fr�h wie m�glich feststellen kann.

@findex ORDER BY
@item
@code{ORDER BY} gestattet Ihnen, eine Tabelle mit Zeilen in einer
bestimmten Reihenfolge zu erzeugen. Beachten Sie, dass die Tabelle nach
INSERTs und DELETEs nicht in dieser Reihenfolge verbleibt. In einigen
F�llen kann es das Sortieren f�r MySQL erleichtern, wenn die Tabelle nach
der Spalte geordnet ist, nach der Sie sie sp�ter ordnen wollen. Diese
Option ist haupts�chlich n�tzlich, wenn Sie wissen, dass Sie die Zeilen
meistens in einer bestimmten Reihenfolge abfragen werden. Wenn Sie diese
Option nach gro�en �nderungen in der Tabelle benutzen, k�nnen Sie
m�glicherweise eine h�here Performance erzielen.

@findex ALTER TABLE
@item
Wenn Sie @code{ALTER TABLE} auf einer @code{MyISAM}-Tabelle benutzen,
werden alle nicht eindeutigen Indexe in einem separaten Stapellauf erzeugt
(wie bei @code{REPAIR}). Das sollte @code{ALTER TABLE} viel schneller
machen, wenn Sie viele Indexe haben.

@item
Ab @strong{MySQL 4.0} kann dies explizit aktiviert werden. @code{ALTER
TABLE ... DISABLE KEYS} veranlasst MySQL, mit der Aktualisierung nicht
eindeutiger Indexe f�r @code{MyISAM}-Tabellen aufzuh�ren. @code{ALTER TABLE
... ENABLE KEYS} sollte dann benutzt werden, um fehlende Indexe wieder zu
erzeugen. Weil MySQL das mit Algorithmen durchf�hrt, die viel schneller
sind als das Einf�gen von Schl�sseln nacheinander, kann das Abschalten von
Schl�sseln bei Masseneinf�geoperationen erheblich Geschwindigkeitsvorteile
bringen.

@item
@findex mysql_info()
Mit der C-API-Funktion @code{mysql_info()} k�nnen Sie herausfinden, wie
viele Datens�tze kopiert wurden und (wenn @code{IGNORE} benutzt wird) wie
viele Datens�tze aufgrund der Duplizierung eindeutiger Schl�sselwerte
gel�scht wurden.

@item
@cindex Fremdschl�ssel
@cindex Referenzen
Die @code{FOREIGN KEY}-, @code{CHECK}- und @code{REFERENCES}-Klauseln
machen nichts. Die Syntax f�r sie steht nur aus Kompatibilit�tsgr�nden
bereit, um das Portieren von Code von anderen SQL-Servern zu erleichtern
und um Applikationen laufen zu lassen, die Tabellen mit Referenzen
erzeugen.
@c German FIX old ref was @xref{Fehlende Funktionen}.
@xref{ANSI diff Foreign Keys}.
@end itemize

Hier ist ein Beispiel, das einige der Anwendungsf�lle von @code{ALTER
TABLE} zeigt. Wir fangen mit einer Tabelle @code{t1} an, die wie folgt
erzeugt wird:

@example
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
@end example

Um die Tabelle von @code{t1} nach @code{t2} umzubenennen, geben Sie ein:

@example
mysql> ALTER TABLE t1 RENAME t2;
@end example

Um Spalte @code{a} von @code{INTEGER} nach @code{TINYINT NOT NULL} zu
�ndern (der Name bleibt derselbe) und Spalte @code{b} von @code{CHAR(10)}
nach @code{CHAR(20)} zu �ndern und gleichzeitig von @code{b} nach @code{c}
umzubenennen, geben Sie ein:

@example
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
@end example

Jetzt wird eine @code{TIMESTAMP}-Spalte namens @code{d} hinzugef�gt:

@example
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
@end example

Nunmehr erzeugen wir einen Index auf Spalte @code{d} und machen Spalte
@code{a} zum Prim�rschl�ssel:

@example
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
@end example

Wir entfernen Spalte @code{c}:

@example
mysql> ALTER TABLE t2 DROP COLUMN c;
@end example

Und f�gen eine neue @code{AUTO_INCREMENT}-Ganzzahl-Spalte namens @code{c}
hinzu:

@example
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
           ADD INDEX (c);
@end example

Beachten Sie, dass wir @code{c} indiziert haben, weil
@code{AUTO_INCREMENT}-Spalten indiziert sein m�ssen, und auch, dass wir
@code{c} als @code{NOT NULL} deklariert haben, weil indizierte Spalten
nicht @code{NULL} sein d�rfen.

Wenn Sie eine @code{AUTO_INCREMENT}-Spalte hinzuf�gen, werden automatisch
Spaltenwerte mit Zahlenfolgen eingef�gt. Sie k�nnen die erste Zahl setzen,
indem Sie @code{SET INSERT_ID=#} vor @code{ALTER TABLE} ausf�hren oder
indem Sie die @code{AUTO_INCREMENT = #}-Tabellenoption benutzen.
@xref{SET OPTION}.

Wenn Sie bei MyISAM-Tabellen nicht die @code{AUTO_INCREMENT}-Spalte �ndern,
ist die Folgezahl davon nicht betroffen. Wenn Sie eine
@code{AUTO_INCREMENT}-Spalte l�schen und dann eine weitere
@code{AUTO_INCREMENT}-Spalte hinzuf�gen, fangen die Zahlen wieder bei 1 an.

@xref{ALTER TABLE problems}.


@node RENAME TABLE, DROP TABLE, ALTER TABLE, Data Definition
@c German node RENAME TABLE
@subsection @code{RENAME TABLE}-Syntax

@findex RENAME TABLE

@example
RENAME TABLE tabelle TO neue_tabelle[, tabelle2 TO neue_tabelle2,...]
@end example

Das Umbenennen wird atomisch durchgef�hrt, was hei�t, dass kein anderer
Thread auf die Tabelle(n) zugreifen kann, w�hrend umbenannt wird. Das
erm�glicht, eine Tabelle durch eine leere zu ersetzen:

@example
CREATE TABLE neue_tabelle (...);
RENAME TABLE alte_tabelle TO datensicherung_tabelle, neue_tabelle TO alte_tabelle;
@end example

Das Umbenennen wird von links nach rechts durchgef�hrt, was bedeutet, dass
Sie beim Vertauschen zweier Tabellennamen folgendes tun k�nnen:

@example
RENAME TABLE alte_tabelle    TO datensicherung_tabelle,
             neue_tabelle    TO alte_tabelle,
             datensicherung_tabelle TO neue_tabelle;
@end example

Solange zwei Datenbanken auf derselben Platte liegen, k�nnen Sie auch von
einer Datenbank in eine andere umbenennen:

@example
RENAME TABLE aktuelle_datenbank.tabelle TO andere_datenbank.tabelle;
@end example

Wenn Sie @code{RENAME} ausf�hren, d�rfen Sie keine gesperrten Tabellen oder
aktive Transaktionen haben. Ausserdem ben�tigen Sie die @code{ALTER}- und
@code{DROP}-Berechtigungen f�r die Original-Tabelle und die @code{CREATE}-
und @code{INSERT}-Berechtigungen auf die neue Tabelle.

Wenn beim Umbenennen mehrfacher Tabellen Fehler auftreten, f�hrt MySQL ein
entgegengesetztes Umbenennen aller umbenannten Tabellen durch, um alles
wieder in den Ausgangszustand zu versetzen.


@node DROP TABLE, CREATE INDEX, RENAME TABLE, Data Definition
@c German node DROP TABLE
@subsection @code{DROP TABLE}-Syntax

@findex DROP TABLE

@example
DROP TABLE [IF EXISTS] tabelle [, tabelle,...] [RESTRICT | CASCADE]
@end example

@code{DROP TABLE} entfernt eine oder mehrere Tabellen. Alle Tabellendaten
und die Tabellendefinition werden @emph{zerst�rt}, seien Sie daher
@strong{vorsichtig} mit diesem Befehl!

Ab MySQL-Version 3.22 k�nnen Sie die Schl�sselw�rter @code{IF EXISTS}
benutzen, um Fehler zu vermeiden, die auftreten, wenn Tabellen nicht
existieren.

@code{RESTRICT} und @code{CASCADE} sind wegen leichterer Portierung
zugelassen. Momentan tun sie nichts.

@strong{HINWEIS}: @code{DROP TABLE} ist nicht transaktionssicher und f�hrt
automatisch jegliche aktiven Transaktionen zuende.


@node CREATE INDEX, DROP INDEX, DROP TABLE, Data Definition
@c German node CREATE INDEX
@subsection @code{CREATE INDEX}-Syntax

@findex CREATE INDEX

@cindex Indexe
@cindex Indexe, mehrteilige
@cindex mehrteilige Indexe

@example
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tabelle (spalten_name[(laenge)],... )
@end example

Das @code{CREATE INDEX}-Statement macht vor MySQL-Version 3.22 nichts. Ab
Version 3.22 ist @code{CREATE INDEX} auf ein @code{ALTER TABLE}-Statement
gemappt, um Indexe zu erzeugen. @xref{ALTER TABLE, , @code{ALTER TABLE}}.

Normalerweise erzeugen Sie alle Indexe auf eine Tabelle zur Zeit, wo die
Tabelle selbst mit @code{CREATE TABLE} erzeugt wird.
@c German FIX unsplit @xref
@xref{CREATE TABLE, ,@code{CREATE TABLE}}.
@code{CREATE INDEX} gestattet, bestehenden Tabellen
Indexe hinzuzuf�gen.

A Spaltenliste der Form @code{(spalte1,spalte2,...)} erzeugt einen
mehrspaltigen Index. Die Indexwerte werden durch Verkettung der Werte der
angegebenen Spalten erzeugt.

Bei @code{CHAR}- und @code{VARCHAR}-Spalten k�nnen Indexe, die nur einen
Teil einer Spalte benutzen, mit der @code{spalten_name(laenge)}-Syntax
erzeugt werden. (Bei @code{BLOB}- und @code{TEXT}-Spalten ist die
L�ngenangabe erforderlich.) Unten stehendes Statement zeigt, wie ein Index
erzeugt wird, der die ersten 10 Zeichen der @code{name}-Spalte benutzt:

@example
mysql> CREATE INDEX teil_von_name ON kunde (name(10));
@end example

Weil sich die meisten Namen �blicherweise in den ersten 10 Zeichen
unterscheiden, sollte dieser Index nicht viel langsamer sein, als wenn der
Index aus der gesamten @code{name}-Spalte erzeugt worden w�re. Die
Benutzung von Teilspalten f�r Indexe kann die Index-Datei auch viel kleiner
machen, was viel Speicherplatz sparen und zus�tzlich
@code{INSERT}-Operationen beschleunigen kann!

Beachten Sie, dass Sie einen Index auf eine Spalte, die @code{NULL}-Werte
haben darf, oder auf eine @code{BLOB}/@code{TEXT}-Spalte erst ab
MySQL-Version 3.23.2 und nur beim @code{MyISAM}-Tabellentyp erzeugen
k�nnen.

Weitere Informationen dar�ber, wie MySQL Indexe benutzt, finden Sie unter
@ref{MySQL indexes, , MySQL-Indexe}.

@code{FULLTEXT}-Indexe k�nnen nur @code{VARCHAR}- und @code{TEXT}-Spalten
indexieren und funktionieren nur bei @code{MyISAM}-Tabellen.
@code{FULLTEXT}-Indexe sind ab MySQL-Version 3.23.23 verf�gbar.
@ref{Fulltext Search}.


@node DROP INDEX,  , CREATE INDEX, Data Definition
@c German node DROP INDEX
@subsection @code{DROP INDEX}-Syntax

@findex DROP INDEX

@example
DROP INDEX index_name ON tabelle
@end example

@code{DROP INDEX} l�scht den Index namens @code{index_name} aus der Tabelle
@code{tabelle}. @code{DROP INDEX} macht vor MySQL-Version 3.22 nichts. Ab
Version 3.22 ist @code{DROP INDEX} auf ein @code{ALTER TABLE}-Statement
gemappt, um den Index zu l�schen. @xref{ALTER TABLE, , @code{ALTER TABLE}}.


@node Basic User Commands, Transactional Commands, Data Definition, Reference
@c German node Grundlegende Benutzerbefehle
@section Grundlegende Befehle des MySQL-Dienstprogramms f�r Benutzer



@menu
* USE::                         
* DESCRIBE::                    
@end menu

@node USE, DESCRIBE, Basic User Commands, Basic User Commands
@c German node USE
@subsection @code{USE}-Syntax

@findex USE

@example
USE datenbank
@end example

Das @code{USE datenbank}-Statement weist MySQL an, @code{datenbank} als
vorgabem��ige Datenbank f�r nachfolgende Anfragen zu benutzen. Die
Datenbank bleibt die aktuelle, entweder bis zum Ende der Sitzung, oder bis
ein weiteres @code{USE}-Statement abgesetzt wird:

@example
mysql> USE datenbank1;
mysql> SELECT count(*) FROM tabelle;      # w�hlt aus von datenbank1.tabelle
mysql> USE datenbank2;
mysql> SELECT count(*) FROM tabelle;      # w�hlt aus von datenbank2.tabelle
@end example

Wenn Sie eine bestimmte Datenbank mit dem @code{USE}-Statement zu aktuellen
machen, hei�t das nicht, dass Sie nicht auf Tabellen in anderen
Datenbanken zugreifen k�nnen. Das unten stehende Beispiel zeigt den Zugriff
auf die @code{autor}-Tabelle in der @code{datenbank1}-Datenbank und auf
die @code{herausgeber}-Tabelle in der @code{datenbank2}-Datenbank:

@example
mysql> USE datenbank1;
mysql> SELECT autor_name,herausgeber_name FROM autor,datenbank2.herausgeber
           WHERE autor.herausgeber_id = datenbank2.herausgeber.herausgeber_id;
@end example

@cindex Sybase Kompatibilit�t
@cindex Kompatibilit�t, mit Sybase
The @code{USE}-Statement wird f�r die Sybase-Kompatibilit�t zur Verf�gung
gestellt.


@node DESCRIBE,  , USE, Basic User Commands
@c German node DESCRIBE
@subsection @code{DESCRIBE}-Syntax (Informationen �ber Spalten erhalten)

@findex DESC
@findex DESCRIBE

@example
@{DESCRIBE | DESC@} tabelle @{spalten_name | platzhalter@}
@end example

@code{DESCRIBE} ist ein K�rzel f�r @code{SHOW COLUMNS FROM}.
@xref{SHOW DATABASE INFO}.

@code{DESCRIBE} stellt Informationen �ber die Spalten einer Tabelle bereit.
@code{spalten_name} kann ein Spaltenname oder eine Zeichenkette sein, die
die SQL-@samp{%}- und -@samp{_}-Platzhalterzeichen enth�lt.

Wenn die Spaltentypen sich von dem unterscheiden, was Sie auf der Grundlage
eines @code{CREATE TABLE}-Statements erwartet h�tten, beachten Sie, dass
MySQL manchmal Spaltentypen �ndert.  @xref{Silent column changes}.

@cindex Oracle-Kompatibilit�t
@cindex Kompatibilit�t, mit Oracle
Dieses Statement wird f�r die Oracle-Kompatibilit�t zur Verf�gung gestellt.

Das @code{SHOW}-Statement stellt �hnliche Informationen bereit.
@xref{SHOW, , @code{SHOW}}.


@node Transactional Commands, Fulltext Search, Basic User Commands, Reference
@c German node Transaktionale Befehle
@section Transaktionale und Sperrbefehle von MySQL



@menu
* COMMIT::                      
* LOCK TABLES::                 
* SET TRANSACTION::             
@end menu

@node COMMIT, LOCK TABLES, Transactional Commands, Transactional Commands
@c German node COMMIT
@subsection @code{BEGIN/COMMIT/ROLLBACK}-Syntax

@findex BEGIN
@findex COMMIT
@findex ROLLBACK

Vorgabem��ig l�uft MySQL im @code{autocommit}-Modus. Das hei�t, dass
MySQL eine Aktualisierung auf Platte speichert, sobald Sie eine
Aktualisierung ausf�hren.

Wenn Sie transaktionssichere Tabellen (wie @code{InnoDB} oder @code{BDB} )
benutzen, k�nnen Sie MySQL mit folgendem Befehl in den
Nicht-@code{autocommit}-Modus setzen:

@example
SET AUTOCOMMIT=0
@end example

Danach m�ssen Sie @code{COMMIT} benutzen, um Ihre �nderungen auf Platte zu
sichern, oder @code{ROLLBACK}, wenn Sie die �nderungen verwerfen wollen,
die Sie seit dem Beginn der Transaktion gemacht haben.

Wenn Sie f�r eine Reihe von Statements zum @code{AUTOCOMMIT}-Modus
umschalten wollen, k�nnen Sie das @code{BEGIN}- oder @code{BEGIN
WORK}-Statement benutzen:

@example
BEGIN;
SELECT @@A:=SUM(gehalt) FROM tabelle1 WHERE type=1;
UPDATE tabelle2 SET zusammenfassung=@@A WHERE type=1;
COMMIT;
@end example

Beachten Sie, dass bei der Benutzung nicht transaktionssicher Tabellen die
�nderungen dennoch sofort gespeichert werden, unabh�ngig vom Status des
@code{autocommit}-Modus.

Wenn Sie @code{ROLLBACK} bei der Aktualisierung einer nicht transaktionalen
Tabelle ausf�hren, erhalten Sie einen Fehler
(@code{ER_WARNING_NOT_COMPLETE_ROLLBACK}) als Warnung. Alle
transaktionssicheren Tabellen werden zur�ckgesetzt, aber nicht
transaktionale Tabelle �ndern sich nicht.

Wenn Sie @code{BEGIN} oder @code{SET AUTOCOMMIT=0} benutzen, sollten Sie
die MySQL-Bin�r-Log-Datei f�r Datensicherungen benutzen statt der �lteren
Update-Log-Datei. Transaktionen werden in der Bin�r-Log-Datei in einem
St�ck gespeichert, beim @code{COMMIT}, um sicherzustellen, dass
Transaktionen, die zur�ckgesetzt werden (Rollback), nicht gespeichert
werden. @xref{Binary log}.

Folgende Befehle beenden automatisch eine Transaktion (als ob Sie ein
@code{COMMIT} vor der Ausf�hrung des Befehls ausgef�hrt h�tten:

@multitable @columnfractions .33 .33 .33
@item @code{ALTER TABLE} @tab @code{BEGIN} @tab @code{CREATE INDEX}
@item @code{DROP DATABASE} @tab @code{DROP TABLE} @tab @code{RENAME TABLE}
@item @code{TRUNCATE}
@end multitable

@c German FIX changed @xref to @xref
Sie k�nnen die Isolationsebene (Isolation Level) f�r Transaktionen mit
@code{SET TRANSACTION ISOLATION LEVEL ...} @ref{SET TRANSACTION} �ndern.


@node LOCK TABLES, SET TRANSACTION, COMMIT, Transactional Commands
@c German node LOCK TABLES
@subsection @code{LOCK TABLES/UNLOCK TABLES}-Syntax

@findex LOCK TABLES
@findex UNLOCK TABLES

@example
LOCK TABLES tabelle [AS alias] @{READ | [READ LOCAL] | [LOW_PRIORITY] WRITE@}
            [, tabelle @{READ | [LOW_PRIORITY] WRITE@} ...]
...
UNLOCK TABLES
@end example

@code{LOCK TABLES} sperrt Tabellen f�r den aktuellen Thread. @code{UNLOCK
TABLES} hebt alle Sperren auf, die vom aktuellen Thread veranlasst wurden.
Alle Tabellen, die durch den aktuellen Thread gesperrt sind, werden
automatisch entsperrt, wenn der Thread ein weiteres @code{LOCK TABLES}
absetzt oder wenn die Verbindung zum Server geschlossen wird.

Die wichtigsten Gr�nde f�r die Benutzung von @code{LOCK TABLES} sind die
Emulation von Transaktionen oder um mehr Geschwindigkeit bei der
Aktualisierung von Tabellen zu erhalten. Das wird sp�ter detaillierter
erl�utert.

Wenn ein Thread eine @code{READ}-Sperre auf eine Tabelle erlangt, kann
dieser Thread (und alle anderen Threads) nur aus der Tabelle lesen. Wenn
ein Thread eine @code{WRITE}-Sperre auf eine Tabelle erlangt, kann nur der
Thread, der die Sperre veranlasst hat, @code{READ} oder @code{WRITE} auf
der Tabelle durchf�hren. Andere Threads werden blockiert.

Der Unterschied zwischen @code{READ LOCAL} und @code{READ} ist, dass
@code{READ LOCAL} nicht kollidierende @code{INSERT}-Statements w�hrend der
Dauer der Sperre zul��t. Das kann jedoch nicht benutzt werden, wenn Sie
Datenbankdateien ausserhalb von MySQL bearbeiten, w�hrend die Sperre aktiv
ist.

Wenn Sie @code{LOCK TABLES} benutzen, m�ssen Sie alle Tabellen sperren, die
Sie benutzen werden, und Sie m�ssen denselben Alias benutzen, den Sie in
Ihren Anfragen benutzen werden! Wenn Sie eine Tabelle in einer Anfrage
mehrfach (mit Aliasen) benutzen, m�ssen Sie f�r jeden Alias eine Sperre
machen!

@code{WRITE}-Sperren haben normalerweise h�here Priorit�t als
@code{READ}-Sperren, um sicherzustellen, dass Aktualisierungen so fr�h wie
m�glich bearbeitet werden. Dass hei�t, wenn ein Thread eine
@code{READ}-Sperre erlangt und dann ein anderer Thread eine
@code{WRITE}-Sperre verlangt, dass nachfolgende @code{READ}-Sperrenanfragen
warten, bis der @code{WRITE}-Thread die Sperre erhalten und freigegeben
hat. Sie k�nnen @code{LOW_PRIORITY WRITE}-Sperren benutzen, um anderen
Threads zu gestatten, @code{READ}-Sperren zu erlangen, w�hrend der Thread
auf die @code{WRITE}-Sperre wartet. Sie sollten nur dann @code{LOW_PRIORITY
WRITE}-Sperren benutzen, wenn Sie sicher sind, dass es irgendwann eine Zeit
gibt, in der kein anderer Thread eine @code{READ}-Sperre haben wird.

@code{LOCK TABLES} funktioniert wie folgt:
@enumerate
@item
Sortiert alle Tabellen, die gesperrt werden sollen, in einer intern
definierten Reihenfolge (aus Benutzersicht ist die Reihenfolge
undefiniert).
@item
Wenn eine Tabelle mit einer Lese- und einer Schreibsperre gesperrt ist,
wird die Schreibsperre vor die Lesesperre platziert.
@item
Sperrt eine Tabelle nach der anderen, bis der Thread alle Sperren erhalten
hat.
@end enumerate

Diese Methode stellt sicher, dass Tabellensperren blockierungsfrei ist. Bei
diesem Schema gibt es jedoch ein paar weitere Dinge, derer man sich bewusst
sein muss:

Wenn Sie eine @code{LOW_PRIORITY_WRITE}-Sperre f�r eine Tabelle benutzen,
hei�t das, dass MySQL auf diese bestimmte Sperre wartet, bis es keinen
Thread gibt, der eine @code{READ}-Sperre will. Wenn der Thread die
@code{WRITE}-Sperre erhalten hat und darauf wartet, die Sperre f�r die
n�chste Tabelle in der Tabellensperrliste zu erhalten, warten alle anderen
Threads darauf, dass die @code{WRITE}-Sperre aufgehoben wird. Wenn das bei
Ihrer Applikation zu ernsthaften Problemen f�hrt, sollten Sie in Betracht
ziehen, einige Ihrer Tabelle in transaktionssichere Tabelle umzuwandeln.

Es ist sicher, einen Thread mit @code{KILL} zu killen, der auf eine
Tabellensperre wartet. @xref{KILL}.

Beachten Sie, dass Sie @strong{NICHT} irgend welche Tabellen sperren
sollten, die Sie mit @code{INSERT DELAYED} benutzen. Das liegt darin, dass
in diesem Fall das @code{INSERT} von einem separaten Thread durchgef�hrt
wird.

Normalerweise m�ssen Sie Tabellen nicht sperren, weil alle einzelnen
@code{UPDATE}-Statements atomisch sind. Kein anderer Thread kann mit einem
aktuell ausgef�hrten SQL-Statement in die Quere kommen. Es gibt dennoch
einige F�llen, in denen es w�nschenswert sein kann, Tabellen zu sperren:

@itemize @bullet
@item
Wenn Sie viele Operationen auf einer gro�en Zahl von Tabellen laufen
lassen wollen, ist es viel schneller, die Tabellen zu sperren, die Sie
benutzen werden. Der Nachteil besteht nat�rlich darin, dass kein anderer
Thread eine @code{READ}-gesperrte Tabelle aktualisieren und kein anderer
Thread eine @code{WRITE}-gesperrte Tabelle lesen kann.

Der Grund, dass einiges mit @code{LOCK TABLES} schneller geht, liegt darin,
dass MySQL den Schl�ssel-Cache f�r die gesperrten Tabellen nicht auf Platte
zur�ckschreibt (flush), bis @code{UNLOCK TABLES} aufgerufen wird
(normalerweise wird der Schl�ssel-Cache nach jedem SQL-Statement auf Platte
zur�ckgeschrieben). Das erh�ht die Geschwindigkeit bei den Operationen
INSERT / UPDATE / DELETE bei @code{MyISAM}-Tabellen.
@item
Wenn Sie einen Tabellen-Handler in MySQL benutzen, der keine Transaktionen
unterst�tzt, m�ssen Sie @code{LOCK TABLES} benutzen, wenn Sie sicherstellen
wollen, dass kann anderer Thread zwischen einem @code{SELECT} und einem
@code{UPDATE} dazwischen kommen kann. Das unten stehende Beispiel erfordert
@code{LOCK TABLES}, um sicher ausgef�hrt zu werden:

@example
mysql> LOCK TABLES trans READ, kunde WRITE;
mysql> select sum(wert) from trans where kunde_id=irgendeine_id;
mysql> update kunde set gesamt_wert=summe_aus_vorherigem_statement
           where kunde_id=irgendeine_id;
mysql> UNLOCK TABLES;
@end example

Ohne @code{LOCK TABLES} besteht die M�glichkeit, dass ein anderer Thread
eine neue Zeile in die @code{trans}-Tabelle einf�gt, zwischen der
Ausf�hrung des @code{SELECT}- und des @code{UPDATE}-Statements.
@end itemize

Wenn Sie inkrementelle Updates (@code{UPDATE kunde SET
wert=wert+neuer_wert}) oder die @code{LAST_INSERT_ID()}-Funktion benutzen,
k�nnen Sie @code{LOCK TABLES} in vielen F�llen vermeiden.

Einige Problemf�lle k�nnen Sie auch l�sen, indem Sie die Sperrfunktionen
auf Benutzerebene @code{GET_LOCK()} und @code{RELEASE_LOCK()} benutzen.
Diese Sperren werden in einer Hash-Tabelle im Server gespeichert und sind
mit @code{pThread_mutex_lock()} und @code{pThread_mutex_unlock()} f�r die
Erzielung h�herer Geschwindigkeit implementiert.
@xref{Miscellaneous functions}.

Siehe @ref{Internal locking} wegen weiterer Informationen �ber
Sperrmethoden.

Sie k�nnen alle Tabellen in allen Datenbanken mit Lesesperren sperren, und
zwar mit dem @code{FLUSH TABLES WITH READ LOCK}-Befehl. @xref{FLUSH}. Das
ist eine sehr bequeme M�glichkeit, Datensicherungen zu erhalten, wenn Sie
ein Dateisystem wie Veritas haben, dass Schnappsch�sse im Zeitverlauf
aufnehmen kann.

@strong{HINWEIS}: @code{LOCK TABLES} ist nicht transaktionssicher und
schickt automatisch jegliche aktiven Transaktionen ab (Commit), bevor es
versucht, die Tabellen zu sperren.


@node SET TRANSACTION,  , LOCK TABLES, Transactional Commands
@c German node SET TRANSACTION
@subsection @code{SET TRANSACTION}-Syntax

@findex ISOLATION LEVEL

@example
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED |�READ COMMITTED | REPEATABLE READ | SERIALIZABLE]
@end example

Setzt die Transaktionsisolationsebene f�r die globale, gesamte Sitzung oder
f�r die n�chste Transaktion.

Das vorgabem��ige Verhalten ist das Setzen der Isolationsebene f�r die
n�chste (nicht angefangene) Transaktion.

Wenn Sie die @code{GLOBAL}-Berechtigung setzen, betrifft das alle neu
erzeugten Threads. Sie ben�tigen daf�r die @code{PROCESS}-Berechtigung.

Wenn Sie die @code{SESSION}-Berechtigung setzen, betrifft das die folgenden
und alle zuk�nftigen Transaktionen.

Sie k�nnen die vorgabem��ige Isolationsebene f�r @code{mysqld} mit
@code{--transaction-isolation=...} setzen. @xref{Command-line options}.


@node Fulltext Search, Query Cache, Transactional Commands, Reference
@c German node Volltextsuche
@section MySQL-Volltextsuche

@cindex Suchen, Volltext
@cindex Volltextsuche
@cindex FULLTEXT

Ab Version 3.23.23 bietet MySQL Unterst�tzung f�r Volltext-Indexierung und
-Suche. Volltext-Indexe sind in MySQL Indexe vom Typ @code{FULLTEXT}. 
@code{FULLTEXT}-Indexe k�nnen von @code{VARCHAR}- und @code{TEXT}-Spalten
zur Zeit von @code{CREATE TABLE} erzeugt werden oder sp�ter mit @code{ALTER
TABLE} oder @code{CREATE INDEX} hinzugef�gt werden. Bei gro�en Datenmengen
ist es viel schneller, einen @code{FULLTEXT}-Index mit @code{ALTER TABLE}
(oder @code{CREATE INDEX}) hinzuzuf�gen, als Zeilen in eine leere Tabelle
mit einem @code{FULLTEXT}-Index einzuf�gen.

Die Volltextsuche wird mit der @code{MATCH}-Funktion durchgef�hrt.

@example
mysql> CREATE TABLE artikel (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    ->   titel VARCHAR(200),
    ->   artikeltext TEXT,
    ->   FULLTEXT (titel,artikeltext)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO artikel VALUES
    -> (0,'MySQL-Tutorial', 'DBMS steht f�r DataBase-Management ...'),
    -> (0,'Wie man MySQL effizient einsetzt', 'Nachdem Sie ...'),
    -> (0,'MySQL optimieren','In diesem Tutorial wird gezeigt, wie ...'),
    -> (0,'1001 MySQL-Tricks','1. Lassen Sie mysqld nie als root laufen. 2. Normalisieren ...'),
    -> (0,'MySQL vs. YourSQL', 'Im folgenden Datenbankvergleich ...'),
    -> (0,'MySQL-Sicherheitsaspekte', 'Wenn er korrekt konfiguriert ist, ist MySQL ...');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM artikel WHERE MATCH (titel,artikeltext) AGAINST ('Datenbank');
+----+-------------------+---------------------------------------------+
| id | titel             | artikeltext                                 |
+----+-------------------+---------------------------------------------+
|  5 | MySQL vs. YourSQL | Im folgenden Datenbankvergleich ...         |
|  1 | MySQL-Tutorial    | DBMS steht f�r DataBase-Management ...      |
+----+-------------------+---------------------------------------------+
2 rows in set (0.00 sec)
@end example

Die Funktion @code{MATCH} pr�ft eine nat�rlichsprachige Anfrage gegen
(@code{AGAINST}) eine Textsammlung (einfach ein Satz von Spalten, der vom
@code{FULLTEXT}-Index abgedeckt wird). F�r jede Zeile in einer Tabelle gibt
sie eine Relevanz zur�ck - ein �hnlichkeitsma� zwischen dem Text in dieser
Zeile (in den Spalten, die Teil der Textsammlung sind) und der Anfrage.
Wenn sie in einer @code{WHERE}-Klausel benutzt wird (siehe Beispiel oben),
werden die zur�ckgegebenen Zeilen automatisch nach absteigender Relevanz
sortiert. Die Relevanz ist eine nicht negative Flie�kommazahl. 0 Relevanz
bedeutet keine �hnlichkeit. Die Relevanz wird auf der Grundlage der Anzahl
von W�rtern in der Zeile, der Anzahl eindeutiger W�rter in dieser Zeile,
der Gesamtzahl von W�rtern in der Textsammlung und der Anzahl von
Dokumenten (Zeilen) berechnet, die ein bestimmtes Wort enthalten.

Das obige Beispiel ist ein grundlegendes Beispiel der Benutzung der
@code{MATCH}-Funktion. Die Zeilen werden nach absteigender Relevanz
zur�ckgegeben.

@example
mysql> SELECT id,MATCH (titel,artikeltext) AGAINST ('Tutorial') FROM artikel;
+----+------------------------------------------------+
| id | MATCH (titel,artikeltext) AGAINST ('Tutorial') |
+----+------------------------------------------------+
|  1 |                               0.64840710366884 |
|  2 |                                              0 |
|  3 |                               0.66266459031789 |
|  4 |                                              0 |
|  5 |                                              0 |
|  6 |                                              0 |
+----+------------------------------------------------+
5 rows in set (0.00 sec)
@end example

Dieses Beispiel zeigt, wie man Relevanzen abruft. Weil weder die
@code{WHERE}- noch die @code{ORDER BY}-Klausel vorhanden sind, werden die
Zeilen unsortiert zur�ckgegeben.

@example
mysql> SELECT id, artikeltext, MATCH (titel,artikeltext) AGAINST (
    -> 'Sicherheits-Implikationen, wenn Sie MySQL als root laufen lassen') AS rang
    -> FROM artikel WHERE MATCH (titel,artikeltext) AGAINST
    -> ('Sicherheits-Implikationen, wenn Sie MySQL als root laufen lassen');
+----+----------------------------------------------------------------+-----------------+
| id | artikeltext                                                    | rang            |
+----+----------------------------------------------------------------+-----------------+
|  4 | 1. Lassen Sie mysqld nie als root laufen. 2. Normalisieren ... | 1.5055546709332 |
|  6 | Wenn er korrekt konfiguriert ist, ist MySQL ...                |   1.31140957288 |
+----+----------------------------------------------------------------+-----------------+
2 rows in set (0.00 sec)
@end example

Das ist ein komplexeres Beispiel - die Anfrage gibt die Relevanz zur�ck und
sortiert die Zeilen auch noch nach absteigender Relevanz. Um das zu
erzielen, m�ssen Sie @code{MATCH} zweimal angeben. Beachten Sie, dass das
keinen zus�tzlichen Overhead verursacht, weil der MySQL-Optimierer bemerkt,
dass diese zwei @code{MATCH}-Aufrufe identisch sind und daher den Code f�r
die Volltextsuche nur einmal aufruft.

MySQL benutzt einen sehr einfachen Parser, um Text in W�rter zu zerlegen.
Ein ``Wort'' ist jede Folge von Buchstaben, Zahlen, @samp{'} und @samp{_}.
Jedes ``Wort'', das in der Liste der Stopwords vorkommt oder einfach nur
zu kurz ist (3 Zeichen oder weniger), wird ignoriert.

Jedes korrekte Wort in der Textsammlung und in der Anfrage wird nach seiner
Signifikanz in der Anfrage oder der Textsammlung gewichtet. Daher hat ein
Wort, dass in vielen Dokumenten vorkommt, ein geringeres Gewicht (und kann
sogar 0 Gewicht haben), weil es in dieser bestimmten Textsammlung einen
geringen semantischen Wert hat. Ansonsten, wenn das Wort selten vorkommt,
erh�lt es ein h�heres Gewicht. Die Gewichte der W�rter werden anschlie�end
kombiniert, um die Relevanz der Zeile zu berechnen.

Solch eine Technik funktioniert am besten bei gro�en Textsammlungen (in
der Tat wurde sie sorgf�ltig darauf optimiert). Bei sehr kleinen Tabellen
spiegelt die Wortverteilung nicht ad�quat seinen semantischen Wert wider,
so dass dieses Modell manchmal bizarre Ergebnisse ergeben kann:

@example
mysql> SELECT * FROM artikel WHERE MATCH (titel,artikeltext) AGAINST ('MySQL');
Empty set (0.00 sec)
@end example

Die Suche nach dem Wort @code{MySQL} erzeugt im obigen Beispiel keine
Ergebnisse. Das Wort @code{MySQL} ist in mehr als der H�lfte der Zeilen
vorhanden und wird deshalb als Stopword betrachtet (eins mit dem
semantischen Wert 0). Das ist in der Tat das gew�nschte Verhalten - eine
nat�rlichsprachige Anfrage sollte bei einer 1 GB gro�en Tabelle nicht jede
zweite Zeile zur�ckgeben.

Bei einem Wort, dass in der H�lfte der Zeilen in einer Tabelle
�bereinstimmt, ist es nicht sehr wahrscheinlich, dass relevante Dokumente
gefunden werden, sondern statt dessen viele irrelevante Dokumente. Das
kennen wir alle aus Recherchen �ber Suchmaschinen auf dem Internet. Das ist
die �berlegung, die dahinter steht, dass solchen W�rtern ein niedriger
semantischer Wert @strong{in diesem bestimmten Satz von Daten} gegeben
wird.



@menu
* Fulltext Restrictions::       
* Fulltext Fine-tuning::        
* Volltext-Features in MySQL 4.0::  
* Fulltext TODO::               
@end menu

@node Fulltext Restrictions, Fulltext Fine-tuning, Fulltext Search, Fulltext Search
@c German node Volltext-Einschr�nkungen
@subsection Volltext-Einschr�nkungen

@itemize @bullet
@item
Alle Parameter der @code{MATCH}-Funktion m�ssen Spalten derselben Tabelle
sein, die Teil desselben Volltext-Indexes ist.
@item
Das Argument f�r @code{AGAINST} muss eine Konstanten-Zeichenkette sein.
@end itemize


@node Fulltext Fine-tuning, Volltext-Features in MySQL 4.0, Fulltext Restrictions, Fulltext Search
@c German node Volltext-Feineinstellungen
@subsection MySQL-Volltextsuche fein einstellen

@c German FIX changed @xref to @pxref
Leider hat die Volltextsuche noch keine durch den Benutzer einstellbare
Parameter, doch diese stehen sehr weit oben auf der TODO-Liste. Wenn Sie
jedoch eine MySQL-Quelldistribution
(@pxref{Installing source})
haben, k�nnen Sie das Verhalten der Volltextsuche in einiger Hinsicht
�ndern.

Beachten Sie, dass die Volltextsuche sorgf�ltig auf beste Sucheffektivit�t
eingestellt wurde. Wenn Sie dieses vorgabem��ige Verhalten �ndern, wird
das die Suchergebnisse in den meisten F�llen verschlechtern. �ndern Sie die
MySQL-Quelltexte deshalb nur, wenn Sie genau wissen, was Sie tun!

@itemize @bullet

@item
Die minimale zu indexierende Wortl�nge wird in der
@code{myisam/ftdefs.h}-Datei in folgender Zeile festgelegt:
@example
#define MIN_WORD_LEN 4
@end example
�ndern Sie diesen Wert nach Belieben, kompilieren Sie MySQL neu und bauen
Sie Ihre @code{FULLTEXT}-Indexe neu auf.

@item
Die Stopword-Liste wird in @code{myisam/ft_static.c} definiert. �ndern Sie
sie nach Ihrem Geschmack, kompilieren Sie MySQL neu und bauen Sie Ihre
@code{FULLTEXT}-Indexe neu auf.

@item
Die 50%-Schwelle wird durch das spezielle, ausgew�hlte Gewichtungsschema
festgelegt. Um dieses abzuschalten, �ndern Sie folgende Zeile in
@code{myisam/ftdefs.h}:
@example
#define GWS_IN_USE GWS_PROB
@end example
zu
@example
#define GWS_IN_USE GWS_FREQ
@end example
und kompilieren Sie MySQL neu.
In diesem Fall brauchen Sie die Indexe nicht neu aufzubauen.

@end itemize


@node Volltext-Features in MySQL 4.0, Fulltext TODO, Fulltext Fine-tuning, Fulltext Search
@c German node <no English equivalent>
@subsection Neue Features der Volltextsuche in MySQL 4.0

Dieser Abschnitt enth�lt eine Auflistung der Volltext-Features, die bereits
im MySQL-4.0-Baum implementiert sind. Er erl�utert den @strong{More
Funktionen f�r Volltextsuche}-Eintrag in @ref{TODO}.

@itemize @bullet
@item @code{REPAIR TABLE} mit @code{FULLTEXT}-Indexen, @code{ALTER TABLE}
mit @code{FULLTEXT}-Indexen und @code{OPTIMIZE TABLE} mit
@code{FULLTEXT}-Indexen l�uft jetzt bis zu 100 mal schneller.

@item @code{MATCH ... AGAINST} wird folgende @strong{Boolesch Operatoren}
unterst�tzen:

@itemize @bullet
@item @code{+}wort bedeutet, dass das Wort in jeder zur�ckgegebenen Zeile
enthalten sein @strong{muss}.
@item @code{-}wort bedeutet, dass das Wort in jeder zur�ckgegebenen Zeile
@strong{nicht} enthalten sein darf.
@item @code{<} und @code{>} k�nnen benutzt werden, um die Wortgewichtung in
der Anfrage herab- und heraufzusetzen.
@item @code{~} kann benutzt werden, um einem 'Rausch-Wort' ein
@strong{negatives} Gewicht zuzuweisen.
@item @code{*} ist ein Trunkierungsoperator.
@end itemize

Die Boole'sche Suche benutzt eine vereinfachte Art, die Relevanz zu
berechnen, die keine 50%-Schwelle hat.

@item Suchen sind jetzt wegen optimierter Suchalgorithmen bis zu 2 mal
schneller.

@item Das Dienstprogramm @code{ft_dump} wurde f�r
Low-Level-@code{FULLTEXT}-Index-Operationen hinzugef�gt (Anfragen / Dumps /
Statistiken).

@end itemize


@node Fulltext TODO,  , Volltext-Features in MySQL 4.0, Fulltext Search
@c German node Volltext-TODO-Liste
@subsection Volltextsuche TODO-Liste

@itemize @bullet
@item Alle Operationen mit @code{FULLTEXT}-Index @strong{schneller} machen.
@item Unterst�tzung f�r Klammern @code{()} in Boole'scher Volltextsuche.
@item Phrasensuche, N�herungsoperatoren
@item Boole'sche Suche funktioniert ohne @code{FULLTEXT}-Index (ja,
@strong{sehr} langsam).
@item Unterst�tzung f�r "immer indizierte W�rter". Das k�nnten beliebige
Zeichenketten sein, die der Benutzer wie W�rter behandeln will. Beispiele
sind "C++", "AS/400", "TCP/IP" usw.
@item Unterst�tzung f�r Volltextsuche in @code{MERGE}-Tabellen.
@item Unterst�tzung f�r Multi-Byte-Zeichens�tze.
@item Die Stopword-Liste von der Sprache der Daten abh�ngig machen.
@item Eind�mmen (Stemming, nat�rlich abh�ngig von der Sprache der Daten).
@item Generischer Benutzer-unterst�tzbarer UDF- (?) Preparser.
@item Das Modell flexibler machen (durch Hinzuf�gen einiger regulierbarer
Parameter f�r @code{FULLTEXT} in @code{CREATE/ALTER TABLE}).
@end itemize


@c ACHTUNG! Folgender NODE ist neu seit 2002-01-15!
@c ATTENTION! The following node ist new since 2001-01-15!

@node Query Cache,  , Fulltext Search, Reference
@c German node Anfragen-Cache
@section MySQL-Anfragen-Cache

@cindex Anfragen-Cache
@cindex @code{SELECT}, Anfragen-Cache

Ab Version 4.0.1 besitzt der @code{MySQL-Server} einen
@code{Anfragen-Cache}. Wenn er benutzt wird, speichert er den Text einer
@code{SELECT}-Anfrage zusammen mit dem entsprechenden Ergebnis, das an den
Client gesendet wird. Wenn eine weitere identische Anfrage empfangen wird,
kann der Server die Ergebnisse aus dem Cache beziehen, statt dieselbe
Anfrage zu parsen und noch einmal auszuf�hren.

Der Anfragen-Cache ist extrem n�tzlich in Umgebungen, in denen sich
(einige) Tabellen nicht h�ufig �ndern und in denen Sie viele identische
Anfragen haben. Das ist eine typische Situation f�r viele Web-Server, die
viele dynamische Inhalte benutzen.

Im folgenden finden Sie einige Performance-Daten f�r den Anfragen-Cache
(die wir mit der MySQL-Benchmark-Suite auf einer Linux Alpha 2 x 500 MHz
mit 2 GB RAM und einem 64-MB-Anfragen-Cache gewonnen haben):

@itemize @bullet
@item
Wenn Sie den Anfragen-Cache-Code abschalten wollen, setzen Sie
@code{query_cache_size=0}. Wenn Sie den Anfragen-Cache-Code abschalten,
gibt es keinen bemerkbaren Overhead.
@item
Wenn alle Anfragen, die Sie ausf�hren, einfach sind (wie das Ausw�hlen
einer Zeile aus einer Tabelle mit einer Zeile), sich aber dennoch
unterscheiden, so dass die Anfragen nicht gecachet werden k�nnen, ist der
Overhead bei einem aktiven Anfragen-Cache 13%. Das sollte als Szenario f�r
den schlechtesten Fall angesehen werden. Im echten Leben sind Anfragen
jedoch meist viel komplizierter, so dass der Overhead normalerweise
betr�chtlich geringer ist.
@item
Die Suche nach einer Zeile in einer Einzeilen-Tabelle ist 238% schneller.
Das kann als minimale Geschwindigkeitssteigerung f�r eine gecachete Anfrage
betrachtet werden.
@end itemize



@menu
* Query Cache How::             
* Query Cache Configuration::   
* Query Cache in SELECT::       
* Query Cache Status and Maintenance::  
@end menu

@node Query Cache How, Query Cache Configuration, Query Cache, Query Cache
@c German node Anfragen-Cache-Funktionsweise
@subsection Wie der Anfragen-Cache funktioniert

Anfragen werden vor dem Parsen verglichen, daher werden

@example
SELECT * FROM TABELLE
@end example

und

@example
Select * from tabelle
@end example

als unterschiedliche Anfragen f�r den Anfragen-Cache betrachtet. Anfragen
m�ssen also exakt gleich sein (Byte f�r Byte), um als identisch erkannt zu
werden. Zus�tzlich kann eine Anfrage als unterschiedlich betrachtet werden,
wenn ein Client zum Beispiel ein neues Kommunikationsprotokollformat
benutzt oder einen anderen Zeichensatz als ein anderer Client.

Anfragen, die unterschiedliche Datenbanken, Protokollversionen oder
unterschiedliche vorgabem��ige Zeichens�tze benutzen, werden als
unterschiedliche Anfragen angesehen und separat gecachet.

Der Cache funktioniert auch bei Anfragen der Art @code{SELECT CALC_ROWS
...} und @code{SELECT FOUND_ROWS() ...}, weil die Anzahl der gefundenen
Zeilen ebenfalls im Cache gespeichert wird.

Wenn sich eine Tabelle �ndert (@code{INSERT}, @code{UPDATE}, @code{DELETE},
@code{TRUNCATE}, @code{ALTER} oder @code{DROP TABLE|DATABASE}), werden alle
gecacheten Anfragen, die diese Tabelle benutzten (m�glicherweise �ber eine
@code{MRG_MyISAM}-Tabelle!) ung�ltig und werden aus dem Cache entfernt.

Momentan werden alle @code{InnoDB}-Tabellen beim @code{COMMIT} als f�r den
Cache ung�ltig gekennzeichnet. In Zukunft wird das ge�ndert, so dass nur
Tabellen, die in der Transaktion ge�ndert wurden, f�r die entsprechenden
Cache-Eintr�ge als ung�ltig markiert werden.

Eine Anfrage kann nicht gecachet werden, wenn sie eine der folgenden
Funktionen enth�lt:
@multitable @columnfractions .25 .25 .25 .25
@item @strong{Funktion} @tab @strong{Funktion}
 @tab @strong{Funktion} @tab @strong{Funktion}
@item @code{Benutzerdefinierte Funktionen} @tab @code{CONNECTION_ID}
 @tab @code{FOUND_ROWS} @tab @code{GET_LOCK}
@item @code{RELEASE_LOCK} @tab @code{LOAD_FILE}
 @tab @code{MASTER_POS_WAIT} @tab @code{NOW}
@item @code{SYSDATE} @tab @code{CURRENT_TIMESTAMP}
 @tab @code{CURDATE} @tab @code{CURRENT_DATE}
@item @code{CURTIME} @tab @code{CURRENT_TIME}
 @tab @code{DATABASE} @tab @code{ENCRYPT} (mit einem Parameter)
@item @code{LAST_INSERT_ID} @tab @code{RAND}
 @tab @code{UNIX_TIMESTAMP} (ohne Parameter) @tab @code{USER}
@item @code{BENCHMARK}
@end multitable

Eine Anfrage kann ebenfalls nicht gecachet werden, wenn sie
Benutzer-Variablen enth�lt oder wenn sie in der Form @code{SELECT ... IN
SHARE MODE} oder der Form @code{SELECT * FROM AUTOINCREMENT_FIELD IS NULL}
(um als ODBC-Workaround die letzte eingef�gte ID abzurufen) ist.

@code{FOUND ROWS()} gibt jedoch den korrekten Werte zur�ck, selbst wenn
eine vorhergehende Anfrage aus dem Cache geholt wurde.

Anfragen, die keinerlei Tabellen benutzen oder solche, bei denen der
Benutzer eine Spaltenberechtigung f�r irgend eine der beteiligten Tabellen
hat, werden nicht gecachet.

Bevor eine Anfrage aus dem Anfragen-Cache geholt wird, pr�ft MySQL, ob der
Benutzer die SELECT-Berechtigung f�r alle beteiligten Datenbanken und
Tabellen hat. Wenn nicht, wird das Cache-Ergebnis nicht benutzt.

@node Query Cache Configuration, Query Cache in SELECT, Query Cache How, Query Cache
@c German node Anfragen-Cache-Konfiguration
@subsection Anfragen-Cache-Konfiguration

Aufgrund des Anfragen-Caches gibt es ein paar neue @code{MySQL}
Systemvariablen f�r @code{mysqld}, die in einer Konfigurationsdatei oder
auf der Kommandozeile beim Starten von @code{mysqld} gesetzt werden k�nnen:

@itemize
@item @code{query_cache_limit}
Keine Ergebnisse cachen, die gr��er als dieser Wert sind (Vorgabe 1 MB).

@item @code{query_cache_size}
Der zugewiesene Arbeitsspeicher, um Ergebnisse aus alten Anfragen zu
speichern. Wenn er 0 ist, ist der Anfragen-Cache abgeschaltet (Vorgabe).

@item @code{query_cache_startup_type}
Dieser Wert (nur Zahlen) kann wie folgt gesetzt werden:
@multitable @columnfractions .3 .7
@item @strong{Option} @tab @strong{Beschreibung}
@item 0 @tab (OFF - AUS, Ergebnisse nicht cachen oder abrufen)
@item 1 @tab (ON - AN, alle Ergebnisse ausser @code{SELECT SQL_NO_CACHE ...}-Anfragen cachen)
@item 2 @tab (DEMAND - AUF VERLANGEN, nur @code{SELECT SQL_CACHE ...}-Anfragen cachen)
@end multitable
@end itemize


Innerhalb eines Threads (Verbindung) kann das Verhalten des Anfragen-Caches
abweichend von der Vorgabe ver�ndert werden. Die Syntax ist wie folgt:

@code{SQL_QUERY_CACHE_TYPE = OFF | ON | DEMAND}
@code{SQL_QUERY_CACHE_TYPE = 0   | 1  | 2}

@multitable @columnfractions .3 .7
@item @strong{Option} @tab @strong{Beschreibung}
@item 0 oder OFF @tab Keine Ergebnisse cachen oder abrufen.
@item 1 oder ON @tab Alle Ergebnisse ausser @code{SELECT SQL_NO_CACHE ...}-Anfragen cachen.
@item 2 oder DEMAND @tab Nur @code{SELECT SQL_CACHE ...}-Anfragen cachen.
@end multitable

Vorgabem��ig h�ngt @code{SQL_QUERY_CACHE_TYPE} vom Wert von
@code{query_cache_startup_type} ab, als der Thread erzeugt wurde.


@node Query Cache in SELECT, Query Cache Status and Maintenance, Query Cache Configuration, Query Cache
@c German node Anfragen-Cache in SELECT
@subsection Anfragen-Cache-Optionen in @code{SELECT}

Es gibt zwei m�gliche Anfragen-Cache-bezogene Parameter, die in einer
@code{SELECT}-Anfrage angegeben werden k�nnen:

@findex SQL_CACHE
@findex SQL_NO_CACHE

@multitable @columnfractions .3 .7
@item @strong{Option} @tab @strong{Beschreibung}
@item @code{SQL_CACHE}
 @tab Wenn @code{SQL_QUERY_CACHE_TYPE} @code{DEMAND} ist, darf die Anfrage gecachet werden.
 Wenn @code{SQL_QUERY_CACHE_TYPE} @code{ON} ist, ist das die Vorgabe.
 Wenn @code{SQL_QUERY_CACHE_TYPE} @code{OFF} ist, nichts tun.
@item @code{SQL_NO_CACHE}
 @tab Diese Anfrage wird nicht gecachet.
@end multitable


@node Query Cache Status and Maintenance,  , Query Cache in SELECT, Query Cache
@c German node Anfragen-Cache-Status und -Wartung
@subsection Anfragen-Cache-Status und -Wartung

Mit dem @code{FLUSH QUERY CACHE}-Befehl k�nnen Sie den Anfragen-Cache
defragmentieren, um den Speicher besser zu benutzen. Dieser Befehl entfernt
keinerlei Anfragen aus dem Cache.
@code{FLUSH TABLES} schreibt auch den Anfragen-Cache zur�ck auf Platte.

Der @code{RESET QUERY CACHE}-Befehl entfernt alle Anfragenergebnisse aus
dem Anfragen-Cache.

Sie k�nnen die Anfragen-Cache-Performance in @code{SHOW STATUS} beobachten:

@multitable @columnfractions .3 .7
@item @strong{Variable} @tab @strong{Beschreibung}
@item @code{Qcache_queries_in_cache}
 @tab Anzahl von Anfragen, die im Cache registriert sind.
@item @code{Qcache_inserts}
 @tab Anzahl von Anfragen, die zum Cache hinzugef�gt wurden.
@item @code{Qcache_hits}
 @tab Anzahl von Cache-Hits.
@item @code{Qcache_not_cached}
 @tab Anzahl von nicht gecacheten Anfragen
 (nicht cachebar oder wegen @code{SQL_QUERY_CACHE_TYPE}).
@item @code{Qcache_free_memory}
 @tab Menge des freien Speichers f�r den Anfragen-Cache.
@item @code{Qcache_total_blocks}
 @tab Gesamtzahl von Bl�cken im Anfragen-Cache.
@item @code{Qcache_free_blocks}
 @tab Anzahl freier Speicherbl�cke im Anfragen-Cache.
@end multitable

Gesamtzahl von Anfragen =
@code{Qcache_inserts} + @code{Qcache_hits} + @code{Qcache_not_cached}.

Der Anfragen-Cache benutzt variable Blockl�ngen, so dass
@code{Qcache_total_blocks} und @code{Qcache_free_blocks} eine
Speicherfragmentierung des Anfragen-Caches anzeigen k�nnen. Nach
@code{FLUSH QUERY CACHE} verbleibt nur ein einzelner (gro�er) freier
Block.

Hinweis: Jede Anfrage ben�tigt minimal zwei Bl�cke (einen f�r den
Anfragentext und einen weiteren f�r das Anfragenergebnis). Ausserdem
ben�tigt jede Tabelle, die in einer Anfrage benutzt wurde, einen Block.
Wenn allerdings zwei oder mehr Anfragen dieselbe Tabelle benutzen, muss nur
ein Block zugewiesen werden.


@c ACHTUNG! Folgender NODE ist ge�ndert, 2002-01-15!
@c ATTENTION! The following node has been changed 2001-01-15!
@node Table types, Clients, Reference, Top
@c German node Tabellentypen
@chapter MySQL-Tabellentypen

@cindex Tabellentypen, Auswahl
@cindex @code{InnoDB}-Tabellentyp
@cindex @code{Berkeley_db}-Tabellentyp
@cindex @code{HEAP}-Tabellentyp
@cindex @code{ISAM}-Tabellentyp
@cindex @code{BDB}-Tabellentyp
@cindex @code{MERGE}-Tabellentyp
@cindex MySQL-Tabellentypen
@cindex @code{MyISAM}-Tabellentyp
@cindex Typen, Tabellen-

AB MySQL-Version 3.23.6 k�nnen Sie unter drei grundlegenden
Tabellenformaten (@code{ISAM}, @code{HEAP} und @code{MyISAM} w�hlen. Neuere
MySQL-Versionen k�nnen zus�tzliche Tabellentypen unterst�tzen
(@code{InnoDB}, oder @code{BDB}), abh�ngig davon, wie Sie sie kompilieren.
 

Beim Erzeugen einer neuen Tabelle k�nnen Sie MySQL mitteilen, welcher
Tabellentyp daf�r benutzt werden soll. MySQL erzeugt immer eine
@code{.frm}-Datei, die die Tabellen- und Spaltendefinitionen enth�lt.
Abh�ngig vom Tabellentyp werden Index und Daten in anderen Dateien
gespeichert.

Beachten Sie, dass Sie f�r die Benutzung von @code{InnoDB}-Tabellen
zumindest die @code{innodb_data_file_path}-Startoption ben�tigen.
@xref{InnoDB start}.

Der vorgabem��ige Tabellentyp in MySQL ist @code{MyISAM}. Wenn Sie
versuchen, einen Tabellentyp zu benutzen, der nicht einkompiliert oder
aktiviert ist, erzeugt MySQL statt dessen eine Tabelle vom Typ
@code{MyISAM}. Das ist ein sehr n�tzliches Feature, wenn Sie Tabellen
zwischen unterschiedlichen SQL-Servern kopieren wollen, die
unterschiedliche Tabellentypen unterst�tzten (zum Beispiel Tabellen zu
einem Slave kopieren, der f�r Geschwindigkeit optimiert ist, aber keine
transaktionalen Tabellen hat). Dieses automatische �ndern des Tabellentyps
kann andererseits f�r neue MySQL-Benutzer sehr verwirrend sein. Wir planen
f�r MySQL 4.0, das zu beheben, indem eine Warnung ausgegeben wird, wenn ein
Tabellentyp automatisch ge�ndert wird.

Sie k�nnen Tabellen zwischen unterschiedlichen Typen mit dem @code{ALTER
TABLE}-Statement umwandeln. @xref{ALTER TABLE, , @code{ALTER TABLE}}.

MySQL unterst�tzt zwei unterschiedliche Arten von Tabellen:
transaktionssichere Tabellen (@code{InnoDB} und @code{BDB}) und nicht
transaktionssichere Tabellen (@code{HEAP}, @code{ISAM}, @code{MERGE} und
@code{MyISAM}).

Vorteile transaktionssicherer Tabellen (TST):

@itemize @bullet
@item
Sicherer. Selbst wenn MySQL abst�rzt oder wenn Sie Hardware-Probleme
bekommen, bekommen Sie Ihre Daten zur�ck, entweder �ber automatische
Wiederherstellung oder von einer Datensicherung plus Transaktionslog-Datei.
@item
Sie k�nnen viele Statements kombinieren und alle in einem Rutsch mit dem
@code{COMMIT}-Befehl akzeptieren.
@item
Sie k�nnen @code{ROLLBACK} ausf�hren, um Ihre �nderungen zu ignorieren
(wenn Sie nicht im Auto-Commit-Modus fahren).
@item
Wenn eine Aktualisierung fehlschl�gt, werden Ihre �nderungen
zur�ckgesichert. (Bei nicht transaktionssicheren Tabellen sind
durchgef�hrte �nderungen permanent.)
@end itemize

Vorteile nicht transaktionssicherer Tabellen (NTST):

@itemize @bullet
@item
Viel schneller, da es keinen Transaktionsoverhead gibt.
@item
Ben�tigen aufgrund des fehlenden Transaktionsoverheads weniger
Speicherplatz.
@item
Ben�tigen weniger Arbeitsspeicher f�r Aktualisierungen.
@end itemize

Sie k�nnen TST- and NTST-Tabellen in denselben Statements kombinieren, um
das Beste aus beiden Welten zu bekommen.



@menu
* MyISAM::                      
* MERGE::                       
* ISAM::                        
* HEAP::                        
* InnoDB::                      
* BDB::                         
@end menu

@node MyISAM, MERGE, Table types, Table types
@c German node MyISAM
@section MyISAM-Tabellen

@code{MyISAM} ist der vorgabem��ige Tabellentyp in MySQL-Version 3.23. Er
basiert auf dem @code{ISAM}-Code und hat viele n�tzliche Erweiterungen.

Der Index wird in einer Datei mit der Endung @code{.MYI} (MYIndex)
gespeichert, die Daten in einer Datei mit der Endung @code{.MYD} (MYData).
Sie k�nnen @code{MyISAM}-Tabellen mit dem @code{myisamchk}-Dienstprogramm
�berpr�fen und reparieren. @xref{Repair}. Sie k�nnen
@code{MyISAM}-Tabellen mit @code{myisampack} komprimieren, damit sie viel
weniger Speicherplatz ben�tigen. @xref{myisampack}.

Folgende Neuerungen gibt es bei @code{MyISAM}:

@itemize @bullet
@item
Es gibt einen Flag in der @code{MyISAM}-Datei, der anzeigt, ob die Tabelle
korrekt geschlossen wurde. Wenn @code{mysqld} mit @code{--myisam-recover}
gestartet wird, werden @code{MyISAM}-Tabellen beim �ffnen automatisch
gepr�ft und / oder repariert, falls die Tabelle nicht korrekt geschlossen
wurde.
@item
Sie k�nnen neue Zeilen in eine Tabelle, die keinerlei freie Bl�cke mitten
in der Daten-Datei hat, einf�gen (@code{INSERT}), w�hrend zeitgleich
andere Threads aus der Tabelle lesen (zeitgleiches Einf�gen). Ein freier
Block kann entstehen, wenn eine Aktualisierung einer Zeile dynamischer
L�nge, die viele Daten enth�lt, mit weniger Daten durchgef�hrt wird, oder
wenn Zeilen gel�scht werden. Wenn alle freien Bl�cke aufgebraucht sind,
k�nnen alle zuk�nftigen Einf�geoperationen auf die zeitgleiche Art
erfolgen.
@item
Unterst�tzung f�r gro�e Dateien (63-Bit) auf Dateisystemen /
Betriebssystemen, die gro�e Dateien unterst�tzen.
@item
Alle Daten werden mit dem niedrigen Byte zuerst gespeichert. Das macht die
Daten Maschinen- und Betriebssystem-unabh�ngig. Die einzige Anforderung
ist, dass die Maschine zweien-komplement�re vorzeichenbehaftete Ganzzahlen
(two's-complement signed integers) benutzt, was bei jeder Maschine in den
letzten 20 Jahren der Fall war), sowie das IEEE-Flie�komma-Format (bei
Mainstream-Maschinen absolut dominierend). Die einzige Art von Maschinen,
die vielleicht keine Bin�rkompatibilit�t unterst�tzen, sind eingebettete
Systeme (Embedded Systems), weil diese manchmal eigent�mliche Prozessoren
haben.

Wenn Daten mit dem niedrigen Byte zuerst gespeichert werden, ergibt sich
daraus kein gro�er Geschwindigkeitsnachteil. Die Bytes in einer
Tabellenzeile sind normalerweise unzusammenh�ngend und man ben�tigt kaum
mehr Ressourcen, um ein unzusammenh�ngendes Byte in Reihenfolge statt in
umgekehrter Reihenfolge zu lesen. Der tats�chliche Hole-Spaltenwert-Code
ist im Vergleich zu sonstigem Code ebenfalls nicht zeitkritisch.
@item
Alle Zahlenschl�ssel werden mit dem hohen Byte zuerst gespeichert, um
bessere Index-Kompression zu erzielen.
@item
Die interne Handhabung einer @code{AUTO_INCREMENT}-Spalte. @code{MyISAM}
aktualisiert diese automatisch bei @code{INSERT / UPDATE}. Der
@code{AUTO_INCREMENT}-Wert kann mit @code{myisamchk} zur�ckgesetzt werden.
Das macht @code{AUTO_INCREMENT}-Spalten schneller (mindestens 10%), und
alten Zahlen werden im Gegensatz zum alten @code{ISAM} nicht wieder
benutzt. Beachten Sie, dass das alte Verhalten immer noch da ist, wenn ein
@code{AUTO_INCREMENT} am Ende eines mehrteiligen Schl�ssels definiert wird.
@item
Wenn er in sortierter Reihenfolge eingef�gt wird (wie bei der Benutzung
einer @code{AUTO_INCREMENT}-Spalte), wird der Schl�sselbaum gespalten, so
dass der hohe Knoten nur einen Schl�ssel enth�lt. Das verbessert die
Platzausnutzung im Schl�sselbaum.
@item
@code{BLOB}- und @code{TEXT}-Spalten k�nnen indiziert werden.
@item
@code{NULL}-Werte sind in indizierten Spalten erlaubt. Daf�r werden 0 bis 1
Byte pro Schl�ssel ben�tigt.
@item
Die maximale Schl�ssell�nge betr�gt vorgabem��ig 500 Bytes (das kann beim
Neukompilieren ge�ndert werden). Wenn Schl�ssel l�nger als 250 Bytes sind,
wird f�r diese eine h�here Schl�sselblockgr��e als die vorgabem��igen
1024 Bytes benutzt.
@item
Die maximale Anzahl von Schl�sseln pro Tabelle betr�gt vorgabem��ig 32.
Diese kann bis auf 64 erh�ht werden, ohne dass @code{myisamchk} neu
kompiliert werden muss.
@item
@code{myisamchk} kennzeichnet Tabellen als gepr�ft, wenn es mit
@code{--update-state} l�uft. @code{myisamchk --fast} pr�ft nur die
Tabellen, die diese Kennzeichnung nicht haben.
@item
@code{myisamchk -a} speichert Statistiken f�r Schl�sselteile (und nicht nur
f�r gesamte Schl�ssel wie bei @code{ISAM}).
@item
Zeilen dynamischer Gr��e werden viel weniger fragmentiert werden, wenn
L�sch- mit Aktualisierungs- und Einf�geoperationen gemischt werden. Daf�r
wird gesorgt, indem angrenzende gel�schte Bl�cke automatisch kombiniert
werden und dadurch, dass Bl�cke erweitert werden, wenn der n�chste Block
gel�scht wird.
@item
@code{myisampack} kann @code{BLOB}- and @code{VARCHAR}-Spalten
komprimieren.
@item
Sie k�nnen die Daten-Datei und die Index-Datei in unterschiedliche
Verzeichnisse legen, um mehr Geschwindigkeit zu erhalten (mit der
@code{DATA/INDEX DIRECTORY="pfad"}-Option f�r @code{CREATE TABLE}).
@xref{CREATE TABLE}.
@end itemize

@code{MyISAM} unterst�tzt ausserdem die folgenden Dinge, die MySQL in naher
Zukunft benutzen k�nnen wird:

@itemize @bullet
@item
Unterst�tzung f�r einen echten @code{VARCHAR}-Typ. Eine
@code{VARCHAR}-Spalte f�ngt mit einer in 2 Bytes gespeicherten L�nge an.
@item
Tabellen mit @code{VARCHAR} k�nnen eine feste oder dynamische
Datensatzl�nge haben.
@item
@code{VARCHAR} und @code{CHAR} k�nnen bis zu 64 KB Gro� sein. Alle
Schl�sselsegmente haben ihre eigene Sprachdefinition. Das versetzt MySQL in
die Lage, unterschiedliche Sprachdefinitionen pro Spalte zu haben.
@item
Ein gehashter berechneter Index kann f�r @code{UNIQUE} benutzt werden. Das
erlaubt Ihnen, @code{UNIQUE} auf jeder beliebigen Kombination von Spalten
in einer Tabelle zu haben. (Sie k�nnen jedoch auf einem @code{UNIQUE}
berechneten Index nicht suchen.)
@end itemize

Beachten Sie, dass Index-Dateien bei @code{MyISAM} �blicherweise viel
kleiner sind als bei @code{ISAM}. Das bedeutet, dass @code{MyISAM}
normalerweise weniger Systemressourcen verbraucht als @code{ISAM},
allerdings mehr Prozessorleistung beim Einf�gen von Daten in einen
komprimierten Index.

Folgende Optionen f�r @code{mysqld} k�nnen benutzt werden, um das Verhalten
von @code{MyISAM}-Tabellen zu �ndern. @xref{SHOW VARIABLES}.

@multitable @columnfractions .40 .60
@item @strong{Option} @tab @strong{Beschreibung}
@item @code{--myisam-recover=#}
 @tab Automatische Wiederherstellung besch�digter Tabellen.
@item @code{-O myisam_sort_buffer_size=#}
 @tab Der beim Wiederherstellen von Tabellen benutzte Puffer.
@item @code{--delay-key-write-for-all-tables}
 @tab Keine Schl�sselpuffer zwischen Schreibvorg�ngen auf jedwede
MyISAM-Tabelle zur�ckschreiben (flush).
@item @code{-O myisam_max_extra_sort_file_size=#}
 @tab Wird benutzt, um MySQL bei der Entscheidung zu helfen, wann die
langsame, aber sichere Schl�ssel-Cache-Index-Erzeugungsmethode benutzt
werden sollte. @strong{Hinweis:} Dieser Parameter wird in Megabytes
angegeben!
@item @code{-O myisam_max_sort_file_size=#}
 @tab Die schnelle Index-Sortiermethode beim Erzeugen eines Indexes nicht
benutzen, wenn die tempor�re Datei gr��er als dieser Wert werden w�rde.
@strong{Hinweis:} Dieser Parameter wird in Megabytes angegeben!
megabytes!--
@item @code{-O myisam_bulk_insert_tree_size=#}
 @tab Die Gr��e des Baum-Caches, der bei der Optimierung von
Massen-Einf�geoperationen benutzt wird. @strong{Hinweis:} Das ist die
Begrenzung @strong{pro Thread}!
@end multitable

Die automatische Wiederherstellung wird aktiviert, wenn Sie @code{mysqld}
mit @code{--myisam-recover=#} starten. @xref{Command-line options}. Beim
�ffnen wird gepr�ft, ob die Tabelle als besch�digt gekennzeichnet ist oder
ob die Z�hlvariable f�r die Tabelle nicht 0 ist und Sie mit
@code{--skip-locking} laufen lassen. Wenn eine dieser Bedingungen erf�llt
ist, geschieht folgendes:

@itemize @bullet
@item
Die Tabelle wird auf Fehler gepr�ft.
@item
Wenn ein Fehler gefunden wird, wird eine schnelle Reparatur der Tabelle
versucht (mit Sortieren und ohne Neuerzeugung der Daten-Datei).
@item
Wenn die Reparatur wegen eines Fehlers in der Daten-Datei fehlschl�gt (zum
Beispiel ein Fehler wegen eines doppelten Schl�sseleintrags), wird die
Reparatur noch einmal versucht, diesmal allerdings mit Neuerzeugung der
Daten-Datei.
@item
Wenn dieser Versuch fehlschl�gt, wird die Reparatur noch einmal mit der
alten Reparaturoption versucht (Zeile f�r Zeile ohne Sortieren schreiben),
was jede Sorte von Fehler beheben sollte, bei gewissen
Festplatten-Erfordernissen ...
@end itemize

Wenn die Wiederherstellung nicht in der Lage ist, alle Zeilen aus einem
vorher abgeschlossenen Statement wiederherzustellen, und Sie nicht
@code{FORCE} als Option f�r @code{myisam-recover} angegeben haben, wird die
automatische Reparatur mit einer Fehlermeldung in der Fehlerdatei
abgebrochen:

@example
Error: Couldn't repair table: test.g00pages
@end example

H�tten Sie in diesem Fall die @code{FORCE}-Option benutzt, w�rden Sie statt
dessen in der Fehlerdatei eine Warnung erhalten:

@example
Warning: Found 344 of 354 rows when repairing ./test/g00pages
@end example

Wenn Sie automatisches Wiederherstellung mit der @code{BACKUP}-Option
laufen lassen, beachten Sie, dass Sie ein Cron-Skript haben sollten, dass
automatisch Dateien mit Namen wie @file{tabellenname-datetime.BAK} aus den
Datenbank-Verzeichnissen auf ein Sicherungsmedium verschiebt.

@xref{Command-line options}.



@menu
* Key space::                   
* MyISAM table formats::        
* MyISAM table problems::       
@end menu

@node Key space, MyISAM table formats, MyISAM, MyISAM
@c German node Speicherplatz f�r Schl�ssel
@subsection F�r Schl�ssel ben�tigter Speicherplatz

@cindex Speicherplatz f�r Schl�ssel, MyISAM

MySQL unterst�tzt unterschiedliche Index-Typen, doch der normale Typ ist
ISAM oder MyISAM. Diese benutzen einen B-Baum-Index, und Sie k�nnen die
Gr��e der Index-Datei grob als @code{(schluessel_laenge+4)/0.67}
kalkuliert, summiert �ber alle Schl�ssel. (Das ist der schlechteste Fall,
bei dem alle Schl�ssel in sortierter Reihenfolge eingeordnet werden und es
keinerlei Schl�ssel-Komprimierung gibt.)

Zeichenketten-Indexe werden Leerzeichen-komprimiert. Wenn der erste
Index-Teil eine Zeichenkette ist, wird er zus�tzlich Pr�fix-komprimiert.
Leerzeichen-Kompression macht die Index-Datei kleiner als in den obigen
Zahlen dargestellt, wenn die Zeichenkettenspalte viele Leerzeichen am Ende
hat oder eine @code{VARCHAR}-Spalte ist, die nicht immer in voller L�nge
genutzt wird. Pr�fix-Kompression wird bei Schl�sseln benutzt, die mit einer
Zeichenkette beginnen. Pr�fix-Kompression hilft, wenn es viele
Zeichenketten mit identischem Pr�fix gibt.

Bei @code{MyISAM}-Tabellen k�nnen Sie auch Zahlen Pr�fix-komprimieren,
indem Sie beim Erzeugen der Tabelle @code{PACK_KEYS=1} angeben. Das hilft,
wenn Sie viele Ganzzahl-Schl�ssel mit identischem Pr�fix haben, wenn die
Zahlen mit dem hohen Byte zuerst gespeichert werden.


@node MyISAM table formats, MyISAM table problems, Key space, MyISAM
@c German node MyISAM-Tabellenformate
@subsection MyISAM-Tabellenformate

@strong{MyISAM} unterst�tzt 3 verschiedene Tabellentypen. Zwei von ihnen
werden automatisch gew�hlt, abh�ngig vom Spaltentyp, den Sie benutzen. Der
dritte, komprimierte Tabellen, kann nur mit dem
@code{myisampack}-Dienstprogramm erzeugt werden.

Wenn Sie eine Tabelle erzeugen (@code{CREATE}) oder �ndern (@code{ALTER}),
k�nnen Sie bei Tabellen, die kein @code{BLOB} enthalten, ein dynamisches
(@code{DYNAMIC}) oder festes (@code{FIXED}) Tabellenformat mit der
@code{ROW_FORMAT=#}-Tabellenoption erzwingen. Zuk�nftig werden Sie in der
Lage sein, Tabellen zu komprimieren / dekomprimieren, indem Sie
@code{ROW_FORMAT=compressed | default} f�r @code{ALTER TABLE} angeben.
@xref{CREATE TABLE}.



@menu
* Static format::               
* Dynamic format::              
* Compressed format::           
@end menu

@node Static format, Dynamic format, MyISAM table formats, MyISAM table formats
@c German node Statisches Format
@subsubsection Kennzeichen statischer (Festl�ngen-) Tabellen

Das ist das vorgabem��ige Format. Es wird benutzt, wenn die Tabelle keine
@code{VARCHAR}-, @code{BLOB}- oder @code{TEXT}-Spalten enth�lt.

Dieses Format ist das einfachste und sicherste Format. Es ist auch das
schnellste der Formate auf Platte. Die Geschwindigkeit ergibt sich aus der
einfachen Weise, wie Daten auf der Platte gefunden werden k�nnen. Wenn man
etwas mit einem Index und statischem Format nachschl�gt, ist es sehr
einfach. Man multipliziert einfach die Zeilennummer mit der Zeilenl�nge.

Wenn eine Tabelle gescannt wird, ist es ausserdem sehr einfach, mit jedem
Plattenzugriff eine konstante Anzahl von Datens�tzen zu lesen.

Die Sicherheit zeigt sich, wenn Ihr Computer beim Schreiben in eine
MyISAM-Datei fester L�nge abst�rzt. In diesem Fall kann @code{myisamchk}
leicht herausfinden, wo jede Zeile anf�ngt und aufh�rt. Daher kann es
�blicherweise alle Datens�tze mit Ausnahme desjenigen, in den nur teilweise
geschrieben wurde, wieder herstellen. Beachten Sie, dass in MySQL alle
Indexe in jedem Fall wiederhergestellt werden k�nnen:

@itemize @bullet
@item
Alle @code{CHAR}-, @code{NUMERIC}- und @code{DECIMAL}-Spalten werden mit
Leerzeichen auf die Spaltenbreite aufgef�llt.
@item
Sehr schnell.
@item
Leicht zu cachen.
@item
Nach einem Absturz leicht zu rekonstruieren, weil sich Datens�tze an festen
Positionen befinden.
@item
m�ssen nicht (mit @code{myisamchk}) reorganisiert werden, es sei denn, eine
riesige Anzahl von Datens�tzen wurde gel�scht und Sie wollen dem
Betriebssystem freien Speicherplatz zur�ckgeben.
@item
Ben�tigen normalerweise mehr Speicherplatz als dynamische Tabellen.
@end itemize


@node Dynamic format, Compressed format, Static format, MyISAM table formats
@c German node Dynamisches Format
@subsubsection Kennzeichen dynamischer Tabellen

@cindex Kennzeichen dynamischer Tabellen
@cindex Tabellen, dynamische

Dieses Format wird benutzt, wenn die Tabelle irgend welche @code{VARCHAR}-,
@code{BLOB}- oder @code{TEXT}-Spalten enth�lt, oder wenn die Tabelle mit
@code{ROW_FORMAT=dynamic} erzeugt wurde.

Dieses Format ist etwas komplexer, weil jede Zeile einen Header haben muss,
der aussagt, wie lang sie ist. Ein Datensatz kann ausserdem an mehr als
einem Speicherplatz enden, wenn er bei einer Aktualisierung verl�ngert
wird.

@cindex Tabellen, defragmentieren
Sie k�nnen @code{OPTIMIZE table} oder @code{myisamchk} benutzen, um eine
Tabelle zu defragmentieren. Wenn Sie statische Daten haben, auf die Sie oft
zugreifen oder die Sie in derselben Tabelle oft �ndern, als @code{VARCHAR}-
oder @code{BLOB}-Spalten haben, ist es eine gute Idee, die dynamischen
Spalten in andere Tabellen zu verschieben, einfach um Fragmentierung zu
vermeiden:

@itemize @bullet
@item
Alle Zeichenketten-Spalten sind dynamisch (ausser denen mit einer L�nge
kleiner 4).
@item
Jedem Datensatz ist eine Bitmap vorangestellt, die angibt, welche Spalten
bei Zeichenketten-Spalten leer (@code{''}) sind oder 0 bei numerischen
Spalten. (Das ist nicht dasselbe wie Spalten, die @code{NULL}-Werte
enthalten.) Wenn eine Zeichenketten-Spalte nach der Entfernung von
Leerzeichen am Ende eine L�nge von 0 hat oder eine numerische Spalte einen
Wert von 0 hat, wird sie in der Bitmap markiert und nicht auf Platte
gespeichert. Nicht leere Zeichenketten werden als ein L�ngen-Byte plus dem
Zeichenketten-Inhalt gespeichert.
@item
Ben�tigen �blicherweise weniger Plattenplatz als Festl�ngen-Tabellen.
@item
Jeder Datensatz benutzt nur so viel Speicherplatz wie erforderlich. Wenn
ein Datensatz gr��er wird, wird er in so viele Teile wie erforderlich
aufgeteilt. Hierdurch wird Datensatzfragmentierung hervorgerufen.
@item
Wenn Sie eine Zeile mit Informationen aktualisieren, die die Zeilenl�nge
�berschreiten, wird die Zeile fragmentiert. In diesem Fall sollten Sie von
Zeit zu Zeit @code{myisamchk -r} laufen lassen, um bessere Performance zu
erzielen. Benutzen Sie @code{myisamchk -ei tabellen_name}, um einige
statistische Informationen zu erhalten.
@item
Sind nach einem Absturz nicht so einfach zu rekonstruieren, weil ein
Datensatz in viele Teile fragmentiert sein und ein Link (Fragment) fehlen
kann.
@item
Die erwartete Zeilenl�nge bei Datens�tzen dynamischer L�nge ist:

@example
3
+ (anzahl_der_spalten + 7) / 8
+ (anzahl_der_zeichenketten_spalten)
+ komprimierte_groesse_numerischer_spalten
+ laenge_von_zeichenketten
+ (anzahl_von_NULL_spalten + 7) / 8
@end example

F�r jeden Link kommen 6 Bytes hinzu. Ein dynamischer Datensatz wird immer
dann verkn�pft (linked), wenn eine Aktualisierung eine Vergr��erung des
Datensatzes bewirkt. Jede neue Verkn�pfung hat mindestens 20 Bytes, so dass
die n�chste Vergr��erung wahrscheinlich in dieselbe Verkn�pfung passt.
Wenn nicht, entsteht eine weitere Verkn�pfung. Sie k�nnen mit
@code{myisamchk -ed} pr�fen, wie viele Verkn�pfungen es gibt. Alle
Verkn�pfungen k�nnen mit @code{myisamchk -r} entfernt werden.
@end itemize


@node Compressed format,  , Dynamic format, MyISAM table formats
@c German node Komprimiertes Format
@subsubsection Kennzeichen komprimierter Tabellen

@cindex Tabellen, komprimiertes Format

Das ist ein Nur-Lese-Typ, der mit dem optionalen
@code{myisampack}-Dienstprogramm (@code{pack_isam} f�r
@code{ISAM}-Tabellen) erzeugt wird:

@itemize @bullet
@item
All MySQL-Distributionen, selbst diejenigen, die es vor der GPL-Version von
MySQL gab, k�nnen Tabellen lesen, die mit @code{myisampack} komprimiert
wurden.
@item
Komprimierte Tabellen ben�tigen viel weniger Speicherplatz. Das minimiert
Plattenzugriffe, was sehr nett ist, wenn Sie langsame Platten benutzen (wie
CD-ROMs).
@item
Jeder Datensatz wird separat komprimiert (sehr geringer Zugriffs-Overhead).
Der Header f�r einen Datensatz hat eine feste L�nge (1 bis 3 Bytes),
abh�ngig vom gr��ten Datensatz in der Tabelle. Jede Spalte wird
unterschiedlich komprimiert. Einige Kompressionstypen sind:
@itemize @minus
@item
F�r jede Spalte gibt es �blicherweise eine unterschiedliche
Huffman-Tabelle.
@item
Komprimierung von Leerzeichen am Ende.
@item
Komprimierung von Leerzeichen am Anfang.
@item
Zahlen mit dem Wert @code{0} werden mit 1 Bit gespeichert.
@item
Wenn Werte in einer Ganzzahl-Spalte einen kleinen Wertebereich haben, wird
die Spalte mit dem kleinsten m�glichen Typ gespeichert. Eine
@code{BIGINT}-Spalte (8 Bytes) kann beispielsweise als
@code{TINYINT}-Spalte (1 Byte) gespeichert werden, wenn sich alle Werte im
Bereich von @code{0} bis @code{255} befinden.
@item
Wenn eine Spalte nur einen kleinen Satz m�glicher Werte besitzt, wird der
Spaltentyp zu @code{ENUM} umgewandelt.
@item
Eine Spalte kann auch eine Kombination der obigen Komprimierungen benutzen.
@end itemize
@item
Kann Datens�tze fester oder dynamischer L�nge handhaben, aber nicht
@code{BLOB}- oder @code{TEXT}-Spalten.
@item
Kann mit @code{myisamchk} dekomprimiert werden.
@end itemize


@node MyISAM table problems,  , MyISAM table formats, MyISAM
@c German node MyISAM-Tabellenprobleme
@subsection MyISAM-Tabellenprobleme

Das Dateiformat, das MySQL benutzt, um Daten zu speichern, wurde ausgiebig
getestet, aber es gibt immer Umst�nde, die dazu f�hren k�nnen, dass
Datenbanktabellen besch�digt werden.



@menu
* Corrupted MyISAM tables::     
* MyISAM table close::          
@end menu

@node Corrupted MyISAM tables, MyISAM table close, MyISAM table problems, MyISAM table problems
@c German node Besch�digte MyISAM-Tabellen
@subsubsection Besch�digte MyISAM-Tabellen

Obwohl das MyISAM-Tabellenformat sehr zuverl�ssig ist (alle �nderungen an
einer Tabelle werden geschrieben, bevor das SQL-Statement zur�ckkehrt),
k�nnen Sie dennoch besch�digte Tabellen bekommen, wenn eines der folgenden
Dinge passiert:

@itemize @bullet
@item
Der @code{mysqld}-Prozess wird mitten in einem Schreibvorgang gekillt.
@item
Unerwartetes Herunterfahren des Computers (wenn der Computer beispielsweise
abgeschaltet wird).
@item
Ein Hardware-Fehler.
@item
Sie benutzen ein externes Programm (wie myisamchk) auf einer benutzten
Tabelle.
@item
Ein Software-Bug im MySQL- oder MyISAM-Code.
@end itemize

Typische Symptome einer besch�digten Tabelle sind:

@itemize @bullet
@item
Sie erhalten den Fehler @code{Incorrect key file for table: '...'. Try to
repair it}, wenn Sie Daten aus der Tabelle ausw�hlen.
@item
Anfragen finden keine Zeilen in der Tabelle oder geben unvollst�ndige Daten
zur�ck.
@end itemize

Sie k�nnen mit dem Befehl @code{CHECK TABLE} pr�fen, ob eine Tabelle in
Ordnung ist. @xref{CHECK TABLE}.

Sie k�nnen eine besch�digte Tabelle mit @code{REPAIR TABLE} reparieren.
@xref{REPAIR TABLE}. Wenn @code{mysqld} nicht l�uft, k�nnen Sie eine
Tabelle auch mit dem @code{myisamchk}-Befehl reparieren.
@code{myisamchk-Syntax}.

Wenn Ihre Tabellen oft besch�digt werden, sollten Sie versuchen, den Grund
daf�r herauszufinden! @xref{Crashing}. 

In diesem Fall ist es am wichtigsten zu wissen, ob die Tabelle durch einen
Absturz von @code{mysqld} besch�digt wurde (das k�nnen Sie leicht
feststellen, wenn es eine aktuelle Zeile @code{restarted mysqld} in der
mysqld-Fehlerdatei gibt). Wenn das nicht der Fall ist, sollten Sie
versuchen, daraus einen Testfall zu machen. @xref{Reproduceable test case}.


@node MyISAM table close,  , Corrupted MyISAM tables, MyISAM table problems
@c German node MyISAM-Tabellenschlie�en
@subsubsection Client benutzt Tabelle oder hat sie nicht korrekt geschlossen

Jede @code{MyISAM}-@code{.MYI}-Datei hat im Header einen Z�hler, der
benutzt werden kann, um zu pr�fen, ob die Tabelle korrekt geschlossen
wurde.

Wenn Sie folgende Warnmeldung von @code{CHECK TABLE} oder @code{myisamchk}
erhalten:

@example
# client is using or hasn't closed the table properly
@end example

hei�t das, dass der Z�hler nicht mehr synchron ist. Das bedeutet nicht,
dass die Tabelle besch�digt ist, aber Sie sollten zumindest eine
�berpr�fung vornehmen, um sicherzustellen, dass die Tabelle in Ordnung ist.

Der Z�hler funktioniert wie folgt:

@itemize @bullet
@item
Wenn die Tabelle das erste Mal in MySQL aktualisiert wird, wird der Z�hler
im Header der Index-Dateien heraufgez�hlt.
@item
Der Z�hler wird w�hrend weiterer Aktualisierungen nicht ver�ndert.
@item
Wenn die letzte Instanz einer Tabelle geschlossen wird (wegen eines
@code{FLUSH} oder weil es nicht mehr genug Platz im Tabellen-Cache gibt),
wird der Z�hler heruntergez�hlt, wenn die Tabelle zu irgend einem Zeitpunkt
aktualisiert wurde.
@item
Wenn Sie eine Tabelle reparieren oder pr�fen und sie in Ordnung ist, wird
der Z�hler auf 0 zur�ckgesetzt.
@item
Um Probleme zu vermeiden, die durch Interaktion mit anderen Prozessen
entstehen, die vielleicht eine Pr�fung der Tabelle durchf�hren, wird der
Z�hler beim Schlie�en nicht heruntergez�hlt, wenn er 0 war.
@end itemize

Mit anderen Worten kann der Z�hler nur in folgenden F�llen nicht mehr
synchron sein:

@itemize @bullet
@item
Die @code{MyISAM}-Tabellen werden ohne @code{LOCK} und @code{FLUSH TABLES}
kopiert.
@item
MySQL ist zwischen einer Aktualisierung und dem endg�ltigen Schlie�en
abgest�rzt. (Beachten Sie, dass die Tabelle trotzdem in Ordnung sein kann,
weil MySQL stets f�r alles zwischen jedem Statement Schreibvorg�nge
durchf�hrt.
@item
Jemand hat @code{myisamchk --repair} oder @code{myisamchk --update-state}
auf eine Tabelle ausgef�hrt, die durch @code{mysqld} in Benutzung war.
@item
Viele @code{mysqld}-Server benutzen die Tabelle und einer davon hat
@code{REPAIR} oder @code{CHECK} der Tabelle ausgef�hrt, w�hrend sie durch
einen anderen Server in Benutzung war. Hierbei kann @code{CHECK} sicher
ausgef�hrt werden (selbst wenn Sie Warnungen von anderen Servern erhalten
werden), aber @code{REPAIR} sollte vermieden werden, weil es momentan die
Daten-Datei durch eine neue ersetzt, was anderen Servern nicht signalisiert
wird.
@end itemize


@node MERGE, ISAM, MyISAM, Table types
@c German node MERGE
@section MERGE-Tabellen

@cindex Tabellen, Merge-
@cindex MERGE-Tabellen, Definition

@code{MERGE}-Tabellen sind neu seit MySQL-Version 3.23.25. Der Code ist
noch Gamma, sollte aber ausreichend stabil sein.

Eine @code{MERGE}-Tabelle (auch bekannt als @code{MRG_MyISAM}-Tabelle) ist
eine Sammlung identischer @code{MyISAM}-Tabellen, die wie eine benutzt
werden k�nnen. Sie k�nnen auf dieser Sammlung von Tabellen nur
@code{SELECT}, @code{DELETE} und @code{UPDATE} ausf�hren. Wenn Sie eine
@code{MERGE}-Tabelle l�schen (@code{DROP}), l�schen Sie nur die
@code{MERGE}-Spezifikation.

Beachten Sie, dass @code{DELETE FROM merge_tabelle} ohne @code{WHERE} nur
das Mapping f�r die Tabelle l�scht, nicht alles in den gemappten Tabellen.
(Geplant ist, das in Version 4.1 zu beheben.)

Mit identischen Tabellen ist gemeint, dass alle Tabellen mit identischen
Spalten- und Schl�sselinformationen erzeugt wurden. Sie k�nnen kein MERGE
auf Tabellen ausf�hren, deren Spalten unterschiedlich komprimiert sind,
nicht genau dieselben Spalten oder die Schl�ssel in unterschiedlicher
Reihenfolge haben. Einige der Tabellen k�nnen jedoch mit @code{myisampack}
komprimiert sein. @xref{myisampack}.

Wenn Sie eine @code{MERGE}-Tabelle erzeugen, erhalten Sie eine
@code{.frm}-Tabellendefinitionsdatei und eine
@code{.MRG}-Tabellenlistendatei. Die @code{.MRG} enth�lt lediglich eine
Liste der Index-Dateien (@code{.MYI}-Dateien), die wie eine benutzt werden
sollen. Alle benutzten Tabellen m�ssen in derselben Datenbank wie die
@code{MERGE}-Tabelle selbst sein.

Momentan ben�tigen Sie @code{SELECT}-, @code{UPDATE}- und
@code{DELETE}-Berechtigungen f�r die Tabellen, die Sie auf eine
@code{MERGE}-Tabelle mappen.

@code{MERGE}-Tabellen k�nnen bei der L�sung folgender Probleme helfen:

@itemize @bullet
@item
Auf einfache Weise einen Satz von Log-Tabellen verwalten. Beispielsweise
k�nnen Sie Daten aus unterschiedlichen Monaten in separaten Dateien
speichern, einige davon mit @code{myisampack} komprimieren und dann eine
@code{MERGE}-Tabelle erzeugen, um sie wie eine zu benutzen.
@item
Mehr Geschwindigkeit. Sie k�nnen eine gro�e Nur-Lese-Tabelle nach
bestimmten Kriterien aufspalten und die verschiedenen Tabellenteile auf
unterschiedlichen Festplatten speichern. Eine @code{MERGE}-Tabelle darauf
k�nnte viel schneller sein als die gro�e Tabelle zu benutzen. (Nat�rlich
k�nnen Sie auch ein RAID benutzen, um dieselben Vorteile zu erzielen.)
@item
Effizientere Suchen durchf�hren. Wenn Sie genau wissen, wonach Sie suchen,
k�nnen Sie mit einigen Anfragen in lediglich einer der aufgespaltenen
Tabellen suchen und die @strong{MERGE}-Tabelle f�r andere benutzen. Es
k�nnen sogar viele unterschiedliche @code{MERGE}-Tabellen aktiv sein,
m�glicherweise mit Dateien, die sich �berlappen.
@item
Effizientere Reparaturen durchf�hren. Es ist leichter, die individuellen
Dateien zu reparieren, die auf eine @code{MERGE}-Datei gemappt sind, als
eine wirklich gro�e Datei zu reparieren.
@item
Sofortiges Mappen vieler Dateien als einer. Eine @code{MERGE}-Tabelle
benutzt den Index der individuellen Tabellen. Sie muss selbst keinen
eigenen Index warten. Dadurch k�nnen Sie @code{MERGE}-Tabellensammlungen
SEHR schnell erzeugen oder neu mappen. Beachten Sie, dass Sie die
Schl�sseldefinitionen angeben, wenn Sie eine @code{MERGE}-Tabelle erzeugen!
@item
Wenn Sie einen Satz von Tabellen bei Bedarf oder im Stapel zu einer gro�en
Tabelle vereinigen, sollten Sie statt dessen bei Bedarf eine
@code{MERGE}-Tabelle darauf erzeugen. Das ist viel schneller und spart eine
Menge Speicherplatz.
@item
Umgehen der Dateigr��engrenze des Betriebssystems.
@item
Sie k�nnen ein Alias / Synonym f�r eine Tabelle erzeugen, indem Sie sie
einfach ein MERGE �ber eine Tabelle benutzen. Das sollte keine sp�rbaren
Performance-Auswirkungen haben (nur eine Reihe indirekter Aufrufen und
memcpy's bei jedem Lesen).
@end itemize

Die Nachteile von @code{MERGE}-Tabellen sind:

@itemize @bullet
@item
Sie k�nnen nur identische @code{MyISAM}-Tabellen f�r eine
@code{MERGE}-Tabelle benutzen.
@item
@code{AUTO_INCREMENT}-Spalten werden bei @code{INSERT} nicht automatisch
aktualisiert.
@item
@code{REPLACE} funktioniert nicht.
@item
@code{MERGE}-Tabellen benutzen mehr Datei-Deskriptoren. Wenn Sie eine
@strong{MERGE} benutzen, die �ber 10 Tabellen mappt, und 10 Benutzer diese
benutzen, ben�tigen Sie 10 * 10 + 10 Datei-Deskriptoren (10 Daten-Dateien
f�r 10 Benutzer und 10 gemeinsam genutzte Index-Dateien).
@item
Lesevorg�nge von Schl�sseln sind langsamer. Wenn Sie eine Leseoperation auf
einen Schl�ssel durchf�hren, muss der @code{MERGE}-Handler ein Lesen auf
alle zugrunde liegenden Tabellen ausf�hren, um zu pr�fen, welche am
n�chsten zum angegebenen Schl�ssel passt. Wenn Sie ein 'Lese n�chsten'
ausf�hren, muss der @code{MERGE}-Handler die Lese-Puffer durchsuchen, um
den n�chsten Schl�ssel zu finden. Erst wenn ein Schl�sselpuffer
aufgebraucht ist, muss der Handler den n�chsten Schl�sselblock lesen. Das
macht @code{MERGE}-Schl�ssel bei @code{eq_ref}-Suchen viel langsamer, aber
nicht viel langsamer bei @code{ref}-Suchen.
@xref{EXPLAIN}.
@item
Sie k�nnen kein @code{DROP TABLE}, @code{ALTER TABLE} oder @code{DELETE
FROM tabelle} ohne eine @code{WHERE}-Klausel auf jeder Tabelle, die von
einer @code{MERGE}-Tabelle gemappt ist, ausf�hren, wenn diese 'offen' ist.
Wenn Sie das tun, k�nnte die @code{MERGE}-Tabelle immer noch auf die
Originaltabelle verweisen, und Sie w�rden unerwartete Ergebnisse erhalten.
@end itemize

Wenn Sie eine @code{MERGE}-Tabelle erzeugen, m�ssen Sie mit
@code{UNION(liste-von-tabellen)} angeben, welche Tabellen Sie wie eine
benutzen wollen. Optional k�nnen Sie mit @code{INSERT_METHOD} angeben, ob
Sie wollen, dass Einf�gungen in die @code{MERGE}-Tabelle in der ersten oder
der letzten Tabelle in der @code{UNION}-Liste geschehen sollen. Wenn Sie
keine @code{INSERT_METHOD} oder @code{NO} angeben, geben alle
@code{INSERT}-Befehle auf die @code{MERGE}-Tabelle einen Fehler zur�ck.

Folgendes Beispiel zeigt, wie Sie @code{MERGE}-Tabellen benutzen:

@example
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, nachricht CHAR(20));
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, nachricht CHAR(20));
INSERT INTO t1 (nachricht) VALUES ("test"),("tabelle"),("t1");
INSERT INTO t2 (nachricht) VALUES ("test"),("tabelle"),("t2");
CREATE TABLE gesamt (a INT NOT NULL, nachricht CHAR(20), KEY(a)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
@end example

Beachten Sie, dass wir keinen @code{UNIQUE}- oder @code{PRIMARY
KEY}-Schl�ssel in der @code{gesamt}-Tabelle angegeben haben, weil der
Schl�ssel in der @code{gesamt}-Tabelle nicht eindeutig sein wird.

Beachten Sie auch, dass Sie die @code{.MRG}-Datei direkt von ausserhalb des
MySQL-Servers manipulieren k�nnen:

@example
shell> cd /mysql-data-verzeichnis/aktuelle-datenbank
shell> ls -1 t1.MYI t2.MYI > gesamt.MRG
shell> mysqladmin flush-tables
@end example

Jetzt k�nnen Sie Dinge wie folgendes tun:

@example
mysql> select * from gesamt;
+---+-----------+
| a | nachricht |
+---+-----------+
| 1 | test      |
| 2 | table     |
| 3 | t1        |
| 1 | test      |
| 2 | table     |
| 3 | t2        |
+---+-----------+
@end example

Um eine @code{MERGE}-Tabelle neu zu mappen, k�nnen Sie folgendes tun:

@itemize @bullet
@item
Die Tabelle l�schen (@code{DROP}) und neu erzeugen.
@item
@code{ALTER TABLE tabelle UNION(...)} benutzen.
@item
Die @code{.MRG}-Datei �ndern und ein @code{FLUSH TABLE} auf die
@code{MERGE}-Tabelle und alle zugrunde liegenden Tabellen ausf�hren, um den
Handler zu zwingen, die neue Definitionsdatei einzulesen.
@end itemize


@menu
* MERGE table problems::        
@end menu

@node MERGE table problems,  , MERGE, MERGE
@c German node MERGE-Tabellenprobleme
@subsection MERGE-Tabellenprobleme.

Folgende Probleme sind bei @code{MERGE}-Tabellen bekannt:

@itemize @bullet
@item
@code{DELETE FROM merge_tabelle} ohne @code{WHERE} l�scht nur das Mapping
f�r die Tabelle, nicht alles in den gemappten Tabellen.
@item
@code{RENAME TABLE} auf eine Tabelle, die in einer aktiven
@code{MERGE}-Tabelle benutzt wird, kann die Tabelle besch�digen. Das wird
in MySQL 4.0.x behoben.
@item
Beim Erzeugen einer Tabelle des Typs @code{MERGE} wird nicht gepr�ft, ob
die zugrunde liegenden Tabellen kompatible Typen sind. Wenn Sie
@code{MERGE}-Tabellen in dieser Weise benutzen, ist es sehr wahrscheinlich,
dass merkw�rdige Probleme auftauchen.
@item
Wenn Sie @code{ALTER TABLE} benutzen, um als erstes eine
@code{UNIQUE}-Index zu einer Tabelle hinzuzuf�gen, die in einer
@code{MERGE}-Tabelle benutzt wird, und dann @code{ALTER TABLE} benutzen, um
einen normalen Index auf die @code{MERGE}-Tabelle hinzuzuf�gen, wird die
Schl�ssel-Reihenfolge f�r die Tabellen anders sein, wenn es einen alten,
nicht eindeutigen Schl�ssel in der Tabelle gab. Das liegt daran, dass
@code{ALTER TABLE} @code{UNIQUE}-Schl�ssel vor normale Schl�ssel einf�gt,
um in der Lage zu sein, doppelte Schl�sseleintr�ge so fr�h wie m�glich zu
erkennen.
@item
Der Bereichsoptimierer kann @code{MERGE}-Tabellen noch nicht effizient
benutzen und kann manchmal nicht optimale Joins produzieren. Das wird in
MySQL 4.0.x behoben.
@item
@code{DROP TABLE} auf eine Tabelle, die in einer @code{MERGE}-Tabelle
benutzt wird, funktioniert unter Windows nicht, weil der
@code{MERGE}-Handler das Tabellen-Mapping versteckt vor der oberen Ebene
von MySQL durchf�hrt. Weil Windows es nicht zul��t, dass Dateien gel�scht
werden, die offen sind, m�ssen Sie zuerst alle @code{MERGE}-Tabellen auf
Platte zur�ckschreiben (mit @code{FLUSH TABLES}) oder die
@code{MERGE}-Tabelle l�schen, bevor Sie die Tabelle l�schen. Das wird zu
dem Zeitpunkt behoben, wenn Sichten (@code{VIEW}s) eingef�hrt werden.
@end itemize

@node ISAM, HEAP, MERGE, Table types
@c German node ISAM
@section ISAM-Tabellen

@cindex tables, ISAM

Sie k�nnen auch den veralteten @code{ISAM}-Tabellentyp benutzen. Dieser
wird recht bald verschwinden (wahrscheinlich in MySQL 4.1), weil
@code{MyISAM} eine bessere Implementation derselbe Sache ist. @code{ISAM}
benutzt einen @code{B-tree}-Index. Der Index wird in einer Datei mit der
Endung @code{.ISM} gespeichert, und die Daten in einer Datei mit der Endung
@code{.ISD}. Sie k�nnen @code{ISAM}-Tabellen mit dem
@code{isamchk}-Dienstprogramm pr�fen / reparieren. @xref{Disaster Prevention}.

@code{ISAM} hat folgende Features / Eigenschaften:

@itemize @bullet
@item Komprimierte und Festl�ngen-Schl�ssel
@item Feste und dynamische Datensatzl�ngen
@item 16 Schl�ssel mit 16 Schl�sselteilen pro Schl�ssel
@item Maximale Schl�ssell�nge 256 (Vorgabe)
@item Daten werden im Maschinenformat gespeichert. Das ist schnell, aber
Maschinen- / Betriebssystem-abh�ngig.
@end itemize

Die meisten Dinge, die f�r @code{MyISAM}-Tabellen gelten, gelten auch f�r
@code{ISAM}-Tabellen. @xref{MyISAM}. Die gr��ten Unterschiede im Vergleich
zu @code{MyISAM} sind:

@itemize @bullet
@item @code{ISAM}-Tabellen sind nicht bin�rportabel zwischen verschiedenen
Betriebssystemen / Plattformen.
@item Handhabt keine Tabellen > 4 GB.
@item Unterst�tzt nur Pr�fix-Komprimierung von Zeichenketten.
@item Kleinere Schl�ssel-Beschr�nkungen.
@item Dynamische Tabelle werden schneller fragmentiert.
@item Tabellen werden mit @code{pack_isam} statt mit @code{myisampack}
komprimiert.
@end itemize

Wenn Sie eine @code{ISAM}-Tabelle in eine @code{MyISAM}-Tabelle umwandeln
wollen, k�nnen Sie Dienstprogramme wie @code{mysqlcheck} oder ein
@code{ALTER TABLE}-Statement benutzen:

@example
mysql> ALTER TABLE tabelle TYPE = MYISAM;
@end example

Die eingebetteten (embedded) MySQL-Versionen unterst�tzen keine
@code{ISAM}-Tabellen.

@node HEAP, InnoDB, ISAM, Table types
@c German node HEAP
@section HEAP-Tabellen

@cindex Tabellen, @code{HEAP}

@code{HEAP}-Tabellen benutzen eine gehashten Index und werden im
Arbeitsspeicher gespeichert. Das macht sie sehr schnell, aber wenn MySQL
abst�rzt, verlieren Sie alle darin gespeicherten Daten. @code{HEAP} ist
sehr n�tzlich f�r tempor�re Tabellen.

Die MySQL-internen @code{HEAP}-Tabellen benutzen 100% dynamisches Hashen
ohne Overflow-Bereiche. Es wird kein zus�tzlicher Platz f�r freie Listen
ben�tigt. @code{HEAP}-Tabellen haben auch keine Probleme mit L�schen plus
Einf�gen, was normalerweise bei gehashten Tabellen h�ufig vorkommt:

@example
mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
        FROM log_tabelle GROUP BY ip;
mysql> SELECT COUNT(ip),AVG(down) FROM test;
mysql> DROP TABLE test;
@end example

Einige Dinge sollten Sie bei der Benutzung von @code{HEAP}-Tabellen in
Betracht ziehen:

@itemize @bullet
@item
Sie sollten immer @code{MAX_ROWS} im @code{CREATE}-Statement angeben, um
sicherzustellen, dass Sie nicht versehentlich den gesamten Arbeitsspeicher
benutzen.
@item
Indexe werden nur bei @code{=} und @code{<=>} benutzt (sind aber SEHR
schnell).
@item
@code{HEAP}-Tabellen k�nnen nur ganze Schl�ssel benutzen, um nach einer
Zeile zu suchen. Vergleichen Sie das mit @code{MyISAM}-Tabellen, bei denen
jedes Pr�fix des Schl�ssels f�r das Suchen von Zeilen benutzt werden kann.
@item
@code{HEAP}-Tabellen benutzen ein festes Datensatzl�ngenformat.
@item
@code{HEAP} unterst�tzt keine @code{BLOB}/@code{TEXT}-Spalten.
@item
@code{HEAP} unterst�tzt keine @code{AUTO_INCREMENT}-Spalten.
@item
@code{HEAP} unterst�tzt keinen Index auf eine @code{NULL}-Spalte.
@item
Es darf keine nicht eindeutigen Schl�ssel auf eine @code{HEAP}-Tabelle
geben (das ist ungebr�uchlich f�r gehashte Tabellen).
@item
@code{HEAP}-Tabellen werden von allen Clients gemeinsam benutzt (so wie
jede andere Tabelle).
@item
Sie k�nnen nicht nach dem n�chsten Eintrag in der Reihenfolge suchen (also
den Index benutzen, um ein @code{ORDER BY} zu machen).
@item
Die Daten f�r @code{HEAP}-Tabellen werden in kleinen Bl�cken zugewiesen.
Die Tabellen sind 100% dynamisch (beim Einf�gen). Es werden keine
Overflow-Bereiche und kein zus�tzlicher Platz f�r Schl�ssel ben�tigt.
Gel�schte Zeilen werden in eine verkn�pfte Liste geschrieben und wieder
benutzt, wenn Sie neue Daten in die Tabelle einf�gen.
@item
Sie brauchen genug zus�tzlichen Arbeitsspeicher f�r alle
@code{HEAP}-Tabellen, die Sie zugleich benutzen wollen.
@item
Um Speicher freizugeben, f�hren Sie @code{DELETE FROM heap_tabelle},
@code{TRUNCATE heap_tabelle} oder @code{DROP TABLE heap_tabelle} aus.
@item
MySQL kann nicht herausfinden, wie viele Zeilen es zwischen zwei Werten
ungef�hr gibt (das wird vom Bereichsoptimierer ben�tigt, um zu entscheiden,
welcher Index benutzt wird). Das kann einige Anfragen betreffen, wenn Sie
eine @code{MyISAM}-Tabelle in eine @code{HEAP}-Tabelle umwandeln.
@item
Um sicherzustellen, dass Sie nicht versehentlich etwas Unkluges tun, k�nnen
Sie keine @code{HEAP}-Tabellen gr��er als @code{max_heap_table_size}
erzeugen.
@end itemize

Der f�r eine Zeile in einer @code{HEAP}-Tabelle ben�tigte Speicher ist:

@example
SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
+ ALIGN(length_of_row+1, sizeof(char*))
@end example

@code{sizeof(char*)} ist 4 auf 32-Bit-Maschinen und 8 auf 64-Bit-Maschinen.


@node InnoDB, BDB, HEAP, Table types
@c German node InnoDB
@section InnoDB-Tabellen



@menu
* InnoDB overview::             
* InnoDB start::                
* InnoDB init::                 
* Using InnoDB tables::         
* Adding and removing::         
* Backing up::                  
* Moving::                      
* InnoDB transaction model::    
* Implementation::              
* Table and index::             
* File space management::       
* Error handling::              
* InnoDB restrictions::         
* InnoDB contact information::  
@end menu

@node InnoDB overview, InnoDB start, InnoDB, InnoDB
@c German node �berblick �ber InnoDB
@subsection �berblick �ber InnoDB-Tabellen

@cindex Transaktionen, Unterst�tzung
@cindex transaktionssichere Tabellen
@cindex ACID

InnoDB stellt MySQL einen transaktionssicheren (@code{ACID}-kompatiblen)
Tabellen-Handler mit F�higkeiten f�r Commit, Rollback und Reparatur nach
Absturz zur Verf�gung. InnoDB beherrscht Sperren auf Zeilenebene sowie ein
konsistentes, nicht sperrendes Lesen in der Art von Oracle bei
@code{SELECT}s. Diese Features steigern die Handhabung gleichzeitiger
Verbindungen und die Performance. Es gibt bei InnoDB keine Notwendigkeit
f�r Sperr-Eskalation, weil die Sperren auf Zeilenebene bei InnoDB in sehr
wenig Speicherplatz passen. InnoDB-Tabellen unterst�tzen als erster
Tabellentyp in MySQL @code{FOREIGN KEY}-Beschr�nkungen.

InnoDB wurde f�r maximale Performance bei der Bearbeitung gro�er
Datenmengen entworfen. Seine Prozessor-Effizienz wird wahrscheinlich von
keiner anderen Festplatten-basierenden relationalen Datenbank-Engine
erreicht.

Technisch gesehen ist InnoDB ein komplettes Datenbank-Backend, das unter
MySQL platziert ist. InnoDB hat seinen eigenen Puffer-Pool, um Daten und
Indexe im Hauptspeicher zu cachen. InnoDB speichert seine Tabellen und
Indexe in einem Tabellenplatz (Tablespace), der aus mehreren Dateien
bestehen kann. Das unterscheidet sich beispielsweise von MyISAM-Tabellen,
bei denen jede Tabelle als separate Datei gespeichert ist. InnoDB-Tabellen
k�nnen jede beliebige Gr��e annehmen, sogar auf Betriebssystemen, deren
Dateigr��e auf 2 GB beschr�nkt ist.

Die neuesten Informationen �ber InnoDB finden Sie unter
@uref{http://www.innodb.com/}. Die aktuellste Version des InnoDB-Handbuchs
ist immer dort zu finden, und Sie k�nnen auch kommerzielle Lizenzen und
kommerziellen Support f�r InnoDB bestellen.

InnoDB wird momentan (Oktober 2001) f�r die Produktion auf mehreren gro�en
Datenbank-Sites benutzt, die hohe Performance ben�tigen. Die bekannte
Internet-Newssite Slashdot.org l�uft auf InnoDB. Mytrix Inc. speichert �ber
1 TB an Daten in InnoDB, und eine andere Site handhabt eine
durchschnittliche Last von 800 Einf�ge- und Update-Operationen pro Sekunde
mit InnoDB.

InnoDB-Tabellen sind in der MySQL-Quelldistribution ab Version 3.23.34a
enthalten und in der MySQL-Max-Bin�rversion aktiviert. F�r Windows sind die
Max-Bin�rdateien in der Standarddistribution enthalten.

Wenn Sie eine Bin�rversion von MySQL herunter geladen haben, die
Unterst�tzung f�r InnoDB enth�lt, folgen Sie einfach den Anweisungen im
Handbuch f�r die Installation einer Bin�rversion von MySQL. Wenn Sie
bereits MySQL-3.23 installiert haben, k�nnen Sie MySQL-Max am einfachsten
installieren, indem Sie die ausf�hrbare Datei f�r den Server
(@file{mysqld}) durch die entsprechende ausf�hrbare Datei in der
Max-Distribution ersetzen. MySQL and MySQL-Max unterscheiden sich nur in
Bezug auf die ausf�hrbare Datei f�r den Server. @xref{MySQL binaries}. @xref{mysqld-max, , @code{mysqld-max}}.

@c German FIX changed @xref to @ref
Um MySQL mit InnoDB-Unterst�tzung zu kompilieren, laden Sie MySQL-3.23.34a
oder neuer von @uref{http://www.mysql.com/} herunter und konfigurieren Sie
MySQL mit der @code{--with-innodb}-Option. Sehen Sie im Handbuch unter
@ref{Installing source} nach.

@example
cd /pfad/zur/quelldistribution/von/mysql-3.23.37
./configure --with-innodb
@end example

Um InnoDB zu benutzen, m�ssen Sie InnoDB init in Ihrer @file{my.cnf}- oder
@file{my.ini}-Datei angeben. In dieser Datei m�ssen Sie mindestens
folgenden Zeile im @code{[mysqld]}-Abschnitt hinzuf�gen:

@example
innodb_data_file_path=ibdata:30M
@end example

@c German FIX changed @xref to @ref
F�r eine gute Performance ist es jedoch am besten, Optionen wie die unten
im Abschnitt @ref{InnoDB start} empfohlenen anzugeben.

InnoDB wird unter der GNU-GPL-Lizenz Version 2 (vom Juni 1991) vertrieben.
In den Quelldistributionen von MySQL erscheint InnoDB als Unterverzeichnis.


@node InnoDB start, InnoDB init, InnoDB overview, InnoDB
@c German node Mit InnoDB anfangen
@subsection Mit InnoDB anfangen - Optionen

Um InnoDB-Tabellen in MySQL-Max-3.23 zu benutzen, @strong{M�SSEN} Sie
Konfigurationsparameter im @code{[mysqld]}-Abschnitt der
MySQL-Konfigurationsdatei @file{my.cnf} angeben. @xref{Option files}.

Der einzige erforderliche Parameter, um InnoDB in MySQL-Max-3.23 benutzen
zu k�nnen, ist @code{innodb_data_file_path}.
In MySQL-4.0 m�ssen Sie nicht einmal @code{innodb_data_file_path} angeben.
Vorgabem��ig wird eine 64 MB gro�e Daten-Datei @file{ibdata1} im
@code{datadir} von MySQL erzeugt.

Um jedoch eine gute Performance zu erzielen, M�SSEN Sie explizit die unten
in Beispielen aufgef�hrten InnoDB-Parameter setzen.

Der Vorgabewert f�r @code{innodb_data_home_dir} ist das @code{datadir} von
MySQL. Wenn Sie @code{innodb_data_home_dir} nicht angeben, k�nnen Sie in
@code{innodb_data_file_path} keine absoluten Pfade benutzen.

Nehmen wir an, Sie haben eine Windows-NT-Maschine mit 128 MB RAM und einer
einzelnen 10 GB gro�en Festplatte. Unten steht ein Beispiel von m�glichen
Konfigurationsparametern in @file{my.cnf} f�r InnoDB:

@example
[mysqld]
# Hier k�nnen Ihre sonstigen MySQL-Serveroptionen stehen
# ...
#
innodb_data_home_dir = c:\ibdata
# Die Daten-Dateien m�ssen in der Lage sein,
# Ihre Daten und Indexe aufzunehmen
innodb_data_file_path = ibdata1:2000M;ibdata2:2000M
# Puffer-Poolgr��e auf 50% bis 80%
# des Arbeitsspeichers Ihres Computers setzen
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
innodb_log_group_home_dir = c:\iblogs
# .._log_arch_dir muss dasselbe sein wie
# .._log_group_home_dir
innodb_log_arch_dir = c:\iblogs
innodb_log_archive=0
set-variable = innodb_log_files_in_group=3
# Die Log-Dateigr��e auf ungef�hr 15%
# der Puffer-Poolgr��e setzen
set-variable = innodb_log_file_size=10M
set-variable = innodb_log_buffer_size=8M
# ..flush_log_at_trx_commit auf 0 setzen,
# wenn Sie es sich leisten k�nnen,
# ein paar der letzten Transaktionen zu verlieren
innodb_flush_log_at_trx_commit=1
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
@end example

Beachten Sie, dass die Daten-Dateien bei einigen Betriebssystemen kleiner
als 2 GB sein m�ssen! Die Gesamtgr��e von Daten-Dateien muss gr��er oder
gleich 10 MB sein. Die Gesamtgr��e der Log-Dateien MUSS auf
32-Bit-Computern kleiner als 4 GB sein.

@strong{InnoDB legt keine Verzeichnisse an. Diese m�ssen Sie selbst
erzeugen!}
Stellen Sie auch sicher, dass der MySQL-Server Rechte hat, Dateien in den
Verzeichnissen anzulegen, die Sie angeben.
 
Wenn Sie zum ersten Mal eine InnoDB-Datenbank erzeugen, sollten Sie den
MySQL-Server am besten von der Kommandozeilen-Eingabeaufforderung starten.
InnoDB gibt dann Informationen �ber die Datenbank-Erzeugung auf dem
Bildschirm aus und Sie sehen, was passiert. Unten in Abschnitt 3 sehen Sie,
wie die Ausgaben aussehen sollten.
Unter Windows k�nnen Sie @file{mysqld-max.exe} so starten:
@example
ihr-pfad-zu-mysqld>mysqld-max --standalone --console
@end example

Nehmen wir an, Sie haben einen Linux-Computer mit 512 MB RAM und drei
Festplatten mit jeweils 20 GB (in Verzeichnispfaden @file{/}, @file{/dr2}
and @file{/dr3}). Unten ist ein Beispiel m�glicher Konfigurationsparameter
in @file{my.cnf} f�r InnoDB:

@example
[mysqld]
# Hier k�nnen Ihre sonstigen MySQL-Serveroptionen stehen
# ...
#
innodb_data_home_dir = /
# Die Daten-Dateien m�ssen in der Lage sein,
# Ihre Daten und Indexe aufzunehmen
innodb_data_file_path = ibdata/ibdata1:2000M;dr2/ibdata/ibdata2:2000M
# Puffer-Poolgr��e auf 50% bis 80%
# des Arbeitsspeichers Ihres Computers setzen
set-variable = innodb_buffer_pool_size=350M
set-variable = innodb_additional_mem_pool_size=20M
innodb_log_group_home_dir = /dr3/iblogs
# .._log_arch_dir muss dasselbe sein wie
# .._log_group_home_dir
innodb_log_arch_dir = /dr3/iblogs
innodb_log_archive=0
set-variable = innodb_log_files_in_group=3
# Die Log-Dateigr��e auf ungef�hr 15%
# der Puffer-Poolgr��e setzen
set-variable = innodb_log_file_size=50M
set-variable = innodb_log_buffer_size=8M
# ..flush_log_at_trx_commit auf 0 setzen,
# wenn Sie es sich leisten k�nnen,
# ein paar der letzten Transaktionen zu verlieren
innodb_flush_log_at_trx_commit=1
set-variable = innodb_file_io_threads=4
set-variable = innodb_lock_wait_timeout=50
#innodb_flush_method=fdatasync
#innodb_fast_shutdown=1
#set-variable = innodb_thread_concurrency=5
@end example

Beachten Sie, dass die beiden Daten-Dateien auf unterschiedliche Platten
platziert wurden. Der Grund f�r den Namen @code{innodb_data_file_path}
ist, dass Sie auch Pfade zu Ihren Daten-Dateien angeben k�nnen und dass
@code{innodb_data_home_dir} nur textlich mit Ihren Daten-Datei-Pfaden
verkettet wird, wobei ein m�glicher Schr�gstrich oder Backslash dazwischen
hinzugef�gt wird. InnoDB f�llt den Tabellenplatz (Tablespace), der durch
die Daten-Dateien gebildet wird, von unten nach oben. In manchen F�llen
verbessert es die Performance der Datenbank, wenn nicht alle Daten auf
derselben physikalischen Festplatte platziert sind. Es verbessert h�ufig
die Performance, Log-Dateien auf anderen Platten als die Daten zu
platzieren.

Die Bedeutung der Konfigurationsparameter ist wie folgt:

@multitable @columnfractions .30 .70
@item @strong{Option} @tab @strong{Beschreibung}
@item @code{innodb_data_home_dir} @tab 
Der allgemeine Teil des Verzeichnispfads f�r alle InnoDB-Daten-Dateien. Die
Vorgabe f�r diesen Parameter ist das @code{datadir} von MySQL.
@item @code{innodb_data_file_path} @tab 
Pfade zu individuellen Daten-Dateien und ihre Gr��en. Der volle
Verzeichnispfad zu jeder Daten-Datei wird durch Verkettung von
innodb_data_home_dir mit den hier angegebenen Pfaden hergestellt. Die
Dateigr��en werden in Megabytes angegeben, daher das 'M' nach der obigen
Angabe. InnoDB versteht auch die Abk�rzung 'G', 1G bedeutet 1024M. Ab
3.23.44 k�nnen Sie die Dateigr��e auf mehr als 4 GB setzen, wenn das
Betriebssystem gro�e Dateien unterst�tzt. Auf einige Betriebssystemen
m�ssen Dateien kleiner als 2 GB sein. Die Summe der Dateigr��en muss
mindestens 10 MB betragen.
@item @code{innodb_mirrored_log_groups} @tab 
Anzahl identischer Kopien von Log-Gruppen, die f�r die Datenbank gehalten
werden. Momentan sollte dieser Parameter auf 1 gesetzt werden.
@item @code{innodb_log_group_home_dir} @tab 
Verzeichnispfad zu den InnoDB-Log-Dateien.
@item @code{innodb_log_files_in_group} @tab 
Anzahl von Log-Dateien in der Log-Gruppe. InnoDB schreibt in zirkul�rer
Weise in die Dateien. Hier wird ein Wert 3 empfohlen.
@item @code{innodb_log_file_size} @tab 
Gr��e jeder Log-Datei in einer Log-Gruppe in Megabytes. Sinnvolle Werte
reichen von 1 MB bis 1/n-tel der Gr��e des Puffer-Pools, die unten
angegeben wird, wobei n die Anzahl der Log-Dateien in der Gruppe ist. Je
gr��er der Wert, desto weniger Checkpoint-Flush-Aktivit�t wird im Puffer
ben�tigt, was Festplatten-Ein- und -Ausgaben erspart. Gr��ere Log-Dateien
bedeutet jedoch auch, dass die Wiederherstellung im Fall eines Absturzes
langsamer ist. Die Gesamtgr��e aller Log-Dateien muss auf 32-Bit-Computern
kleiner als 4 GB sein.
@item @code{innodb_log_buffer_size} @tab 
Die Gr��e des Puffers, den InnoDB benutzt, um in die Log-Dateien auf
Platte zu schreiben. Sinnvolle Werte liegen im Bereich von 1 MB bis zur
H�lfte der Gesamtgr��e der Log-Dateien. Ein gro�er Log-Puffer erlaubt,
dass gro�e Transaktionen laufen k�nnen, ohne dass die Notwendigkeit
besteht, das Log auf Platte zu schreiben, bis die Transaktion abgeschickt
(commit) wird. Wenn Sie daher gro�e Transaktionen haben, sparen Sie
Festplatten-Ein- und Ausgaben, wenn Sie den Log-Puffer Gro� machen.
@item @code{innodb_flush_log_at_trx_commit} @tab 
Normalerweise wird dieser Parameter auf 1 gesetzt, was bedeutet, dass beim
Abschicken (commit) einer Transaktion das Log auf Platte geschrieben wird 
(flush) und die durch die Transaktion gemachten �nderungen permanent werden
und einen Datenbankabsturz �berleben. Wenn Sie willens sind, in Bezug auf
diese Sicherheit Kompromisse einzugeben und eher kleine Transaktionen
laufen lassen, k�nnen Sie diesen Wert auf 0 setzen, um Festplatten-Ein- und
-Ausgaben in Bezug auf die Log-Dateien zu verringern.
@item @code{innodb_log_arch_dir} @tab 
Das Verzeichnis, in dem komplett geschriebene Log-Dateien archiviert
werden, wenn Archivierung benutzt wird. Der Wert dieses Parameters sollte
momentan derselbe sein wie @code{innodb_log_group_home_dir}.
@item @code{innodb_log_archive} @tab 
Dieser Wert sollte momentan auf 0 gesetzt werden. Weil MySQL die
Wiederherstellung aus einer Datensicherung unter Benutzung seiner eigenen
Log-Dateien durchf�hrt, gibt es momentan keine Notwendigkeit,
InnoDB-Log-Dateien zu archivieren.
@item @code{innodb_buffer_pool_size} @tab 
Die Gr��e des Speicherpuffers, den InnoDB benutzt, um Daten und Indexe
seiner Tabellen zu cachen. Je gr��er Sie diesen Wert setzen, desto weniger
Festplatten-Ein- und -Ausgaben werden f�r den Zugriff auf Daten in Tabellen
ben�tigt. Auf einem dedizierten Datenbank-Server k�nnen Sie diesen
Parameter auf bis zu 80% des physikalischen Arbeitsspeichers der Maschine
setzen. Setzen Sie ihn allerdings nicht zu hoch, weil bei manchen
Betriebssystemen der Wettbewerb um Arbeitsspeicher zu Paging f�hrt.
@item @code{innodb_additional_mem_pool_size} @tab 
Die Gr��e des Speicher-Pools, den InnoDB f�r die Speicherung von
Daten-W�rterbuchinformationen und anderen internen Datenstrukturen benutzt.
Ein sinnvoller Wert hierf�r k�nnte 2 MB sein. Je mehr Tabellen Sie jedoch
in Ihrer Applikation haben, desto mehr m�ssen Sie hier zuweisen. Wenn
InnoDB in diesem Pool keinen Speicherplatz mehr hat, l��t es sich
Speicherplatz vom Betriebssystem zuweisen und schreibt Warnmeldungen in die
MySQL-Fehler-Log-Datei.
@item @code{innodb_file_io_threads} @tab 
Die Anzahl der Datei-Ein- und -Ausgabe-Threads in InnoDB. Normalerweise
sollte dieser Wert 4 sein, aber Windows-Festplatten k�nnten von einer
h�heren Zahl profitieren.
@item @code{innodb_lock_wait_timeout} @tab 
Timeout in Sekunden. Solange wartet eine InnoDB-Transaktion auf eine
Sperre, bevor sie abgebrochen (Rollback) wird. InnoDB erkennt automatisch
Transaktionsblockierungen in seiner eigenen Sperr-Tabelle und bricht die
Transaktion ab (Rollback). Wenn Sie den @code{LOCK TABLES}-Befehl oder
andere transaktionssichere Tabellen-Handler als InnoDB in derselben
Transaktion benutzen, kann eine Blockierung auftreten, die InnoDB nicht
erkennen kann. In solchen F�llen ist ein Timeout n�tzlich, um die Situation
zu bereinigen.
@item @code{innodb_flush_method} @tab
(Verf�gbar ab Version 3.23.40.)
Der Vorgabewert hierf�r ist @code{fdatasync}.
Ein andere Option ist @code{O_DSYNC}.
@end multitable
 

@node InnoDB init, Using InnoDB tables, InnoDB start, InnoDB
@c German node InnoDB initialisieren
@subsection InnoDB-Tabellenplatz (Tablespace) erzeugen

Angenommen, Sie haben MySQL installiert und @file{my.cnf} so editiert, dass
sie die notwendigen InnoDB Konfigurationsparameter enth�lt. Bevor Sie MySQL
starten, sollten Sie �berpr�fen, dass die f�r InnoDB-Daten- und Log-Dateien
angegebenen Verzeichnisse existieren und dass Sie auf diese Zugriffsrechte
haben. InnoDB kann keine Verzeichnisse anlegen, nur Dateien. �berpr�fen Sie
auch, ob Sie auf der Festplatte genug Platz f�r Daten- und Log-Dateien
haben.

Wenn Sie jetzt MySQL starten, f�ngt InnoDB an, Ihre Daten- und Log-Dateien
zu erzeugen. InnoDB gibt dabei etwas wie das folgende aus:

@example
~/mysqlm/sql > mysqld
InnoDB: The first specified data file /home/stefan/data/ibdata1 did not exist:
InnoDB: a new database to be created!
InnoDB: Setting file /home/stefan/data/ibdata1 size to 134217728
InnoDB: Database physically writes the file full: wait...
InnoDB: Data file /home/stefan/data/ibdata2 did not exist: new to be created
InnoDB: Setting file /home/stefan/data/ibdata2 size to 262144000
InnoDB: Database physically writes the file full: wait...
InnoDB: Log file /home/stefan/data/logs/ib_logfile0 did not exist: new to be created
InnoDB: Setting log file /home/stefan/data/logs/ib_logfile0 size to 5242880
InnoDB: Log file /home/stefan/data/logs/ib_logfile1 did not exist: new to be created
InnoDB: Setting log file /home/stefan/data/logs/ib_logfile1 size to 5242880
InnoDB: Log file /home/stefan/data/logs/ib_logfile2 did not exist: new to be created
InnoDB: Setting log file /home/stefan/data/logs/ib_logfile2 size to 5242880
InnoDB: Started
mysqld: ready for connections
@end example

Jetzt wurde eine neue InnoDB-Datenbank erzeugt. Sie k�nnen sich mit den
�blichen MySQL-Client-Programmen wie @code{mysql} mit dem MySQL-Server
verbinden. Wenn Sie den MySQL-Server mit @file{mysqladmin shutdown}
herunter fahren, gibt InnoDB etwa wie das folgende aus:

@example
010321 18:33:34  mysqld: Normal shutdown
010321 18:33:34  mysqld: Shutdown Complete
InnoDB: Starting shutdown...
InnoDB: Shutdown completed
@end example

Wenn Sie jetzt einen Blick auf die Daten-Dateien und Log-Verzeichnisse
werfen, sehen Sie die erzeugten Dateien. Das Log-Verzeichnis enth�lt auch
eine kleine Datei namens @file{ib_arch_log_0000000000}. Diese Datei
resultiert aus der Datenbank-Erzeugung, nach der InnoDB die
Log-Archivierung ausgeschaltet hat. Wenn MySQL noch einmal gestartet wird,
sieht die Ausgabe etwa wie folgt aus:

@example
~/mysqlm/sql > mysqld
InnoDB: Started
mysqld: ready for connections
@end example



@menu
* Error creating InnoDB::       
@end menu

@node Error creating InnoDB,  , InnoDB init, InnoDB init
@c German node Fehler bei der Erzeugung von InnoDB
@subsubsection Falls etwas bei der Datenbank-Erzeugung schiefgeht

Falls etwas bei der Datenbank-Erzeugung schiefgeht, sollten Sie alle durch
InnoDB erzeugten Dateien l�schen. Das hei�t alle Daten-Dateien, alle
Log-Dateien, die kleine archivierte Log-Datei und - falls Sie bereits
InnoDB-Tabellen erzeugt haben, auch die entsprechenden @file{.frm}-Dateien
f�r diese Tabellen in den MySQL-Datenbankverzeichnissen. Danach k�nnen Sie
die InnoDB-Datenbankerzeugung erneut versuchen.


@node Using InnoDB tables, Adding and removing, InnoDB init, InnoDB
@c German node InnoDB-Tabellen benutzen
@subsection InnoDB-Tabellen erzeugen

Angenommen, Sie haben den MySQL-Client mit dem Befehl @code{mysql test}
gestartet. Um eine Tabelle im InnoDB-Format zu erzeugen, m�ssen Sie im
SQL-Befehl zur Tabellenerzeugung @code{TYPE = InnoDB} angeben:

@example
CREATE TABLE kunde (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB;
@end example

Dieser SQL-Befehl erzeugt eine Tabelle und einen Index auf die Spalte
@code{A} im InnoDB-Tabellenplatz (Tablespace), der aus den Daten-Dateien
besteht, die Sie in @file{my.cnf} angegeben haben. MySQL erzeugt zus�tzlich
eine Datei @file{kunde.frm} im MySQL-Datenbankverzeichnis @file{test}.
Intern f�gt InnoDB seinem eigenen Datenw�rterbuch einen Eintrag f�r die
Tabelle @code{'test/kunde'} hinzu. Wenn Sie daher eine Tabelle namens
@code{kunde} in einer anderen Datenbank von MySQL erzeugen, kollidieren die
Tabellennamen innerhalb InnoDB nicht.

Sie k�nnen den freien Speicherplatz im InnoDB-Tabellenplatz (Tablespace)
mit dem Tabellen-Status-Befehl von MySQL f�r jede Tabelle, die Sie mit
@code{TYPE = InnoDB} erzeugt haben, abfragen. Die Menge freien Platzes im
Tabellenplatz (Tablespace) erscheint im Kommentar-Abschnitt der Tabelle in
der Ausgabe von @code{SHOW}. Beispiel:

@example
SHOW TABLE STATUS FROM test LIKE 'kunde'
@end example

Beachten Sie, dass die Statistiken, die @code{SHOW} �ber InnoDB-Tabellen
ausgibt, nur N�herungswerte sind: Sie werden f�r die SQL-Optimierung
benutzt. Die f�r Tabelle und Indexe reservierten Gr��en in Bytes sind
allerdings genau.

@subsubsection MyISAM-Tabellen in InnoDB-Tabellen umwandeln

InnoDB hat keine spezielle Optimierung f�r separate Index-Erzeugung. Daher
lohnt es sich nicht, die Tabelle zu exportieren und importieren und die
Indexe danach zu erzeugen. Die schnellste Art, eine Tabelle in InnoDB zu
�ndern, ist, die Einf�gungen direkt in eine InnoDB-Tabelle vorzunehmen,
das hei�t, @code{ALTER TABLE ... TYPE=INNODB} zu benutzen oder eine leere
InnoDB-Tabelle mit identischen Definitionen zu nehmen und die Zeilen mit
@code{INSERT INTO ... SELECT * FROM ...} einzuf�gen.

Um eine bessere Kontrolle �ber den Einf�geprozess zu erhalten, kann es
besser sein, gro�e Tabellen in Teilst�cken einzuf�gen:

@example
INSERT INTO neue_tabelle SELECT * FROM alte_tabelle WHERE schluessel > etwas
                                             AND schluessel <= etwas_anderes;
@end example

Nachdem alle Daten eingef�gt wurden, k�nnen Sie die Tabellen umbenennen.

W�hrend der Umwandlung gro�er Tabellen sollten Sie den InnoDB-Puffer-Pool
hoch setzen, um Festplatten-Ein- und -Ausgaben zu verringern, allerdings
nicht h�her als 80% des physikalischen Arbeitsspeichers. Sie sollten die
InnoDB-Log-Dateien Gro� machen und auch den Log-Puffer.

Stellen Sie sicher, dass Sie genug Tabellenplatz (Tablespace) haben!
InnoDB-Tabellen ben�tigen viel mehr Platz als MyISAM-Tabellen. Wenn ein
@code{ALTER TABLE} nicht mehr genug Platz hat, wird ein Rollback gestartet,
das Stunden dauern kann, wenn es auf der Festplatte stattfindet. Bei
Einf�geoperationen verwendet InnoDB den Einf�gepuffer, um sekund�re
Index-Datens�tze mit Indexen in Stapeln zu vermischen. Das spart eine Menge
an Festplatten-Ein- und -Ausgaben. Beim Rollback wird kein solcher
Mechanismus benutzt, weshalb das Rollback bis zu 30 mal l�nger als das
Einf�gen dauern kann.

Falls Sie keine wertvollen Daten in Ihren InnoDB-Dateien haben, ist es im
Fall eines 'festgefahrenen' Rollback besser, den Datenbank-Prozess zu
killen und alle InnoDB-Daten- und Log-Dateien sowie alle InnoDB-Tabellen
(@file{.frm}-Dateien) zu l�schen und noch einmal anzufangen, statt darauf
zu warten, dass Millionen von Festplatten-Ein- und -Ausgaben beendet
werden.

@subsubsection  Fremdschl�ssel-(Foreign Key)-Beschr�nkungen

InnoDB-Version 3.23.44 hat Fremdschl�ssel-(Foreign Key)-Beschr�nkungen.
InnoDB ist der erste MySQL-Tabellentyp, der die Definition von
Fremdschl�ssel-Beschr�nkungen zul��t, um die Integrit�t Ihrer Daten zu
�berwachen.

Die Syntax einer Fremdschl�sseldefinition in InnoDB:
@example
FOREIGN KEY (index_spalten_name, ...) REFERENCES tabellen_name (index_spalten_name, ...)
@end example

Beispiel:

@example
CREATE TABLE eltern(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE kind(id INT, eltern_id INT, INDEX par_ind (eltern_id),
           FOREIGN KEY (eltern_id) REFERENCES eltern(id)) TYPE=INNODB;
@end example

Beide Tabellen m�ssen vom Typ InnoDB sein und es muss einen Index geben,
bei dem der Fremdschl�ssel und der referenzierte Schl�ssel als erste
Spalten aufgef�hrt sind. Jegliches @code{ALTER TABLE} entfernt momentan
alle Fremdschl�sselbeschr�nkungen, die f�r die Tabelle definiert wurden,
aber nicht die Beschr�nkungen, die die Tabelle referenzieren.
Korrespondierende Spalten im Fremdschl�ssel und dem referenzierten
Schl�ssel m�ssen �hnliche interne Datentypen innerhalb InnoDB sein, so dass
sie ohne Typumwandlung verglichen werden k�nnen. Die L�ngen von
Zeichenkettentypen m�ssen nicht dieselben sein. Die Gr��e und Vorzeichen /
kein Vorzeichen von Ganzzahltypen m�ssen dieselben sein.

Beim Pr�fen von Fremdschl�sseln setzt InnoDB gemeinsame Sperren auf
Zeilenebene auf kind- und eltern-Datens�tze, die es betrachten muss. InnoDB
pr�ft Fremdschl�ssel-(Foreign Key)-Beschr�nkungen sofort: Die Pr�fung wird
nicht bis zu einem Transaktions-Commit verschoben.

InnoDB l��t zu, dass jegliche Tabelle gel�scht wird, selbst wenn das die
Fremdschl�ssel-(Foreign Key)-Beschr�nkungen durchbrechen w�rde, die die
Tabelle referenzieren. Wenn Sie eine Tabelle l�schen, werden die
Beschr�nkungen, die in ihrem CREATE-Statement definiert wurden, ebenfalls
gel�scht.

Wenn Sie eine gel�schte Tabelle neu erzeugen, muss sie eine Definition
haben, die mit den Fremdschl�ssel-(Foreign Key)-Beschr�nkungen konform ist,
die sie referenzieren. Sie muss die richten Spaltennamen und -typen haben,
und sie muss - wie oben angegeben - Indexe auf die referenzierten Schl�ssel
haben.

Sie k�nnen die Fremdschl�ssel-(Foreign Key)-Beschr�nkungen f�r eine Tabelle
wie folgt auflisten:
@code{T} with
@example
SHOW TABLE STATUS FROM ihr_datenbank_name LIKE 'T';
@end example
Die Fremdschl�ssel-(Foreign Key)-Beschr�nkungen werden im
Tabellen-Kommentar der Ausgabe aufgelistet.

InnoDB unterst�tzt noch kein @code{CASCADE ON DELETE} oder andere spezielle
Optionen f�r diese Beschr�nkungen.

@node Adding and removing, Backing up, Using InnoDB tables, InnoDB
@c German node Hinzuf�gen und entfernen
@subsection Hinzuf�gen und Entfernen von InnoDB-Daten- und -Log-Dateien

Sie k�nnen die Gr��e einer InnoDB-Daten-Datei nicht vergr��ern. Um Ihrem
Tabellenplatz (Tablespace) mehr hinzuzuf�gen, m�ssen Sie eine neue
Daten-Datei hinzuf�gen. Um das zu tun, m�ssen Sie Ihre MySQL-Datenbank
herunter fahren, die @file{my.cnf}-Datei editieren und eine neue Datei zu
@code{innodb_data_file_path} hinzuf�gen. Dann starten Sie MySQL erneut.

Momentan k�nnen Sie keine Daten-Datei aus InnoDB entfernen. Um die Gr��e
Ihrer Datenbank zu verringern, m�ssen Sie @file{mysqldump} benutzen, um
alle Ihre Tabellen zu dumpen, eine neue Datenbank erzeugen und Ihre
Tabellen in die neue Datenbank importieren.

Wenn Sie die Anzahl oder die Gr��e Ihrer InnoDB-Log-Dateien �ndern wollen,
m�ssen Sie MySQL herunter fahren und sicher stellen, dass er ohne Fehler
herunter fuhr. Dann kopieren Sie die alten Log-Dateien an eine sichere
Stelle, falls etwas beim Herunterfahren schiefging und Sie die Datenbank
wiederherstellen m�ssen. L�schen Sie die alten Log-Dateien aus dem
Log-Datei-Verzeichnis, editieren Sie @file{my.cnf} und starten Sie MySQL
noch einmal. InnoDB meldet beim Starten, dass es neue Log-Dateien anlegt.


@node Backing up, Moving, Adding and removing, InnoDB
@c German node Datensicherung InnoDB
@subsection Datensicherung und Wiederherstellung einer InnoDB-Datenbank

Der Schl�ssel zur sicheren Datenbankverwaltung sind regelm��ige
Datensicherungen. Im eine 'bin�re' Sicherung Ihrer Datenbank zu machen, tun
Sie folgendes:

@itemize @bullet
@item
Fahren Sie Ihre MySQL-Datenbank herunter und stellen Sie sicher, dass dabei
keine Fehler auftraten.
@item
Kopieren Sie Ihre Daten-Dateien an eine sichere Stelle.
@item
Kopieren Sie alle InnoDB-Log-Dateien an eine sichere Stelle.
@item
Kopieren Sie Ihre @file{my.cnf} Konfigurationsdatei(en) an eine sichere
Stelle.
@item
Kopieren Sie alle @file{.frm}-Dateien f�r Ihre InnoDB-Tabellen an eine
sichere Stelle.
@end itemize

Momentan gibt es kein Online- oder inkrementelles Datensicherungsprogramm
f�r InnoDB, obwohl diese auf der TODO-Liste sind.

Zus�tzlich zu den beschriebenen Bin�r-Datensicherungen sollten Sie
ausserdem regelm��ig Dumps Ihrer Tabellen mit @file{mysqldump} machen. Der
Grund ist, dass eine Bin�rdatei besch�digt sein kann, ohne dass Sie das
bemerken. Gedumpte Tabellen werden in Textdateien gespeichert, die
Menschen-lesbar und viel einfacher als bin�re Datenbankdateien sind. Aus
gedumpten Dateien l��t sich Tabellenbesch�digung leichter erkennen und da
ihr Format einfacher ist, ist das Risiko ernsthafter Datenbesch�digung in
ihnen geringer.

Es ist eine gute Idee, Dumps zur gleichen Zeit zu machen wie die bin�re
Datensicherung Ihrer Datenbank. Sie m�ssen alle Clients aus Ihrer Datenbank
ausschlie�en, um konsistente Schnappsch�sse aller Ihrer Tabellen im Dump
zu bekommen. Danach k�nnen Sie die bin�re Datensicherung machen, so dass
Sie einen konsistenten Schnappschuss Ihrer Datenbank in zwei Formaten
haben.

Um in der Lage zu sein, Ihre InnoDB-Datenbank aus den beschriebenen bin�ren
Datensicherungen wiederherzustellen, m�ssen Sie Ihre MySQL-Datenbank mit
allgemeinem Loggen und angeschalteter Log-Archivierung von MySQL laufen
lassen. Mit allgemeinem Loggen ist hier der Log-Mechanismus des
MySQL-Servers gemeint, der unabh�ngig von den InnoDB-Logs ist.

Zum Wiederherstellen nach einem Absturz des MySQL-Serverprozesses ist es
lediglich n�tig, diesen erneut zu starten. InnoDB pr�ft automatisch die
Log-Dateien und f�hrt ein Roll-Forward der Datenbank bis zum aktuellen
Stand durch. InnoDB macht ein automatisches Rollback nicht abgeschlossener
(committed) Transaktionen, die zur Zeit des Absturzes anh�ngig waren.
W�hrend der Wiederherstellung gibt InnoDB etwa folgendes aus:

@example
~/mysqlm/sql > mysqld
InnoDB: Database was not shut down normally.
InnoDB: Starting recovery from log files...
InnoDB: Starting log scan based on checkpoint at
InnoDB: log sequence number 0 13674004
InnoDB: Doing recovery: scanned up to log sequence number 0 13739520
InnoDB: Doing recovery: scanned up to log sequence number 0 13805056
InnoDB: Doing recovery: scanned up to log sequence number 0 13870592
InnoDB: Doing recovery: scanned up to log sequence number 0 13936128
...
InnoDB: Doing recovery: scanned up to log sequence number 0 20555264
InnoDB: Doing recovery: scanned up to log sequence number 0 20620800
InnoDB: Doing recovery: scanned up to log sequence number 0 20664692
InnoDB: 1 uncommitted transaction(s) which must be rolled back
InnoDB: Starting rollback of uncommitted transactions
InnoDB: Rolling back trx no 16745
InnoDB: Rolling back of trx no 16745 completed
InnoDB: Rollback of uncommitted transactions completed
InnoDB: Starting an apply batch of log records to the database...
InnoDB: Apply batch completed
InnoDB: Started
mysqld: ready for connections
@end example

Wenn Ihre Datenbank besch�digt wird oder Ihre Festplatte Fehler hat, m�ssen
Sie eine Wiederherstellung aus einer Datensicherung durchf�hren. Im Falle
der Besch�digung sollten Sie zun�chst eine Datensicherung finden, die nicht
besch�digt ist. Machen Sie aus der Datensicherung eine Wiederherstellung
aus den allgemeinen Log-Dateien von MySQL unter Beachtung der Anleitungen
im MySQL-Handbuch.



@menu
* InnoDB checkpoints::          
@end menu

@node InnoDB checkpoints,  , Backing up, Backing up
@c German node InnoDB-Checkpoints
@subsubsection Checkpoints

InnoDB hat einen Checkpoint-Mechanismus implementiert, der sich Fuzzy
Checkpoint nennt. InnoDB schreibt ver�nderten Datenbankseiten aus dem
Puffer-Pool in kleinen Stapeln (Batch) auf Platte (flush), daher besteht
keine Notwendigkeit, den Puffer-Pool in einem einzelnen Stapel
zur�ckzuschreiben, was in der Praxis dazu f�hren w�rde, dass SQL-Statements
von Benutzern f�r eine Weile angehalten w�rden.

Bei der Reparatur nach Abst�rzen sucht InnoDB nach einem Checkpoint-Label in
den Log-Dateien. Es wei�, dass alle �nderungen an der Datenbank vor dem
Label bereits im Platten-Image der Datenbank enthalten sind. InnoDB scannt
anschlie�end die Log-Dateien ab dem Checkpoint vorw�rts und wendet die
geloggten �nderungen auf die Datenbank an.

InnoDB schreibt in zirkul�rer Art in die Log-Dateien. Alle abgeschickten
(committed) �nderungen, die dazu f�hren, dass sich die Datenbankseiten im
Puffer-Pool vom Image auf der Platte unterscheiden, m�ssen in den
Log-Dateien verf�gbar sein, f�r den Fall, dass InnoDB eine
Wiederherstellung durchf�hren muss. Das hei�t, wenn InnoDB anf�ngt, eine
Log-Datei auf zirkul�re Weise wieder zu benutzen, muss es sicherstellen,
dass die Datenbankseiten-Images auf der Festplatte bereits die �nderungen
enthalten, die in der Log-Datei mitgeschrieben sind, die InnoDB benutzen
wird. Mit anderen Worten muss InnoDB einen Checkpoint machen, was oft das
Zur�ckschreiben auf Platte (flush) ge�nderter Datenbankseiten beinhaltet.

Das erkl�rt, warum es Festplatten-Ein- und -Ausgaben sparen kann, wenn man
die Log-Dateien sehr Gro� macht. Es kann sinnvoll sein, die Gesamtgr��e
der Log-Dateien so Gro� wie den Puffer-Pool oder sogar noch gr��er zu
machen. Der Nachteil gro�er Log-Dateien ist, dass eine Reparatur nach
Absturz l�nger dauern kann, weil mehr Log-Eintr�ge auf die Datenbank
angewendet werden m�ssen.


@node Moving, InnoDB transaction model, Backing up, InnoDB
@c German node Verschieben
@subsection Eine InnoDB-Datenbank auf eine andere Maschine verschieben

InnoDB-Daten- und Log-Dateien sind auf allen Plattformen bin�rkompatibel,
wenn das Flie�kommazahlenformat auf den Maschinen dasselbe ist. Sie k�nnen
eine InnoDB-Datenbank einfach verschieben, indem Sie alle relevanten
Dateien kopieren, die im vorherigen Abschnitt �ber Datensicherung erw�hnt
wurden. Wenn sich das Flie�kommaformat auf den Maschinen unterscheidet,
sie aber keine @code{FLOAT}- oder @code{DOUBLE}-Datentypen in Ihren
Tabellen benutzt haben, ist die Prozedur dieselbe: Kopieren Sie einfach die
relevanten Dateien. Wenn die Formate unterschiedlich sind und Ihre Tabellen
Flie�komma-Daten enthalten, m�ssen Sie @file{mysqldump} und
@file{mysqlimport} benutzen, um diese Tabellen zu verschieben.

Ein Tipp zur Performance: Schalten Sie Auto-Commit aus, wenn Sie Daten in
Ihre Datenbank importieren (unter der Annahme, dass Ihr Tabellenplatz
(Tablespace) genug Platz f�r das gro�e Rollback-Segment enth�lt, den die
gro�e Import-Transaktion erzeugen wird). Machen Sie das Commit erst nach
dem Import einer ganzen Tabelle oder eines Segments einer Tabelle.


@node InnoDB transaction model, Implementation, Moving, InnoDB
@c German node InnoDB-Transaktionsmodell
@subsection InnoDB-Transaktionsmodell

Im InnoDB-Transaktionsmodell war das Ziel, die besten Eigenschaften einer
multiversionsf�higen Datenbank mit dem traditionellen Zwei-Phasen-Sperren
zu verbinden. InnoDB f�hrt Sperren auf Zeilenebene durch und l��t Anfragen
vorgabem��ig als nicht sperrende konsistente Leseoperationen laufen, im
Stil von Oracle. Das Tabellensperren ist in InnoDB so platzsparend
gespeichert, dass keine Sperr-Eskalation ben�tigt wird: Typischerweise
d�rfen mehrere Benutzer jede Zeile in der Datenbank oder eine beliebige
Teilmenge der Zeilen sperren, ohne dass InnoDB keinen Speicher mehr hat.

Bei InnoDB findet jede Benutzeraktivit�t innerhalb von Transaktionen statt.
Wenn der Auto-Commit-Modus in MySQL benutzt wird, stellt jedes
SQL-Statement eine einzelne Transaktion dar. Wenn der Auto-Commit-Modus
ausgeschaltet wird, kann man sich vorstellen, dass ein Benutzer stets eine
Transaktion offen hat. Wenn er das SQL-@code{COMMIT}- oder
@code{ROLLBACK}-Statement absetzt, beendet das die aktuelle Transaktion und
eine neue beginnt. Beide Statements heben alle InnoDB-Sperren auf, die
w�hrend der aktuellen Transaktion gesetzt wurden. Ein @code{COMMIT}
bedeutet, dass die in der aktuellen Transaktion gemachten �nderungen
permanent und sichtbar f�r andere Benutzer gemacht werden. Auf der anderen
Seite bricht ein @code{ROLLBACK} alle �nderungen ab, die in der aktuellen
Transaktion gemacht wurden.



@menu
* InnoDB consistent read::      
* InnoDB locking reads::        
* InnoDB Next-key locking::     
* InnoDB Locks set::            
* InnoDB Deadlock detection::   
* InnoDB Consistent read example::  
@end menu

@node InnoDB consistent read, InnoDB locking reads, InnoDB transaction model, InnoDB transaction model
@c German node Konsistentes Lesen bei InnoDB
@subsubsection Konsistentes Lesen

Konsistentes Lesen bedeutet, dass InnoDB seine Multiversionsf�higkeiten
nutzt, um einer Anfrage einen Schnappschuss der Datenbank zu einem
bestimmten Zeitpunkt zu zeigen. Die Anfrage sieht genau die �nderungen, die
von Transaktionen durchgef�hrt wurden, die bis zu diesem Zeitpunkt
abgeschlossen wurden (committed), und keine �nderungen, die sp�ter gemacht
wurden oder die noch nicht abgeschlossen sind. Die Ausnahme von der Regel
ist, dass die Anfrage die �nderungen sieht, die durch die Transaktion
selbst durchgef�hrt wurde, die die Anfrage absetzt.

Wenn eine Transaktion ihr erstes Konsistentes Lesen durchf�hrt, weist
InnoDB den Schnappschuss oder Zeitpunkt zu, den jedes Konsistente Lesen
in derselben Transaktion benutzen wird. Im Schnappschuss sind alle
Transaktionen enthalten, die vor der Zuweisung zum Schnappschuss
abgeschlossen (committed) wurden. Daher ist Konsistentes Lesens innerhalb
derselben Transaktion auch untereinander konsistent. Sie k�nnen einen
frischeren Schnappschuss f�r Ihre Anfragen erhalten, indem Sie die aktuelle
Transaktion beenden (commit) und danach neue Anfragen absetzen.

Konsistentes Lesen ist der vorgabem��ige Modus, in dem InnoDB
@code{SELECT}-Statements abarbeitet. Konsistentes Lesen setzt keinerlei
Sperren auf die Tabellen, auf die es zugreift. Daher k�nnen andere Benutzer
zur selben Zeit, wie Konsistentes Lesen auf die Tabelle durchgef�hrt wird,
diese ver�ndern.


@node InnoDB locking reads, InnoDB Next-key locking, InnoDB consistent read, InnoDB transaction model
@c German node Lese-Sperren bei InnoDB
@subsubsection Lesevorg�nge sperren

Unter manchen Umst�nden ist Konsistentes Lesen nicht w�nschenswert.
Angenommen, Sie wollen eine neue Zeile in die Tabelle @code{kind} einf�gen
und dabei sicherstellen, dass das Kind bereits Eltern in der Tabelle
@code{eltern} hat.

Wenn Sie Konsistentes Lesen benutzen, um die Tabelle @code{eltern} zu lesen
und in der Tat die Eltern des Kindes in der Tabelle sehen, k�nnen Sie dann
sicher die Kind-Zeile zur Tabelle @code{kind} hinzuf�gen? Nein, denn es
kann sein, dass zwischenzeitlich jemand anderes die Eltern-Zeile aus der
Tabelle @code{eltern} gel�scht hat und Sie das nicht sehen.

Die L�sung besteht darin, das @code{SELECT} im Sperrmodus durchzuf�hren.
@code{LOCK IN SHARE MODE}.

@example
SELECT * FROM eltern WHERE NAME = 'Hinz' LOCK IN SHARE MODE;
@end example

Wenn Sie ein Lesen im Share-Modus durchf�hren, hei�t das, dass die letzten
verf�gbaren Daten gelesen werden und eine Shared-Modus-Sperre auf die Zeile
gesetzt wird, die gelesen wird. Wenn die letzten Daten zu einer noch nicht
abgeschlossenen Transaktion eines anderen Benutzers geh�ren, wird gewartet,
bis die Transaktion abgeschlossen (committed) ist. Eine Shared-Modus-Sperre
verhindert, dass andere die Zeile aktualisieren oder l�schen, die gerade
gelesen wurde. Nachdem festgestellt wurde, dass die obige Anfrage die
Eltern @code{'Hinr'} zur�ckgibt, kann das Kind sicher zur Tabelle
@code{kind} hinzugef�gt und die Transaktion abgeschlossen werden. Dieses
Beispiel zeigt, wie Sie in Ihren Applikations-Code referentielle Integrit�t
integrieren k�nnen.

Sehen wir uns ein weiteres Beispiel an. Wir haben ein ganzzahliges
Z�hlerfeld in einer Tabelle @code{kind_codes}, was benutzt wird, um jedem
Kinde, das wir der Tabelle @code{kind} hinzuf�gen, eine eindeutige Kennung
zuzuweisen. Es ist offensichtlich, dass Konsistentes Lesen oder
Shared-Modus-Lesen kein geeignetes Mittel ist, um den aktuellen Wert des
Z�hlers zu ermitteln, weil n�mlich zwei Benutzer der Datenbank denselben
Wert des Z�hlers sehen k�nnen und wir daher einen Fehler wegen doppelter
Schl�sseleintr�ge erhalten, wenn wir zwei Kinder mit derselben Kennung in
die Tabelle einf�gen.

In diesem Fall gibt es zwei geeignete M�glichkeiten, das Lesen und
Heraufz�hlen des Z�hlers zu implementieren:
(1) Zuerst den Z�hler um eins erh�hen und erst danach lesen.
(2) Zuerst den Z�hler im Sperr-Modus @code{FOR UPDATE} lesen und danach
heraufz�hlen:

@example
SELECT COUNTER_FIELD FROM kind_codes FOR UPDATE;
UPDATE kind_codes SET COUNTER_FIELD = COUNTER_FIELD + 1;
@end example

@code{SELECT ... FOR UPDATE} liest die letzten verf�gbaren Daten und setzt
exklusive Sperren auf jede Zeile, die es liest. Daher setzt es dieselben
Sperren, die ein gesuchtes SQL-@code{UPDATE} auf die Zeilen setzen w�rde.


@node InnoDB Next-key locking, InnoDB Locks set, InnoDB locking reads, InnoDB transaction model
@c German node N�chsten-Schl�ssel-Sperren bei InnoDB
@subsubsection N�chsten Schl�ssel sperren: Wie das Phantom-Problem vermieden wird

Beim Sperren auf Zeilenebene benutzt InnoDB einen Algorithmus, der
N�chsten-Schl�ssel-Sperren genannt wird. InnoDB f�hrt das Sperren auf
Zeilenebene so durch, dass es beim Suchen oder Scannen eines Indexes auf
eine Tabelle gemeinsam genutzte (shared) oder exklusive Sperren auf die
Index-Datens�tze setzt, die es findet. Daher werden die Sperren auf
Zeilenebene genauer Index-Datensatz-Sperren genannt.

Die Sperren, die InnoDB auf Index-Datens�tze setzt, betreffen auch die
'L�cke' vor diesem Index-Datensatz. Wenn ein Benutzer eine gemeinsam
benutzte (shared) oder exklusive Sperre auf den Datensatz R in einem Index
hat, kann ein anderen Benutzer keinen Datensatz direkt vor R (in der
Index-Reihenfolge) einf�gen. Dieses Sperren von L�cken wird durchgef�hrt,
um das so genannte Phantom-Problem zu vermeiden. Angenommen, man will alle
Kinder aus der Tabelle @code{kind} lesen und sperren, die eine Kennung
gr��er 100 haben, und irgend ein Feld in der ausgew�hlten Zeile
aktualisieren:

@example
SELECT * FROM kind WHERE ID > 100 FOR UPDATE;
@end example

Angenommen, es gibt einen Index auf der Tabelle @code{kind} auf der Spalte
@code{ID}. Unsere Anfrage scannt diesen Index ab dem ersten Datensatz, bei
dem @code{ID} gr��er als 100 ist. Wenn jetzt die auf den Index-Datensatz
gesetzten Sperren nicht Einf�geoperationen sperren w�rden, die in die
L�cken ausgef�hrt w�rden, k�nnte zwischenzeitlich ein neues Kind in die
Tabelle eingef�gt werden. Wenn jetzt unsere Transaktion noch einmal
folgendes ausf�hren w�rde:

@example
SELECT * FROM kind WHERE ID > 100 FOR UPDATE;
@end example

Sehen wir ein neues Kind in der Ergebnismenge, die die Anfrage zur�ckgibt.
Das verst��t gegen das Isolationsprinzip von Transaktionen: Eine
Transaktion sollte in der Lage sein, so abzulaufen, dass die Daten, die sie
gelesen hat, sich nicht w�hrend der Transaktion �ndern. Wenn wir einen Satz
von Zeilen als Daten-Posten betrachten, w�rde das neue 'Phantom'-Kind
dieses Isolationsprinzip durchbrechen.

Wenn InnoDB einen Index scannt, kann es auch die L�cke nach dem letzten
Datensatz im Index sperren. Genau das passiert im vorherigen Beispiel: Die
Sperren, die von InnoDB gesetzt werden, verhindert jedes Einf�gen in die
Tabelle an Stellen, wo @code{ID} gr��er als 100 ist.

Sie k�nnen N�chsten-Schl�ssel-Sperren dazu benutzen, eine
Eindeutigkeitspr�fung in Ihre Applikation zu implementieren: Wenn Sie Ihre
Daten im Share-Modus lesen und kein Duplikat f�r eine Zeile sehen, die Sie
einf�gen werden, k�nnen Sie Ihre Zeile sicher einf�gen und wissen, dass das
N�chsten-Schl�ssel-Sperren verhindern wird, dass zwischenzeitlich jemand
eine Duplikatzeile Ihrer Zeile einf�gt. Daher gestattet Ihnen das
N�chsten-Schl�ssel-Sperren, die Nicht-Existenz von irgend etwas in Ihrer
Tabelle zu 'sperren'.

@node InnoDB Locks set, InnoDB Deadlock detection, InnoDB Next-key locking, InnoDB transaction model
@c German node Bei InnoDB gesetzte Sperren
@subsubsection Sperren, die in InnoDB durch unterschiedliche SQL-Statements gesetzt werden

@itemize @bullet
@item
@code{SELECT ... FROM ...} : Das ist Konsistentes Lesen, es wird ein
Schnappschuss einer Datenbank gelesen und es werden keine Sperren gesetzt.
@item
@code{SELECT ... FROM ... LOCK IN SHARE MODE} : setzt gemeinsam genutztes
(shared) N�chsten-Schl�ssel-Sperren auf alle Index-Datens�tze, die beim
Lesen gefunden werden.
@item
@code{SELECT ... FROM ... FOR UPDATE} : setzt exklusives
N�chsten-Schl�ssel-Sperren auf alle Index-Datens�tze, die beim Lesen
gefunden werden.
@item
@code{INSERT INTO ... VALUES (...)} : setzt eine exklusive Sperre auf die
eingef�gte Zeile. Beachten Sie, dass diese Sperre kein
N�chsten-Schl�ssel-Sperren ist und andere Benutzer nicht davon abh�lt,
etwas in die L�cke vor der eingef�gten Zeile einzuf�gen. Wenn ein Fehler
wegen doppelter Schl�sseleintr�ge auftritt, setzt dieser Befehl eine
gemeinsam genutzte (shared) Sperre auf den doppelten (Duplikat)
Index-Datensatz.
@item
@code{INSERT INTO T SELECT ... FROM S WHERE ...} setzt eine exklusive
Sperre (kein N�chsten-Schl�ssel-Sperren) auf jede Zeile, die in @code{T}
eingef�gt wurde. Sucht nach @code{S} in Form von Konsistentem Lesen, aber
setzt N�chsten-Schl�ssel-Sperren auf @code{S}, wenn bei MySQL das Loggen
angeschaltet ist. InnoDB muss in letzterem Fall Sperren setzen, weil bei
einer Roll-Forward-Wiederherstellung aus einer Datensicherung jedes
SQL-Statement auf genau dieselbe Weise ausgef�hrt werden muss, wie es
urspr�nglich ausgef�hrt wurde.
@item
@code{CREATE TABLE ... SELECT ...} f�hrt @code{SELECT} als Konsistentes
Lesen oder mit gemeinsam genutzten (shared) Sperren aus, wie im vorherigen
Punkt.
@item
@code{REPLACE} wird wie Einf�gen ausgef�hrt, wenn es keine Kollision auf
einem eindeutigen Schl�ssel gibt. Ansonsten wird ein exklusives
N�chsten-Schl�ssel-Sperren auf die Reihe gesetzt, die aktualisiert werden
muss.
@item
@code{UPDATE ... SET ... WHERE ...} setzt ein exklusives
N�chsten-Schl�ssel-Sperren auf jeden Datensatz, der beim Suchen gefunden
wird.
@item
@code{DELETE FROM ... WHERE ...} setzt ein exklusives
N�chsten-Schl�ssel-Sperren auf jeden Datensatz, der beim Suchen gefunden
wird.
@item
Wenn auf der Tabelle eine @code{FOREIGN KEY}-Beschr�nkung definiert ist,
setzt jedes Einf�gen, Aktualisieren oder L�schen, was die �berpr�fung der
Beschr�nkungsbedingung erfordert, gemeinsam genutzte (shared) Sperren auf
Datensatzebene auf die Datens�tze, die bei der �berpr�fung der Beschr�nkung
betrachtet werden. Auch im Falle, dass die Beschr�nkung fehlschl�gt, setzt
InnoDB diese Sperren.
@item
@code{LOCK TABLES ... } : setzt Tabellensperren. In der Implementation
setzt die MySQL-Ebene des Codes diese Sperren. Die automatische
Blockierungserkennung von InnoDB kann keine Blockierungen bemerken, bei
denen solche Tabellensperren involviert sind, siehe n�chster Abschnitt
weiter unten. Sehen Sie auch im Abschnitt 13 ('InnoDB-Einschr�nkungen')
wegen folgendem nach: Weil MySQL keine Sperren auf Zeilenebene erkennt, ist
es m�glich, dass Sie eine Sperre auf eine Tabelle erhalten, auf der ein
anderer Benutzer momentan Sperren auf Zeilenebene hat. Das gef�hrdet
allerdings nicht die Transaktionsintegrit�t.
@end itemize


@node InnoDB Deadlock detection, InnoDB Consistent read example, InnoDB Locks set, InnoDB transaction model
@c German node Blockierungserkennung bei InnoDB
@subsubsection Blockierungserkennung und Rollback

InnoDB erkennt automatisch eine Blockierung von Transaktionen und rollt die
Transaktion zur�ck, deren Sperranforderung diejenige war, die die
Blockierung aufbaute, also einen Kreis im Warte-Diagramm von Transaktionen.
InnoDB kann keine Blockierungen erkennen, bei denen eine Sperre im Spiel
ist, die durch ein MySQL-@code{LOCK TABLES}-Statement verursacht wurde,
oder wenn eine Sperre durch einen anderen Tabellen-Handler als InnoDB
gesetzt wurde. Solche Situationen m�ssen Sie mit
@code{innodb_lock_wait_timeout}, das in @file{my.cnf} gesetzt wird.

Wenn InnoDB ein komplettes Rollback einer Transaktion durchf�hrt, werden
alle Sperren der Transaktion aufgehoben. Wenn jedoch nur ein einzelnes
SQL-Statement als Ergebnis eines Fehlers zur�ckgerollt wird, k�nnen einige
der Sperren, die durch das SQL-Statement gesetzt wurde, verbleiben. Das
liegt daran, dass InnoDB Zeilensperren in einem Format speichert, die ihm
unm�glich machen, im Nachhinein zu erkennen, welche Sperre durch welches
SQL-Statement gesetzt wurde.

@node InnoDB Consistent read example,  , InnoDB Deadlock detection, InnoDB transaction model
@c German node Konsistentes Lesen bei InnoDB im Beispiel
@subsubsection Ein Beispiel, wie konsistentes Lesen bei InnoDB funktioniert

Wenn Sie ein Konsistentes Lesen ausf�hren, also ein gew�hnliches
@code{SELECT}-Statement, gibt InnoDB Ihrer Transaktion einen Zeitpunkt
(Timepoint), gem�� dem Ihre Anfrage die Datenbank sieht. Wenn daher
Transaktion B eine Zeile l�scht und das wirksam wird (commit), nachdem Ihr
Zeitpunkt zugewiesen wurde, werden Sie die Zeile nicht als gel�scht sehen.
Gleiches gilt f�r Einf�ge- und Aktualisierungsoperationen.

Sie k�nnen Ihren Zeitpunkt 'vorstellen', indem Sie Ihre Transaktion
abschicken (commit) und dann ein weiteres @code{SELECT} ausf�hren.

Das nennt sich Multiversioned Concurrency Control (multiversionierte
Gleichzeitigkeitskontrolle):

@example
                  Benutzer A             Benutzer B

              set autocommit=0;      set autocommit=0;
zeit
|             SELECT * FROM t;
|             empty set
|                                    INSERT INTO t VALUES (1, 2);
|
v             SELECT * FROM t;
              empty set
                                     COMMIT;

              SELECT * FROM t;
              empty set;

              COMMIT;

              SELECT * FROM t;
              ---------------------
              |    1    |    2    |
              ---------------------
@end example

Daher sieht Benutzer A die durch B eingef�gte Zeile erst, wenn B das
Einf�gen und A seine eigene Transaktion abgeschickt hat (commit), so dass
der Zeitpunkt hinter das Commit von B 'vorgestellt' ist.

Wenn Sie den 'frischsten' Zustand der Datenbank sehen wollen, sollten Sie
ein sperrendes Lesen (Locking Read) benutzen:

@example
SELECT * FROM t LOCK IN SHARE MODE;
@end example


@subsection Tipps zur Performance-Steigerung

@strong{1.}
Wenn das Unix-@file{top} oder der Windows-@file{Task-Manager} zeigen, dass
die CPU-Auslastung weniger als 70% betr�gt, ist Ihre Auslastung
wahrscheinlich Platten-gebunden. Das kann daran liegen, dass Sie zu viele
Transaktionen abschicken (commit) oder dass der Puffer-Pool zu klein ist.
Dann kann es helfen, den Puffer-Pool zu vergr��ern. Setzen Sie ihn aber
nicht h�her als 80% des physikalischen Arbeitsspeichers.

@strong{2.}
Packen Sie mehrere �nderungen in eine Transaktion. InnoDB muss das Log
jedes Mal auf Platte zur�ckschreiben (flush), wenn eine Transaktion
abgeschickt wird (commit), wenn diese Transaktion irgend welche �nderungen
an der Datenbank vorgenommen hat. Weil die Rotationsgeschwindigkeit einer
Platte typischerweise h�chsten 167 Umdrehungen pro Sekunde betr�gt,
beschr�nkt das die Anzahl von Commits auf eben diese Zahl pro Sekunde, wenn
die Festplatte nicht das Betriebssystem t�uscht.

@strong{3.}
Wenn Sie es sich leisten k�nnen, einige der zuletzt abgeschickten
(committed) Transaktionen zu verlieren, k�nnen Sie den
@file{my.cnf}-Parameter @code{innodb_flush_log_at_trx_commit} auf 0 setzen.
InnoDB versucht dann trotzdem, das Log einmal pro Sekunde auf Platte
zur�ckzuschreiben (flush), doch dieses Zur�ckschreiben ist nicht
garantiert.

@strong{4.}
Machen Sie Ihre Log-Dateien Gro�, selbst so Gro� wie den Puffer-Pool.
Wenn InnoDB seine Log-Dateien vollgeschrieben hat, muss es die ver�nderten
Inhalte des Puffer-Pools in einem Checkpoint auf Platte schreiben. Kleine
Log-Dateien verursachen daher unn�tige Festplatten-Schreibzugriffe. Der
Nachteil gro�er Log-Dateien liegt darin, dass die Wiederherstellungszeit
l�nger wird.

@strong{5.}
Ausserdem sollte der Log-Puffer recht Gro� sein, sagen wir 8 MB.

@strong{6.} (Relevant from 3.23.39 up.)
In einigen Versionen von Linux und Unix ist das Zur�ckschreiben von Dateien
auf Platte (flush) mit dem Unix-@code{fdatasync} und anderen �hnlichen
Methoden �berraschend langsam. InnoDB benutzt vorgabem��ig die
@code{fdatasync}-Funktion. Wenn Sie mit der Datenbank-Schreib-Performance
nicht zufrieden sind, k�nnen Sie versuchen, die @code{innodb_flush_method}
in @file{my.cnf} auf @code{O_DSYNC} zu setzen, obwohl O_DSYNC auf den
meisten Systemen langsamer zu sein scheint.

@strong{7.} Wenn Sie Daten in InnoDB importieren, stellen Sie sicher, dass
MySQL @code{autocommit=1} nicht angeschaltet hat, denn dann ben�tigt jedes
Einf�gen ein Zur�ckschreiben des Logs auf Platte (flush). Setzen Sie vor
Ihre SQL-Importdatei die Zeile

@example
set autocommit=0;
@end example

und danach

@example
commit;
@end example

Wenn Sie die @file{mysqldump}-Option @code{--opt} benutzen, erhalten Sie
Dump-Dateien, die sich sehr schnell auch in eine InnoDB-Tabelle importieren
lassen, selbst ohne sie in die oben erw�hnten @code{set autocommit=0; ...
commit;}-Wrapper zu verpacken.

@strong{8.}
H�ten Sie sich vor gro�en Rollbacks beim Einf�gen von Massendaten: InnoDB
benutzt den Einf�ge-Puffer, um beim Einf�gen Festplatten-Ein- und -Ausgaben
zu sparen, doch beim entsprechenden Rollback wird kein solcher Mechanismus
benutzt. Ein Festplatten-gebundenes Rollback kann die 30-fache Zeit des
entsprechenden Einf�gevorgangs in Anspruch nehmen. Es hilft nicht, den
Datenbankprozess zu killen, weil der Rollback erneut starten wird, wenn die
Datenbank hochf�hrt. Die einzige M�glichkeit, ein aus dem Ruder gelaufenes
Rollback loszuwerden, besteht darin, den Puffer-Pool zu erh�hen, so dass
das Rollback CPU-gebunden wird und damit schnell l�uft, oder indem die
gesamte InnoDB-Datenbank gel�scht wird.

@strong{9.}
Seien Sie auch vor anderen gro�en Festplatten-gebundenen Operationen auf
der Hut. Benutzen Sie @code{DROP TABLE} oder @code{TRUNCATE} (ab
MySQL-4.0), um eine Tabelle zu l�schen, nicht @code{DELETE FROM tabelle}.

@strong{10.}
Benutzen Sie das mehrzeilige @code{INSERT}, um den Kommunikations-Overhead
zwischen Client und Server zu verringern, wenn Sie viele Zeilen einf�gen
m�ssen:

@example
INSERT INTO tabelle VALUES (1, 2), (5, 5);
@end example

Dieser Tipp gilt nat�rlich f�r jeden Tabellentyp, nicht nur f�r InnoDB.

@subsubsection Der InnoDB-Monitor

Ab Version 3.23.41 beinhaltet InnoDB den InnoDB-Monitor, der Informationen
�ber den internen Zustand von InnoDB ausgibt. Wenn er angeschaltet ist,
veranlasst der InnoDB-Monitor den MySQL-Server @file{mysqld}, etwa alle 15
Sekunden Daten an die Standardausgabe auszugeben (Hinweis: der MySQL-Client
gibt nichts aus). Diese Daten sind n�tzlich, um die Performance zu tunen.
Unter Windows m�ssen Sie @code{mysqld-max} von einer DOS-Kommandozeile aus
mit @code{--standalone --console} starten, um die Ausgabe auf das
DOS-Fenster umzuleiten.

Es gibt einen separaten @code{innodb_lock_monitor}, der dieselben
Informationen ausgibt wie @code{innodb_monitor}, aber zus�tzlich
Informationen �ber Sperren, die durch jede Transaktion gesetzt werden.

Die ausgegebene Information enth�lt Daten �ber:
@itemize @bullet
@item
Sperren, die auf eine Transaktion warten,
@item
Semaphore, die auf Threads warten,
@item
anh�ngige Datei-Ein- und -Ausgabeanforderungen,
@item
Puffer-Pool-Statistiken und
@item
Bereinigungs- (purge) und Einf�ge-Puffer-Vermengungs- (merge) Aktivit�t des
Haupt-Threads von InnoDB.
@end itemize

Sie k�nnen den InnoDB-Monitor mit folgendem SQL-Befehl starten:

@example
CREATE TABLE innodb_monitor(a int) type = innodb;
@end example

Und ihn mit folgendem Befehl anhalten:

@example
DROP TABLE innodb_monitor;
@end example

Die @code{CREATE TABLE}-Syntax ist nur eine M�glichkeit, einen Befehl durch
den MySQL-SQL-Parser an die InnoDB-Engine durchzureichen. Wenn Sie die
Datenbank herunter fahren, w�hrend der Monitor l�uft, und Sie den Monitor
erneut starten wollen, m�ssen Sie die Tabelle l�schen, bevor Sie ein
erneutes @code{CREATE TABLE} absetzen k�nnen, um den Monitor zu starten.
Diese Syntax wird sich in zuk�nftigen Releases m�glicherweise �ndern.


Beispiel f�r die Ausgabe des InnoDB-Monitors:

@example
================================
010809 18:45:06 INNODB MONITOR OUTPUT
================================
--------------------------
LOCKS HELD BY transactions
--------------------------
LOCK INFO:
Number of locks in the record hash table 1294
LOCKS FOR TRANSACTION ID 0 579342744
TABLE LOCK table test/tabelle trx id 0 582333343 lock_mode IX

RECORD LOCKS space id 0 page no 12758 n bits 104 table test/tabelle index
PRIMARY trx id 0 582333343 lock_mode X
Record lock, heap no 2 PHYSICAL RECORD: n_fields 74; 1-byte offs FALSE;
info bits 0
 0: len 4; hex 0001a801; asc ;; 1: len 6; hex 000022b5b39f; asc ";; 2: len 7;
hex 000002001e03ec; asc ;; 3: len 4; hex 00000001;
...
-----------------------------------------------
CURRENT SEMAPHORES RESERVED AND SEMAPHORE WAITS
-----------------------------------------------
SYNC INFO:
Sorry, cannot give mutex list info in non-debug version!
Sorry, cannot give rw-lock list info in non-debug version!
-----------------------------------------------------
SYNC ARRAY INFO: reservation count 6041054, signal count 2913432
4a239430 waited for by thread 49627477 op. S-LOCK file NOT KNOWN line 0 
Mut ex 0 sp 5530989 r 62038708 sys 2155035; rws 0 8257574 8025336; rwx 0 1121090 1848344
-----------------------------------------------------
CURRENT PENDING FILE I/O'S
--------------------------
Pending normal aio reads:
Reserved slot, messages 40157658 4a4a40b8
Reserved slot, messages 40157658 4a477e28
...
Reserved slot, messages 40157658 4a4424a8
Reserved slot, messages 40157658 4a39ea38
Total of 36 reserved aio slots
Pending aio writes:
Total of 0 reserved aio slots
Pending insert buffer aio reads:
Total of 0 reserved aio slots
Pending log writes or reads:
Reserved slot, messages 40158c98 40157f98
Total of 1 reserved aio slots
Pending synchronous reads or writes:
Total of 0 reserved aio slots
-----------
BUFFER POOL
-----------
LRU list length 8034 
Free list length 0 
Flush list length 999 
Buffer pool size in pages 8192
Pending reads 39 
Pending writes: LRU 0, flush list 0, single page 0
Pages read 31383918, created 51310, written 2985115
----------------------------
END OF INNODB MONITOR OUTPUT
============================
010809 18:45:22 InnoDB starts purge
010809 18:45:22 InnoDB purged 0 pages
@end example

Einige Anmerkungen zur Ausgabe:

@itemize @bullet
@item
Wenn der Abschnitt @code{LOCKS HELD BY transactions} warten auf Sperren
berichtet, kann es sein, dass Ihre Applikation Sperr-Konflikte hat. Die
Ausgabe kann auch helfen, Gr�nde f�r Transaktions-Blockierungen
aufzusp�ren.
@item
Der Abschnitt @code{SYNC INFO} berichtet reservierte Semaphore, wenn Sie
InnoDB mit @code{UNIV_SYNC_DEBUG} kompilieren, definiert in @file{univ.i}.
@item
Der Abschnitt @code{SYNC ARRAY INFO} berichtet Threads, die auf ein
Semaphor warten, und Statistiken, wie viele Male Threads ein Spin oder ein
Warten auf einem Mutex oder einem Lese-/Schreibe-Sperr-Semaphor ben�tigten.
Eine gro�e Anzahl auf Semaphore wartender Threads kann ein Ergebnis von
Festplatten-Ein- und -Ausgaben oder Konfliktproblemen innerhalb von InnoDB
sein. Konflikte k�nnen durch starke Parallelen von Anfragen oder durch
Probleme des Betriebssystems beim Thread Scheduling hervorgerufen werden.
@item
Der Abschnitt @code{CURRENT PENDING FILE I/O'S} listet anh�ngige Datei-Ein-
und -Ausgabeanforderungen auf. Eine gro�e Anzahl davon zeigt an, dass die
Auslastung Festplatten-Ein- und -Ausgabe-gebunden ist.
@item
Der Abschnitt @code{BUFFER POOL} gibt statistische Informationen �ber
gelesene und geschriebene Seiten. Aus diesen Zahlen k�nnen Sie errechnen,
wie viele Daten-Datei-Ein- und Ausgaben Ihre Anfragen aktuell durchf�hren.
@end itemize

@node Implementation, Table and index, InnoDB transaction model, InnoDB
@c German node Implementation
@subsection Implementation des Multiversionings

Weil InnoDB eine multiversionierte Datenbank ist, muss es Informationen
�ber alte Versionen von Zeilen im Tabellenplatz (Tablespace) aufbewahren.
Diese Informationen werden in einer Datenstruktur gespeichert, die wir in
Anlehnung an eine analoge Struktur in Oracle Rollback-Segment nennen.

InnoDB f�gt jeder Zeile, die in der Datenbank gespeichert wird, intern zwei
Felder hinzu. Ein 6 Byte gro�es Feld enth�lt den
Transaktions-Identifikator der letzten Transaktion, die die Zeile eingef�gt
oder aktualisiert hat. Ein L�schen wir intern als eine Aktualisierung
behandelt, wobei ein spezielles Bit in die Zeile eingef�gt wird, um sie als
gel�scht zu markieren. Jede Zeile enth�lt ausserdem ein 7 Byte gro�es
Feld, das Roll-Zeiger genannt wird. Der Roll-Zeiger zeigt auf einen
R�ckg�ngig-Log-Datensatz, der in das Rollback-Segment geschrieben wird.
Wenn die Zeile aktualisiert wurde, enth�lt der R�ckg�ngig-Log-Datensatz die
Informationen, die notwendig sind, um den Inhalt der Zeile wieder
herzustellen, bevor sie aktualisiert wurde.

InnoDB benutzt die Informationen im Rollback-Segment, um die
R�ckg�ngig-Operationen durchzuf�hren, die bei einem Transaktions-Rollback
notwendig sind. Diese Informationen benutzt es auch daf�r, um fr�here
Informationen einer Zeile beim Konsistenten Lesen aufzubauen.

R�ckg�ngig-Logs im Rollback-Segment lassen sich in Logs f�r Einf�gen und
f�r Aktualisieren unterteilen. Einf�ge-R�ckg�ngig-Logs werden nur f�r
Transaktions-Rollbacks ben�tigt und k�nnen verworfen werden, sobald die
Transaktion abgeschickt ist (commit). Aktualisierungs-R�ckg�ngig-Logs
werden auch f�r Konsistentes Lesens benutzt und k�nnen daher erst verworfen
werden, wenn keine Transaktion mehr vorhanden ist, f�r die InnoDB einen
Schnappschuss zugewiesen hat, dessen Informationen beim Konsistenten Lesen
ben�tigt werden k�nnten, um daraus eine fr�here Version der Datenbank-Zeile
aufzubauen.

Sie m�ssen daran denken, Ihre Transaktionen regelm��ig abzuschicken
(commit), auch die Transaktionen, die nur Konsistentes Lesens ausf�hren.
Ansonsten kann InnoDB Daten aus dem Aktualisierungs-R�ckg�ngig-Log nicht
verwerfen und das Rollback-Segment k�nnte zu Gro� werden und Ihren
Tabellenplatz (Tablespace) komplett f�llen.

Die physikalische Gr��e eines R�ckg�ngig-Log-Datensatzes im
Rollback-Segment ist typischerweise kleiner als die entsprechende
eingef�gte oder aktualisierte Zeile. Sie k�nnen diese Informationen
benutzen, um den Platzbedarf f�r Ihr Rollback-Segment zu berechnen.

In diesem multiversionierten Schema wird eine Zeile nicht unmittelbar
physikalisch aus der Datenbank entfernt, wenn Sie sie mit einem
SQL-Statement l�schen. Erst wenn InnoDB den Datensatz des
Aktualisierungs-R�ckg�ngig-Logs l�schen kann, der f�r das L�schen
geschrieben wurde, kann es die entsprechende Zeile und ihre
Index-Datens�tze auch physikalisch aus der Datenbank entfernen. Diese
Entfernungsoperation wird Purge genannt und ist recht schnell, wobei sie
�berschl�gig dieselbe Zeit ben�tigt wie das SQL-Statement, das das L�schen
ausf�hrte.


@node Table and index, File space management, Implementation, InnoDB
@c German node Tabelle und Index
@subsection Tabellen- und Index-Strukturen

MySQL speichert seine Daten-W�rterbuch-Informationen �ber Tabellen in
@file{.frm}-Dateien in den Datenbank-Verzeichnissen. Jedoch hat auch jede
Tabelle vom Typ InnoDB ihren eigenen Eintrag, in InnoDB-internen
Daten-W�rterb�chern innerhalb des Tabellenplatzes (Tablespace). Wenn MySQL
eine Tabelle oder Datenbank l�scht, muss er sowohl eine oder mehrere
@file{.frm}-Datei(en) als auch die entsprechenden Eintr�ge im
InnoDB-Daten-W�rterbuch l�schen. Das ist der Grund, warum Sie
InnoDB-Tabellen nicht einfach zwischen Datenbanken verschieben k�nnen,
indem Sie die @file{.frm}-Dateien verschieben und warum @code{DROP
DATABASE} bei InnoDB-Tabellen in MySQL-Versionen bis 3.23.43 nicht
funktionierte.

Jede InnoDB-Tabelle hat einen speziellen Index, der Cluster-Index genannt
wird, in dem die Daten der Zeilen gespeichert sind. Wenn Sie auf Ihre
Tabelle einen @code{PRIMARY KEY} definieren, ist der Index des
Prim�rschl�ssels der Cluster-Index.

Wenn Sie f�r Ihre Tabelle keinen Prim�rschl�ssel definieren, erzeugt InnoDB
intern einen Cluster-Index, bei dem die Zeilen nach der Zeilen-Kennung (ID)
geordnet sind, die InnoDB Zeilen in einer solchen Tabelle zuweist. Die
Zeilen-Kennung ist ein 6 Byte gro�es Feld, das monoton erh�ht wird, wenn
neue Zeilen eingef�gt werden. Daher liegen nach der Zeilen-Kennung
geordnete Zeile physikalisch in der Einf�ge-Reihenfolge vor.

Der Zugriff auf eine Zeile �ber den Cluster-Index ist schnell, weil die
Zeilendaten auf derselben Seite sind, auf die die Index-Suche f�hrt. In
vielen Datenbanken werden die Daten traditionell auf einer anderen Seite
als derjenigen, wo sich der Index-Datensatz befindet, gespeichert. Wenn die
Tabelle Gro� ist, spart die Cluster-Index-Architektur im Vergleich zur
traditionellen L�sung auf Festplatten-Ein- und -Ausgaben.

In InnoDB enthalten die Datens�tze in Nicht-Cluster-Indexen (die wir auch
sekund�re Indexe nennen) den Prim�rschl�sselwert f�r die Zeile. InnoDB
benutzt diesen Prim�rschl�sselwert, um vom Cluster-Index aus nach der Zeile
zu suchen. Beachten Sie, dass die sekund�ren Indexe mehr Platz ben�tigen,
wenn der Prim�rschl�ssel lang ist.



@menu
* InnoDB physical structure::   
* InnoDB Insert buffering::     
* InnoDB Adaptive hash::        
* InnoDB Physical record::      
@end menu

@node InnoDB physical structure, InnoDB Insert buffering, Table and index, Table and index
@c German node Physikalische Struktur von InnoDB
@subsubsection Physikalische Struktur eines Indexes

Alle Indexe in InnoDB sind B-B�ume, in denen die Index-Datens�tze in den
Bl�tter-Seiten des Baums gespeichert sind. Die vorgabem��ige Gr��e einer
Index-Seite ist 16 KB. Wenn neue Datens�tze eingef�gt werden, versucht
InnoDB, 1/16 der Seite f�r zuk�nftige Einf�gungen und Aktualisierungen des
Index-Datensatzes freizuhalten.

Wenn Index-Datens�tze in sequentieller (aufsteigender oder absteigender)
Reihenfolge eingef�gt werden, sind die resultierenden Index-Seiten ungef�hr
zu 15/16 gef�llt. Wenn der F�llfaktor einer Index-Seite unter 1/12 f�llt,
versucht InnoDB, den Index-Baum zusammenzuziehen, um die Seite
freizugeben.


@node InnoDB Insert buffering, InnoDB Adaptive hash, InnoDB physical structure, Table and index
@c German node Einf�gepuffer von InnoDB
@subsubsection Einf�gepufferung

H�ufig wird der Prim�rschl�ssel in Datenbank-Applikationen als eindeutiger
Identifizierer benutzt und neue Zeilen in aufsteigender Reihenfolge des
Prim�rschl�ssels eingef�gt. Daher erfordern Einf�gungen in den
Cluster-Index keine wahlfreien (random) Lesezugriffe auf die Platte.

Sekund�re Indexe auf der anderen Seite sind �blicherweise nicht eindeutig
und Einf�gungen in sekund�re Indexe erfolgen in einer relativ wahlfreien
Reihenfolge. Wenn InnoDB keinen speziellen Mechanismus hierf�r benutzen
w�rde, w�rden diese viele wahlfreie Festplatten-Ein- und -Ausgaben
verursachen.

Wenn ein Index-Datensatz in einen nicht eindeutigen sekund�ren Index
eingef�gt werden soll, pr�ft InnoDB, ob die sekund�re Index-Seite bereits
im Puffer-Pool ist. Wenn das der Fall ist, f�hrt InnoDB das Einf�gen direkt
in die Index-Seite durch. Wenn die Index-Seite aber nicht im Puffer-Pool
gefunden wird, f�gt InnoDB den Datensatz in eine spezielle
Einf�ge-Puffer-Struktur ein. Der Einf�ge-Puffer wird so klein gehalten,
dass er komplett in den Puffer-Pool passt, so dass Einf�gungen sehr schnell
durchgef�hrt werden k�nnen.

Der Einf�ge-Puffer wird periodisch mit den sekund�ren Index-B�umen in der
Datenbank vermengt. Oft k�nnen mehrere Einf�geoperationen auf derselben
Seite im Index-Baum zusammengefasst werden, so dass Festplatten-Ein- und
-Ausgaben eingespart werden. Messungen ergaben, dass der Einf�ge-Puffer
Einf�gungen in eine Tabelle bis zu 15 mal schneller machen kann.


@node InnoDB Adaptive hash, InnoDB Physical record, InnoDB Insert buffering, Table and index
@c German node Anpassungsf�higer Hash in InnoDB
@subsubsection Anpassungsf�hige Hash-Indexe

Wenn eine Datenbank fast komplette in den Hauptspeicher passt, k�nnen
Anfragen am schnellsten unter Verwendung von Hash-Indexen ausgef�hrt
werden. InnoDB hat einen automatischen Mechanismus, der Index-Suchen
beobachtet, die auf den Indexen durchgef�hrt werden, die f�r eine Tabelle
definiert wurden. Wenn InnoDB bemerkt, dass Anfragen vom Aufbauen eines
Hash-Indexes profitieren k�nnten, wird ein solcher Index automatisch
aufgebaut.

Beachten Sie aber, dass der Hash-Index immer auf der Grundlage eines
bestehenden B-Baum-Indexes auf die Tabelle aufgebaut wird. InnoDB kann
einen Hash-Index auf einem Pr�fix beliebiger L�nge des Schl�ssels aufbauen,
der f�r den B-Baum definiert wurde, abh�ngig vom Suchmuster, das InnoDB auf
dem Index-Baum beobachtet. Ein Hash-Index kann partiell sein: Es ist nicht
erforderlich, dass der gesamte Index-Baum im Puffer-Pool
zwischengespeichert ist. InnoDB baut Hash-Indexe bei Bedarf automatisch f�r
die Index-Seiten auf, auf die oft zugegriffen wird.

In gewisser Hinsicht kommt InnoDB durch den anpassungsf�higen
Hash-Index-Mechanismus (wobei sich InnoDB �ppig verf�gbarem Hauptspeicher
anpasst) der Architektur von Hauptspeicher-Datenbanken nahe.


@node InnoDB Physical record,  , InnoDB Adaptive hash, Table and index
@c German node Physikalischer Datensatz in InnoDB
@subsubsection Physikalische Datensatzstruktur

@itemize @bullet
@item
Jeder Index-Datensatz in InnoDB enth�lt einen Header von 6 Bytes. Der
Header wird benutzt, um nachfolgende Datens�tze zu verkn�pfen, sowie beim
Sperren auf Zeilenebene.
@item
Datens�tze im Cluster-Index enthalten Felder f�r alle benutzerdefinierten
Spalten. Zus�tzlich gibt es ein 6 Byte gro�es Feld f�r die
Transaktions-Kennung und ein 7 Byte gro�es Feld f�r den Roll-Zeiger.
@item
Wenn der Benutzer keinen Prim�rschl�ssel f�r eine Tabelle definiert hat,
enth�lt jeder Cluster-Index-Datensatz zus�tzlich ein 6 Byte gro�es
Zeilenkennungsfeld.
@item
Jeder sekund�re Index-Datensatz enth�lt auch alle Felder, die f�r den
Cluster-Index-Schl�ssel definiert wurden.
@item
Ein Datensatz enth�lt auch einen Zeiger zu jedem Feld des Datensatzes. Wenn
die Gesamtl�nge des Feldes in einem Datensatz kleiner als 128 Bytes ist,
ist der Zeiger 1 Byte lang, ansonsten 2 Bytes.
@end itemize

@subsubsection Wie eine Auto-Increment-Spalte in InnoDB funktioniert

Wenn der Benutzer nach einem Datenbankstart zuerst einen Datensatz in eine
Tabelle @code{T} einf�gt, in der eine Auto-Increment-Spalte definiert
wurde, und er keinen expliziten Wert f�r die Spalte angibt, f�hrt InnoDB
@code{SELECT MAX(auto-inc-column) FROM T} aus und weist den um 1
hochgez�hlten Wert der Spalte und dem Auto-Increment-Z�hler der Tabelle zu.
Wir sagen dazu, dass der Auto-Increment-Z�hler f�r Tabelle @code{T}
initialisiert wurde.

InnoDB f�hrt dieselbe Prozedur der Initialisierung des
Auto-Increment-Z�hlers f�r eine frisch erzeugte Tabelle durch.

Wenn Sie f�r die Auto-Increment-Spalte einen Wert von 0 angeben, beachten
Sie, dass InnoDB die Zeile so behandelt, als h�tten Sie den Wert nicht
angegeben.

Wenn nach der Initialisierung des Auto-Increment-Z�hlers der Benutzer eine
Zeile eingibt, in der er explizit den Spaltenwert angibt, und dieser
gr��er als der aktuelle Z�hlerwert ist, wird der Z�hler auf den
angegebenen Spaltenwert gesetzt. Wenn der Benutzer nicht explizit einen
Wert angibt, z�hlt InnoDB den Z�hler um 1 hoch und weist der Spalte diesen
neuen Wert zu.

Der Auto-Increment-Mechanismus umgeht beim Zuweisen von Werten vom Z�hler
Sperren und Transaktionshandhabung. Daher k�nnen L�cken in der
Nummernfolge entstehen, wenn Sie Transaktionen zur�ckrollen (Rollback), die
Nummern vom Z�hler erhalten haben.

Das Verhalten von Auto-Increment ist f�r die F�lle undefiniert, in denen
ein Benutzer der Spalte einen negativen Wert gibt oder wenn der Wert
gr��er als die gr��te Ganzzahl wird, die im festgelegten Ganzzahl-Typ
gespeichert werden kann.


@node File space management, Error handling, Table and index, InnoDB
@c German node Verwaltung von Datei-Speicherplatz
@subsection Verwaltung von Datei-Speicherplatz und Festplatten-Eingaben / -Ausgaben



@menu
* InnoDB Disk I/O::             
* InnoDB File space::           
* InnoDB File Defragmenting::   
@end menu

@node InnoDB Disk I/O, InnoDB File space, File space management, File space management
@c German node Festplatten-Ein- und -Ausgaben bei InnoDB
@subsubsection Festplatten-Ein- und -Ausgaben

Bei Festplatten-Ein- und -Ausgaben benutzt InnoDB asynchrone Ein- und
Ausgaben. Unter Windows NT benutzt es die nativen Ein- und Ausgaben, die
vom Betriebssystem zur Verf�gung gestellt werden. Unter Unix benutzt InnoDB
simulierte asynchrone Ein- und Ausgaben, die in InnoDB eingebaut sind:
InnoDB erzeugt eine Reihe von Ein-/Ausgabe-Threads, die sich um Ein- und
Ausgabeoperationen k�mmern, zum Beispiel Vorw�rts-Lesen (Read-Ahead).
Zuk�nftig werden wir auch f�r Windows NT simulierte Ein-/Ausgaben
unterst�tzen sowie f�r die Unix-Versionen, die so etwas besitzen, native
Ein-/Ausgaben.

Unter Windows NT benutzt InnoDB ungepufferte Ein- und Ausgaben. Das hei�t,
dass die Festplatten-Seiten, die InnoDB liest oder schreibt, nicht im
Datei-Cache des Betriebssystems gepuffert werden. Das spart einiges an
Arbeitsspeicher-Bandbreite.

Ab Version 3.23.41 benutzt InnoDB eine neuartige Datei-Flush-Technik, die
Doublewrite hei�t. Sie erh�ht die Sicherheit bei Reparaturen nach Absturz,
wenn ein Betriebssystemabsturz oder ein Stromausfall aufgetreten sind, und
verbessert auf den meisten Unix-Versionen die Performance, indem die
Notwendigkeit von Fsync-Operationen verringert wird.

Doublewrite bedeutet, dass InnoDB zuerst in einen zusammenh�ngenden
Tabellenplatz (Tablespace) namens Doublewrite-Puffer schreibt, bevor Seiten
in eine Daten-Datei geschrieben werden. Erst nachdem das Schreiben und
Zur�ckschreiben (Flush) in den Doublewrite-Puffer fertig sind, schreibt
InnoDB die Seiten an ihre korrekten Positionen in der Daten-Datei. Wenn das
Betriebssystem mitten in einem Seiten-Schreiben abst�rzt, findet InnoDB bei
der Wiederherstellung eine gute Kopie der Seite im Doublewrite-Puffer.

Ab Version 3.23.41 k�nnen Sie auch eine Raw-Disk-Partition als Daten-Datei
benutzen, obwohl das bisher noch nicht getestet wurde. Wenn Sie eine neue
Daten-Datei erzeugen, m�ssen Sie das Schl�sselwort @code{newraw}
unmittelbar nach der Daten-Datei-Gr��e in @code{innodb_data_file_path}
angeben. Die Partition muss gr��er oder gleich der Gr��e sein, die Sie
angeben. Beachten Sie, dass in InnoDB 1 MB 1024 x 1024 Bytes ist, w�hrend 1
MB in Festplatten-Spezifikationen �blicherweise 1.000.000 Bytes bedeutet.

@example
innodb_data_file_path=hdd1:5Gnewraw;hdd2:2Gnewraw
@end example

Wenn Sie die Datenbank wieder starten, @strong{m�ssen} -sue das
Schl�sselwort in @code{raw} �ndern. Ansonsten schreibt InnoDB �ber Ihre
Partition!

@example
innodb_data_file_path=hdd1:5Graw;hdd2:2Graw
@end example

Wenn Sie Raw-Disk benutzen, k�nnen Sie unter einigen Unixen ungepufferte
Ein- und Ausgaben ausf�hren.

Es gibt zwei Vorw�rts-Lesen-(Read-Ahead-)Heuristiken in InnoDB:
sequentielles Vorw�rts-Lesen und wahlfreies (random) Vorw�rts-Lesen. Beim
sequentiellen Vorw�rts-Lesen bemerkt InnoDB, dass das Zugriffsschema auf
ein Segment im Tabellenplatz (Tablespace) sequentiell ist. InnoDB schickt
dann vorab einen Stapel von Lesevorg�ngen von Datenbankseiten an das
Ein-/Ausgabesystem. Beim wahlfreien Vorw�rts-Lesen bemerkt InnoDB, dass ein
bestimmter Bereich im Tabellenplatz (Tablespace) im Zustand des vollst�ndig
Eingelesenwerdens in den Puffer-Pool zu sein scheint. Dann schickt InnoDB
die verbleibenden Lesevorg�nge an das Ein-/Ausgabesystem.


@node InnoDB File space, InnoDB File Defragmenting, InnoDB Disk I/O, File space management
@c German node Speicherplatz in InnoDB
@subsubsection Speicherplatzverwaltung

Die Daten-Dateien, die Sie in der Konfigurationsdatei definieren, formen
den Tabellenplatz (Tablespace) von InnoDB. Die Dateien werden einfach
verkettet, um den Tabellenplatz (Tablespace) zu formen, es wird kein
Striping benutzt. Momentan k�nnen Sie nicht direkt angeben, wo der Platz
f�r Ihre Tabellen zugewiesen werden soll, ausser wenn Sie folgende Tatsache
benutzen: InnoDB weist Speicherplatz von einem neu erzeugten Tabellenplatz
(Tablespace) vom niedrigen Ende ausgehend zu.

Der Tabellenplatz (Tablespace) besteht aus Datenbankseiten, deren
vorgabem��ige Gr��e 16 KB betr�gt. Diese Seiten werden bis zu einer
Ausdehnung von 64 aufeinander folgenden Seiten gruppiert. Die 'Dateien'
innerhalb eines Tabellenplatzes (Tablespace) werden in InnoDB Segmente
genannt. Der Name des Rollback-Segments ist in gewisser Hinsicht
irref�hrend, weil dieses tats�chlich viele Segmente im Tabellenplatz
enth�lt.

F�r jeden Index in InnoDB werden zwei Segmente zugewiesen: eins f�r die
Nicht-Bl�tter-Knoten (Non-Leaf-Nodes) des B-Baum, das andere f�r die
Bl�tter-Knoten. Die Idee dahinter ist, f�r die Bl�tter-Knoten, die die
Daten enthalten, bessere Sequentialit�t zu erzielen.

Wenn ein Segment innerhalb des Tabellenplatzes anw�chst, weist ihm InnoDB
die ersten 32 Seiten individuell zu. Danach f�ngt InnoDB an, dem Segment
ganze Ausdehnungen zuzuweisen. InnoDB kann einem gro�en Segment bis zu
vier Ausdehnungen auf einmal hinzuf�gen, um gute Sequentialit�t f�r die
Daten sicherzustellen.

Einige Seiten im Tabellenplatz enthalten Bitmaps anderer Seiten. Daher
k�nnen einige Ausdehnungen in einem InnoDB-Tabellenplatz (Tablespace) nicht
Segmenten als Ganzes zugewiesen werden, sondern nur als individuelle
Seiten.

Wenn Sie eine Anfrage @code{SHOW TABLE STATUS FROM ... LIKE ...} ausf�hren,
um den verf�gbaren freien Platz im Tabellenplatz festzustellen, berichtet
InnoDB den Platz, der in v�llig freien Ausdehnungen im Tabellenplatz sicher
benutzt werden kann. InnoDB reserviert immer einige Ausdehnungen f�r
S�uberungs- und interne Zwecke. Diese Ausdehnungen werden nicht in den
freien Platz einbezogen.

Wenn Sie Daten aus einer Tabelle l�schen, zieht InnoDB die entsprechenden
B-Baum-Indexe zusammen. Es h�ngt vom Schema der L�schvorg�nge ab, ob das
individuelle Seiten oder Ausdehnungen im Tabellenplatz freigibt, so dass
der freigegebene Platz anderen Benutzern zur Verf�gung steht. Wenn eine
Tabelle gel�scht wird oder alle Zeilen aus ihr gel�scht werden, gibt das
garantiert Platz frei f�r andere Benutzer, aber denken Sie daran, dass
gel�schte Zeile physikalisch nur durch eine Purge-Operation entfernt werden
k�nnen, nachdem Sie nicht mehr f�r ein Transaktions-Rollback oder f�r
Konsistentes Lesen ben�tigt werden.


@node InnoDB File Defragmenting,  , InnoDB File space, File space management
@c German node Datei-Defragmentierung in InnoDB
@subsubsection Eine Tabelle defragmentieren

Wenn es wahlfreie (random) Einf�ge- oder L�schvorg�nge in die Indexe einer
Tabelle gibt, k�nnen die Indexe fragmentiert werden. Unter Fragmentierung
verstehen wird, dass die physikalische Reihenfolge der Index-Seiten auf der
Platte der alphabetischen Reihenfolge der Datens�tze auf den Seiten nicht
nahe kommt oder dass es viele unbenutzte Seiten in den 64-Seiten-Bl�cken
gibt, die dem Index zugewiesen wurden.

Index-Scans k�nnen beschleunigt werden, wenn Sie von Zeit zu Zeit
@code{mysqldump} benutzen, um die Tabelle in eine Textdatei zu dumpen, dann
die Tabelle zu l�schen und sie aus dem Dump neu aufzubauen. Eine weitere
M�glichkeit zur Defragmentierung besteht darin, den Tabellentyp in
@code{MyISAM} zu �ndern (@code{ALTER}) und danach wieder in @code{InnoDB}
zur�ck. Beachten Sie, dass die @code{MyISAM}-Tabelle auf Ihrem
Betriebssystem in eine einzige Datei passen muss.

Wenn die Einf�gungen in einen Index immer aufsteigend sind und Datens�tze
nur vom Ende gel�scht werden, garantiert der
Speicherplatzverwaltungs-Algorithmus von InnoDB, dass keine Fragmentierung
im Index auftritt.


@node Error handling, InnoDB restrictions, File space management, InnoDB
@c German node Fehlerbehandlung
@subsection Fehlerbehandlung

Die Fehlerbehandlung in InnoDB ist nicht immer so, wie es die
ANSI-SQL-Standards festlegen. Nach ANSI-Standard sollte jeder Fehler
w�hrend eines SQL-Statements ein Rollback des Statements verursachen.
InnoDB rollt manchmal nur Teile des Statements oder auch die gesamte
Transaktion zur�ck. Folgende Liste gibt die Fehlerbehandlung von InnoDB an:

@itemize @bullet
@item
Wenn es keinen Speicherplatz mehr im Tabellenplatz (Tablespace) gibt,
bekommen Sie den MySQL-Fehler @code{'Table is full'} und InnoDB rollt das
SQL-Statement zur�ck.
@item
Eine Transaktions-Blockierung oder eine Zeit�berschreitung beim Warten auf
eine Sperre f�hren dazu, dass InnoDB die gesamte Transaktion zur�ckrollt.
@item
Ein Fehler wegen doppelter Schl�sseleintr�ge rollt das Einf�gen dieser
Zeile zur�ck, selbst in einem Statement wie @code{INSERT INTO ... SELECT
...}. Das wird sich voraussichtlich �ndern, so dass das SQL-Statement
zur�ckgerollt wird, wenn Sie die @code{IGNORE}-Option in Ihrem Statement
nicht angegeben haben.
@item
Ein Fehler 'row too long' rollt das SQL-Statement zur�ck.
@item
Andere Fehler werden zumeist durch die MySQL-Code-Ebene entdeckt und rollen
das entsprechende SQL-Statement zur�ck.
@end itemize


@node InnoDB restrictions, InnoDB contact information, Error handling, InnoDB
@c German node InnoDB-Einschr�nkungen
@subsection Beschr�nkungen von InnoDB-Tabellen

@itemize @bullet

@item
@strong{ACHTUNG:} Konvertieren Sie @strong{KEINE} MySQL-Systemtabellen von
MyISAM in InnoDB-Tabellen! Das wird nicht unterst�tzt. Wenn Sie es dennoch
tun, startet MySQL nicht mehr, bis Sie die alten Systemtabellen aus einer
Datensicherung wiederhergestellt haben oder sie mit dem
mysql_install_db-Skript neu erzeugen.

@item
@code{SHOW TABLE STATUS} gibt keine genauen Statistiken �ber
InnoDB-Tabellen, ausser �ber die physikalische Gr��e, die durch die
Tabelle reserviert wird. Der Zeilenz�hler ist nur eine grobe Sch�tzung, die
bei der SQL-Optimierung benutzt wird.

@item
Wenn Sie versuchen, einen eindeutigen Index auf ein Pr�fix einer Spalte zu
erzeugen, erhalten Sie einen Fehler:

@example
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
@end example

Wenn Sie einen nicht eindeutigen Index auf ein Spaltenpr�fix erzeugen,
erzeugt InnoDB einen Index �ber die gesamte Spalte.
@item
@code{INSERT DELAYED} wird f�r InnoDB-Tabellen nicht unterst�tzt.
@item
Die MySQL-@code{LOCK TABLES}-Operation wei� nichts von InnoDB-Sperren auf
Zeilenebene, die in bereits fertigen SQL-Statements gesetzt sind. Das
bedeutet, dass Sie eine Tabellensperre auf eine Tabelle selbst dann
erhalten k�nnen, wenn es noch Transaktionen anderer Benutzer gibt, die
Sperren auf Zeilenebene auf dieselbe Tabelle haben. Daher kann es sein,
dass Ihre Operationen auf die Tabelle warten m�ssen, wenn sie mit diesen
Sperren anderer Benutzer kollidieren. Auch eine Blockierung ist m�glich.
Dennoch gef�hrdet das nicht die Transaktionsintegrit�t, weil sich die
Sperren auf Zeilenebene, die InnoDB setzt, um die Integrit�t k�mmern.
Zus�tzlich hindert eine Tabellensperren andere Transaktionen daran, weitere
Sperren auf Zeilenebene (in einem konfliktbehafteten Sperrmodus) auf die
Tabelle zu erlangen.
@item
Sie k�nnen keinen Schl�ssel auf eine @code{BLOB}- oder @code{TEXT}-Spalte
setzen.
@item
Eine Tabelle kann nicht mehr als 1.000 Spalten enthalten.
@item
@code{DELETE FROM TABLE} erzeugt die Tabelle nicht neu, sondern l�scht
statt dessen alle Zeilen, eine nach der anderen, was nicht sehr schnell
ist. In zuk�nftigen MySQL-Versionen k�nnen Sie @code{TRUNCATE} benutzen,
was schnell ist.
@item
Die vorgabem��ige Datenbank-Seitengr��e in InnoDB betr�gt 16 KB. Indem
Sie den Code neu kompilieren, k�nnen Sie sie auf Werte zwischen 8 KB und 64
KB setzen. Die maximale Zeilenl�nge betr�gt etwas weniger als die H�lfte
der Datenbank-Seite in den InnoDB-Versionen kleiner oder gleich 3.23.40. Ab
Quelldistribution 3.23.41 d�rfen BLOB- und TEXT-Spalten bis zu 4 GB Gro�
sein, die gesamte Zeilenl�nge kann auch < 4 GB betragen. InnoDB speichert
Felder, deren Gr��e kleiner oder gleich 128 Bytes betr�gt, nicht auf
separaten Seiten. Nachdem InnoDB die Zeile ge�ndert hat, indem lange Felder
auf separaten Seiten gespeichert werden, muss die restliche Zeilenl�nge
weniger als die H�lfte einer Datenbank-Seite betragen. Die maximale
Schl�ssell�nge betr�gt 7.000 Bytes.
@item
Auf einigen Betriebssystemen m�ssen Daten-Dateien kleiner als 2 GB sein.
Die Gesamtgr��e der Log-Dateien muss auf 32-Bit-Computern kleiner als 4 GB
sein.
@item
Die maximale Gr��e des Tabellenplatzes (Tablespace) betr�gt 4 Milliarden
Datenbank-Seiten. Das ist auch die maximale Gr��e f�r eine Tabelle. Die
minimale Gr��e des Tabellenplatzes (Tablespace) betr�gt 10 MB.
@end itemize


@node InnoDB contact information,  , InnoDB restrictions, InnoDB
@c German node InnoDB-Kontaktinformationen
@subsection InnoDB-Kontaktinformationen

Kontaktinformationen von Innobase Oy, Hersteller der InnoDB-Engine:
Website: @uref{http://www.innodb.com/}.
E-Mail: @email{Heikki.Tuuri@@innodb.com}

@example
Telefon: 358-9-6969 3250 (B�ro) 358-40-5617367 (mobil)
Innobase Oy Inc.
World Trade Center Helsinki
Aleksanterinkatu 17
P.O.Box 800
00101 Helsinki
Finnland
@end example


@node BDB,  , InnoDB, Table types
@c German node BDB
@section BDB- oder Berkeley_db-Tabellen

@cindex Tabellen, @code{BDB}
@cindex Tabellen, @code{Berkeley DB}


@menu
* BDB overview::                
* BDB install::                 
* BDB start::                   
* BDB characteristics::         
* BDB TODO::                    
* BDB portability::             
* BDB errors::                  
@end menu

@node BDB overview, BDB install, BDB, BDB
@c German node BDB-�berblick
@subsection �berblick �ber BDB-Tabellen

Unterst�tzung f�r BDB-Tabellen ist in der MySQL-Quelldistribution seit
Version 3.23.34 enthalten und in der MySQL-Max-Bin�rdistribution aktiviert.

BerkeleyDB, erh�ltlich unter @uref{http://www.sleepycat.com/}, stattet
MySQL mit einem transaktionalen Tabellen-Handler aus. Wenn Sie
BerkeleyDB-Tabellen benutzen, haben Ihre Tabellen eine h�here Chance,
Abst�rze zu �berleben. Zus�tzlich stehen @code{COMMIT} und @code{ROLLBACK}
f�r Transaktionen zur Verf�gung. Die MySQL-Quelldistribution enth�lt eine
BDB-Distribution, die eine Reihe kleiner Patches hat, damit sie glatter mit
MySQL zusammen arbeitet. Sie k�nnen keine nicht gepatchte
@code{BDB}-Version f�r MySQL verwenden.

Wir bei MySQL AB arbeiten in enger Kooperation mit Sleepycat, um die hohe
Qualit�t der MySQL-/BDB-Schnittstelle zu halten.

Was den Support f�r BDB-Tabellen angeht, sehen wir uns in der Pflicht,
unseren Benutzern zu helfen, Probleme zu lokalisieren und Ihnen zu helfen,
einen reproduzierbaren Testfall f�r jegliche Probleme mit BDB-Tabellen zu
erstellen. Solche ein Fall wird an Sleepycat weiter geleitet, die sich dann
an uns wenden, um uns zu helfen, das Problem zu finden und zu beheben. Weil
das also in zwei Schritten abl�uft, kann es bei jeglichen Problemen mit
BDB-Tabellen etwas l�nger dauern, diese zu l�sen, als das bei anderen
Tabellen-Handlern der Fall ist. Weil jedoch der BerkeleyDB-Code selbst auch
von vielen sonstigen Applikationen benutzt wird, sind hierbei keine gro�en
Probleme zu erwarten. @xref{Support}.


@node BDB install, BDB start, BDB overview, BDB
@c German node BDB installieren
@subsection BDB installieren

Wenn Sie eine Bin�rdistribution von MySQL herunter geladen haben, die
Unterst�tzung f�r BerkeleyDB enth�lt, folgen Sie einfach den Anweisungen
zur Installation einer Bin�rversion von MySQL. @xref{MySQL binaries}.  @xref{mysqld-max, , @code{mysqld-max}}.

Um MySQL mit BerkeleyDB-Unterst�tzung zu kompilieren, laden Sie
MySQL-Version 3.23.34 oder neuer herunter und konfigurieren Sie
@code{MySQL} mit der @code{--with-berkeley-db}-Option.
@c German FIX unwrapped @xref
@xref{Installing source}.

@example
cd /pfad/zur/quelle/von/mysql-3.23.34
./configure --with-berkeley-db
@end example

Bitte sehen Sie wegen aktuellerer Informationen im Handbuch nach, das mit
der @code{BDB}-Distribution mitgeliefert wird.

Obwohl BerkeleyDB selbst sehr gut getestet und zuverl�ssig ist, wird die
MySQL-Schnittstelle noch als Beta-Qualit�t erachtet. Wir verbessern diese
aktiv und optimieren sie, um sie sehr bald stabil zu bekommen.


@node BDB start, BDB characteristics, BDB install, BDB
@c German node BDB starten
@subsection BDB-Startoptionen

Wenn Sie mit @code{AUTOCOMMIT=0} fahren, werden Ihre �nderungen in
@code{BDB}-Tabellen erst aktualisiert, wenn Sie @code{COMMIT} ausf�hren.
Statt dessen k�nnen Sie @code{ROLLBACK} ausf�hren, um Ihre �nderungen zu
verwerfen. @xref{COMMIT}.

Wenn Sie mit @code{AUTOCOMMIT=1} fahren (der Vorgabe), werden Ihre
�nderungen sofort abgeschickt. Sie k�nnen eine ausgedehnte Transaktion mit
dem SQL-Befehl @code{BEGIN WORK} starten. Danach werden Ihre �nderungen
solange nicht abgeschickt, bis Sie @code{COMMIT} ausf�hren (oder sich f�r
@code{ROLLBACK} entscheiden, um Ihre �nderungen zu verwerfen).

Folgende Optionen f�r @code{mysqld} k�nnen benutzt werden, um das Verhalten
von BDB-Tabellen zu �ndern:

@multitable @columnfractions .30 .70
@item @strong{Option} @tab @strong{Beschreibung}
@item @code{--bdb-home=directory} 
 @tab Base Verzeichnis f�r BDB-Tabellen. Das sollte dasselbe Verzeichnis sein, das Sie f�r --datadir benutzen.
@item @code{--bdb-lock-detect=#} 
 @tab Berkeley-Sperr-Erkennung. # steht f�r DEFAULT, OLDEST, RANDOM oder YOUNGEST.
@item @code{--bdb-logdir=Verzeichnis}
 @tab BerkeleyDB-Log-Datei-Verzeichnis.
@item @code{--bdb-no-sync}
 @tab Flush-Logs nicht synchronisieren.
@item @code{--bdb-no-recover}
 @tab BerkeleyDB nicht im Wiederherstellungsmodus starten.
@item @code{--bdb-shared-data}
 @tab BerkeleyDB im Multi-Prozess-Modus starten (@code{DB_PRIVATE} bei der Initialisierung von BerkeleyDB nicht verwenden).
@item @code{--bdb-tmpdir=verzeichnis}
 @tab Name der tempor�ren Datei von BerkeleyDB.
@item @code{--skip-bdb}
 @tab BerkeleyDB nicht benutzen.
@item @code{-O bdb_max_lock=1000}
 @tab Setzt die h�chste Anzahl m�glicher Sperren. @xref{SHOW VARIABLES}.
@end multitable

Wenn Sie @code{--skip-bdb} benutzen, initialisiert MySQL nicht die
BerkeleyDB-Bibliothek und spart deshalb viel Speicher. Nat�rlich k�nnen Sie
@code{BDB}-Tabellen nicht benutzen, wenn Sie diese Option verwenden.

Normalerweise sollten Sie @code{mysqld} ohne @code{--bdb-no-recover}
starten, wenn Sie vorhaben, BDB-Tabellen zu verwenden. Das kann allerdings
zu Problemen f�hren, wenn Sie @code{mysqld} starten und die BDB-Log-Dateien
besch�digt sind. @xref{Starting server}.

Mit @code{bdb_max_lock} k�nnen Sie die maximale Anzahl von Sperren
festlegen (vorgabem��ig 10.000), die auf einer BDB-Tabelle aktiv sein
k�nnen. Sie sollten diesen Wert herauf setzen, wenn Sie Fehler vom Typ
@code{bdb: Lock table is out of available locks} oder @code{Got error 12
from ...} erhalten, wenn Sie lange Transaktionen ausf�hren oder wenn
@code{mysqld} viele Zeilen untersuchen muss, um die Anfrage zu berechnen.

Sie k�nnten auch @code{binlog_cache_size} und @code{max_binlog_cache_size}
�ndern, wenn Sie gro�e, vielzeilige Transaktionen benutzen. @xref{COMMIT}.


@node BDB characteristics, BDB TODO, BDB start, BDB
@c German node BDB-Charakteristiken
@subsection Kennzeichen von @code{BDB}-Tabellen

@itemize @bullet
@item
Um Transaktionen zur�ckrollen zu k�nnen, unterh�lt BDB Log-Dateien. Um
maximale Performance zu erzielen, sollten Sie diese auf andere Festplatten
platzieren als Ihre Datenbanken, indem Sie die @code{--bdb_log_dir}-Option
benutzen.
@item
MySQL macht jedes Mal, wenn eine neue BDB-Log-Datei gestartet wird, einen
Checkpoint und entfernt alle Log-Dateien, die nicht f�r aktuelle
Transaktionen ben�tigt werden. Sie k�nnen auch jederzeit @code{FLUSH LOGS}
laufen lassen, um einen Checkpoint f�r die BerkeleyDB-Tabellen anzulegen.

F�r die Wiederherstellung nach Abst�rzen sollten Sie Datensicherungen der
Tabellen plus das Bin�r-Log von MySQL benutzen. @xref{Backup}.

@strong{Achtung}: Wenn Sie alte Log-Dateien l�schen, die in Benutzung sind,
ist BDB nicht in der Lage, Wiederherstellungen durchzuf�hren, und Sie
k�nnten Daten verlieren, wenn etwas schief geht.
@item
MySQL erfordert einen @code{PRIMARY KEY} in jeder BDB-Tabelle, um auf
vorher gelesene Zeilen verweisen zu k�nnen. Wenn Sie keine Prim�rschl�ssel
anlegen, erzeugt MySQL einen versteckten @code{PRIMARY KEY}. Der versteckte
Schl�ssel hat eine L�nge von 5 Bytes und wird bei jedem Einf�geversuch um 1
hochgez�hlt.
@item
Wenn alle Spalten, auf die Sie in einer @code{BDB}-Tabelle zugreifen, Teil
desselben Indexes oder Teil des Prim�rschl�ssels sind, kann MySQL die
Anfrage ausf�hren, ohne auf die tats�chliche Zeile zugreifen zu m�ssen. Bei
einer @code{MyISAM}-Tabelle gilt das nur, wenn die Spalten Teil desselben
Indexes sind.
@item
Der @code{PRIMARY KEY} ist schneller als jeder andere Schl�ssel, weil
@code{PRIMARY KEY} zusammen mit den Zeilendaten gespeichert wird. Weil die
anderen Schl�ssel als Schl�sseldaten plus @code{PRIMARY KEY} gespeichert
werden, ist es wichtig, den @code{PRIMARY KEY} so kurz wie m�glich zu
halten, um Plattenplatz zu sparen und bessere Geschwindigkeit zu erzielen.
@item
@code{LOCK TABLES} funktioniert bei @code{BDB}-Tabellen wie bei anderen
Tabellen. Wenn Sie @code{LOCK TABLE} nicht benutzen, f�hrt MySQL einer
interne mehrfache Schreibsperre auf die Tabelle aus, um sicherzustellen,
dass die Tabelle korrekt gesperrt ist, wenn ein anderer Thread eine
Tabellensperre ausf�hrt.
@item
Internes Sperren in @code{BDB}-Tabellen wird auf Seitenebene durchgef�hrt.
@item
@code{SELECT COUNT(*) FROM tabelle} ist langsam, weil @code{BDB}-Tabellen
keinen Z�hler f�r die Anzahl der Zeilen in der Tabelle unterhalten.
@item
Scannen ist langsamer als bei @code{MyISAM}-Tabellen, weil Daten in
BDB-Tabellen in B-B�umen und nicht in separaten Daten-Dateien gespeichert
werden.
@item
Die Applikation muss stets darauf vorbereitet sein, F�lle zu handhaben, bei
denen jegliche �nderung einer @code{BDB}-Tabelle zu einem automatischen
Rollback f�hren kann und jegliches Lesen fehlschlagen kann, weil ein
Blockierungsfehler auftritt.
@item
Schl�ssel werden nicht auf vorherige Schl�ssel komprimiert, wie das bei
ISAM- und MyISAM-Tabellen der Fall ist. Mit anderen Worten ben�tigt die
Schl�sselinformation etwas mehr Platz bei @code{BDB}-Tabellen im Vergleich
zu MyISAM-Tabellen, die nicht @code{PACK_KEYS=0} benutzen.
@item
Oft gibt es L�cher in der BDB-Tabelle, damit Sie neue Zeilen in der Mitte
des Schl�sselbaums einf�gen k�nnen. Das macht BDB-Tabellen etwas gr��er
als MyISAM-Tabellen.
@item
Der Optimierer muss n�herungsweise die Anzahl von Zeilen in der Tabelle
kennen. MySQL l�st dieses Problem, indem Einf�geoperationen gez�hlt werden,
und unterh�lt diese in einem separaten Segment in jeder BDB-Tabelle. Wenn
Sie nicht viele @code{DELETE} oder @code{ROLLBACK} ausf�hren, sollte diese
Zahl ausreichend genau f�r den MySQL-Optimierer sein. Weil MySQL die Zahl
nur beim Schlie�en speichert, kann sie falsch sein, wenn MySQL unerwartet
stirbt. Das sollte kein schwerer Fehler sein, selbst wenn die Zahl nicht
100% korrekt ist. Man kann die Anzahl von Zeilen aktualisieren, indem man
@code{ANALYZE TABLE} oder @code{OPTIMIZE TABLE} ausf�hrt.
@c German FIX Unsplit @xref
@xref{ANALYZE TABLE}. @xref{OPTIMIZE TABLE}.
@item
Wenn die Platte bei einer @code{BDB}-Tabelle voll wird, erhalten Sie einen
Fehler (wahrscheinlich Fehler 28) und die Transaktion sollte zur�ckgerollt
werden. Das steht im Gegensatz zu @code{MyISAM}- and @code{ISAM}-Tabellen,
bei denen @code{mysqld} wartet, bis genug Plattenplatz frei ist, bevor
weiter gemacht wird.
@end itemize


@node BDB TODO, BDB portability, BDB characteristics, BDB
@c German node BDB-TODO-Liste
@subsection Was in naher Zukunft bei BDB in Ordnung gebracht werden muss

@itemize @bullet
@item
Viele BDB-Tabellen zur gleichen Zeit �ffnen ist sehr langsam. Wenn Sie
BDB-Tabellen benutzen wollen, sollten Sie einen sehr gro�en Tabellen-Cache
haben (evtl. gr��er als 256) und beim @code{mysql}-Client
@code{--no-auto-rehash} benutzen. Das soll partiell in Version 4.0 behoben
werden.
@item
@code{SHOW TABLE STATUS} gibt momentan noch nicht viele Informationen �ber
BDB-Tabellen aus.
@item
Performance optimieren.
@item
Es sollten �berhaupt keine Seitensperren mehr benutzt werden, wenn Tabellen
gescannt werden.
@end itemize


@node BDB portability, BDB errors, BDB TODO, BDB
@c German node BDB-Portabilit�t
@subsection Betriebssysteme, die von @strong{BDB} unterst�tzt werden

Wenn Sie MySQL mit Unterst�tzung f�r BDB-Tabellen gebaut haben und
folgenden Fehler in der Log-Datei sehen, wenn Sie @code{mysqld} starten:

@example
bdb: architecture lacks fast mutexes: applications cannot be threaded
Can't init databases
@end example

Bedeutet das, dass @code{BDB}-Tabellen f�r Ihre Architektur nicht
unterst�tzt werden. In diesem Fall m�ssen Sie MySQL erneut bauen, ohne
Unterst�tzung f�r BDB-Tabellen.

HINWEIS: Folgende Liste ist nicht komplett. Sie wird aktualisiert, sobald
wir mehr Informationen dar�ber haben.

Momentan wissen wir, dass BDB-Tabellen auf folgenden Betriebssystemen
laufen:

@itemize @bullet
@item
Linux 2.x intel
@item
Solaris sparc
@item
Caldera (SCO) OpenServer
@item
Caldera (SCO) UnixWare 7.0.1
@end itemize

Auf folgenden Betriebssystemen l�uft BDB nicht:

@itemize @bullet
@item
Linux 2.x Alpha
@item
Mac OS X
@end itemize


@node BDB errors,  , BDB portability, BDB
@c German node BDB-Fehler
@subsection Fehler, die bei der Benutzung von BDB-Tabellen auftreten k�nnen

@itemize @bullet
@item
Wenn Sie folgenden Fehler in der @code{hostname.err}-Log-Datei beim Start
von @code{mysqld} erhalten:

@example
bdb:  Ignoring log file: .../log.XXXXXXXXXX: unsupported log version #
@end example
Bedeutet das, dass die neue @code{BDB}-Version das alte Log-Dateiformat
nicht unterst�tzt. In diesem Fall m�ssen Sie alle @code{BDB}-Log-Dateien
aus Ihrem Datenbankverzeichnis l�schen (die Dateien haben das Format
@code{log.XXXXXXXXXX}) und @code{mysqld} neu starten. Wir empfehlen
ausserdem, dass Sie @code{mysqldump --opt} auf Ihre alten
@code{BDB}-Tabellen ausf�hren, die alten Tabellen l�schen und aus dem Dump
wiederherstellen.
@item
Wenn Sie im @code{auto_commit}-Modus fahren und eine Tabelle l�schen, die
durch einen anderen Thread benutzt wird, erhalten Sie wom�glich folgende
Fehlermeldungen in der MySQL-Fehlerdatei:

@example
001119 23:43:56  bdb:  Missing log fileid entry
001119 23:43:56  bdb:  txn_abort: Log undo failed for LSN: 1 3644744: Invalid
@end example

Das ist kein schwerer Fehler, aber wir empfehlen, alle Tabellen zu l�schen,
wenn Sie nicht im @code{auto_commit}-Modus sind, bis dieses Problem behoben
ist (die Behebung ist nicht trivial).
@end itemize


@node Clients, Extending MySQL, Table types, Top
@c German node MySQL-APIs
@chapter MySQL-APIs

@cindex Client-Werkzeuge
@cindex APIs
@cindex @code{mysqlclient}-Bibliothek
@cindex Puffergr��en, Client
@cindex Bibliothek, @code{mysqlclient}


Dieses Kapitel beschreibt die APIs, die f�r MySQL bereitstehen, wo man sie 
bekommt und wie man sie benutzt. Die C-API ist am ausf�hrlichsten beschrieben,
da sie vom MySQL-Team stammt und als Basis f�r die meisten anderen APIs 
dient.


@menu
* PHP::                         
* Perl::                        
* ODBC::                        
* C::                           
* Cplusplus::                   
* Java::                        
* Python::                      
* Tcl::                         
* Eiffel::                      
@end menu

@node PHP, Perl, Clients, Clients
@c German node PHP
@section MySQL-PHP-API

@cindex PHP-API

PHP ist eine serverseitige Skriptsprache, die in HTML eingebettet werden
kann und mit der man dynamische Webseiten erstellen kann. PHP unterst�tzt
eine Vielzahl von Datenbanken. Darunter befindet sich auch MySQL. PHP kann
als alleinstehendes Programm oder als Teil des Apache Webservers eingesetzt
werden.


Die Distribution und die Dokumentation gibt es unter 
@uref{http://www.php.net/, PHP-Website}.


@menu
* PHP problems::                
@end menu

@node PHP problems,  , PHP, PHP
@c German node PHP-Probleme
@subsection Allgemeine Probleme mit MySQL und PHP

@itemize @bullet
@item Error: "Maximum Execution Time Exceeded"
Dies ist eine PHP-Beschr�nkung. �ndern sie den Wert f�r die maximale
Ausf�hrungszeit in der @file{php3.ini}-Datei. Es ist ausserdem keine
schlechte Idee, die Beschr�nkung f�r die maximale Benutzung von RAM von 8
MB auf 16 MB per Skript zu verdoppeln.


@item Error: "Fatal error: Call to unsupported oder undefined function mysql_connect() in .."
Das bedeutet, dass Ihre PHP-Version nicht mit MySQL-Unterst�tzung
ausgestattet ist. Sie k�nnen entweder ein dynamisches MySQL-Modul f�r PHP
kompilieren oder PHP mit seiner eingebautet MySQL-Unterst�tzung neu
kompilieren. Im PHP-Manual ist dies ausf�hrlich beschrieben.

@item Error: "undefined reference to `uncompress'"
Die Client-Bibliothek wurde mit der Unterst�tzung f�r ein komprimiertes
Client-/Server-Protokoll kompiliert. Um den Fehler zu beheben, m�ssen Sie
@code{-lz} als letztes angeben, wenn Sie gegen @code{-lmysqlclient}
linken.
@end itemize


@node Perl, ODBC, PHP, Clients
@c German node Perl
@section MySQL-Perl-API

@cindex APIs, Perl
@cindex Perl-API

Dieser Abschnitt dokumentiert die Perl-@code{DBI}-Schnittstelle. Die
fr�here Schnittstelle hie� @code{mysqlperl}.  @code{DBI}/@code{DBD} ist
jetzt die empfohlene Perl-Schnittstelle. @code{mysqlperl} ist �berfl��ig
und deshalb hier nicht n�her beschrieben.



@menu
* DBI with DBD::                
* Perl DBI Class::              
* DBI-info::                    
@end menu

@node DBI with DBD, Perl DBI Class, Perl, Perl
@c German node DBI mit DBD
@subsection @code{DBI} mit @code{DBD::mysql}

@cindex @code{DBI}-Schnittstelle

@code{DBI} ist eine allgemeine Schnittstelle f�r viele Datenbanken. Das
bedeutet, Sie k�nnen ein Skript schreiben, dass viele verschiedene
Datenbanken unterst�tzt, ohne es zu �ndern. Sie brauchen f�r jeden
Datenbanktyp einen Datenbank-Treiber (DBD). F�r MySQL hei�t dieser Treiber
@code{DBD::mysql}. F�r weitere Informationen �ber Perl5 DBI besuchen Sie
bitte die @code{DBI}-Website und lesen Sie die Dokumentation:

@example
@uref{http://www.symbolstone.org/technology/perl/DBI/index.html}
@end example
F�r weitere Informationen �ber objektorientierte Programmierung (OOP) in
Perl5 besuchen Sie die OOP-Seite:
@example
@uref{http://language.perl.com/info/documentation.html}
@end example

Beachten Sie, dass Sie, wenn Sie Transaktionen mit Perl einsetzen wollen,
@code{Msql-Mysql-modules} der Version 1.2216 oder neuer ben�tigen.

Installationsanweisungen f�r MySQL-Perl-Unterst�tzung finden Sie unter
@ref{Perl}.


@node Perl DBI Class, DBI-info, DBI with DBD, Perl
@c German node Perl-DBI-Klasse
@subsection Die @code{DBI}-Schnittstelle

@cindex @code{DBI}-Perl-Modul

@noindent
@strong{Portable DBI-Methoden}

@multitable @columnfractions .3 .7
@item @code{connect} @tab Errichtet eine Verbindung zum Datenbankserver.
@item @code{disconnect} @tab Trennt eine Verbindung zum Datenbankserver.
@item @code{prepare} @tab Bereitet ein SQL-Statement zur Abfrage vor.
@item @code{execute} @tab F�hrt eine vorbereitetes Statement aus.
@item @code{do}      @tab Bereitet ein SQL-Statement vor und f�hrt es aus.
@item @code{quote}   @tab Quotet eine Zeichenkette oder einen @code{BLOB}-Wert zum Einf�gen.
@item @code{fetchrow_array} @tab Holt die n�chste Zeile als einen Array aus Feldern.
@item @code{fetchrow_arrayref} @tab Holt die n�chste Zeile als eine Referenz eines Arrays aus Feldern.
@item @code{fetchrow_hashref} @tab Holt die n�chste Zeile als eine Referenz einer Hash-Tabelle.
@item @code{fetchall_arrayref} @tab Holt alle Zeilen als einen Array von Arrays.
@item @code{finish}  @tab Beendet ein Statement und l��t das System Resourcen freigeben.
@item @code{rows}    @tab Gibt die Anzahl der betroffenen Zeilen zur�ck.
@item @code{data_sources} @tab Gibt einen Array mit den verf�gbaren Daten auf localhost zur�ck.
@item @code{ChopBlanks} @tab Kontroliert, ob die @code{fetchrow_*}-Methoden Leerzeichen entfernen.
@item @code{NUM_OF_PARAMS} @tab Die Anzahl der Platzhalter in einem vorbereiteten Statement.
@item @code{NULLABLE} @tab Welche Spalten @code{NULL} sein k�nnen.
@item @code{trace}    @tab Tracen zum Debuggen ausf�hren.
@end multitable

@noindent
@strong{MySQL-spezifische Methoden}

@multitable @columnfractions .3 .7
@item @code{insertid} @tab Der letzte @code{AUTO_INCREMENT}-Wert.
@item @code{is_blob} @tab Welche Spalten @code{BLOB}-Werte sind.
@item @code{is_key} @tab Welche Spalten Schl�ssel sind.
@item @code{is_num} @tab Welche Spalten numerisch sind.
@item @code{is_pri_key} @tab Welche Spalten Prim�rschl�ssel sind.
@item @code{is_not_null} @tab Welche Spalten NICHT @code{NULL} sein k�nnen. Siehe auch @code{NULLABLE}.
@item @code{length} @tab Maximal m�gliche Spaltengr��e.
@item @code{max_length} @tab Maximale Spaltengr��e, die im aktuellen Ergebnis enthalten ist.
@item @code{NAME} @tab Spaltennamen.
@item @code{NUM_OF_FIELDS} @tab Anzahl der zur�ckgegebenen Felder.
@item @code{table} @tab Tabellennamen im zur�ckgegebenen Ergebnis.
@item @code{type} @tab Alle Spaltentypen.
@end multitable

Die Perl-Methoden werden im Folgenden detaillierter erl�utert. Die
Variablen f�r die zur�ckgegebenen Werte haben folgende Bedeutung:

@table @code
@item $dbh
Datenbank-Handle

@item $sth
Statement-Handle

@item $rc
R�ckgabe-Code (oft ein Status)

@item $rv
R�ckgabewert (oft ein Status)
@end table

@noindent
@strong{Portable DBI-Methoden}

@table @code

@findex DBI->connect()
@findex connect()-DBI-Methode
@item connect($datenquelle, $benutzername, $passwort)
Benutzen Sie die @code{connect}-Methode, um eine Verbindung zur Datenbank
der Datenquelle herzustellen. Der @code{$datenquelle}-Wert sollte mit
@code{DBI:Treiber_name:} beginnen. Beispielanwendungen von @code{connect}
mit dem @code{DBD::mysql} Treiber:
@example
$dbh = DBI->connect("DBI:mysql:$datenbank", $benutzer, $passwort);
$dbh = DBI->connect("DBI:mysql:$datenbank:$hostname",
                    $benutzer, $passwort);
$dbh = DBI->connect("DBI:mysql:$datenbank:$hostname:$port",
                    $benutzer, $passwort);
@end example
Wenn der Benutzername und / oder das Passwort nicht angegeben werden,
verwendet @code{DBI} die Werte der @code{DBI_USER}- und @code{DBI_PASS}-
Umgebungsvariablen. Wen Sie keinen Hostnamen angeben, wird @code{'localhost'}
verwendet. Wenn Sie keine Portnummer angeben, wird der MySQL-Port 
(@value{default_port}) verwendet.

Seit @code{Msql-Mysql-modules}-Version 1.2009 erlaubt der 
@code{$datenquelle}-Wert bestimmte Modifikatoren:

@table @code
@item mysql_read_default_file=datei
Liest @file{datei} als eine Optionsdatei. F�r weitere Informationen zu 
Optionsdateien beachten Sie bitte @ref{Option files}.

@item mysql_read_default_group=group_name
Beim Lesen einer Optionsdatei ist die Standardgruppe normalerweise die
@code{[client]}-Gruppe. Wenn Sie die @code{mysql_read_default_group}-
Option angeben, wird die Standardgruppe @code{[gruppenname]}.

@item mysql_compression=1
Aktiviert die Kompression w�hrend der Kommunikation zwischen Client und
Server (ab Version 3.22.3).

@item mysql_socket=/pfad/zur/socket
Gibt den Pfad des Unix-Sockets an, der zum Verbinden mit dem
Server verwendet wird (MySQL-Version 3.21.15 oder neuer).
@end table

Sie k�nnen mehrere Modifikatoren angeben, dabei muss jedem ein Semikolon 
vorangestellt sein.

Wenn Sie zum Beispiel vermeiden wollen, dass sie Benutzername und Passwort
im @code{DBI}-Skript angeben m�ssen, k�nnen Sie sie aus der
@file{~/.my.cnf}-Optionsdatei nehmen. Ihr @code{connect}-Aufruf sieht
folgenderma�en aus:

@example
$dbh = DBI->connect("DBI:mysql:$datenbank"
                . ";mysql_read_default_file=$ENV@{HOME@}/.my.cnf",
                $benutzer, $passwort);
@end example

Dieser Aufruf liest die Optionen f�r die @code{[client]}-Gruppe aus der
Optionsdatei. Wenn Sie dasselbe f�r die @code{[perl]}-Gruppe tun wollen, 
k�nnte Ihr Code so aussehen:

@example
$dbh = DBI->connect("DBI:mysql:$Datenbank"
                . ";mysql_read_default_file=$ENV@{HOME@}/.my.cnf"
                . ";mysql_read_default_group=perl",
                $benutzer, $passwort);
@end example

@findex DBI->disconnect
@findex disconnect-DBI-Methode
@item disconnect
Die @code{disconnect}-Methode beendet die Verbindung mit der Datenbank.
Dies wird typischerweise kurz vor dem Ende eines Scripts ausgef�hrt.
Beispiel:
@example
$rc = $dbh->disconnect;
@end example

@findex DBI->prepare()
@findex prepare()-DBI-Methode
@item prepare($statement)
Bereitet ein SQL-Statement zum Ausf�hren durch den Datenbankserver vor und
gibt ein "Statement-Handle" @code{($sth)} zur�ck, mit der Sie die
@code{execute}-Methode aufrufen.
Normalerweise werden Sie @code{SELECT}-Statements (und
@code{SELECT}-�hnliche Statements so wie @code{SHOW}, @code{DESCRIBE} und
@code{EXPLAIN}) mit der Bedeutung von @code{prepare} und @code{execute}
verwenden.
Beispiel:
@example
$sth = $dbh->prepare($statement)
    or die "$statement: $dbh->errstr kann nicht vorbereitet werden\n";
@end example

@findex DBI->execute
@findex execute-DBI-Methode
@item execute
Die @code{execute}-Methode f�hrt ein vorbereitetes Statement aus. Bei
Nicht-@code{SELECT}-Statements gibt @code{execute} die Anzahl der
betroffenen Zeilen zur�ck. Wenn Zeilen betroffen sind, gibt @code{execute}
@code{"0E0"} zur�ck, was in Perl als 0 und true erkannt wird. Wenn ein
Fehler auftritt, gibt @code{execute} @code{undef} zur�ck. Bei
@code{SELECT}-Statements beginnt @code{execute} die SQL-Anfrage in der
Datenbank; Sie m�ssen eine der @code{fetch_*}-Methoden nutzen, die weiter
unten beschrieben sind, um Daten erhalten. Beispiel:
@example
$rv = $sth->execute
          or die "Die Query: $sth->errstr kann nicht ausgef�hrt werden.";
@end example

@findex DBI->do()
@findex do()-DBI-Methode
@item do($statement)
Die @code{do}-Methode bereitet ein Statement vor, f�hrt es aus und gibt die
Anzahl der betroffenen Zeilen zur�ck. Wenn Zeilen betroffen sind, gibt
@code{execute} @code{"0E0"} zur�ck, was in Perl als 0 und true erkannt
wird. Diese Methode wird normalerweise verwendet, um
Nicht-@code{SELECT}-Statements zu bearbeiten, die (z. B. wegen
Treiber-Beschr�nkungen) nicht vorbereitet werden k�nnen, oder die nicht
mehr als einmal vorbereitet werden m�ssen (INSERTS, DELETE usw.). Beispiel:
@example
$rv = $dbh->do($statement)
        or die "$statement: $dbh- >errstr kann nicht vorbereitet werden\n";
@end example

Im Allgemeinen ist die @code{do}-Methode VIEL schneller (und vorzuziehen)
als die @code{prepare}/@code{execute}-Methoden, die ohne Parameter
aufgerufen werden.

@findex DBI->quote()
@findex quote()-DBI-Methode
@cindex Zeichenketten quoten
@cindex Zeichenketten, quoten
@item quote($string)
Die @code{quote}-Methode wird verwendet, um Sonderzeichen zu "escapen", die
in Zeichenketten enthalten sein k�nnen, und um notwendige �u�ere
Anf�hrungszeichen hinzuzuf�gen. Beispiel:
@example
$sql = $dbh->quote($string)
@end example

@findex DBI->fetchrow_array
@findex fetchrow_array-DBI-Methode
@item fetchrow_array
Die Methode holt die n�chste Datenzeile und gibt sie als ein Array mit den
Feldwerten zur�ck. Beispiel:
@example
while(@@row = $sth->fetchrow_array) @{
        print qw($row[0]\t$row[1]\t$row[2]\n);
@}
@end example

@findex DBI->fetchrow_arrayref
@findex fetchrow_arrayref-DBI-Methode
@item fetchrow_arrayref
Die Methode holt die n�chste Datenzeile und gibt sie als eine Referenz auf
ein Array mit den Feldwerten zur�ck. Beispiel:
@example
while($row_ref = $sth->fetchrow_arrayref) @{
        print qw($row_ref->[0]\t$row_ref->[1]\t$row_ref->[2]\n);
@}
@end example

@findex DBI->fetchrow_hashref
@findex fetchrow_hashref-DBI-Methode
@item fetchrow_hashref
Diese Methode holt eine Datenzeile und gibt eine Referenz auf einen Hash
zur�ck, der Name-/Wert-Paare enth�lt. Die Methode ist lange nicht so
performant wie das Verwenden von Referenzen auf ein Array, wie weiter oben
beschrieben ist. Beispiel:
@example
while($hash_ref = $sth->fetchrow_hashref) @{
        print qw($hash_ref->@{vorname@}\t$hash_ref->@{nachname@}\t\
                $hash_ref- > title@}\n);
@}
@end example

@findex DBI->fetchall_arrayref
@findex fetchall_arrayref-DBI-Methode
@item fetchall_arrayref
Diese Methode gibt alle Zeilen eines Ergebnisses einer SQL-Anfrage zur�ck.
Sie gibt eine Referenz auf ein Array mit Referenzen auf Arrays mit den
Werten der einzelnen Zeilen zur�ck. Sie k�nnen mit zwei verschachtelten
Schleifen auf die Werte zugreifen. Beispiel:
@example
my $table = $sth->fetchall_arrayref
                or die "$sth->errstr\n";
my($i, $j);
for $i ( 0 .. $#@{$table@} ) @{
        f�r $j ( 0 .. $#@{$table->[$i]@} ) @{
                print "$table->[$i][$j]\t";
        @}
        print "\n";
@}
@end example

@findex DBI->finish
@findex finish-DBI-Methode
@item finish
Bewirkt, dass keine weiteren Daten von dem SQL-Anfrageergebnis geholt
werden. Sie k�nnen diese Methode aufrufen, um Systemressourcen freizugeben.
Beispiel:
@example
s$rc = $sth->finish;
@end example

@findex DBI->rows
@findex rows-DBI-Methode
@item rows
Gibt die Anzahl der ver�nderten Zeilen (die aktualisiert oder gel�scht
wurden) des letzten Befehls zur�ck. Dies wird normalerweise nach
Nicht-@code{SELECT}-@code{execute}-Statements verwendet. Beispiel:
@example
$rv = $sth->rows;
@end example

@findex DBI->@{NULLABLE@}
@findex NULLABLE-DBI-Methode
@item NULLABLE
Gibt eine Referenz auf ein Array mit Boole'schen Werten zur�ck; f�r jedes
Element TRUE kann die Spalte @code{NULL}-Werte enthalten. Beispiel:
@example
$null_possible = $sth->@{NULLABLE@};
@end example

@findex DBI->@{NUM_OF_FIELDS@}
@findex NUM_OF_FIELDS-DBI-Methode
@item NUM_OF_FIELDS
Dieses Attribut enth�lt die Anzahl der Zeilen, die eine @code{SELECT}- oder
@code{SHOW FIELDS}-SQL-Anfrage zur�ckgibt. Sie k�nnen es verwenden, um zu
pr�fen, ob eine Anfrage ein Ergebnis zur�ckgegeben hat: 0 weist auf eine
Nicht-@code{SELECT}-Anfrage hin, wie @code{INSERT}, @code{DELETE} oder
@code{UPDATE}. Beispiel:
@example
$nr_of_fields = $sth->@{NUM_OF_FIELDS@};
@end example

@findex DBI->datasource()
@findex datasource()-DBI-Methode
@item datasource($Treiber_name)
Diese Methode gibt einen Array zur�ck, der die Namen der verf�gbaren
Datenbanken auf @code{'localhost'} enth�lt. Beispiel:
@example
@@dbs = DBI->datasource("mysql");
@end example

@findex DBI->@{ChopBlanks@}
@findex ChopBlanks-DBI-Methode
@item ChopBlanks
Dieses Attribut gibt an, ob die @code{fetchrow_*}-Methoden vor- und
nachstehende Leerzeichen entfernen. Beispiel:
@example
$sth->@{'ChopBlanks'@} =1;
@end example

@findex DBI->trace
@findex trace-DBI-Methode
@item trace($trace_ebene)
@itemx trace($trace_ebene, $trace_dateiname)
@code{trace} aktiviert oder deaktiviert "Tracing".
Wenn @code{DBI} als eine Klassenmethode aufgerufen wird, steuert es das
"Tracing" mit allen Datenbankverbindungen. Wenn es als Datenbank- oder
Statement-Handle-Methode aufgerufen wird, steuert es nur die verwendete
Verbindung (und deren sp�tere Ableitungen). Wenn Sie @code{$trace_ebene}
auf 2 setzen, bewirkt es detaillierte Informationen. Der Wert 0 stellt
"Tracing" ab. Die Ausgabe des "Tracing" wird vorgabem��ig nach "standard
error" geleitet. Wenn @code{$trace_dateiname} angegeben ist, wird die
Ausgabe f�r @emph{alle} "getraceten" Verbindungen an das Ende dieser Datei
geschrieben. Beispiel:
@example
DBI->trace(2);                # alles tracen
DBI->trace(2,"/tmp/dbi.out"); # alles nach /tmp/dbi.out tracen
$dth->trace(2);               # diese Datenbankverbindung tracen
$sth->trace(2);               # dieses Statement-Handle tracen.
@end example

@tindex @code{DBI_TRACE}-Umgebungsvariable
@tindex Umgebungsvariable, @code{DBI_TRACE}
Sie k�nnen @code{DBI}-Tracing auch anschalten, indem Sie die
@code{DBI_TRACE}-Umgebungsvariable setzen. Wenn Sie sie auf einen
numerischen Wert setzen, ist das dasselbe, wie @code{DBI->(wert)}
aufzurufen. Wenn Sie sie auf einen Pfadnamen setzen, ist das dasselbe, wie
@code{DBI->(2,wert)} aufzurufen.

@end table

@noindent
@strong{MySQL-spezifische Methoden}

Die unten stehenden Methoden sind MySQL-spezifisch und nicht Teil des
@code{DBI}-Standards. Mehrere von ihnen sind veraltet:
@code{is_blob}, @code{is_key}, @code{is_num}, @code{is_pri_key},
@code{is_not_null}, @code{length}, @code{max_length} und @code{table}.
Wo immer es @code{DBI}-Standard-Alternativen gibt, ist das unten angemerkt:

@table @code
@findex DBI->@{insertid@}
@findex insertid-DBI-Methode
@tindex AUTO_INCREMENT, Benutzung bei DBI
@item insertid
Wenn Sie das @code{AUTO_INCREMENT}-Feature von MySQL benutzen, werden neue,
automatisch heraufgez�hlte Werte hier gespeichert. Beispiel:
@example
$new_id = $sth->@{insertid@};
@end example

Alternativ k�nnen Sie @code{$dbh->@{'mysql_insertid'@}} verwenden.

@findex DBI->@{is_blob@}
@findex is_blob-DBI-Methode
@item is_blob
Gibt eine Referenz auf einen Array mit Boole'schen Werten zur�ck; f�r jedes
Element des Arrays bedeutet der Wert TRUE, dass die entsprechende Spalte
ein @code{BLOB} ist. Beispiel:
@example
$keys = $sth->@{is_blob@};
@end example

@findex DBI->@{is_key@}
@findex is_key-DBI-Methode
@item is_key
Gibt eine Referenz auf einen Array mit Boole'schen Werten zur�ck; f�r jedes
Element des Arrays bedeutet der Wert TRUE, dass die entsprechende Spalte
ein Schl�ssel ist. Beispiel:
@example
$keys = $sth->@{is_key@};
@end example

@findex DBI->@{is_num@}
@findex is_num DBI-Methode
@item is_num
Gibt eine Referenz auf einen Array mit Boole'schen Werten zur�ck; f�r jedes
Element des Arrays bedeutet der Wert TRUE, dass die entsprechende Spalte
numerische Werte enth�lt. Beispiel:
@example
$nums = $sth->@{is_num@};
@end example

@findex DBI->@{is_pri_key@}
@findex is_pri_key DBI-Methode
@item is_pri_key
Gibt eine Referenz auf einen Array mit Boole'schen Werten zur�ck; f�r jedes
Element des Arrays bedeutet der Wert TRUE, dass die entsprechende Spalte
ein Prim�rschl�ssel ist. Beispiel:
@example
$pri_keys = $sth->@{is_pri_key@};
@end example

@findex DBI->@{is_not_null@}
@findex is_not_null DBI-Methode
@item is_not_null
Gibt eine Referenz auf einen Array mit Boole'schen Werten zur�ck; f�r jedes
Element des Arrays bedeutet der Wert FALSE, dass die entsprechende Spalte
NULL enthalten kann. Beispiel:
@example
$not_nulls = $sth->@{is_not_null@};
@end example

Das oben beschriebene @code{NULLABLE}-Attribut ist @code{is_not_null} in
jedem Fall vorzuziehen, da es zum DBI-Standard geh�rt.

@findex DBI->@{length@}
@findex length-DBI-Methode
@findex DBI->@{max_length@}
@findex max_length-DBI-Methode
@item length
@itemx max_length
Beide Methoden geben je einen Array mit Spaltenl�ngen zur�ck. Der
@code{length}-Array gibt die maximal m�gliche L�nge jeder Spalte an (wie es
in der Tabellendefinition festgelegt wurde). Der @code{max_length}-Array
gibt die L�nge des aktuell l�ngsten Wertes in den Spalten an. Beispiel:
@example
$lengths = $sth->@{length@};
$max_lengths = $sth->@{max_length@};
@end example

@findex DBI->@{NAME@}
@findex NAME-DBI-Methode
@item NAME
Gibt eine Referenz auf ein Array mit den Spaltennamen zur�ck. Beispiel:
@example
$names = $sth->@{NAME@};
@end example

@findex DBI->@{table@}
@findex table-DBI-Methode
@item table
Gibt eine Referenz auf ein Array mit den Tabellennamen zur�ck. Beispiel:
@example
$tables = $sth->@{table@};
@end example

@findex DBI->@{type@}
@findex type-DBI-Methode
@item type
Gibt eine Referenz auf ein Array mit den Spaltentypen zur�ck. Beispiel:
@example
$types = $sth->@{type@};
@end example

@end table


@node DBI-info,  , Perl DBI Class, Perl
@c German node DBI-Informationen
@subsection Weitere @code{DBI}/@code{DBD}-Informationen

@cindex @code{DBI/DBD}

Bitte verwenden Sie den @code{perldoc}-Befehl, um weitere Informationen
�ber @code{DBI} zu erhalten.

@example
perldoc DBI
perldoc DBI::FAQ
perldoc DBD::mysql
@end example

Sie k�nnen ausserdem @code{pod2man}, @code{pod2html} usw. verwenden, um in
andere Formate zu wandeln.

Die neuesten @code{DBI}-Informationen finden Sie auf der @code{DBI} Website:
@example
@uref{http://www.symbolstone.org/technology/perl/DBI/index.html}
@end example


@node ODBC, C, Perl, Clients
@c German node ODBC
@section MySQL-ODBC-Unterst�tzung

@cindex ODBC
@cindex Windows
@cindex MyODBC



MySQL unterst�tzt ODBC mit Hilfe des @strong{MyODBC}-Programms. Dieses
Kapitel erl�utert, wie Sie @strong{MyODBC} installieren und benutzen. Hier
werden Sie au�erdem eine Liste von Programmen finden, die mit
@strong{MyODBC} zusammenarbeiten.

@menu
* Installing MyODBC::           
* ODBC administrator::          
* MyODBC connect parameters::   
* ODBC Problems::               
* MyODBC clients::              
* ODBC and last_insert_id::     
* MyODBC bug report::           
@end menu

@node Installing MyODBC, ODBC administrator, ODBC, ODBC
@c German node MyODBC-Installation
@subsection Wie Sie MyODBC installieren

@strong{MyODBC} ist ein 32-Bit-ODBC- (2.50) -Level-0- (mit Level-1- und
Level-2-Features) Treiber f�r die Anbindung an ODBC-f�hige Applikationen an
MySQL. @strong{MyODBC} funktioniert unter Windows95, Windows98, NT, und
auf den meisten Unix-Plattformen.

@strong{MyODBC} ist "public domain". Sie finden die neueste Version bei
@uref{http://www.mysql.com/downloads/api-myodbc.html}.

Wenn Sie ein Problem mit @strong{MyODBC} haben und Ihr Programm auch
mit OLEDB arbeitet, sollten sie den OLEDB Treiber probieren, den sie im
"Contrib"-Abschnitt finden.  @xref{Contrib}.

Normalerweise m�ssen Sie @strong{MyODBC} nur auf Windows-Maschinen
installieren. Sie brauchen @strong{MyODBC} f�r Unix nur, wenn sie ein
Programm wie ColdFusion haben, das auf einer Unix-Maschine l�uft und ODBC
f�r die Datenbankverbindung nutzt.

Wenn Sie @strong{MyODBC} unter Unix installieren wollen, brauchen Sie noch
einen @strong{ODBC}-Manager. @strong{MyODBC} arbeitet mit den meisten
Unix-ODBC-Managern zusammen.
@c German FIX node doesn't exist, should probably be to Portals?
@c Eine Liste finden Sie in dem @strong{ODBC}-verwandten Linkabschnitt
@c auf der MySQL-Seite @xref{N�tzliche Links}.

Um @strong{MyODBC} unter Windows zu installieren, sollten sie die passende
@strong{MyODBC} Zip-Datei (f�r Windows 95/98 oder NT / Windows 2000)
herunterladen, es mit @code{WINZIP} oder einem �hnlichen Programm
entpacken, und die @code{SETUP.EXE}-Datei ausf�hren.

Unter Windows NT kann folgender Fehler w�hrend der Installation auftreten
(@strong{MyODBC}):

@example
W�hrend des Kopiervorgangs ist ein Fehler aufgetreten:
C:\WINDOWS\SYSTEM\MFC30.DLL. Starten Sie Windows neu und beginnen die
Installation erneut, noch bevor sie ein anderes Programm starten, das ODBC
verwendet.
@end example

Das Problem in diesem Fall ist, dass ein anderes Programm ODBC verwendet
und dass unter Windows zwei Programme nicht gleichzeitig auf eine Datei
zugreifen k�nnen. Deshalb kann es sein, dass Sie nicht in der Lage sind,
die ODBC-Treiber mit Microsofts ODBC Setup Programm zu installieren. In den
meisten F�llen gen�gt es, den @code{Ignorieren}-Knopf zu dr�cken, um die
restlichen Dateien zu installieren und die Installation abzuschlie�en. Wenn
das nicht funktioniert, booten Sie Ihren Rechner im Abgesicherten Modus,
indem sie F8 vor dem Starten von Windows dr�cken und den Abgesicherten
Modus ausw�hlen. Installieren sie @strong{MyODBC}, und starten Sie wieder
im normalen Modus.

@itemize @bullet
@item
Um eine Verbindung mit einer ODBC-Applikation, die MySQL nicht nativ
unterst�tzt, von Windows zu Unix herzustellen, m�ssen Sie zun�chst
@strong{MyODBC} unter Windows installieren.
@item
Der Windows-Benutzer muss Zugriffsrechte auf den MySQL-Server der
Unix-Maschine besitzen. Diese richten Sie mit dem @code{GRANT}-Befehl ein.
@xref{GRANT,,@code{GRANT}}.
@item
Sie m�ssen wie folgt einen ODBC-DSN-Eintrag erstellen:

@itemize @minus
@item
�ffnen Sie die Systemsteuerung der Windows-Maschine.
@item
Doppelklicken Sie das ODBC-Datenquellen-Symbol.
@item
Klicken Sie auf die Registerkarte Benutzer-DSN.
@item
Klicken Sie auf Hinzuf�gen.
@item
W�hlen Sie MySQL im Fenster "Neue Datenquelle hinzuf�gen" und klicken Sie
auf den Fertig-Knopf.
@item
Das MySQL-Treiber-Standard-Konfigurationsfenster wird nun angezeigt.
@xref{ODBC administrator}.
@end itemize

@item
Starten Sie nun ihre Applikation und w�hlen Sie den ODBC-Treiber mit der
von ihnen im ODBC angegebenen DSN.
@end itemize

Bitte beachten Sie, dass weitere Konfigurationsoptionen im MySQL-Fenster
vorhanden sind (trace, don't prompt on connect usw.). Probieren Sie diese
aus, wenn Sie Probleme haben.

@node ODBC administrator, MyODBC connect parameters, Installing MyODBC, ODBC
@c German node ODBC-Administrator
@subsection Wie Sie die verschiedenen Felder im ODBC-Administrator Programm ausf�llen

@cindex ODBC, Administrator

Es gibt drei M�glichkeiten, den Server unter Windows 95 anzugeben:

@itemize @bullet
@item
Verwenden Sie die IP-Adresse des Servers.
@item
F�gen Sie der Datei @file{\windows\lmhosts} folgende Informationen an:

@example
ip hostname
@end example

Beispiel:

@example
194.216.84.21 mein_hostname
@end example

@item
Konfigurieren Sie DNS:
@end itemize

Beispiel: Wie Sie das @code{ODBC setup} ausf�llen:
@example
Windows DSN Name:   test
Beschreibung:       Das ist meine Datenbank
MySql Datenbank:    test
Server:             194.216.84.21
User:               monty
Password:           mein_passwort
Port:
@end example

Der Wert f�r @code{Windows DSN Namen} muss in ihrem Windows-ODBC-Setup
eindeutig sein.

Sie m�ssen die Werte f�r @code{Server}, @code{User}, @code{Password} oder
@code{Port} im ODBC-Setup-Fenster nicht angeben. Wenn Sie es jedoch tun,
werden diese Werte als Standardwerte verwendet, wenn Sie versuchen, eine
Verbindung aufzubauen. Sie k�nnen die Werte auch zur Laufzeit ihres
Programms angeben.

Wenn Sie die Portnummer nicht angeben, wird der Standard-Port
(@value{default_port}) verwendet.

Wenn Sie die Option @code{Optionen aus C:\my.cnf lesen} angeben, werden die
Gruppen @code{client} und @code{odbc} aus der @file{C:\my.cnf}-Datei
gelesen. Sie k�nnen alle Optionen verwenden, die f�r @code{mysql_options()}
g�ltig sind. @xref{mysql_options, , @code{mysql_options}}.


@node MyODBC connect parameters, ODBC Problems, ODBC administrator, ODBC
@c German node MyODBC-Verbindungsparameter
@subsection Verbindungsparameter f�r MyODBC

Man kann die folgenden Parameter f�r @strong{MyODBC} im
@code{[Servername]}-Abschnitt in der @code{ODBC.INI}-Datei oder �ber das
@code{InConnectionString}-Argument im @code{SQLDriverConnect()}-Aufruf
angeben:

@multitable @columnfractions .2 .2 .6
@item @strong{Parameter} @tab @strong{Standardwert} @tab @strong{Bedeutung}
@item user @tab ODBC (unter Windows) @tab Der Benutzername, der verwendet wird, um zu MySQL zu verbinden.
@item server @tab localhost @tab Der Hostname des MySQL-Servers.
@item database @tab @tab Die Standarddatenbank
@item option @tab 0 @tab Eine Ganzzahl, die angibt, wie @strong{MyODBC} arbeiten soll. Siehe unten.
@item port @tab 3306 @tab Der TCP/IP-Port, der verwendet werden soll, wenn der @code{server} nicht @code{localhost} ist.
@item stmt @tab @tab Ein Statement, das bei der Verbindung zu @code{MySQL} ausgef�hrt wird.
@item password @tab @tab Das Passwort f�r die @code{server}-@code{user}-Kombination.
@item socket @tab @tab Der Socket oder die Windows-Pipe, �ber die verbunden werden soll.
@end multitable

Die Option "argument" wird verwendet, um @strong{MyODBC} zu sagen, dass der
Client nicht 100% ODBC-kompatibel ist. Unter Windows setzt man diese Option
normalerweise im Verbindungsdialog, Sie k�nnen aber auch das
"option"-Argument verwenden. Die folgenden Optionen sind in derselben
Reihenfolge wie im @strong{MyODBC}-Verbindungsdialog:

@multitable @columnfractions .1 .9
@item @strong{Bit} @tab @strong{Bedeutung}
@item 1 @tab Der Client kann nicht damit umgehen, dass @strong{MyODBC} die wirkliche Breite einer Spalte zur�ckgibt.
@item 2 @tab  Der Client kann nicht damit umgehen, dass MySQL die wirkliche Anzahl an "affected rows" zur�ckgibt. Wenn dieses Bit gesetzt ist, wird MySQL statt dessen 'found rows' zur�ckgeben. Dies wird erst ab MySQL 3.21.14 unterst�tzt.
@item 4 @tab Erstellt ein Debug-Log in c:\myodbc.log. Das ist dasselbe, als wenn Sie @code{MYSQL_DEBUG=d:t:O,c::\myodbc.log} in Ihre @file{AUTOEXEC.BAT} schreiben.
@item 8  @tab Entfernt jede Paket-Beschr�nkung f�r Ergebnisse und Parameter.
@item 16 @tab Nicht auf Eingaben warten, sogar wenn der Treiber dies verlangt.
@item 32 @tab Einen ODBC 1.0 Treiber simulieren.
@item 64 @tab Die Angabe 'datenbank' in 'datenbank.tabelle.spalte' ignorieren.
@item 128 @tab Die Verwendung von ODBC-Manager-Zeigern erzwingen (experimentell).
@item 256 @tab Die Verwendung des erweiterten 'fetch' verbieten (experimentell).
@item 512 @tab CHAR-Felder bis zur vollen Spaltenl�nge f�llen.
@item 1024 @tab SQLDescribeCol() wird voll qualifizierte Spaltennamen zur�ckgeben.
@item 2048 @tab Verwendet das komprimierte Client-/Server Protokoll.
@item 4096 @tab Weist den Server an, Leerzeichen nach einem Funktionsnamen und vor @code{'('} zu ignorieren (wird von PowerBuilder ben�tigt). So werden alle Funktionsnamen zu Schl�sselw�rtern!
@item 8192 @tab �ber "Named Pipes" zu einem @code{mysqld}-Server verbinden, der unter Windows NT l�uft.
@item 16384 @tab �ndert LONGLONG-Spalten zu INT-Spalten (einige Applikationen k�nnen mit LONGLONG nicht umgehen).
@item 32768 @tab Gibt 'user' als Tabellenqualifizierer und Tabellen-Besitzer von SQL-Tabellen zur�ck (experimentell).
@item 65536 @tab Liest die Parameter @code{client} und @code{odbc}-Gruppen aus der @file{my.cnf}-Datei.
@item 131072 @tab F�gt einige Sicherheits�berpr�fungen hinzu (sollte nicht n�tig sein, aber ...).
@end multitable

Wenn Sie viele Optionen haben wollen, sollten Sie die obigen Flags
hinzuf�gen. Zum Beispiel gibt Ihnen die Option 12 (4+8) Debugging und keine
Paketbeschr�nkungen.

Die Standard-@file{MYODBC.DLL}-Datei wird f�r optimale Performance
kompiliert. Wenn Sie @strong{MyODBC} debuggen wollen (um zum Beispiel
"tracing" zu aktivieren), sollten Sie stattdessen @code{MYODBCD.DLL}
verwenden. Um diese Datei zu installieren, kopieren Sie @file{MYODBCD.DLL}
einfach �ber die installierte @code{MYODBC.DLL}-Datei.


@node ODBC Problems, MyODBC clients, MyODBC connect parameters, ODBC
@c German node ODBC-Probleme
@subsection Wie Sie Probleme mit MyODBC berichten

@strong{MyODBC} wurde mit Access, Admndemo.exe, C++-Builder,
Borland Builder 4, Centura Team Developer (vorher Gupta SQL/Windows),
ColdFusion (unter Solaris und NT mit Service Pack 5), Crystal Reports,
DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes
4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32
bit, VC++ und Visual Basic getestet.

Wenn Sie weitere Applikationen kennen, die mit @strong{MyODBC}
zusammenarbeiten, sagen Sie uns bitte unter @email{myodbc@@lists.mysql.com}
Bescheid!

Mit einigen Programmen k�nnen Fehler wie diese auftreten: @code{Another
user hat modifies the record that you have modified}. Meistens l�sen Sie
das folgenderma�en:

@itemize @bullet
@item
F�gen Sie der Tabelle einen Prim�rschl�ssel hinzu, wenn noch keiner
existiert.
@item
F�gen Sie eine TIMESTAMP-Spalte hinzu, wenn noch keine existiert.
@item
Verwenden Sie ausschlie�lich 'Double Float'-Felder. Manche Programme
kommen mit 'Single Float'-Feldern nicht klar.
@end itemize

Wenn das nicht helfen sollte, dann erstellen Sie eine @code{MyODBC}
'Trace'-Datei und versuchen Sie, die Fehlerquelle so zu erschlie�en.


@node MyODBC clients, ODBC and last_insert_id, ODBC Problems, ODBC
@c German node MyODBC-Clients
@subsection Programme, die bekannterma�en mit MyODBC zusammenarbeiten

Die meisten Programme sollten mit @strong{MyODBC} zusammenarbeiten. F�r die
unten aufgef�hrten haben wir es selbst getestet oder haben die Best�tigung
eines Benutzers, dass es l�uft.

@table @asis
@item @strong{Programm}
@strong{Anmerkung}
@cindex Microsoft Access

@item Access
Um Access zum Laufen zu bringen:
@itemize @bullet
@item
Wenn Sie Access 2000 verwenden, sollten Sie die neuesten (Version 2.6 oder
h�her) Microsoft-MDAC (@code{Microsoft Data Access Components}) von
@uref{http://www.microsoft.com/data} herunterladen. Dies wird folgenden Bug
in Access beheben: Wenn Sie Daten nach MySQL exportieren, werden Tabellen-
und Spaltennamen nicht spezifiziert. Ein anderer Weg, diesen Bug zu
umgehen, ist, MyODBC auf Version 2.50.33 und MySQL auf Version 3.23.x zu
aktualisieren, welche beide zusammen einen Workaround f�r diesen Bug
implementiert haben.

Ausserdem sollten Sie das Microsoft-Jet-4.0-Service-Pack 5 (SP5)
einspielen, welches hier
@uref{http://support.microsoft.com/support/kb/articles/Q 239/1/14.ASP}
gefunden werden kann. Dies behebt einige F�lle, in denen Spalten als
@code{#deleted#} in Access markiert sind.

Beachten Sie, dass Sie, wenn Sie die MySQL-Version 3.22 verwenden, den
MDAC-Patch einspielen und MyODBC 2.50.32 oder 2.50.34 und h�her benutzen
m�ssen, um dieses Problem zu umgehen.
@item
F�r alle Access-Versionen sollten Sie die MyODBC-Optionen auf @code{Return
matching rows} setzen. F�r Access 2.0 sollten Sie ausserdem @code{Simulate
ODBC 1.0} einschalten.
@item
Sie sollten einen Timestamp in alle Tabellen einf�gen, die Sie
aktualisieren wollen. F�r maximale Portablilit�t werden
@code{TIMESTAMP(14)} oder einfach  @code{TIMESTAMP} anstelle von
@code{TIMESTAMP(X)}-Variationen empfohlen.
@item
Sie sollten einen Prim�rschl�ssel in Ihren Tabellen haben. Falls nicht,
k�nnen neue oder ge�nderte Zeilen als @code{#DELETED#} erscheinen.
@item
Verwenden sie ausschlie�lich @code{DOUBLE}-Float-Felder. Access kann nicht
richtig mit "Single Floats" vergleichen. Die Symptome sind, dass entweder
neue oder ge�nderte Zeilen als @code{#DELETED#} erscheinen oder Sie keine
Zeilen finden oder �ndern k�nnen.
@item
Wenn Sie eine Tabelle mit MyODBC verbinden, die eine @code{BIGINT}-Spalte hat,
werden die Ergebnisse als @code{#DELETED} angezeigt. Sie umgehen das Problem
folgenderma�en:
@itemize @bullet
@item
F�gen Sie eine weitere @code{TIMESTAMP}-"Dummy-Spalte" hinzu, am besten
@code{TIMESTAMP(14)}.
@item
W�hlen Sie @code{'BIGINT Spalten zu INT wandeln'} im Verbindungsdialog des
ODBC-DSN-Administrators.
@item
Entfernen Sie die Tabellenverkn�pfung aus Access und stellen Sie sie wieder
her.
@end itemize

Die vorherigen Zeilen werden weiterhin als @code{#DELETED#} angezeigt, aber
neue/ge�nderte Zeilen werden korrekt dargestellt.
@item
Wenn Sie weiterhin den Fehler @code{Ein anderer Benutzer hat Ihre Daten ge�ndert}
erhalten, nachdem Sie die @code{TIMESTAMP}-Spalte hinzugef�gt haben, k�nnte
Ihnen der folgende Trick helfen:

Verwenden Sie anstelle von @code{Datenblattansicht} ein Formular mit den
von Ihnen gew�nschten Feldern und benutzen Sie dann
@code{Formularblattansicht}. Sie sollten den @code{StandardWert} f�r die
@code{TIMESTAMP}-Spalte auf @code{NOW()} setzen. Zus�tzlich ist es sicher
n�tzlich, die @code{TIMESTAMP}-Spalte zu verstecken, damit Ihre Anwender
nicht erschrecken.
@item
Manchmal erstellt Access ung�ltige SQL-Anfragen, die MySQL nicht versteht.


W�hlen Sie zur L�sung dieses Problems
@code{"Abfrage|SQL-spezifisch|Pass-Through"} aus dem Access-Men�.
@item
Wenn Sie statt dessen @code{MEMO}-Spalten haben wollen, sollten Sie die
Spalte mit @code{ALTER TABLE} in @code{TEXT} �ndern.
@item
Access kann nicht immer sauber mit @code{DATE}-Spalten umgehen. Wenn Sie ein 
solches Problem haben, �ndern Sie die entsprechenden Spalten in @code{DATETIME}.
@item
Wenn Sie in Access eine Spalte @code{BYTE} haben, wird Access versuchen,
diese in @code{TINYINT} anstelle von @code{TINYINT UNSIGNED} zu
exportieren. Das f�hrt zu Problemen, wenn Sie Werte in der Spalte haben,
die gr��er als 127 sind!
@end itemize

@cindex ADO program
@item ADO
Wenn Sie mit der ADO-API und @strong{MyODBC} kodieren, m�ssen Sie auf
einige vorgabem��ige Eigenschaften achten, die vom MySQL-Server nicht
unterst�tzt werden. Die Benutzung von @code{CursorLocationProperty} als
@code{adUseServer} zum Beispiel gibt f�r @code{RecordCountProperty} ein
Ergebnis von -1 zur�ck. Um den richtigen Wert zu erhalten, m�ssen Sie diese
Eigenschaft auf @code{adUseClient} setzen, wie im unten stehenden
Visual-Basic-Code gezeigt:

@example
Dim myconn As New ADODB.Connection
Dim myrs As New Recordset
Dim mySQL As String
Dim myrows As Long

myconn.Open "DSN=MyODBCsample"
mySQL = "SELECT * from user"
myrs.Source = mySQL
Set myrs.ActiveConnection = myconn
myrs.CursorLocation = adUseClient
myrs.Open
myrows = myrs.RecordCount

myrs.Close
myconn.Close
@end example

Ein weiterer Workaround besteht darin, ein @code{SELECT COUNT(*)}-Statement
f�r eine �hnliche Anfrage zu benutzen, um das korrekte Z�hlen der Zeilen zu
erreichen.

@item Active server pages (ASP)
Sie sollten den Option-Flag @code{Return matching rows} benutzen.

@item BDE-Applikationen
Damit diese funktionieren, sollten Sie die Option-Flags
@code{Don't optimize column widths} und @code{Return matching rows}
benutzen.

@cindex Borland Builder 4
@item Borland Builder 4
Wenn Sie eine Anfrage starten, k�nnen Sie die Eigenschaft @code{Active}
oder die Methode @code{Open} benutzen. Beachten Sie, dass @code{Active}
automatisch mit einer @code{SELECT * FROM ...}-Anfrage startet, was keine
gute Idee ist, wenn Ihre Tabellen Gro� sind!
@item ColdFusion (unter Unix)
Die folgenden Informationen sind der ColdFusion-Dokumentation entnommen:

Lesen Sie folgende Informationen, um den ColdFusion-Server f�r Linux so zu
konfigurieren, dass er den unixODBC-Treiber bei @strong{MyODBC} f�r
MySQL-Datenquellen benutzt. Allaire kann best�tigen, dass die
@strong{MyODBC}-Version 2.50.26 mit MySQL-Version 3.22.27 und ColdFusion
f�r Linux funktioniert. (Jede neuere Version sollte ebenfalls
funktionieren.) Sie k�nnen @strong{MyODBC} von
@uref{http://www.mysql.com/downloads/api-myodbc.html} herunter laden.

@cindex ColdFusion
Bei ColdFusion Version 4.5.1 k�nnen Sie den ColdFusion Administrator
benutzen, um die MySQL-Datenquelle hinzuzuf�gen. Der Treiber liegt der
ColdFusion Version 4.5.1 jedoch nicht bei. Bevor der MySQL-Treiber in der
Auswahlliste der ODBC-Datenquellen erscheint, m�ssen Sie den
@strong{MyODBC}-Treiber bauen und nach
@file{/opt/coldfusion/lib/libmyodbc.so} kopieren.

Das Contrib-Verzeichnis enth�lt das Programm mydsn-xxx.zip, mit dem Sie die
DSN-Registrierungs-Datei f�r den MyODBC-Treiber auf
Coldfusion-Applikationen bauen k�nnen.

@cindex DataJunction
@item DataJunction
Sie m�ssen es �ndern, damit es @code{VARCHAR} statt @code{ENUM} ausgibt,
weil es Letzteres in einer Art ausgibt, die MySQL nicht versteht.

@cindex Excel
@item Excel
Funktioniert. Einige Tipps:
@itemize @bullet
@item
Wenn Sie Probleme mit Datumsangaben haben, versuchen Sie, sie als
Zeichenketten mit der @code{CONCAT()}-Funktion abzurufen. Beispiel:
@example
select CONCAT(sonnenaufgang), CONCAT(sonnenuntergang)
    from aufgang_untergang;
@end example
Werte, die auf diese Art als Zeichenketten abgerufen werden, sollten
korrekt als Zeitwerte von Excel97 erkannt werden.

Der Zweck von @code{CONCAT()} in diesem Beispiel ist, ODBC auszutricksen,
so dass es denkt, dass die Spalte vom Typ "Zeichenkette" sei. Ohne
@code{CONCAT()} wei� ODBC, dass die Spalte vom Typ "Zeit" ist, und Excel
versteht das nicht.

Beachten Sie, dass das ein Bug in Excel ist, weil es eine Zeichenkette
automatisch in eine Zeitangabe umwandelt. Das w�re sehr gut, wenn die
Quelle eine Textdatei w�re, ist aber einfach nur dumm, wenn die Quelle eine
ODBC-Verbindung ist, die exakte Typen f�r jede Spalte �bermittelt.
@end itemize
@cindex Word
@item Word

Um Daten von MySQL in Word- / Excel-Dokumente abzurufen, m�ssen Sie den
@code{MyODBC}-Treiber benutzen und das Add-in Microsoft Query hinzuf�gen.

Erzeugen Sie zum Beispiel eine Datenbank mit einer Tabelle, die 2
Text-Spalten enth�lt:

@itemize @bullet
@item
F�gen Sie Zeilen mit dem @code{mysql}-Kommandozeilenwerkzeug ein.
@item
Erzeugen Sie eine DSN-Datei mit dem MyODBC-Treiber, die Sie zum Beispiel my
nennen, f�r die oben genannten Datenbank.
@item
�ffnen Sie Word.
@item
Erzeugen Sie ein leeres Dokument.
@item
�ffnen Sie die Symbolleiste 'Datenbank' und klicken Sie auf die
Schaltfl�che 'Datenbank einf�gen'.
@item
Klicken Sie auf die Schaltfl�che 'Daten abrufen'.
@item
Klicken Sie auf die Schaltfl�che 'MS Query'.
@item
Erzeugen Sie in MS Query eine neue Datenquelle unter Benutzung der
DSN-Datei my.
@item
W�hlen Sie die neue Anfrage aus.
@item
W�hlen Sie die Spalten aus, die Sie haben wollen.
@item
Legen Sie bei Bedarf einen Filter fest.
@item
Legen Sie bei Bedarf eine Sortierung fest.
@item
W�hlen Sie 'Daten an Word zur�ckgeben'.
@item
Klicken Sie auf 'Beenden'.
@item
Klicken Sie auf 'Daten einf�gen' und w�hlen Sie die Datens�tze aus.
@item
Klicken Sie auf 'OK', und Sie sehen die Zeilen in Ihrem Word-Dokument.
@end itemize

@cindex odbcadmin
@item odbcadmin
Test-Programm f�r ODBC.
@cindex Delphi-Programm
@item Delphi
Sie m�ssen BDE-Version 3.2 oder neuer benutzen. Setzen Sie die `Don't
optimize column width'-Option, wenn Sie sich mit MySQL verbinden.

Hier ist m�glicherweise n�tzlicher Delphi-Code, der sowohl einen
ODBC-Eintrag als auch einen BDE-Eintrag f�r @strong{MyODBC} setzt (der
BDE-Eintrag erfordert einen BDE-Alias-Editor, der kostenlos auf einer
Delphi Super Page in Ihrer N�he herunter geladen werden kann (Dank daf�r an
Bryan Brunton @email{bryan@@flesherfab.com}:

@example
fReg:= TRegistry.Create;
  fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True);
  fReg.WriteString('Database', 'Documents');
  fReg.WriteString('Description', ' ');
  fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll');
  fReg.WriteString('Flag', '1');
  fReg.WriteString('Password', '');
  fReg.WriteString('Port', ' ');
  fReg.WriteString('Server', 'xmark');
  fReg.WriteString('User', 'winuser');
  fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
  fReg.WriteString('DocumentsFab', 'MySQL');
  fReg.CloseKey;
  fReg.Free;

  Memo1.Lines.Add('DATABASE NAME=');
  Memo1.Lines.Add('USER NAME=');
  Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  Memo1.Lines.Add('BATCH COUNT=200');
  Memo1.Lines.Add('LANGTreiber=');
  Memo1.Lines.Add('MAX ROWS=-1');
  Memo1.Lines.Add('SCHEMA CACHE DIR=');
  Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  Memo1.Lines.Add('SQLQRYMODE=');
  Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  Memo1.Lines.Add('ENABLE BCD=FALSE');
  Memo1.Lines.Add('ROWSET SIZE=20');
  Memo1.Lines.Add('BLOBS TO CACHE=64');
  Memo1.Lines.Add('BLOB SIZE=32');

  AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
@end example

@cindex C++-Builder
@item C++-Builder
Getestet mit BDE-Version 3.0. Das einzige bekannte Problem ist, dass
Anfragefelder nicht aktualisiert werden, wenn sich die Tabellenstruktur
�ndert. BDE scheint jedoch keine Prim�rschl�ssel zu erkennen, sondern nur
den Index PRIMARY, obwohl das eigentlich kein Problem darstellt.

@item Vision
Sie sollten den Option-Flag @code{Return matching rows} benutzen.

@cindex Visual Basic
@item Visual Basic
Damit Sie eine Tabelle aktualisieren k�nnen, m�ssen Sie f�r die Tabelle
einen Prim�rschl�ssel definieren.

Visual Basic mit ADO kann keine gro�en Ganzzahlen handhaben. Das hei�t,
dass einige Anfragen wie @code{SHOW PROCESSLIST} nicht korrekt
funktionieren. Das l��t sich beheben, indem man die Option
@code{OPTION=16834} in der ODBC-Verbindungs-Zeichenkette hinzuf�gt oder die
@code{Change BIGINT columns to INT}-Option im MySQL-Verbindungsbildschirm
setzt. Eventuell sollten Sie auch die @code{Return matching rows}-Option
setzen.

@item VisualInterDev
Wenn Sie den Fehler @code{[Microsoft][ODBC Driver Manager] Driver does not
support this parameter} erhalten, kann es daran liegen, dass Sie ein
@code{BIGINT} in Ihrem Ergebnis haben. Versuchen Sie, die @code{Change
BIGINT columns to INT}-Option im MySQL-Verbindungsbildschirm zu setzen.

@item Visual Objects
Sie sollten den Option-Flag @code{Don't optimize column widths} setzen.
@end table


@node ODBC and last_insert_id, MyODBC bug report, MyODBC clients, ODBC
@c German node ODBC und last_insert_id
@subsection Wie man den Wert einer @code{AUTO_INCREMENT}-Spalte in ODBC erh�lt

@cindex AUTO-INCREMENT, ODBC

Ein h�ufiges Problem ist es, den Wert einer automatisch erzeugten Kennung
von einem @code{INSERT} zu erhalten. Bei ODBC k�nnen Sie etwas wie
folgendes tun (unter der Annahme, dass @code{auto} ein
@code{AUTO_INCREMENT}-Feld ist):

@example
INSERT INTO foo (auto,text) VALUES(NULL,'text');
SELECT LAST_INSERT_ID();
@end example

Oder, wenn Sie die Kennung in eine andere Tabelle einf�gen wollen:

@example
INSERT INTO foo (auto,text) VALUES(NULL,'text');
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
@end example

@xref{Getting unique ID}.

Bei einigen ODBC-Applikationen (zumindest Delphi und Access) kann folgende
Anfrage benutzt werden, um eine neu eingef�gte Zeile zu finden:
@example
SELECT * FROM tabelle WHERE auto IS NULL;
@end example


@node MyODBC bug report,  , ODBC and last_insert_id, ODBC
@c German node MyODBC-Bug-Bericht
@subsection Probleme mit MyODBC berichten

@cindex berichten, MyODBC-Probleme
@cindex Probleme, ODBC
@cindex MyODBC, Probleme berichten

Wenn Sie Probleme mit @strong{MyODBC} bekommen, sollten Sie als erstes eine
Log-Datei durch den ODBC-Manager anlegen lassen (das Log, das Sie erhalten,
wenn Sie Logs von ODBCADMIN abfragen) sowie ein @strong{MyODBC}-Log.

Um ein @strong{MyODBC}-Log zu erhalten, tun Sie folgendes:

@enumerate
@item
Stellen Sie sicher, dass Sie @code{myodbcd.dll} und nicht @code{myodbc.dll}
benutzen. Am einfachsten ist es, wenn Sie sich @code{myodbcd.dll} aus der
MyODBC-Distribution holen und es �ber @code{myodbc.dll} kopieren, die sich
wahrscheinlich in Ihrem @code{C:\windows\system32}- oder
@code{C:\winnt\system32}-Verzeichnis befindet.

Denken Sie daran, dass Sie wahrscheinlich die alten myodbc.dll nach dem
Testen wiederherstellen wollen, weil Sie um einiges schneller ist als
@code{myodbcd.dll}.
@item
Kreuzen Sie `Trace MyODBC' im @strong{MyODBC}-Verbindungs- bzw.
Konfigurationsfenster an. Das Log wird in die Datei @file{C:\myodbc.log}
geschrieben.

Wenn Sie zu diesem Fenster zur�ckkehren und feststellen, dass die
Trace-Option nicht mehr angekreuzt ist, hei�t das, dass Sie nicht den
@code{myodbcd.dll}-Treiber benutzen (siehe oben).
@item
Starten Sie Ihre Applikation und versuchen Sie, eine Fehlfunktion zu
bekommen.
@end enumerate

Untersuchen Sie die @code{MyODBC-Trace-Datei}, um herauszufinden, was
m�glicherweise schief geht. Sie k�nnen die abgesetzten Anfragen finden,
indem Sie nach der Zeichenkette @code{>mysql_real_query} in der
@file{myodbc.log}-Datei suchen.

Sie sollten die Anfragen auch zus�tzlich im @code{mysql}-Monitor oder in
@code{admndemo} laufen lassen, um herauszufinden, ob der Fehler bei MyODBC
oder bei MySQL liegt.

Wenn Sie herausgefunden haben, was schief l�uft, schicken Sie bitte nur die
relevanten Zeilen (maximal 40 Zeilen) an @email{myodbc@@lists.mysql.com}.
Bitte schicken Sie nie die gesamte MyODBC- oder ODBC-Log-Datei!

Wenn Sie nicht herausfinden k�nnen, was schief l�uft, besteht die letzte
Option darin, eine Archivdatei anzulegen (tar oder zip), die eine
MyODBC-Trace-Datei, die ODBC-Log-Datei und eine README-Datei enth�lt, die
das Problem erl�utert. Schicken Sie diese an
@uref{ftp://support.mysql.com/pub/mysql/secret}. Nur wir bei MySQL AB haben
Zugriff auf die Dateien, die Sie hochspielen, und wir gehen mit den Daten
sehr diskret um!

Wenn Sie ein Programm erzeugen k�nnen, das dieses Problem ebenfalls zeigt,
laden Sie dieses bitte ebenfalls hoch!

Wenn das Programm mit irgend einem anderen SQL-Server funktioniert, sollten
Sie eine ODBC-Log-Datei anlegen, in der Sie dasselbe in dem anderen
SQL-Server ausf�hren.

Bedenken Sie, dass wir umso eher das Problem beheben k�nnen, desto mehr
Informationen Sie uns zur Verf�gung stellen!


@node C, Cplusplus, ODBC, Clients
@c German node C
@section MySQL-C-API

@cindex C-API, datatypes
@cindex Datentypen, C-API


Der C-API-Code wird mit MySQL ausgeliefert. Er ist in der
@code{mysqlclient}-Bibliothek enthalten und erlaubt C-Programmen, auf eine
Datenbank zuzugreifen.

Viele Clients in der MySQL-Quelldistribution sind in C geschrieben. Wenn
Sie nach Beispielen f�r den Gebrauch der C-API suchen, schauen Sie sich
diese Clients an. Sie finden Sie im @code{clients}-Verzeichnis in der
MySQL-Quelldistribution.

Viele andere Client-APIs (alle ausser Java) benutzen die
@code{mysqlclient}-Bibliothek, um mit dem MySQL-Server zu kommunizieren.
Das hei�t zum Beispiel, dass Sie viele derselben Umgebungsvariablen nutzen
k�nnen, die von anderen Client-Programmen benutzt werden, weil sie von der
Bibliothek referenziert werden. Eine Liste dieser Variablen findet sich
unter @ref{Client-Side Scripts}.

Der Client hat eine maximale Kommunikationspuffergr��e. Die anf�nglich
zugewiesene Puffergr��e (16 KB) wird automatisch bis zur maximale Gr��e
(16 MB) vergr��ert. Weil Puffergr��en nur bei Bedarf vergr��ert werden,
bedeutet die einfache Erh�hung der maximalen Gr��e nicht per se, dass mehr
Ressourcen benutzt werden. Die �berpr�fung der Gr��e ist haupts�chlich
eine Pr�fung auf irrt�mliche Anfragen und Kommunikationspakete.

Der Kommunikationspuffer muss Gro� genug sein, um ein einzelnes
SQL-Statement aufzunehmen (f�r den Client-Server-Verkehr) und eine Zeile
zur�ckgegebener Daten (f�r den Server-Client-Verkehr). Der
Kommunikationspuffer jedes Threads wird dynamisch vergr��ert, um jede
Anfrage oder Zeile bis zur maximalen Gr��e zu handhaben. Wenn Sie
beispielsweise @code{BLOB}-Werte haben, die bis zu 16 MB an Daten
beinhalten, m�ssen Sie eine Kommunikationspuffergrenze von zumindest 16 MB
haben (sowohl beim Server als auch beim Client). Die vorgabem��ige
maximale Gr��e beim Client liegt bei 16 MB, aber die vorgabem��ige
maximale Grenze beim Server liegt bei 1 MB. Das k�nnen Sie vergr��ern,
indem Sie den Wert des @code{max_allowed_packet}-Parameters setzen, wenn
der Server gestartet wird. @xref{Server parameters}.

Der MySQL-Server verringert den Kommunikationspuffer auf
@code{net_buffer_length} Bytes nach jeder Anfrage. Bei Clients wird die
Gr��e des zugewiesenen Puffers bei einer Verbindung nicht herabgesetzt,
bis die Verbindung geschlossen wird. Dann wird der Client-Speicher wieder
freigesetzt.

Zum Programmieren mit Threads siehe @ref{Threaded clients}. Um eine
Standalone-Applikation herzustellen, die "Server" und "Client" im selben
Programm beinhaltet (und nicht mit einem externen MySQL-Server
kommuniziert), siehe @ref{libmysqld}.


@menu
* C API datatypes::             
* C API function overview::     
* C API functions::             
* C Thread functions::          
* C Embedded Server func::      
* C API problems::              
* Building clients::            
* Threaded clients::            
* libmysqld::                   
@end menu

@node C API datatypes, C API function overview, C, C
@c German node C-API-Datentypen
@subsection C-API-Datentypen

@table @code
@tindex MYSQL C type
@item MYSQL
This structure represents a handle to one Datenbank connection. It is
used f�r almost all MySQL Funktionen.

@tindex MYSQL_RES C-Typ
@item MYSQL_RES
Diese Struktur repr�sentiert das Ergebnis einer Anfrage, die Zeilen
zur�ckgibt (@code{SELECT}, @code{SHOW}, @code{DESCRIBE}, @code{EXPLAIN}).
Die von der Anfrage zur�ckgegebene Informationen wird im Weiteren
@emph{result set} (Ergebnismenge) genannt.

@tindex MYSQL_ROW C-Typ
@item MYSQL_ROW
Das ist eine Typ-sichere Repr�sentation einer Zeile von Daten. Momentan ist
sie als ein Array gez�hlter Byte-Zeichenketten implementiert. (Sie k�nnen
diese nicht als NULL-begrenzte Zeichenketten behandeln, falls Feldwert
bin�re Daten enthalten k�nnen, welche solche Werte intern NULL-Bytes
enthalten k�nnen.) Zeilen werden mit dem Aufruf von
@code{mysql_fetch_row()} abgeholt.

@tindex MYSQL_FIELD C-Typ
@item MYSQL_FIELD
Diese Struktur enth�lt Informationen �ber ein Feld, wie Feldname, Feldtyp
und Feldgr��e. Seine Elemente werden weiter unten genauer beschrieben. Sie
erhalten die @code{MYSQL_FIELD}-Strukturen f�r jedes Feld durch den
wiederholten Aufruf von @code{mysql_fetch_field()}. Feldwerte sind nicht
Teil dieser Struktur, sondern in der @code{MYSQL_ROW}-Struktur enthalten.


@tindex MYSQL_FIELD_OFFSET C-Typ
@item MYSQL_FIELD_OFFSET
Das ist eine Typ-sichere Repr�sentation eines Offsets in einer
MySQL-Feldliste (benutzt von @code{mysql_field_seek()}.) Offsets sind
Feldnummern innerhalb einer Zeile, beginnend mit 0.

@tindex my_ulonglong C-Typ
@tindex my_ulonglong-Werte, Ausgabe
@item my_ulonglong
Der Typ, der f�r die Anzahl von Zeilen und f�r @code{mysql_affected_rows()},
@code{mysql_num_rows()}, und @code{mysql_insert_id()} benutzt wird. Dieser
Typ stellt einen Bereich von @code{0} bis @code{1.84e19} zur Verf�gung.

Auf manchen Systemen funktioniert der Versuch, einen Wert des Typs
@code{my_ulonglong} auszugeben, nicht. Um einen solchen Wert auszugeben,
wandeln Sie ihn in @code{unsigned long} um und benutzen Sie ein
@code{%lu}-Ausgabeformat. Beispiel:
@example
printf (Anzahl von Zeilen: %lu\n", (unsigned long) mysql_num_rows(result));
@end example
@end table

@noindent
Die @code{MYSQL_FIELD}-Struktur enth�lt die unten aufgef�hrten Elemente:

@table @code
@item char * name
Der Name des Feldes, als NULL-begrenzte Zeichenkette.

@item char * table
Der Name der Tabelle, die dieses Feld enth�lt, falls es kein berechnetes
Feld ist. Bei berechneten Feldern ist der @code{table}-Wert eine leere
Zeichenkette.

@item char * def
Der Vorgabewert dieses Felds als eine NULL-begrenzte Zeichenkette. Dieser
wird nur gesetzt, wenn Sie @code{mysql_list_fields()} benutzen.

@item enum enum_field_types-Typ
Der Typ des Felds. Der @code{type}-Wert kann einer der folgenden sein:

@multitable @columnfractions .3 .55
@item @strong{Typwert}                  @tab @strong{Typbedeutung}
@item @code{FIELD_TYPE_TINY}            @tab @code{TINYINT}-Feld
@item @code{FIELD_TYPE_SHORT}           @tab @code{SMALLINT}-Feld
@item @code{FIELD_TYPE_LONG}            @tab @code{INTEGER}-Feld
@item @code{FIELD_TYPE_INT24}           @tab @code{MEDIUMINT}-Feld
@item @code{FIELD_TYPE_LONGLONG}        @tab @code{BIGINT}-Feld
@item @code{FIELD_TYPE_DECIMAL}         @tab @code{DECIMAL}- oder @code{NUMERIC}-Feld
@item @code{FIELD_TYPE_FLOAT}           @tab @code{FLOAT}-Feld
@item @code{FIELD_TYPE_DOUBLE}          @tab @code{DOUBLE}- oder @code{REAL}-Feld
@item @code{FIELD_TYPE_TIMESTAMP}       @tab @code{TIMESTAMP}-Feld
@item @code{FIELD_TYPE_DATE}            @tab @code{DATE}-Feld
@item @code{FIELD_TYPE_TIME}            @tab @code{TIME}-Feld
@item @code{FIELD_TYPE_DATETIME}        @tab @code{DATETIME}-Feld
@item @code{FIELD_TYPE_YEAR}            @tab @code{YEAR}-Feld
@item @code{FIELD_TYPE_STRING}          @tab @code{CHAR}- oder @code{VARCHAR}-Feld
@item @code{FIELD_TYPE_BLOB}            @tab @code{BLOB}- oder @code{TEXT}-Feld (benutzen Sie @code{max_length}, um die maximale L�nge festzulegen)
@item @code{FIELD_TYPE_SET}             @tab @code{SET}-Feld
@item @code{FIELD_TYPE_ENUM}            @tab @code{ENUM}-Feld
@item @code{FIELD_TYPE_NULL}            @tab @code{NULL}-Feld
@item @code{FIELD_TYPE_CHAR}            @tab Veraltet; benutzen Sie statt dessen @code{FIELD_TYPE_TINY}
@end multitable

Sie k�nnen das @code{IS_NUM()}-Makro benutzen, um zu testen, ob ein Feld
einen numerischen Typ besitzt oder nicht. �bergeben Sie den
@code{type}-Wert an @code{IS_NUM()}, und Sie erhalten WAHR (true), wenn das
Feld numerisch ist:

@example
if (IS_NUM(field->type))
    printf("Feld ist numerisch\n");
@end example

@item unsigned int length
Die Breite des Felds, wie in der Tabellendefinition festgelegt.

@item unsigned int max_length
Die maximale Breite des Felds f�r die Ergebnismenge (die L�nge des l�ngsten
Feldwerts f�r die Zeilen, die tats�chlich in der Ergebnismenge enthalten
sind). Wenn Sie @code{mysql_store_result()} oder @code{mysql_list_fields()}
benutzen, enth�lt die Variable die maximale L�nge f�r das Feld. Wenn Sie
@code{mysql_use_result()} benutzen, ist sie 0.

@item unsigned int flags
Unterschiedliche Bit-Flags f�r das Feld. Der @code{flags}-Wert kann 0 oder
mehr der folgenden Bits gesetzt haben:

@multitable @columnfractions .3 .55
@item @strong{Flag-Wert}         @tab @strong{Flag-Bedeutung}
@item @code{NOT_NULL_FLAG}       @tab Feld darf nicht @code{NULL} sein
@item @code{PRI_KEY_FLAG}        @tab Feld ist Teil eines Prim�rschl�ssels
@item @code{UNIQUE_KEY_FLAG}     @tab Feld ist Teil eines eindeutigen Schl�ssels
@item @code{MULTIPLE_KEY_FLAG}   @tab Feld ist Teil eines nicht eindeutigen Schl�ssels
@item @code{UNSIGNED_FLAG}       @tab Feld hat das @code{UNSIGNED}-Attribute
@item @code{ZEROFILL_FLAG}       @tab Feld hat das @code{ZEROFILL}-Attribute
@item @code{BINARY_FLAG}         @tab Feld hat das @code{BINARY}-Attribute
@item @code{AUTO_INCREMENT_FLAG} @tab Feld hat das @code{AUTO_INCREMENT}-Attribut
@item @code{ENUM_FLAG}           @tab Feld ist ein @code{ENUM} (veraltet)
@item @code{BLOB_FLAG}           @tab Feld ist ein @code{BLOB} oder @code{TEXT} (veraltet)
@item @code{TIMESTAMP_FLAG}      @tab Feld ist ein @code{TIMESTAMP} (veraltet)
@end multitable

Die Benutzung der @code{BLOB_FLAG}-, @code{ENUM_FLAG}- und
@code{TIMESTAMP_FLAG}-Flags ist veraltet, weil sie den Feldtyp statt eines
Attributs seines Typs angeben. Statt dessen sollten Sie @code{field->type}
gegen @code{FIELD_TYPE_BLOB}, @code{FIELD_TYPE_ENUM} oder
@code{FIELD_TYPE_TIMESTAMP} testen.

@noindent
Das unten stehende Beispiel zeigt eine typische Benutzung des
@code{flags}-Werts:

@example
if (field->flags & NOT_NULL_FLAG)
    printf("Feld darf nicht NULL sein\n");
@end example

Sie k�nnen aus Bequemlichkeitsgr�nden folgende Makros benutzen, um den
Bool'schen Status des @code{flags}-Werts zu bestimmen:

@multitable @columnfractions .3 .5
@item @code{IS_NOT_NULL(flags)} @tab WAHR, wenn der Feldwert als @code{NOT NULL} definiert ist
@item @code{IS_PRI_KEY(flags)}  @tab WAHR, wenn der Feldwert ein Prim�rschl�ssel ist
@item @code{IS_BLOB(flags)}     @tab WAHR, wenn der Feldwert ein @code{BLOB} oder @code{TEXT} ist (veraltet; testen Sie statt dessen @code{field->type})
@end multitable

@item unsigned int decimals
Die Anzahl von Dezimalstellen f�r numerische Felder.
@end table


@node C API function overview, C API functions, C API datatypes, C
@c German node C-API-Funktions�berblick
@subsection C-API-Funktions�berblick

@cindex C-API, Funktionen
@cindex Funktionen, C-API

Die in der C-API verf�gbaren Funktionen sind unten aufgef�hrt und im
n�chsten Abschnitt detaillierter beschrieben.
@xref{C API functions}.

@multitable @columnfractions .3 .7
@item @strong{mysql_affected_rows()} @tab
Gibt die Anzahl von Zeilen zur�ck, die durch die letzte @code{UPDATE}-,
@code{DELETE}- oder @code{INSERT}-Anfrage ge�ndert, gel�scht bzw.
hinzugef�gt wurden.

@item @strong{mysql_close()} @tab
Schlie�t eine Server-Verbindung.

@item @strong{mysql_connect()} @tab
Stellt die Verbindung mit einem MySQL-Server her. Diese Funktion ist
veraltet, benutzen Sie statt dessen @code{mysql_real_connect()}.

@item @strong{mysql_change_user()} @tab
�ndert Benutzer und Datenbank bei einer ge�ffneten Verbindung.

@item @strong{mysql_character_set_name()} @tab
Gibt den Namen des vorgabem��igen Zeichensatzes f�r die Verbindung zur�ck.

@item @strong{mysql_create_db()} @tab
Erzeugt eine Datenbank. Diese Funktion ist veraltet, benutzen Sie statt
dessen den SQL-Befehl @code{CREATE DATABASE}.

@item @strong{mysql_data_seek()} @tab
Sucht bis zu einer beliebigen Zeile in einer Anfrage-Ergebnismenge.

@item @strong{mysql_debug()} @tab
Macht ein @code{DBUG_PUSH} mit der angegebenen Zeichenkette.

@item @strong{mysql_drop_db()} @tab
L�scht eine Datenbank. Diese Funktion ist veraltet, benutzen Sie statt
dessen den SQL-Befehl @code{DROP DATABASE}.

@item @strong{mysql_dump_debug_info()} @tab
Veranlasst den Server, Debug-Informationen in die Log-Datei zu schreiben.

@item @strong{mysql_eof()} @tab
Stellt fest, ob die letzte Zeile der Ergebnismenge gelesen wurde oder
nicht. Diese Funktion ist veraltet, benutzen Sie statt dessen
@code{mysql_errno()} oder @code{mysql_error()}.

@item @strong{mysql_errno()} @tab
Gibt die Fehlernummer der zuletzt aufgerufenen MySQL-Funktion zur�ck.

@item @strong{mysql_error()} @tab
Gibt die Fehlermeldung der zuletzt aufgerufenen MySQL-Funktion zur�ck.

@item @strong{mysql_real_escape_string()} @tab
Escapet Sonderzeichen in einer Zeichenkette, die f�r ein SQL-Statement
benutzt wird, wobei der aktuelle Zeichensatz der Verbindung ber�cksichtigt
wird.

@item @strong{mysql_escape_string()} @tab
Escapet Sonderzeichen in einer Zeichenkette, die f�r ein SQL-Statement
benutzt wird.

@item @strong{mysql_fetch_field()} @tab
Gibt den Typ des n�chsten Tabellenfelds zur�ck.

@item @strong{mysql_fetch_field_direct()} @tab
Gibt den Typ eines Tabellenfelds zur�ck, angegeben durch eine Feldnummer.

@item @strong{mysql_fetch_fields()} @tab
Gibt ein Array aller Feldstrukturen zur�ck.

@item @strong{mysql_fetch_lengths()} @tab
Gibt die L�nge aller Spalten in der aktuellen Zeile zur�ck.

@item @strong{mysql_fetch_row()} @tab
Holt die n�chste Zeile aus der Ergebnismenge.

@item @strong{mysql_field_seek()} @tab
Setzt den Spaltencursor auf eine bestimmte Spalte.

@item @strong{mysql_field_count()} @tab
Gibt die Anzahl der Ergebnisspalten f�r die letzte Anfrage zur�ck.

@item @strong{mysql_field_tell()} @tab
Gibt die Position des Feldcursors zur�ck, der f�r das letzte
@code{mysql_fetch_field()} benutzt wurde.

@item @strong{mysql_free_result()} @tab
Gibt Speicher frei, der von einer Ergebnismenge benutzt wird.

@item @strong{mysql_get_client_info()} @tab
Gibt Client-Versionsinformationen zur�ck.

@item @strong{mysql_get_host_info()} @tab
Gibt eine Zeichenkette zur�ck, die die Verbindung beschreibt.

@item @strong{mysql_get_proto_info()} @tab
Gibt die Protokollversion zru�ck, die von der Verbindung benutzt wird.

@item @strong{mysql_get_server_info()} @tab
Gibt die Server-Versionsnummer zur�ck.

@item @strong{mysql_info()} @tab
Gibt Informationen �ber die zuletzt ausgef�hrte Anfrage zur�ck.

@item @strong{mysql_init()} @tab
Holt oder initialisiert eine @code{MYSQL}-Struktur.

@item @strong{mysql_insert_id()} @tab
Gibt die Kennung zur�ck, die f�r eine @code{AUTO_INCREMENT}-Spalte durch
die letzte Anfrage erzeugt wurde.

@item @strong{mysql_kill()} @tab
T�tet einen angegebenen Thread.

@item @strong{mysql_list_dbs()} @tab
Gibt die Datenbanknamen zur�ck, die mit einem einfachen regul�ren Ausdruck
�bereinstimmen.

@item @strong{mysql_list_fields()} @tab
Gibt die Feldnamen zur�ck, die mit einem einfachen regul�ren Ausdruck
�bereinstimmen.

@item @strong{mysql_list_processes()} @tab
Gibt eine Liste der aktuellen Server-Threads zur�ck.

@item @strong{mysql_list_tables()} @tab
Gibt Tabellenamen zur�ck, die mit einem einfachen regul�ren Ausdruck
�bereinstimmen.

@item @strong{mysql_num_fields()} @tab
Gibt die Anzahl von Spalten in einer Ergebnismenge zur�ck.

@item @strong{mysql_num_rows()} @tab
Gibt die Anzahl von Zeilen in einer Ergebnismenge zur�ck.

@item @strong{mysql_options()} @tab
Setzt Verbindungsoptionen f�r @code{mysql_connect()}.

@item @strong{mysql_ping()} @tab
Pr�ft, ob die Verbindung zum Server funktioniert oder nicht und verbindet
sich erneut, falls notwendig.

@item @strong{mysql_Anfrage()} @tab
F�hrt eine SQL-Anfrage aus, die als NULL-begrenzte Zeichenkette angegeben
wird.

@item @strong{mysql_real_connect()} @tab
Verbindet sich mit einem MySQL-Server.

@item @strong{mysql_real_query()} @tab
F�hrt eine SQL-Anfrage aus, die als gez�hlte Zeichenkette angegeben wird.

@item @strong{mysql_reload()} @tab
Weist den Server an, die Berechtigungstabellen erneut zu laden.

@item @strong{mysql_row_seek()} @tab
Sucht bis zu einer Zeile in einer Ergebnismenge, indem sie den Wert
benutzt, der von @code{mysql_row_tell()} zur�ckgegeben wird.

@item @strong{mysql_row_tell()} @tab
Gibt die Zeilencursorposition zur�ck.

@item @strong{mysql_select_db()} @tab
W�hlt eine Datenbank aus.

@item @strong{mysql_shutdown()} @tab
F�hrt den Datenbankserver herunter.

@item @strong{mysql_stat()} @tab
Gibt den Serverstatus als Zeichenkette zur�ck.

@item @strong{mysql_store_result()} @tab
Ruft eine komplette Ergebnismenge zum Client ab.

@item @strong{mysql_thread_id()} @tab
Gibt die aktuelle Thread-Kennung zur�ck.

@item @strong{mysql_thread_safe()} @tab
Gibt 1 zur�ck, wenn die Clients Thread-sicher kompiliert sind.

@item @strong{mysql_use_result()} @tab
Initialisiert den zeilenweisen Abruf einer Ergebnismenge.
@end multitable

Um sich mit dem Server zu verbinden, rufen Sie @code{mysql_init()} auf, um
einen Verbindungs-Handler zu initialisieren. Rufen Sie dann
@code{mysql_real_connect()} mit diesem Handler auf (mit Informationen wie
Hostname, Benutzername und Passwort). Beim Verbinden setzt
@code{mysql_real_connect()} den @code{reconnect}-Flag (Teil der
MYSQL-Struktur) auf einen Wert von @code{1}. Dieser Flag legt bei einer
Anfrage, die wegen einer verloren gegangenen Serververbindung nicht
ausgef�hrt werden kann, fest, dass ein erneutes Verbinden versucht wird,
bevor aufgegeben wird. Wenn Sie mit der Verbindung fertig sind, rufen Sie
@code{mysql_close()} auf, um sie zu beenden.

W�hrend eine Verbindung aktiv ist, kann der Client SQL-Anfragen an den
Server schicken, indem er @code{mysql_query()} oder
@code{mysql_real_query()} benutzt. Der Unterschied zwischen beiden ist,
dass @code{mysql_query()} erwartet, dass die Anfrage als NULL-separierte
Zeichenkette angegeben wird, w�hrend @code{mysql_real_query()} eine
gez�hlte Zeichenkette erwartet. Wenn die Zeichenkette Bin�rdaten enth�lt
(was NULL-Bytes beinhalten kann), m�ssen Sie @code{mysql_real_query()}
benutzen.

Bei jeder Nicht-@code{SELECT}-Anfrage (wie @code{INSERT}, @code{UPDATE},
@code{DELETE}) finden Sie heraus, wie viele Zeilen ge�ndert (betroffen)
wurden, indem Sie @code{mysql_affected_rows()} aufrufen.

Bei @code{SELECT}-Anfragen rufen Sie die ausgew�hlten Zeilen als
Ergebnismenge ab. (Beachten Sie, dass einige Statements �hnlich wie
@code{SELECT} sind, weil auch sie Zeilen zur�ckgeben. Das sind @code{SHOW},
@code{DESCRIBE} und @code{EXPLAIN}. Sie werden auf dieselbe Weise behandelt
wie @code{SELECT}-Statements.)

Es gibt f�r einen Client zwei M�glichkeiten, Ergebnismengen zu verarbeiten.
Eine M�glichkeit besteht darin, die gesamte Ergebnismenge auf einmal
abzurufen, indem @code{mysql_store_result()} aufgerufen wird. Diese
Funktion holt alle Zeilen vom Server ab, die von der Anfrage zur�ckgegeben
werden, und speichert sie im Client. Die zweite M�glichkeit besteht darin,
dass der Client die Ergebnismenge zeilenweise abruft, indem er
@code{mysql_use_result()} aufruft. Diese Funktion initialisiert den Abruf,
holt aber keinerlei Zeilen vom Server ab.

In beiden F�llen k�nnen Sie auf Zeilen zugreifen, indem Sie
@code{mysql_fetch_row()} aufrufen. Bei @code{mysql_store_result()} greift
@code{mysql_fetch_row()} auf Zeilen zur�ck, die bereits vom Server geholt
wurden. Bei @code{mysql_use_result()} ruft @code{mysql_fetch_row()} die
Zeilen direkt vom Server ab. Informationen �ber die Gr��e der Daten in
jeder Zeile sind durch Aufruf von @code{mysql_fetch_lengths()} verf�gbar.

Wenn Sie mit einer Ergebnismenge fertig sind, rufen Sie
@code{mysql_free_result()} auf, um den hierf�r benutzten Speicher
freizugeben.

Die beiden Abrufmechanismen sind komplement�r. Client-Programme sollten
entscheiden, welcher Ansatz der f�r ihre Erfordernisse geeignetste ist. In
der Praxis wird f�r Clients h�ufiger @code{mysql_store_result()} verwendet.

Ein Vorteil von @code{mysql_store_result()} ist, dass bereits alle Zeilen
zum Client geholt wurden. Deshalb k�nnen Sie nicht nur sequentiell auf
Zeilen zugreifen, sondern sich in der Ergebnismenge vorw�rts und r�ckw�rts
bewegen, indem Sie @code{mysql_data_seek()} oder @code{mysql_row_seek()}
benutzen, um die aktuelle Position innerhalb der Ergebnismenge zu �ndern.
Sie k�nnen auch herausfinden, wie viele Zeilen es gibt, indem Sie
@code{mysql_num_rows()} aufrufen. Auf der anderen Seite kann der
Speicherbedarf f�r @code{mysql_store_result()} sehr hoch sein, wenn Sie
gro�e Ergebnismengen abrufen, so dass Speichermangel eintreten kann.

Ein Vorteil von @code{mysql_use_result()} ist, dass der Client weniger
Arbeitsspeicher f�r die Ergebnismenge ben�tigt, weil er nur eine Zeile
zugleich erh�lt (und weil weniger Zuweisungs-Overhead da ist, kann
@code{mysql_use_result()} schneller sein). Die Nachteile liegen darin, dass
Sie jede Zeile schnell verarbeiten m�ssen, um zu vermeiden, den Server zu
blockieren. Ausserdem haben Sie keinen wahlfreien (random) Zugriff auf die
Zeilen innerhalb einer Ergebnismenge (Sie k�nnen auf die Zeilen nur
sequentiell zugreifen), und Sie wissen nicht, wie viele Zeilen sich in der
Ergebnismenge befinden, bis Sie sie alle abgerufen haben. Dar�ber hinaus
@emph{m�ssen} Sie alle Zeilen abrufen, selbst wenn Sie w�hrend des Abrufs
feststellen, dass Sie die Information gefunden haben, nach der Sie suchen.

Die API erm�glicht Clients, auf die Anfragen entsprechend zu antworten
(Zeilen nur wenn n�tig abzurufen), ohne zu wissen, ob die Anfragen ein
@code{SELECT} ist oder nicht. Das erreichen Sie durch Aufruf von
@code{mysql_store_result()} nach jedem @code{mysql_query()} (oder
@code{mysql_real_query()}). Wenn der Ergebnismengenaufruf erfolgreich ist,
war die Anfrage ein @code{SELECT} und Sie k�nnen die Zeilen lesen. Wenn der
Ergebnismengenaufruf fehlschl�gt, rufen Sie @code{mysql_field_count()} auf,
um festzustellen, ob ein Ergebnis erwartet wurde oder nicht. Wenn
@code{mysql_field_count()} 0 zur�ckgibt, gab die Anfrage keine Daten zur�ck
(was anzeigt, dass sie kein @code{INSERT}, @code{UPDATE}, @code{DELETE}
usw. war), und es wurde nicht erwartet, dass sie Zeilen zur�ckgibt. Wenn
@code{mysql_field_count()} ungleich 0 ist, sollte die Anfrage Zeilen
zur�ckgegeben haben, tat das aber nicht. Das zeigt an, dass die Anfrage ein
@code{SELECT} war, das fehlschlug. Sehen Sie in der Beschreibung von
@code{mysql_field_count()} wegen eines Beispiels nach, wie das gemacht
wird.

Sowohl @code{mysql_store_result()} als auch @code{mysql_use_result()}
gestatten Ihnen, Informationen �ber die Felder zu erlangen, aus denen die
Ergebnismenge besteht (die Anzahl der Felder, ihre Namen, Typen usw.). Sie
k�nnen sequentiell auf Feldinformationen innerhalb der Zeile zugreifen,
indem Sie @code{mysql_fetch_field()} wiederholt aufrufen, oder direkt auf
die Feldnummer innerhalb einer Zeile durch Aufruf von
@code{mysql_fetch_field_direct()}. Die aktuelle Feldcursorposition kann
durch den Aufruf von @code{mysql_field_seek()} ge�ndert werden. Wenn Sie
den Feldcursor setzen, betrifft das nachfolgende Aufrufe von
@code{mysql_fetch_field()}. Sie erhalten alle Feldinformationen auf einmal,
wenn Sie @code{mysql_fetch_fields()} aufrufen.

Um Fehler zu erkennen und zu berichten, stellt MySQL den Zugriff auf
Fehlerinformationen durch die @code{mysql_errno()}- und
@code{mysql_error()}-Funktionen zur Verf�gung. Diese geben den Fehlercode
oder die Fehlermeldung f�r die zuletzt aufgerufenen Funktionen zur
Verf�gung, die erfolgreich sein oder fehlschlagen k�nnen, so dass Sie
feststellen k�nnen, wann ein Fehler auftrat und welcher es war.


@node C API functions, C Thread functions, C API function overview, C
@c German node C-API-Funktionen
@subsection C-API-Funktionsbeschreibungen


In den unten stehenden Beschreibungen bedeutet ein Parameter oder
R�ckgabewert von @code{NULL} @code{NULL} im Sinne der
C-Programmier-Sprache, nicht einen MySQL-@code{NULL}-Wert.

Funktionen, die einen Wert zur�ckgeben, geben allgemein einen Zeiger oder
eine Ganzzahl zur�ck. Falls nicht anders angegeben geben Funktionen, die
einen Zeiger zur�ckgeben, einen Nicht-@code{NULL}-Wert zur�ck, um Erfolg
anzuzeigen, oder einen @code{NULL}-Wert, um einen Fehler anzuzeigen.
Funktionen, die eine Ganzzahl zur�ckgeben, geben 0 zur�ck, um Erfolg
anzuzeigen, und Nicht-0, um einen Fehler anzuzeigen. Beachten Sie, dass
``Nicht-0'' genau das bedeutet. Wenn die Funktionsbeschreibung nichts
anderes aussagt, testen Sie nicht gegen einen anderen Wert als 0:

@example
if (ergebnis)                   /* korrekt */
    ... FEHLER ...

if (ergebnis < 0)               /* nicht korrekt */
    ... FEHLER ...

if (ergebnis == -1)             /* nicht korrekt */
    ... FEHLER ...
@end example

Wenn eine Funktion einen Fehler zur�ckgibt, listet der Unterabschnitt
@strong{Errors} der Funktionsbeschreibung die m�glichen Fehlertypen auf.
Sie finden heraus, welcher davon auftrat, indem Sie @code{mysql_errno()}
aufrufen. Eine Zeichenketten-Darstellung des Fehler kann durch Aufruf von
@code{mysql_error()} erlangt werden.


@menu
* mysql_affected_rows::         
* mysql_close::                 
* mysql_connect::               
* mysql_change_user::           
* mysql_character_set_name::    
* mysql_create_db::             
* mysql_data_seek::             
* mysql_debug::                 
* mysql_drop_db::               
* mysql_dump_debug_info::       
* mysql_eof::                   
* mysql_errno::                 
* mysql_error::                 
* mysql_escape_string::         
* mysql_fetch_field::           
* mysql_fetch_fields::          
* mysql_fetch_field_direct::    
* mysql_fetch_lengths::         
* mysql_fetch_row::             
* mysql_field_count::           
* mysql_field_seek::            
* mysql_field_tell::            
* mysql_free_result::           
* mysql_get_client_info::       
* mysql_get_host_info::         
* mysql_get_proto_info::        
* mysql_get_server_info::       
* mysql_info::                  
* mysql_init::                  
* mysql_insert_id::             
* mysql_kill::                  
* mysql_list_dbs::              
* mysql_list_fields::           
* mysql_list_processes::        
* mysql_list_tables::           
* mysql_num_fields::            
* mysql_num_rows::              
* mysql_options::               
* mysql_ping::                  
* mysql_query::                 
* mysql_real_connect::          
* mysql_real_escape_string::    
* mysql_real_query::            
* mysql_reload::                
* mysql_row_seek::              
* mysql_row_tell::              
* mysql_select_db::             
* mysql_shutdown::              
* mysql_stat::                  
* mysql_store_result::          
* mysql_thread_id::             
* mysql_use_result::            
@end menu

@node mysql_affected_rows, mysql_close, C API functions, C API functions
@c German node mysql_affected_rows
@subsubsection @code{mysql_affected_rows()}

@findex @code{mysql_affected_rows()}

@code{my_ulonglong mysql_affected_rows(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt die Anzahl von Zeilen zur�ck, die durch das letzte @code{UPDATE}
ge�ndert, durch das letzte @code{DELETE} gel�scht oder durch das letzte
@code{INSERT} eingef�gt wurden. Kann direkt nach @code{mysql_query()}
aufgerufen werden, bei @code{UPDATE}-, @code{DELETE}- oder
@code{INSERT}-Statements. Bei @code{SELECT}-Statements funktioniert
@code{mysql_affected_rows()} wie @code{mysql_num_rows()}.

@subsubheading R�ckgabewerte

Eine Ganzzahl gr��er als 0 gibt die Anzahl von Zeilen an, die betroffen
oder abgerufen wurden. 0 gibt an, dass keine Datens�tze bei einem
@code{UPDATE}-Statement ge�ndert wurden, keine Zeilen der
@code{WHERE}-Klausel in der Anfrage entsprachen oder dass bislang keine
Anfrage ausgef�hrt wurde. -1 gibt an, dass die Anfrage einen Fehler
zur�ckgab oder dass - bei einer @code{SELECT}-Anfrage -
@code{mysql_affected_rows()} vor @code{mysql_store_result()} aufgerufen
wurde.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
mysql_query(&mysql,"UPDATE produkte SET kosten=kosten*1.25 WHERE gruppe=10");
printf("%ld produkte updated",(long) mysql_affected_rows(&mysql));
@end example

Wenn man den Flag @code{CLIENT_FOUND_ROWS} angibt, wenn man sich mit
@code{mysqld} verbindet, gibt @code{mysql_affected_rows()} die Anzahl von
Zeilen zur�ck, die mit dem @code{WHERE}-Statement bei
@code{UPDATE}-Statements �bereinstimmten.

Beachten Sie bei der Benutzung des @code{REPLACE}-Befehls, dass
@code{mysql_affected_rows()} 2 zur�ckgibt, wenn die neue Zeile eine alte
Zeile ersetzte. Das liegt daran, dass in diesem Fall eine neue Zeile
eingef�gt und dann das alte Duplikat gel�scht wurde.


@node mysql_close, mysql_connect, mysql_affected_rows, C API functions
@c German node mysql_close
@subsubsection @code{mysql_close()}

@findex @code{mysql_close()}

@code{void mysql_close(MYSQL *mysql)}

@subsubheading Beschreibung
Schlie�t eine vorher ge�ffnete Verbindung. @code{mysql_close()} gibt auch
den Verbindungs-Handle frei, der von @code{mysql} zugewiesen wurde, wenn
der Handle automatisch mit @code{mysql_init()} oder @code{mysql_connect()}
zugewiesen wurde.

@subsubheading R�ckgabewerte

Keine.

@subsubheading Fehler

Keine.


@node mysql_connect, mysql_change_user, mysql_close, C API functions
@c German node mysql_connect
@subsubsection @code{mysql_connect()}

@findex @code{mysql_connect()}

@code{MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)}

@subsubheading Beschreibung

Diese Funktion ist veraltet. Sie sollten statt dessen
@code{mysql_real_connect()} benutzen.

@code{mysql_connect()} versucht, eine Verbindung zu einer
MySQL-Datenbankmaschine aufzubauen, die auf @code{host} l�uft.
@code{mysql_connect()} muss erfolgreich beendet werden, bevor Sie irgend
welche weiteren API-Funktionen aufrufen k�nnen, mit Ausnahme von
@code{mysql_get_client_info()}.

Die Bedeutung der Parameter ist dieselbe wie die entsprechenden Parameter
bei @code{mysql_real_connect()}, mit dem Unterschied, dass die
Verbindungsparameter @code{NULL} sein d�rfen. In diesem Fall weist die
C-API automatisch Speicher f�r die Verbindungsstruktur zu und gibt diesen
frei, wenn Sie @code{mysql_close()} aufrufen. Der Nachteil dieses Ansatzes
besteht darin, dass Sie keine Fehlermeldung abrufen k�nnen, wenn die
Verbindung fehlschl�gt. (Um Fehlerinformationen von @code{mysql_errno()}
oder @code{mysql_error()} abrufen zu k�nnen, m�ssen Sie einen g�ltigen
@code{MYSQL}-Zeiger angeben.)

@subsubheading R�ckgabewerte

Dieselben wie f�r @code{mysql_real_connect()}.

@subsubheading Fehler

Dieselben wie f�r @code{mysql_real_connect()}.


@node mysql_change_user, mysql_character_set_name, mysql_connect, C API functions
@c German node mysql_change_user
@subsubsection @code{mysql_change_user()}

@findex @code{mysql_change_user()}

@code{my_bool mysql_change_user(MYSQL *mysql, const char *user, const
char *password, const char *db)}

@subsubheading Beschreibung

�ndert den Benutzer und veranlasst, dass die Datenbank, die mit @code{db}
angegeben wurde, die vorgabem��ige (aktuelle) Datenbank f�r die Verbindung
wird, die durch @code{mysql} festgelegt wurde. In nachfolgenden Anfragen
ist diese Datenbank die Vorgabe f�r Tabellenverweise, bei denen nicht
explizit eine Datenbank angegeben wird.

Diese Funktion wurde in MySQL-Version 3.23.3 eingef�hrt.

@code{mysql_change_user()} schl�gt fehl, wenn sich der Benutzer nicht
authentifizieren kann oder wenn er keine Zugriffsrechte auf die Datenbank
hat. In diesem Fall werden Benutzer und Datenbank nicht ge�ndert.

Der @code{db}-Parameter kann auf @code{NULL} gesetzt werden, wenn Sie keine
vorgabem��ige Datenbank haben wollen.

@subsubheading R�ckgabewerte

0 f�r Erfolg. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

Dieselben, die Sie von @code{mysql_real_connect()} erhalten.

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurde in nicht korrekter Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler ist aufgetreten.
@item ER_UNKNOWN_COM_ERROR
Der MySQL-Server hat diesen Befehl nicht implementiert (wahrscheinlich ein
alter Server).
@item ER_ACCESS_DENIED_ERROR
Benutzername oder Passwort sind falsch.
@item ER_BAD_DB_ERROR
Die Datenbank existiert nicht.
@item ER_DBACCESS_DENIED_ERROR
Der Benutzer hat keine Zugriffsrechte auf die Datenbank.
@item ER_WRONG_DB_NAME
Der Datenbankname war zu lang.
@end table

@subsubheading Beispiel

@example
if (mysql_change_user(&mysql, "benutzer", "passwort", "neue_datenbank"))
@{
   fprintf(stderr, "�nderung des Benutzers fehlgeschlagen. Fehler: %s\n",
           mysql_error(&mysql));
@}
@end example


@node mysql_character_set_name, mysql_create_db, mysql_change_user, C API functions
@c German node mysql_character_set_name
@subsubsection @code{mysql_character_set_name()}

@findex @code{mysql_character_set_name()}

@code{const char *mysql_character_set_name(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt den vorgabem��igen Zeichensatz f�r die aktuelle Verbindung zur�ck.

@subsubheading R�ckgabewerte

Der vorgabem��ige Zeichensatz

@subsubheading Fehler

Keine.


@node mysql_create_db, mysql_data_seek, mysql_character_set_name, C API functions
@c German node mysql_create_db
@subsubsection @code{mysql_create_db()}

@findex @code{mysql_create_db()}

@code{int mysql_create_db(MYSQL *mysql, const char *db)}

@subsubheading Beschreibung
Erzeugt die Datenbank, die durch den @code{db}-Parameter angegeben wird.

Diese Funktion ist veraltet. Vorzugsweise sollten Sie @code{mysql_query()}
benutzen, um statt dessen ein SQL-@code{CREATE DATABASE}-Statement
abzusetzen.

@subsubheading R�ckgabewerte

0, wenn die Datenbank erfolgreich erzeugt wurde. Nicht-0, wenn ein Fehler
auftrat.

@subsubheading Fehler
@table @code

@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden in nicht korrekter Reihenfolge ausgef�hrt.

@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.

@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.

@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table

@subsubheading Beispiel

@example
if(mysql_create_db(&mysql, "meine_datenbank"))
@{
   fprintf(stderr, "Erzeugung der neuen Datenbank fehlgeschlagen. Fehler: %s\n",
           mysql_error(&mysql));
@}
@end example


@node mysql_data_seek, mysql_debug, mysql_create_db, C API functions
@c German node mysql_data_seek
@subsubsection @code{mysql_data_seek()}

@findex @code{mysql_data_seek()}

@code{void mysql_data_seek(MYSQL_RES *result, unsigned long long offset)}

@subsubheading Beschreibung
Sucht bis zu einer beliebigen Zeile in einer Anfrageergebnismenge. Das
setzt voraus, dass die Ergebnismengenstruktur das gesamte Anfrageergebnis
enth�lt. Daher kann @code{mysql_data_seek()} nur in Verbindung mit
@code{mysql_store_result()} benutzt werden, nicht in Verbindung mit
@code{mysql_use_result()}.

Der Offset sollte ein Wert im Bereich von 0 bis
@code{mysql_num_rows(ergebnis)-1} sein.

@subsubheading R�ckgabewerte

Keine.

@subsubheading Fehler

Keine.


@node mysql_debug, mysql_drop_db, mysql_data_seek, C API functions
@c German node mysql_debug
@subsubsection @code{mysql_debug()}

@findex @code{mysql_debug()}

@code{void mysql_debug(char *debug)}

@subsubheading Beschreibung
F�hrt ein @code{DBUG_PUSH} mit der angegebenen Zeichenkette durch.
@code{mysql_debug()} benutzt die Debug-Bibliothek von Fred Fish. Um diese
Funktion benutzen zu k�nnen, m�ssen Sie die Client-Bibliothek so
kompilieren, dass sie Debuggen unterst�tzt. @xref{Debugging server}.
@xref{Debugging client}.

@subsubheading R�ckgabewerte

Keine.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

Der unten stehende Aufruf f�hrt dazu, dass die Client-Bibliothek eine
Trace-Datei in @file{/tmp/client.trace} auf der Client-Maschine erzeugt:

@example
mysql_debug("d:t:O,/tmp/client.trace");
@end example


@node mysql_drop_db, mysql_dump_debug_info, mysql_debug, C API functions
@c German node mysql_drop_db
@subsubsection @code{mysql_drop_db()}

@findex @code{mysql_drop_db()}

@code{int mysql_drop_db(MYSQL *mysql, const char *db)}

@subsubheading Beschreibung
L�scht die Datenbank, die durch den @code{db}-Parameter angegeben wird.

Diese Funktion ist veraltet. Benutzen Sie vorzugsweise
@code{mysql_query()}, um statt dessen ein SQL-@code{DROP
DATABASE}-Statement abzusetzen.

@subsubheading R�ckgabewerte

0, wenn die Datenbank erfolgreich gel�scht wurde. Nicht-0, wenn ein Fehler
auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table

@subsubheading Beispiel

@example
if(mysql_drop_db(&mysql, "meine_datenbank"))
  fprintf(stderr, "L�schen der Datenbank fehlgeschlagen: Fehler: %s\n",
          mysql_error(&mysql));
@end example


@node mysql_dump_debug_info, mysql_eof, mysql_drop_db, C API functions
@c German node mysql_dump_debug_info
@subsubsection @code{mysql_dump_debug_info()}

@findex @code{mysql_dump_debug_info()}

@code{int mysql_dump_debug_info(MYSQL *mysql)}

@subsubheading Beschreibung

Weist den Server an, Debug-Informationen ins Log zu schreiben. Damit das
funktioniert, muss der verbundene Benutzer die
@strong{process}-Berechtigung haben.

@subsubheading R�ckgabewerte

0, wenn der Befehl erfolgreich war. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler
@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_eof, mysql_errno, mysql_dump_debug_info, C API functions
@c German node mysql_eof
@subsubsection @code{mysql_eof()}

@findex @code{mysql_eof()}

@code{my_bool mysql_eof(MYSQL_RES *result)}

@subsubheading Beschreibung

Diese Funktion ist veraltet. Benutzen Sie statt dessen @code{mysql_errno()}
oder @code{mysql_error()}.

@code{mysql_eof()} stellt fest, ob die letzte Zeile einer Ergebnismenge
gelesen wurde oder nicht.

Wenn Sie eine Ergebnismenge durch einen erfolgreichen Aufruf von
@code{mysql_store_result()} erhalten, erh�lt der Client den gesamten Satz
in einer Operation. In diesem Fall bedeutet eine @code{NULL}-R�ckgabe von
@code{mysql_fetch_row()} immer, dass das Ende der Ergebnismenge erreicht
wurde und es unn�tig ist, @code{mysql_eof()} aufzurufen.

Wenn Sie auf der anderen Seite @code{mysql_use_result()} aufrufen, um den
Abruf einer Ergebnismenge zu initialisieren, werden die Zeilen des Satzes
Zeile f�r Zeile vom Server erlangt, indem Sie @code{mysql_fetch_row()}
wiederholt aufrufen. Weil w�hrend dieses Prozesses ein Verbindungsfehler
auftreten kann, bedeutet ein @code{NULL}-R�ckgabewert von
@code{mysql_fetch_row()} nicht notwendigerweise, dass das Ende der
Ergebnismenge auf normale Weise erreicht wurde. In diesem Fall k�nnen Sie
@code{mysql_eof()} benutzen, um festzustellen, was passiert ist.
@code{mysql_eof()} gibt einen Nicht-0-Wert zur�ck, wenn das Ende der
Ergebnismenge erreicht wurde, und 0, wenn ein Fehler auftrat.

Historisch liegt @code{mysql_eof()} vor den Standard-MySQL-Fehlerfunktionen
@code{mysql_errno()} und @code{mysql_error()}. Weil diese Fehlerfunktionen
dieselben Informationen zur Verf�gung stellen, wird ihre Benutzung des des
veralteten @code{mysql_eof()} empfohlen. (Sie stellen in der Tat sogar mehr
Informationen zur Verf�gung, weil @code{mysql_eof()} nur einen Bool'schen
Wert zur�ckgibt, w�hrend die Fehlerfunktionen den Grund angeben, warum der
Fehler auftrat.)

@subsubheading R�ckgabewerte

0, wenn kein Fehler auftrat. Nicht-0, wenn das Ende der Ergebnismenge
erreicht wurde.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

Folgendes Beispiel zeigt, wie Sie @code{mysql_eof()} benutzen k�nnen:

@example
mysql_query(&mysql,"SELECT * FROM tabelle");
ergebnis = mysql_use_result(&mysql);
while((zeile = mysql_fetch_row(ergebnis)))
@{
    // Daten verarbeiten usw.
@}
if(!mysql_eof(ergebnis))  // mysql_fetch_row() schlug wegen eines Fehlers fehl
@{
    fprintf(stderr, "Fehler: %s\n", mysql_error(&mysql));
@}
@end example

Sie k�nnen denselben Effekt jedoch auch mit den
Standard-MySQL-Fehlerfunktionen erreichen:

@example
mysql_query(&mysql,"SELECT * FROM tabelle");
result = mysql_use_result(&mysql);
while((zeile = mysql_fetch_row(ergebnis)))
@{
    // Daten verarbeiten usw.
@}
if(mysql_errno(&mysql))  // mysql_fetch_row() schlug wegen eines Fehlers fehl
@{
    fprintf(stderr, "Fehler: %s\n", mysql_error(&mysql));
@}
@end example


@node mysql_errno, mysql_error, mysql_eof, C API functions
@c German node mysql_errno
@subsubsection @code{mysql_errno()}

@findex @code{mysql_errno()}

@code{unsigned int mysql_errno(MYSQL *mysql)}

@subsubheading Beschreibung

F�r die von @code{mysql} angegebene Verbindung gibt @code{mysql_errno()}
den Fehlercode f�r die zuletzt aufgerufene API-Funktion zur�ck, die
erfolgreich sein oder fehlschlagen kann. Ein R�ckgabewert von 0 bedeutet,
dass kein Fehler auftrat. Client-Fehlermeldungsnummern sind in der
MySQL-@file{errmsg.h}-Header-Datei aufgelistet.
Server-Fehlermeldungsnummern sind in @file{mysqld_error.h} aufgelistet. In
der MySQL-Quelldistribution finden Sie eine komplette Liste der
Fehlermeldungen und Fehlernummern in der Datei
@file{Docs/mysqld_error.txt}.

@subsubheading R�ckgabewerte

Ein Fehlercode-Wert. 0, wenn kein Fehler auftrat.

@subsubheading Fehler

Keine.


@node mysql_error, mysql_escape_string, mysql_errno, C API functions
@c German node mysql_error
@subsubsection @code{mysql_error()}

@findex @code{mysql_error()}

@code{char *mysql_error(MYSQL *mysql)}

@subsubheading Beschreibung

F�r die von @code{mysql} angegebene Verbindung gibt @code{mysql_error()}
die Fehlermeldung f�r die zuletzt aufgerufene API-Funktion zur�ck, die
erfolgreich sein oder fehlschlagen kann. Eine leere Zeichenkette
(@code{""}) wird zur�ckgegeben, wenn kein Fehler auftrat. Das bedeutet,
dass folgende zwei Tests �quivalent sind:

@example
if(mysql_errno(&mysql))
@{
    // Ein Fehler trat auf
@}

if(mysql_error(&mysql)[0] != '\0')
@{
    // Ein Fehler trat auf
@}
@end example

Die Sprache der Client-Fehlermeldungen kann durch erneutes Kompilieren der
MySQL-Client-Bibliothek ge�ndert werden. Sie k�nnen Fehlermeldungen in
mehreren unterschiedlichen Sprachen ausw�hlen. @xref{Languages}.

@subsubheading R�ckgabewerte

Eine Zeichenkette, die den Fehler beschreibt. Eine leere Zeichenkette, wenn
kein Fehler auftrat.

@subsubheading Fehler

Keine.


@node mysql_escape_string, mysql_fetch_field, mysql_error, C API functions
@c German node mysql_escape_string
@subsubsection @code{mysql_escape_string()}

@findex @code{mysql_escape_string()}

Statt dessen sollten Sie @code{mysql_real_escape_string()} benutzen!

Das ist identisch mit @code{mysql_real_escape_string()}, ausser dass die
Verbindung als erstes Argument genommen wird.
@code{mysql_real_escape_string()} escapet die Zeichenkette gem�� dem
aktuellen Zeichensatz, wohingegen @code{mysql_escape_string()} die aktuelle
Zeichensatzeinstellung ignoriert.


@node mysql_fetch_field, mysql_fetch_fields, mysql_escape_string, C API functions
@c German node mysql_fetch_field
@subsubsection @code{mysql_fetch_field()}

@findex @code{mysql_fetch_field()}

@code{MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt die Definition einer Spalte der Ergebnismenge als
@code{MYSQL_FIELD}-Struktur zur�ck. Rufen Sie diese Funktion wiederholt
auf, um Informationen �ber alle Spalten in der Ergebnismenge zu erhalten.
@code{mysql_fetch_field()} gibt @code{NULL} zur�ck, wenn es keine weiteren
Felder mehr gibt.

@code{mysql_fetch_field()} wird zur�ckgesetzt, so dass sie Informationen
�ber das erste Feld zur�ckgibt, und zwar jedes Mal, wenn Sie eine neue
@code{SELECT}-Anfrage ausf�hren. Das von @code{mysql_fetch_field()}
zur�ckgegebene Feld wird auch durch Aufrufe von @code{mysql_field_seek()}
betroffen.

Wenn Sie @code{mysql_query()} aufgerufen haben, um ein @code{SELECT} auf
eine Tabelle auszuf�hren, aber nicht @code{mysql_store_result()} aufgerufen
haben, gibt MySQL die vorgabem��ige BLOB-L�nge (8 KB) zur�ck, wenn Sie
@code{mysql_fetch_field()} aufrufen, um nach der L�nge eines
@code{BLOB}-Felds zu fragen. (Die Gr��e von 8 KB wird gew�hlt, weil MySQL
die maximale L�nge des @code{BLOB} nicht kennt. Das wird irgendwann einmal
konfigurierbar gemacht.) Nachdem Sie die Ergebnismenge erst einmal
abgerufen haben, enth�lt @code{field->max_length} die L�nge des l�ngsten
Werts dieser Spalte in der bestimmten Anfrage.

@subsubheading R�ckgabewerte

Die @code{MYSQL_FIELD}-Struktur der aktuellen Spalte. @code{NULL}, wenn
keine Spalten mehr �brig sind.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
MYSQL_FIELD *field;

while((field = mysql_fetch_field(ergebnis)))
@{
    printf("Feldname %s\n", field->name);
@}
@end example


@node mysql_fetch_fields, mysql_fetch_field_direct, mysql_fetch_field, C API functions
@c German node mysql_fetch_fields
@subsubsection @code{mysql_fetch_fields()}

@findex @code{mysql_fetch_fields()}

@code{MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt ein Array aller @code{MYSQL_FIELD}-Strukturen f�r eine Ergebnismenge
zur�ck. Jede Struktur stellt Felddefinitionen f�r eine Spalte der
Ergebnismenge zur Verf�gung.

@subsubheading R�ckgabewerte

Ein Array von @code{MYSQL_FIELD}-Strukturen f�r alle Spalten einer
Ergebnismenge.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;

num_fields = mysql_num_fields(ergebnis);
fields = mysql_fetch_fields(ergebnis);
for(i = 0; i < num_fields; i++)
@{
   printf("Feld %u ist %s\n", i, fields[i].name);
@}
@end example


@node mysql_fetch_field_direct, mysql_fetch_lengths, mysql_fetch_fields, C API functions
@c German node mysql_fetch_field_direct
@subsubsection @code{mysql_fetch_field_direct()}

@findex @code{mysql_fetch_field_direct()}

@code{MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int feldnr)}

@subsubheading Beschreibung

Mit der Angabe einer Feldnummer @code{feldnr} f�r eine Spalte innerhalb
einer Ergebnismenge gibt sie die Felddefinition dieser Spalte als
@code{MYSQL_FIELD}-Struktur zur�ck. Sie k�nnen diese Funktion verwenden, um
die Definition f�r eine beliebige Spalte abzurufen. Der Wert von
@code{feldnr} sollte im Bereich von 0 bis
@code{mysql_num_fields(ergebnis)-1} liegen.

@subsubheading R�ckgabewerte

Die @code{MYSQL_FIELD}-Struktur f�r die angegebene Spalte.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;

num_fields = mysql_num_fields(ergebnis);
for(i = 0; i < num_fields; i++)
@{
    field = mysql_fetch_field_direct(ergebnis, i);
    printf("Feld %u ist %s\n", i, field->name);
@}
@end example


@node mysql_fetch_lengths, mysql_fetch_row, mysql_fetch_field_direct, C API functions
@c German node mysql_fetch_lengths
@subsubsection @code{mysql_fetch_lengths()}

@findex @code{mysql_fetch_lengths()}

@code{unsigned long *mysql_fetch_lengths(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt die L�nge der Spalten der aktuellen Zeile innerhalb der Ergebnismenge
zur�ck. Wenn Sie vorhaben, Feldwerte zu kopieren, sind diese
L�ngeninformationen auch n�tzlich f�r Optimierungen, weil Sie vermeiden
k�nnen, @code{strlen()} aufzurufen. Wenn die Ergebnismenge Bin�rdaten
enth�lt, kommt hinzu, dass Sie diese Funktion benutzen @emph{m�ssen}, um
die Gr��e der Daten zu bestimmen, weil @code{strlen()} falsche Ergebnisse
f�r Felder zur�ckgibt, die NULL-Zeichen enthalten.

Die L�nge leerer Spalten und von Spalten, die @code{NULL}-Werte enthalten,
ist 0. Um zu sehen, wie man diese beiden F�lle auseinander h�lt, sehen Sie
in der Beschreibung von @code{mysql_fetch_row()} nach.

@subsubheading R�ckgabewerte

Ein Array vorzeichenloser langer Ganzzahlen (long integer), die die Gr��e
jeder Spalte darstellen (ohne irgend welche begrenzenden NULL-Zeichen).
@code{NULL}, wenn ein Fehler auftrat.

@subsubheading Fehler

@code{mysql_fetch_lengths()} ist nur f�r die aktuelle Zeile der
Ergebnismenge g�ltig. Sie gibt @code{NULL} zur�ck, wenn Sie sie vor
@code{mysql_fetch_row()} oder nach dem Abruf aller Zeilen im Ergebnis
aufrufen.

@subsubheading Beispiel

@example
MYSQL_ROW zeile;
unsigned long *laengen;
unsigned int anzahl_felder;
unsigned int i;

zeile = mysql_fetch_row(ergebnis);
if (zeile)
@{
    anzahl_felder = mysql_num_fields(ergebnis);
    laengen = mysql_fetch_lengths(ergebnis);
    for(i = 0; i < anzahl_felder; i++)
    @{
         printf("Spalte %u ist %lu Bytes lang.\n", i, lengths[i]);
    @}
@}
@end example


@node mysql_fetch_row, mysql_field_count, mysql_fetch_lengths, C API functions
@c German node mysql_fetch_row
@subsubsection @code{mysql_fetch_row()}

@findex @code{mysql_fetch_row()}

@code{MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)}

@subsubheading Beschreibung

Ruft die n�chste Zeile einer Ergebnismenge ab. Wenn sie nach
@code{mysql_store_result()} benutzt wird, gibt @code{mysql_fetch_row()}
@code{NULL} zur�ck, wenn es keine weiteren Zeilen zum Abruf mehr gibt. Wenn
sie nach @code{mysql_use_result()} benutzt wird, gibt
@code{mysql_fetch_row()} @code{NULL} zur�ck, wenn es keine Zeilen mehr zum
Abruf gibt oder wenn ein Fehler auftrat.

Die Anzahl von Werten in der Zeile wird durch
@code{mysql_num_fields(ergebnis)} gegeben. Wenn @code{zeile} den
R�ckgabewert eines Aufrufs von @code{mysql_fetch_row()} enth�lt, wird auf
Zeiger auf die Werte als @code{zeile[0]} bis
@code{zeile[mysql_num_fields(ergebnis)-1]} zugegriffen. @code{NULL}-Werte
in der Zeile werden durch @code{NULL}-Zeiger angezeigt.

Die L�ngen der Feldwerte in der Zeile k�nnen durch Aufruf von
@code{mysql_fetch_lengths()} bestimmt werden. Leere Felder und Felder, die
@code{NULL} enthalten, haben beide die L�nge 0. Sie k�nnen diese
auseinanderhalten, indem Sie den Zeiger f�r den Feldwert �berpr�fen. Wenn
der Zeiger @code{NULL} ist, ist das Feld @code{NULL}, ansonsten ist das
Feld leer.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_ROW}-Struktur f�r die n�chste Zeile. @code{NULL}, wenn
keine weiteren Zeilen abzurufen sind oder wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table

@subsubheading Beispiel

@example
MYSQL_ROW zeile;
unsigned int anzahl_felder;
unsigned int i;

anzahl_felder = mysql_num_fields(ergebnis);
while ((zeile = mysql_fetch_row(ergebnis)))
@{
   unsigned long *laengen;
   laengen = mysql_fetch_lengths(ergebnis);
   for(i = 0; i < anzahl_felder; i++)
   @{
       printf("[%.*s] ", (int) laengen[i], zeile[i] ? zeile[i] : "NULL");
   @}
   printf("\n");
@}
@end example


@node mysql_field_count, mysql_field_seek, mysql_fetch_row, C API functions
@c German node mysql_field_count
@subsubsection @code{mysql_field_count()}

@findex @code{mysql_field_count()}

@code{unsigned int mysql_field_count(MYSQL *mysql)}

Wenn Sie eine Version von MySQL vor Version 3.22.24 benutzen, sollten Sie
statt dessen @code{unsigned int mysql_num_fields(MYSQL *mysql)} benutzen.

@subsubheading Beschreibung

Gibt die Anzahl von Spalten der letzten Anfrage auf der Verbindung zur�ck.

Normalerweise wird diese Funktion benutzt, wenn @code{mysql_store_result()}
@code{NULL} zur�ckgab (und Sie daher keinen Ergebnismengen-Zeiger haben).
In diesem Fall k�nnen Sie @code{mysql_field_count()} aufrufen, um
festzustellen, ob @code{mysql_store_result()} ein leeres Ergebnis h�tte
zur�ckgeben sollen oder nicht. Das gestattet dem Client-Programm, die
richtigen Aktionen zu ergreifen, ohne wissen zu m�ssen, ob die Anfrage ein
@code{SELECT} war oder nicht (oder ein @code{SELECT}-�hnliches Statement).
Das unten stehende Beispiel zeigt, wie man das machen kann.

@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}.

@subsubheading R�ckgabewerte

Eine vorzeichenlose Ganzzahl, die die Anzahl von Feldern in einer
Ergebnismenge darstellt.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
MYSQL_RES *result;
unsigned int anzahl_felder;
unsigned int anzahl_zeilen;

if (mysql_query(&mysql,anfrage))
@{
    // FEHLER
@}
else // Anfrage war erfolgreich, zur�ckgegebene Daten verarbeiten
@{
    ergebnis = mysql_store_result(&mysql);
    if (ergebnis)  // Es gibt Zeilen
    @{
        anzahl_felder = mysql_num_fields(ergebnis);
        // Zeilen abrufen, dann mysql_free_result(result) aufrufen
    @}
    else  // mysql_store_result() gab nichts zur�ck, h�tte es etwas zur�ckgeben sollen?
    @{
        if(mysql_field_count(&mysql) == 0)
        @{
            // Anfrage gibt keine Daten zur�ck
            // (Anfrage war kein SELECT)
            anzahl_zeilen = mysql_affected_rows(&mysql);
        @}
        else // mysql_store_result() h�tte Daten zur�ckgeben sollen
        @{
            fprintf(stderr, "Fehler: %s\n", mysql_error(&mysql));
        @}
    @}
@}
@end example

Eine Alternative besteht darin, den @code{mysql_field_count(&mysql)}-Aufruf
durch @code{mysql_errno(&mysql)} zu ersetzen. In diesem Fall �berpr�fen Sie
direkt auf einen Fehler von @code{mysql_store_result()}, statt aus dem Wert
von @code{mysql_field_count()} zu schlussfolgern, ob das Statement ein
@code{SELECT} war oder nicht.


@node mysql_field_seek, mysql_field_tell, mysql_field_count, C API functions
@c German node mysql_field_seek
@subsubsection @code{mysql_field_seek()}

@findex @code{mysql_field_seek()}

@code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)}

@subsubheading Beschreibung

Setzt den Feldcursor auf den angegebenen Offset. Der n�chste Aufruf von
@code{mysql_fetch_field()} ruf die Felddefinition der Spalte ab, die mit
diesem Offset verkn�pft ist.

Um bis zum Anfang einer Zeile zu suchen, geben Sie einen @code{offset}-Wert
von 0 an.

@subsubheading R�ckgabewerte

Der vorherige Wert des Feldcursors.

@subsubheading Fehler

Keine.


@node mysql_field_tell, mysql_free_result, mysql_field_seek, C API functions
@c German node mysql_field_tell
@subsubsection @code{mysql_field_tell()}

@findex @code{mysql_field_tell()}

@code{MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt die Position des Feldcursors f�r die letzte @code{mysql_fetch_field()}
zur�ck. Dieser Wert kann als Argument f�r @code{mysql_field_seek()} benutzt
werden.

@subsubheading R�ckgabewerte

Der aktuelle Offset des Feldcursors.

@subsubheading Fehler

Keine.


@node mysql_free_result, mysql_get_client_info, mysql_field_tell, C API functions
@c German node mysql_free_result
@subsubsection @code{mysql_free_result()}

@findex @code{mysql_free_result()}

@code{void mysql_free_result(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt den Speicher frei, der f�r eine Ergebnismenge von
@code{mysql_store_result()}, @code{mysql_use_result()},
@code{mysql_list_dbs()} usw. zugewiesen wurde. Wenn Sie mit einer
Ergebnismenge fertig sind, m�ssen Sie den von ihr benutzten Speicher durch
Aufruf von @code{mysql_free_result()} freigeben.

@subsubheading R�ckgabewerte

Keine.

@subsubheading Fehler

Keine.


@node mysql_get_client_info, mysql_get_host_info, mysql_free_result, C API functions
@c German node mysql_get_client_info
@subsubsection @code{mysql_get_client_info()}

@findex @code{mysql_get_client_info()}

@code{char *mysql_get_client_info(void)}

@subsubheading Beschreibung

Returns a string that represents the client Bibliothek version.

@subsubheading R�ckgabewerte

A character string that represents the MySQL-Client Bibliothek version.

@subsubheading Fehler
Keine.


@node mysql_get_host_info, mysql_get_proto_info, mysql_get_client_info, C API functions
@c German node mysql_get_host_info
@subsubsection @code{mysql_get_host_info()}

@findex @code{mysql_get_host_info()}

@code{char *mysql_get_host_info(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt eine Zeichenkette zur�ck, die den Typ der benutzten Verbindung
beschreibt, inklusive des Server-Hostnamens.

@subsubheading R�ckgabewerte

Eine Zeichenkette, die den Server-Hostnamen und den Verbindungstyp
bezeichnet.

@subsubheading Fehler

Keine.


@node mysql_get_proto_info, mysql_get_server_info, mysql_get_host_info, C API functions
@c German node mysql_get_proto_info
@subsubsection @code{mysql_get_proto_info()}

@findex @code{mysql_get_proto_info()}

@code{unsigned int mysql_get_proto_info(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt die Protokollversion zur�ck, die von der aktuellen Verbindung benutzt
wird.

@subsubheading R�ckgabewerte

Eine vorzeichenlose Ganzzahl, die die Protokollversion bezeichnet, die von
der aktuellen Verbindung benutzt wird.

@subsubheading Fehler

Keine.


@node mysql_get_server_info, mysql_info, mysql_get_proto_info, C API functions
@c German node mysql_get_server_info
@subsubsection @code{mysql_get_server_info()}

@findex @code{mysql_get_server_info()}

@code{char *mysql_get_server_info(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt eine Zeichenkette zur�ck, die die Server-Versionsnummer bezeichnet.

@subsubheading R�ckgabewerte

Eine Zeichenkette, die die Server-Versionsnummer bezeichnet.

@subsubheading Fehler

Keine.


@node mysql_info, mysql_init, mysql_get_server_info, C API functions
@c German node mysql_info
@subsubsection @code{mysql_info()}

@findex @code{mysql_info()}

@code{char *mysql_info(MYSQL *mysql)}

@subsubheading Beschreibung

Ruft eine Zeichenkette ab, die Informationen �ber die zuletzt ausgef�hrte
Anfrage zur�ckgibt, aber nur f�r die unten aufgef�hrten Statements. Bei
anderen Statements gibt @code{mysql_info()} @code{NULL} zur�ck. Das Format
der Zeichenkette variiert in Abh�ngigkeit vom Anfragetyp, wie unten
beschrieben. Die Nummern dienen nur der Veranschaulichung; die Zeichenkette
enth�lt die der Anfrage entsprechenden Werte.

@table @code
@item INSERT INTO ... SELECT ...
Zeichenkettenformat: @code{Records: 100 Duplicates: 0 Warnings: 0}
@item INSERT INTO ... VALUES (...),(...),(...)...
Zeichenkettenformat: @code{Records: 3  Duplicates: 0  Warnings: 0}
@item LOAD DATA INFILE ...
Zeichenkettenformat: @code{Records: 1 Deleted: 0 Skipped: 0 Warnings: 0}
@item ALTER TABLE
Zeichenkettenformat: @code{Records: 3 Duplicates: 0 Warnings: 0}
@item UPDATE
Zeichenkettenformat: @code{Rows matched: 40 Changed: 40 Warnings: 0}
@end table

Beachten Sie, dass @code{mysql_info()} einen Nicht-@code{NULL}-Wert f�r das
@code{INSERT ... VALUES}-Statement nur dann zur�ckgibt, wenn im Statement
mehrfache Wertlisten angegeben sind.

@subsubheading R�ckgabewerte

Eine Zeichenkette, die zus�tzliche Informationen �ber die zuletzt
ausgef�hrte Anfrage bereitstellt. @code{NULL}, wenn f�r die Anfrage keine
Information verf�gbar ist.

@subsubheading Fehler
Keine.


@node mysql_init, mysql_insert_id, mysql_info, C API functions
@c German node mysql_init
@subsubsection @code{mysql_init()}

@findex @code{mysql_init()}

@code{MYSQL *mysql_init(MYSQL *mysql)}

@subsubheading Beschreibung

Alloziert oder initialisiert ein @code{MYSQL}-Objekt, das f�r
@code{mysql_real_connect()} geeignet ist. Wenn @code{mysql} ein
@code{NULL}-Zeiger ist, alloziert, initialisiert und gibt diese Funktion
ein neues Objekt zur�ck. Ansonsten wird das Objekt initialisiert und die
Adresse des Objekts zur�ckgegeben. Wenn @code{mysql_init()} ein neues
Objekt alloziert, wird es freigegeben, wenn @code{mysql_close()} aufgerufen
wird, um die Verbindung zu schlie�en.

@subsubheading R�ckgabewerte

Ein initialisiertes @code{MYSQL*}-Handle. @code{NULL}, wenn der Speicher
nicht ausreichte, um ein neues Objekt zu allozieren.

@subsubheading Fehler

Im Falle von ungen�gendem Speicher wird @code{NULL} zur�ckgegeben.


@node mysql_insert_id, mysql_kill, mysql_init, C API functions
@c German node mysql_insert_id
@subsubsection @code{mysql_insert_id()}

@findex @code{mysql_insert_id()}

@code{my_ulonglong mysql_insert_id(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt die Kennung zur�ck, die f�r eine @code{AUTO_INCREMENT}-Spalte durch
die vorherige Anfrage erzeugt wurde. Benutzen Sie diese Funktion, nachdem
Sie eine @code{INSERT}-Anfrage f�r eine Tabelle durchgef�hrt haben, die ein
@code{AUTO_INCREMENT}-Feld enth�lt.

Beachten Sie, dass @code{mysql_insert_id()} @code{0} zur�ckgibt, wenn die
vorherige Anfrage keinen @code{AUTO_INCREMENT}-Wert erzeugt hat. Wenn Sie
den Wert f�r sp�tere Benutzung speichern wollen, stellen Sie sicher, dass
Sie @code{mysql_insert_id()} unmittelbar nach der Anfrage aufrufen, die den
Wert erzeugt.

@code{mysql_insert_id()} wird nach @code{INSERT}- und
@code{UPDATE}-Statements aktualisiert, die einen @code{AUTO_INCREMENT}-Wert
erzeugen oder einen Spaltenwert auf @code{LAST_INSERT_ID(ausdruck)} setzen.
@xref{Miscellaneous functions}.

Beachten Sie auch, dass der Wert der SQL-@code{LAST_INSERT_ID()}-Funktion
immer den aktuellsten erzeugten @code{AUTO_INCREMENT}-Wert enth�lt, und
zwischen Anfragen nicht zur�ckgesetzt wird, weil der Wert dieser Funktion
im Server gewartet wird.

@subsubheading R�ckgabewerte

Der Wert des @code{AUTO_INCREMENT}-Felds, das durch die vorherige Anfrage
aktualisiert wurde. Gibt 0 zur�ck, wenn es keine vorherige Anfrage auf der
Verbindung gab oder wenn die Anfrage keinen @code{AUTO_INCREMENT}-Wert
aktualisierte.

@subsubheading Fehler

Keine.


@node mysql_kill, mysql_list_dbs, mysql_insert_id, C API functions
@c German node mysql_kill
@subsubsection @code{mysql_kill()}

@findex @code{mysql_kill()}

@code{int mysql_kill(MYSQL *mysql, unsigned long pid)}

@subsubheading Beschreibung

Bittet den Server, den Thread zu t�ten, der durch @code{pid} angegeben
wurde.

@subsubheading R�ckgabewerte

0 f�r Erfolg. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_list_dbs, mysql_list_fields, mysql_kill, C API functions
@c German node mysql_list_dbs
@subsubsection @code{mysql_list_dbs()}

@findex @code{mysql_list_dbs()}

@code{MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)}

@subsubheading Beschreibung

Gibt eine Ergebnismenge zur�ck, die aus den Datenbanknamen auf dem Server
besteht, die mit dem einfachen regul�ren Ausdruck �bereinstimmen, der durch
den @code{wild}-Parameter angegeben wird. @code{wild} darf die
Platzhalterzeichen @samp{%} oder @samp{_} enthalten oder ein
@code{NULL}-Zeiger sein, der mit allen Datenbanken �bereinstimmt. Der
Aufruf von @code{mysql_list_dbs()} ist �hnlich der Ausf�hrung der Anfrage
@code{SHOW DATABASES [LIKE wild]}.

Sie m�ssen die Ergebnismenge mit @code{mysql_free_result()} freigeben.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnismenge bei Erfolg. @code{NULL}, wenn ein
Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_OUT_OF_MEMORY
Kein Speicher mehr.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_list_fields, mysql_list_processes, mysql_list_dbs, C API functions
@c German node mysql_list_fields
@subsubsection  @code{mysql_list_fields()}

@findex @code{mysql_list_fields()}

@code{MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)}

@subsubheading Beschreibung

Gibt eine Ergebnismenge zur�ck, die aus Feldnamen in der angegebenen
Tabelle bestehen, die mit einem einfachen regul�ren Ausdruck
�bereinstimmen, der durch den @code{wild}-Parameter angegeben wird.
@code{wild} darf die Platzhalterzeichen @samp{%} oder @samp{_} enthalten
oder ein @code{NULL}-Zeiger sein, der mit allen Datenbanken �bereinstimmt.
Der Aufruf von @code{mysql_list_fields()} ist �hnlich der Ausf�hrung der
Anfrage @code{SHOW COLUMNS FROM tabelle [LIKE wild]}.

Beachten Sie, dass empfohlen wird, @code{SHOW COLUMNS FROM tabelle} statt
@code{mysql_list_fields()} zu benutzen.

Sie m�ssen die Ergebnismenge mit @code{mysql_free_result()} freigeben.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnismenge bei Erfolg. @code{NULL}, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_list_processes, mysql_list_tables, mysql_list_fields, C API functions
@c German node mysql_list_processes
@subsubsection @code{mysql_list_processes()}

@findex @code{mysql_list_processes()}

@code{MYSQL_RES *mysql_list_processes(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt eine Ergebnismenge zur�ck, die die aktuellen Server-Threads
beschreibt. Das ist dieselbe Art von Information, die von @code{mysqladmin
processlist} oder einer @code{SHOW PROCESSLIST}-Anfrage zur Verf�gung
gestellt wird.

Sie m�ssen die Ergebnismenge mit @code{mysql_free_result()} freigeben.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnismenge bei Erfolg. @code{NULL}, wenn ein
Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_list_tables, mysql_num_fields, mysql_list_processes, C API functions
@c German node mysql_list_tables
@subsubsection @code{mysql_list_tables()}

@findex @code{mysql_list_tables()}

@code{MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)}

@subsubheading Beschreibung

Gibt eine Ergebnismenge zur�ck, die aus Tabellennamen in der aktuellen
Datenbank besteht, die mit einem einfachen regul�ren Ausdruck
�bereinstimmen, der durch den @code{wild}-Parameter angegeben wird.
@code{wild} darf die Platzhalterzeichen @samp{%} oder @samp{_} enthalten
oder ein @code{NULL}-Zeiger sein, der mit allen Tabellen �bereinstimmt. Der
Aufruf von @code{mysql_list_tables()} ist �hnlich der Ausf�hrung der
Anfrage @code{SHOW tables [LIKE wild]}.

Sie m�ssen die Ergebnismenge mit @code{mysql_free_result()} freigeben.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnismenge bei Erfolg. @code{NULL}, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_num_fields, mysql_num_rows, mysql_list_tables, C API functions
@c German node mysql_num_fields
@subsubsection @code{mysql_num_fields()}

@findex @code{mysql_num_fields()}
@findex @code{mysql_field_count()}

@code{unsigned int mysql_num_fields(MYSQL_RES *result)}

oder

@code{unsigned int mysql_num_fields(MYSQL *mysql)}

Die zweite Form funktioniert nicht bei MySQL-Version 3.22.24 oder neuer. Um
ein @code{MYSQL*}-Argument zu �bergeben, m�ssen Sie statt dessen
@code{unsigned int mysql_field_count(MYSQL *mysql)} benutzen.

@subsubheading Beschreibung

Gibt die Anzahl von Spalten in einer Ergebnismenge zur�ck.

Beachten Sie, dass Sie die Anzahl von Spalten entweder durch einen Zeiger
auf die Ergebnismenge oder auf ein Verbindungs-Handle erhalten. Das
Verbindungs-Handle benutzen Sie, wenn @code{mysql_store_result()} oder
@code{mysql_use_result()}  @code{NULL} zur�ckgibt (und Sie daher keinen
Ergebnismengen-Zeiger haben). In diesem Fall k�nnen Sie
@code{mysql_field_count()} aufrufen, um festzustellen, ob
@code{mysql_store_result()} eine leere Ergebnismenge produziert haben
sollte oder nicht. Das erlaubt dem Client-Programm, die korrekten Aktionen
vorzunehmen, ohne wissen zu m�ssen, ob die Anfrage ein @code{SELECT}- (oder
@code{SELECT}-�hnliches) Statement war oder nicht. Das unten stehende
Beispiel zeigt, wie das gemacht wird.

@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}.

@subsubheading R�ckgabewerte

Eine vorzeichenlose Ganzzahl, die die Anzahl von Feldern in einer
Ergebnismenge darstellt.

@subsubheading Fehler

Keine.

@subsubheading Beispiel

@example
MYSQL_RES *ergebnis;
unsigned int anzahl_felder;
unsigned int anzahl_zeilen;

if (mysql_query(&mysql,anfrage_zeichenkette))
@{
    // FEHLER
@}
else // Anfrage erfolgreich, zur�ckgegebene Daten verarbeiten
@{
    ergebnis = mysql_store_result(&mysql);
    if (ergebnis)  // Es gibt Zeilen
    @{
        anzahl_felder = mysql_num_fields(ergebnis);
        // Zeilen abrufen, dann mysql_free_result(ergebnis) aufrufen
    @}
    else  // mysql_store_result() gab nichts zur�ck, h�tte es das tun sollen?
    @{
        if (mysql_errno(&mysql))
	@{
           fprintf(stderr, "Fehler: %s\n", mysql_error(&mysql));
	@}
        else if (mysql_field_count(&mysql) == 0)
        @{
            // Anfrage gibt keine Daten zur�ck
            // (war kein SELECT)
            anzahl_zeilen = mysql_affected_rows(&mysql);
        @}
    @}
@}
@end example

Eine Alternative (wenn Sie WISSEN, dass Ihre Anfrage eine Ergebnismenge
h�tte zur�ckgeben sollen) ist es, den @code{mysql_errno(&mysql)}-Aufruf
durch eine Pr�fung zu ersetzen, ob @code{mysql_field_count(&mysql)} gleich
0 ist. Das passiert nur, wenn etwas schief lief.


@node mysql_num_rows, mysql_options, mysql_num_fields, C API functions
@c German node mysql_num_rows
@subsubsection @code{mysql_num_rows()}

@findex @code{mysql_num_rows()}

@code{my_ulonglong mysql_num_rows(MYSQL_RES *result)}

@subsubheading Beschreibung

Gibt die Anzahl von Zeilen in der Ergebnismenge zur�ck.

Die Benutzung von @code{mysql_num_rows()} h�ngt davon ab, ob Sie
@code{mysql_store_result()} oder @code{mysql_use_result()} benutzen, um die
Ergebnismenge zur�ckzugeben.. Wenn Sie @code{mysql_store_result()}
benutzen, kann @code{mysql_num_rows()} unmittelbar aufgerufen werden. Wenn
Sie @code{mysql_use_result()} benutzen, gibt @code{mysql_num_rows()} nicht
den richtigen Wert zur�ck, bis alle Zeilen in der Ergebnismenge abgerufen
wurden.

@subsubheading R�ckgabewerte

Die Anzahl von Zeilen in der Ergebnismenge.

@subsubheading Fehler

Keine.


@node mysql_options, mysql_ping, mysql_num_rows, C API functions
@c German node mysql_options
@subsubsection @code{mysql_options()}

@findex @code{mysql_options()}

@code{int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)}

@subsubheading Beschreibung

Kann benutzt werden, um zus�tzliche Optionen zu setzen und das Verhalten
einer Verbindung zu beeinflussen. Diese Funktion kann mehrfach aufgerufen
werden, um mehrere Optionen zu setzen.

@code{mysql_options()} sollte nach @code{mysql_init()} und vor
@code{mysql_connect()} oder @code{mysql_real_connect()} aufgerufen werden.

Das @code{option}-Argument ist die Option, die Sie setzen wollen. Das
@code{arg}-Argument ist der Wert f�r die Option. Wenn die Option eine
Ganzzahl ist, sollte @code{arg} auf den Wert der Ganzzahl zeigen.

M�gliche Optionswerte:

@multitable @columnfractions .25 .25 .5
@item @strong{Option} @tab @strong{Argumenttyp} @tab @strong{Funktion}
@item @code{MYSQL_OPT_CONNECT_TIMEOUT} @tab @code{unsigned int *} @tab Verbindungszeit�berschreitung (Timeout) in Sekunden.
@item @code{MYSQL_OPT_COMPRESS} @tab Unbenutzt @tab Das komprimierte Client-/Server-Protokoll verwenden.
@item @code{MYSQL_OPT_NAMED_PIPE} @tab Unbenutzt @tab Named Pipes benutzen, um sich mit einem MySQL-Server unter NT zu verbinden.
@item @code{MYSQL_INIT_COMMAND} @tab @code{char *} @tab Befehl, der beim Verbinden mit dem MySQL-Server ausgef�hrt werden soll. Wird beim erneuten Verbinden automatisch wieder ausgef�hrt.
@item @code{MYSQL_READ_DEFAULT_FILE} @tab @code{char *} @tab Optionen aus der benannten Optionsdatei einlesen anstelle von @file{my.cnf}.
@item @code{MYSQL_READ_DEFAULT_GROUP} @tab @code{char *} @tab Optionen aus der benannten Gruppe von @file{my.cnf} oder der Datei einlesen, die durch @code{MYSQL_READ_DEFAULT_FILE} angegeben wurde.
@end multitable

Beachten Sie, dass die Gruppe @code{client} immer gelesen wird, wenn Sie
@code{MYSQL_READ_DEFAULT_FILE} oder @code{MYSQL_READ_DEFAULT_GROUP}
benutzen.

Die angegebene Gruppe in der Optionsdatei kann folgende Optionen enthalten:

@multitable @columnfractions .3 .7
@item @code{connect_timeout} @tab Zeit�berschreitung (Timeout) f�r die
Verbindung in Sekunden. Unter Linux wird dieser Wert zus�tzlich f�r die
Wartezeit auf die erste Antwort vom Server benutzt.
@item @code{compress} @tab Das komprimierte Client-/Server-Protokoll
benutzen.
@item @code{database} @tab Mit dieser Datenbank verbinden, wenn im
Verbindungsbefehl keine Datenbank angegeben wurde.
@item @code{debug} @tab Debug-Optionen.
@item @code{host} @tab Vorgabem��iger Hostname.
@item @code{init-commund} @tab Befehl, der bei der Verbindung zum
MySQL-Server ausgef�hrt wird. Wird automatisch beim erneuten Verbinden
erneut ausgef�hrt.
@item @code{interactive-timeout} @tab Dasselbe wie die Angabe von
@code{CLIENT_INTERACTIVE} f�r @code{mysql_real_connect()}.
@xref{mysql_real_connect}.
@item @code{password} @tab Vorgabem��iges Passwort.
@item @code{pipe} @tab Named Pipes benutzen, um sich mit einem MySQL-Server unter NT zu verbinden.
@item @code{port} @tab Vorgabem��ige Port-Nummer.
@item @code{return-found-rows} @tab Weist @code{mysql_info()} an, gefundene
Zeilen anstelle von aktualisierten Zeilen zur�ckzugeben, wenn @code{UPDATE}
benutzt wird.
@item @code{socket} @tab Vorgabem��ige Socket-Nummer.
@item
@item @code{user} @tab Vorgabem��iger Benutzer.
@end multitable

Beachten Sie, dass @code{timeout} durch @code{connect_timeout} ersetzt
wurde. Dennoch wird @code{timeout} noch f�r eine Weile funktionieren.

Weitere Informationen �ber Optionsdateien finden Sie unter
@ref{Option files}.

@subsubheading R�ckgabewerte

0 bei Erfolg. Nicht-0, wenn Sie eine unbekannte Option verwenden.

@subsubheading Beispiel

@example
MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
if (!mysql_real_connect(&mysql,"host","benutzer","passwort","datenbank",0,NULL,0))
@{
    fprintf(stderr, "Keine Verbindung zur Datenbank: Fehler: %s\n",
          mysql_error(&mysql));
@}
@end example

Im obigen Beispiel wird der Client angewiesen, das komprimierte
Client-/Server-Protokoll zu benutzen und zus�tzliche Optionen aus dem
@code{odbc}-Abschnitt in @code{my.cnf} zu lesen.


@node mysql_ping, mysql_query, mysql_options, C API functions
@c German node mysql_ping
@subsubsection @code{mysql_ping()}

@findex @code{mysql_ping()}

@code{int mysql_ping(MYSQL *mysql)}

@subsubheading Beschreibung

Pr�ft, ob die Verbindung zum Server funktioniert oder nicht. Wenn diese weg
ist, wird automatisch eine erneute Verbindung versucht.

Diese Funktion kann von Clients benutzt werden, die f�r lange Zeit im
Leerlauf laufen, um zu pr�fen, ob der Server die Verbindung geschlossen
hat, und sich bei Bedarf erneut zu verbinden.

@subsubheading R�ckgabewerte

0, wenn der Server da ist. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_query, mysql_real_connect, mysql_ping, C API functions
@c German node mysql_query
@subsubsection @code{mysql_query()}

@findex @code{mysql_query()}

@code{int mysql_query(MYSQL *mysql, const char *anfrage)}

@subsubheading Beschreibung
F�hrt die SQL-Anfrage aus, auf die durch die NULL-begrenzte Zeichenkette
@code{anfrage} gezeigt wird. Die Anfrage muss aus einem einzelnen
SQL-Statement bestehen. Sie d�rfen kein Semikolon (@samp{;}) oder @code{\g}
zum Statement hinzuf�gen.

@code{mysql_query()} kann nicht f�r Anfragen benutzt werden, die Bin�rdaten
enthalten. Hierf�r sollten Sie statt dessen @code{mysql_real_query()}
benutzen. (Bin�rdaten k�nnen das @samp{\0}-Zeichen enthalten, was
@code{mysql_query()} als Ende der Anfrage-Zeichenkette interpretiert.)

Wenn Sie wissen wollen, ob die Anfrage eine Ergebnismenge zur�ckgeben
sollte oder nicht, k�nnen Sie @code{mysql_field_count()} benutzen, um
hierauf zu pr�fen. @xref{mysql_field_count, , @code{mysql_field_count}}.

@subsubheading R�ckgabewerte

0, wenn die Anfrage erfolgreich war. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_real_connect, mysql_real_escape_string, mysql_query, C API functions
@c German node mysql_real_connect
@subsubsection @code{mysql_real_connect()}

@findex @code{mysql_real_connect()}

@code{MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
                          const char *user, const char *passwd, const char *db,
                          unsigned int port, const char *unix_socket,
                          unsigned int client_flag)}

@subsubheading Beschreibung

@code{mysql_real_connect()} versucht, eine Verbindung zu einer
MySQL-Datenbankmaschine aufzubauen, die auf @code{host} l�uft.
@code{mysql_real_connect()} muss erfolgreich verlaufen sein, bevor Sie
irgend eine andere API-Funktion ausf�hren k�nnen, mit Ausnahme von
@code{mysql_get_client_info()}.

Die Parameter werden wie folgt angegeben:

@itemize @bullet
@item
Der erste Parameter sollte die Adresse einer existierenden
@code{MYSQL}-Struktur sein. Vor dem Aufruf von @code{mysql_real_connect()}
m�ssen Sie @code{mysql_init()} aufrufen, um die @code{MYSQL}-Struktur zu
initialisieren. Sie k�nnen viele der Verbindungsoptionen mit dem
@code{mysql_options()}-Aufruf �ndern. @xref{mysql_options}.

@item
Der Wert von @code{host} kann entweder ein Hostname oder eine IP-Adresse
sein. Wenn @code{host} @code{NULL} oder die Zeichenkette @code{"localhost"}
ist, wird eine Verbindung zum lokalen Host angenommen. Wenn das
Betriebssystem Sockets (Unix) oder Named Pipes (Windows NT) unterst�tzt,
werden diese statt TCP/IP benutzt, um sich mit dem Server zu verbinden.

@item
Der @code{user}-Parameter enth�lt die MySQL-Login-Benutzerkennung. Wenn
@code{user} @code{NULL} ist, wird der aktuelle Benutzer angenommen. Unter
Unix ist das der aktuelle Login-Name. Unter Windows-ODBC muss der aktuelle
Benutzername explizit angegeben werden. @xref{ODBC administrator}.

@item
Der @code{passwd}-Parameter enth�lt das Passwort f�r @code{user}. Wenn
@code{passwd} @code{NULL} ist, werden nur Eintr�ge in der
@code{user}-Tabelle f�r Benutzer auf �bereinstimmung �berpr�ft, die ein
leeres Passwort-Feld haben. Das erlaubt dem Datenbank-Administrator, das
MySQL-Berechtigungssystem so einzurichten, dass Benutzer unterschiedliche
Berechtigungen haben, je nachdem, ob sie ein Passwort angegeben haben oder
nicht.

HINWEIS: Versuchen Sie nicht, dass Passwort zu verschl�sseln, bevor Sie
@code{mysql_real_connect()} aufrufen. Die Passwortverschl�sselung wird
automatisch durch die Client-API gehandhabt.

@item
@code{db} ist der Datenbankname. Wenn @code{db} nicht @code{NULL} ist,
wird die vorgabem��ige Datenbank f�r die Verbindung auf diesen Wert
gesetzt.

@item
Wenn @code{port} nicht 0 ist, wird dieser Wert als Port-Nummer f�r die
TCP/IP-Verbindung benutzt. Beachten Sie, dass der @code{host}-Parameter den
Verbindungstyp festlegt.

@item
Wenn @code{unix_socket} nicht @code{NULL} ist, legt die Zeichenkette den
Socket oder die Named Pipe fest, die benutzt werden sollen. Beachten Sie,
dass der @code{host}-Parameter den Verbindungstyp festlegt.

@item
Der Wert von @code{client_flag} ist �blicherweise 0, kann aber unter sehr
speziellen Umst�nden auf eine Kombination folgender Flags gesetzt werden:

@multitable @columnfractions .25 .7
@item @strong{Flag-Name}       @tab @strong{Flag-Bedeutung}
@item @code{CLIENT_COMPRESS}   @tab Komprimiertes Protokoll benutzen.
@item @code{CLIENT_FOUND_ROWS} @tab Die Anzahl gefundener
(�bereinstimmender) Zeilen zur�ckgeben, nicht die Anzahl betroffener
Zeilen.
@item @code{CLIENT_IGNORE_SPACE} @tab Leerzeichen nach Funktionsnamen
zulassen. Macht alle Funktionsnamen zu reservierten W�rter.
@item @code{CLIENT_INTERACTIVE} @tab @code{interactive_timeout} Sekunden
zulassen (anstelle von @code{wait_timeout} Sekunden) von Inaktivit�t, bevor
die Verbindung geschlossen wird.
@item @code{CLIENT_NO_SCHEMA}  @tab Die
@code{datenbank.tabelle.spalte}-Syntax nicht zulassen. Das ist f�r ODBC.
Der Flag veranlasst den Parser, einen Fehler zu erzeugen, wenn Sie diese
Syntax benutzen, was f�r die Fehlersuche in einigen ODBC-Programmen
hilfreich ist.
@item @code{CLIENT_ODBC}       @tab Der Client ist ein ODBC-Client. Das
�ndert
@item @code{CLIENT_SSL}		@tab SSL benutzen (verschl�sseltes Protokoll).
@end multitable
@end itemize

@subsubheading R�ckgabewerte

Ein @code{MYSQL*}-Verbindungs-Handle, wenn die Verbindung erfolgreich war,
@code{NULL}, wenn die Verbindung nicht erfolgreich war. Bei einer
erfolgreichen Verbindung ist der R�ckgabewert derselbe wie der Wert des
ersten Parameters, es sei denn, Sie �bergeben f�r diesen Parameter
@code{NULL}.

@subsubheading Fehler

@table @code
@item CR_CONN_HOST_ERROR
Verbindung zum MySQL-Server fehlgeschlagen.

@item CR_CONNECTION_ERROR
Verbindung zum lokalen MySQL-Server fehlgeschlagen.

@item CR_IPSOCK_ERROR
IP-Socket konnte nicht erzeugt werden.

@item CR_OUT_OF_MEMORY
Kein Speicher mehr.

@item CR_SOCKET_CREATE_ERROR
Unix-Socket konnte nicht erzeugt werden.

@item CR_UNKNOWN_HOST
IP-Adresse f�r den Hostnamen konnte nicht gefunden werden.

@item CR_VERSION_ERROR
Eine Protokollunvertr�glichkeit resultierte aus dem Versuch, sich mit einer
Client-Bibliothek mit einem Server zu verbinden, die eine andere
Protokollversion benutzt. Das kann passieren, wenn Sie eine sehr alte
Client-Bibliothek benutzen und sich mit einem neuen Server verbinden, der
nicht mit der @code{--old-protocol}-Option gestartet wurde.

@item CR_NAMEDPIPEOPEN_ERROR
Named Pipe unter Windows konnte nicht erzeugt werden.

@item CR_NAMEDPIPEWAIT_ERROR
Fehler beim Warten auf eine Named Pipe unter Windows.

@item CR_NAMEDPIPESETSTATE_ERROR
Pipe-Handler unter Windows konnte nicht erlangt werden.

@item CR_SERVER_LOST
Wenn @code{connect_timeout} > 0 ist und die Verbindung zum Server l�nger
als @code{connect_timeout} ben�tigte, oder wenn der Server w�hrend der
Ausf�hrung von @code{init-command} starb.

@end table

@subsubheading Beispiel

@example
MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","benutzer","passwort","datenbank",0,NULL,0))
@{
    fprintf(stderr, "Verbindung zur Datenbank fehlgeschlagen: Fehler: %s\n",
          mysql_error(&mysql));
@}
@end example

Wenn Sie @code{mysql_options()} benutzen, liest die MySQL-Bibliothek die
@code{[client]}- und @code{ihr_programm_name}-Abschnitte in der
@code{my.cnf}-Datei. Das stellt sicher, dass Ihr Programm funktioniert,
selbst wenn jemand MySQL auf Nicht-Standard-Weise eingerichtet hat.

Beachten Sie, dass @code{mysql_real_connect()} beim Verbinden den
@code{reconnect}-Flag (Teil der MySQL-Struktur) auf einen Wert von @code{1}
setzt. Dieser Flag gibt an, dass ein erneuter Verbindungsversuch zum Server
gemacht wird, bevor aufgegeben wird, wenn eine Anfrage wegen einer verloren
gegangenen Verbindung nicht ausgef�hrt werden kann.


@node mysql_real_escape_string, mysql_real_query, mysql_real_connect, C API functions
@c German node mysql_real_escape_string
@subsubsection @code{mysql_real_escape_string()}

@findex @code{mysql_real_escape_string()}

@code{unsigned int mysql_real_escape_string(MYSQL *mysql, char *nach, const char *von, unsigned int laenge)}

@subsubheading Beschreibung

Diese Funktion wird benutzt, um eine zul�ssige SQL-Zeichenkette zu
erzeugen, die Sie in einem SQL-Statement benutzen k�nnen.
@xref{String syntax}.

Die Zeichenkette in @code{von} wird in eine escapete SQL-Zeichenkette
kodiert, wobei der aktuelle Zeichensatz der Verbindung ber�cksichtigt wird.
Das Ergebnis wird in @code{nach} platziert und ein Null-Byte am Ende
angef�gt. Kodierte Zeichen sind @code{NUL} (ASCII 0), @samp{\n}, @samp{\r},
@samp{\}, @samp{'}, @samp{"} und Control-Z (@pxref{Literals}).

Die Zeichenkette, auf die von @code{von} gezeigt wird, muss @code{laenge}
Bytes lang sein. Sie m�ssen den @code{nach}-Puffer so zuweisen, dass er
mindestens @code{laenge*2+1} Bytes lang ist. (Im schlimmsten Fall muss
jedes Zeichen mit zwei Bytes kodiert werden, und Sie brauchen Platz f�r das
Null-Byte am Ende.) Wenn @code{mysql_escape_string()} zur�ckgibt, sind die
Inhalte von @code{nach} eine Null-begrenzte Zeichenkette. Der R�ckgabewert
ist die L�nge der kodierten Zeichenkette, ohne das Null-Zeichen am Ende.

@subsubheading Beispiel

@example
char anfrage[1000],*end;

end = strmov(anfrage,"INSERT INTO tabelle values(");
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"Was is'n das?",12);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_real_escape_string(&mysql, end,"Bin�rdaten: \0\r\n",17);
*end++ = '\'';
*end++ = ')';

if (mysql_real_query(&mysql,anfrage,(unsigned int) (end - anfrage)))
@{
   fprintf(stderr, "Einf�gen der Zeile fehlgeschlagen, Fehler: %s\n",
           mysql_error(&mysql));
@}
@end example

Die im Beispiel benutzte @code{strmov()}-Funktion ist in der
@code{mysqlclient}-Bibliothek enthalten und funktioniert wie
@code{strcpy()}, gibt aber einen Zeiger auf Null am Ende des ersten
Parameters zur�ck.

@subsubheading R�ckgabewerte

Die L�nge des Wertes in @code{nach}, ohne das Null-Zeichen am Ende.

@subsubheading Fehler

Keine.


@node mysql_real_query, mysql_reload, mysql_real_escape_string, C API functions
@c German node mysql_real_query
@subsubsection @code{mysql_real_query()}

@findex @code{mysql_real_query()}

@code{int mysql_real_query(MYSQL *mysql, const char *anfrage, unsigned int laenge)}

@subsubheading Beschreibung

F�hrt die SQL-Anfrage aus, auf die von @code{anfrage} gezeigt wird, was
eine @code{laenge} Bytes lange Zeichenkette sein sollte. Die0 Anfrage muss
aus einem einzelnen SQL-Statement bestehen. Sie d�rfen kein Semikolon
(@samp{;}) oder @code{\g} zum Statement hinzuf�gen.

Sie @emph{m�ssen} @code{mysql_real_query()} statt @code{mysql_query()} f�r
Anfragen benutzen, die Bin�rdaten enthalten, weil Bin�rdaten das
@samp{\0}-Zeichen enthalten k�nnen. Ausserdem ist @code{mysql_real_query()}
schneller als @code{mysql_query()}, weil es in der Anfragezeichenkette
nicht @code{strlen()} aufruft.

Wenn Sie wissen wollen, ob die Anfrage eine Ergebnismenge zur�ckgeben
sollte oder nicht, k�nnen Sie hierf�r @code{mysql_field_count()} benutzen.
@xref{mysql_field_count, @code{mysql_field_count}}.

@subsubheading R�ckgabewerte

0, wenn die Anfrage erfolgreich war. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_reload, mysql_row_seek, mysql_real_query, C API functions
@c German node mysql_reload
@subsubsection @code{mysql_reload()}

@findex @code{mysql_reload()}

@code{int mysql_reload(MYSQL *mysql)}

@subsubheading Beschreibung

Weist den MySQL-Server an, die Berechtigungstabellen neu zu laden. Der
verbundene Benutzer muss die @strong{reload}-Berechtigung haben.

Diese Funktion ist veraltet. Vorzugsweise sollten Sie @code{mysql_query()}
benutzen, um statt dessen ein SQL-@code{FLUSH PRIVILEGES}-Statement
auszuf�hren.

@subsubheading R�ckgabewerte

0 bei Erfolg. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_row_seek, mysql_row_tell, mysql_reload, C API functions
@c German node mysql_row_seek
@subsubsection @code{mysql_row_seek()}

@findex @code{mysql_row_seek()}

@code{MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *ergebnis, MYSQL_ROW_OFFSET offset)}

@subsubheading Beschreibung
Setzt den Zeilencursor auf eine beliebige Zeile in einer
Anfrageergebnismenge. Daf�r ist erforderlich, dass die
Ergebnismengenstruktur das gesamte Ergebnis der Anfrage enth�lt, so dass
@code{mysql_row_seek()} nur in Verbindung mit @code{mysql_store_result()}
benutzt werden kann, nicht mit @code{mysql_use_result()}.

Der Offset sollte ein Wert sein, der von einem Aufruf von
@code{mysql_row_tell()} oder @code{mysql_row_seek()} zur�ckgegeben wird.
Dieser Wert ist nicht einfach eine Zeilennummer; wenn Sie eine Zeile
innerhalb einer Ergebnismenge mittels einer Zeilennummer suchen wollen,
benutzen Sie statt dessen @code{mysql_data_seek()}.

@subsubheading R�ckgabewerte

Der vorherige Wert des Zeilencursors. Dieser Wert kann an einen
nachfolgenden Aufruf von @code{mysql_row_seek()} �bergeben werden.

@subsubheading Fehler

Keine.


@node mysql_row_tell, mysql_select_db, mysql_row_seek, C API functions
@c German node mysql_row_tell
@subsubsection @code{mysql_row_tell()}

@findex @code{mysql_row_tell()}

@code{MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *ergebnis)}

@subsubheading Beschreibung

Gibt die aktuelle Position des Zeilencursors f�r das letzte
@code{mysql_fetch_row()} zur�ck. Dieser Wert kann als Argument f�r
@code{mysql_row_seek()} benutzt werden.

Sie sollten @code{mysql_row_tell()} nur nach @code{mysql_store_result()},
nicht nach @code{mysql_use_result()} benutzen.

@subsubheading R�ckgabewerte

Der aktuelle Offset des Zeilencursors.

@subsubheading Fehler

Keine.


@node mysql_select_db, mysql_shutdown, mysql_row_tell, C API functions
@c German node mysql_select_db
@subsubsection @code{mysql_select_db()}

@findex @code{mysql_select_db()}

@code{int mysql_select_db(MYSQL *mysql, const char *db)}

@subsubheading Beschreibung

F�hrt dazu, dass die Datenbank, die durch @code{db} angegeben wird, die
vorgabem��ige (aktuelle) Datenbank auf der von @code{mysql} angegebenen
Verbindung wird. Bei nachfolgenden Anfragen ist diese Datenbank die Vorgabe
f�r Tabellenverweise, die nicht explizit einen Datenbank-Spezifizierer
enthalten.

@code{mysql_select_db()} schl�gt fehl, wenn der verbundene Benutzer keine
Zugriffsrechte auf die Datenbank hat.

@subsubheading R�ckgabewerte

0 bei Erfolg. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_shutdown, mysql_stat, mysql_select_db, C API functions
@c German node mysql_shutdown
@subsubsection @code{mysql_shutdown()}

@findex @code{mysql_shutdown()}

@code{int mysql_shutdown(MYSQL *mysql)}

@subsubheading Beschreibung

F�hrt dazu, dass der Datenbankserver herunter f�hrt. Der verbundene
Benutzer muss die @strong{shutdown}-Berechtigung haben.

@subsubheading R�ckgabewerte

0 bei Erfolg. Nicht-0, wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_stat, mysql_store_result, mysql_shutdown, C API functions
@c German node mysql_stat
@subsubsection @code{mysql_stat()}

@findex @code{mysql_stat()}

@code{char *mysql_stat(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt eine Zeichenkette zur�ck, die Informationen enth�lt, die �hnlich denen
sind, die vom @code{mysqladmin status}-Befehl zur Verf�gung gestellt
werden. Das schlie�t die Betriebszeit (Uptime) in Sekunden und die Anzahl
laufender Threads, Anfragen (Questions), Neuladen (Reloads) und offener
Tabellen ein.

@subsubheading R�ckgabewerte

Eine Zeichenkette, die den Serverstatus beschreibt. @code{NULL}, wenn ein
Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_store_result, mysql_thread_id, mysql_stat, C API functions
@c German node mysql_store_result
@subsubsection @code{mysql_store_result()}

@findex @code{mysql_store_result()}

@code{MYSQL_RES *mysql_store_result(MYSQL *mysql)}

@subsubheading Beschreibung

Sie m�ssen @code{mysql_store_result()} oder @code{mysql_use_result()} f�r
jede Anfrage aufrufen, die erfolgreich Daten abruft (@code{SELECT},
@code{SHOW}, @code{DESCRIBE}, @code{EXPLAIN}).

F�r andere Anfragen m�ssen Sie @code{mysql_store_result()} oder
@code{mysql_use_result()} nicht aufrufen, es schadet aber auch nicht, noch
f�hrt es zu wahrnehmbaren Performance-St�rungen, wenn Sie
@code{mysql_store_result()} in jedem Fall aufrufen. Sie k�nnen feststellen,
ob die Anfrage keine Ergebnismenge hatte, wenn Sie pr�fen, ob
@code{mysql_store_result()} 0 zur�ckgibt (mehr dar�ber sp�ter).

Wenn Sie wissen wollen, ob die Anfrage eine Ergebnismenge zur�ckgeben
sollte oder nicht, k�nnen Sie hierf�r @code{mysql_field_count()} benutzen.
@xref{mysql_field_count, @code{mysql_field_count}}.

@code{mysql_store_result()} liest das gesamte Ergebnis einer Anfrage zum
Client ein, weist eine @code{MYSQL_RES}-Struktur zu und platziert das
Ergebnis in diese Struktur.

@code{mysql_store_results()} gibt einen NULL-Zeiger zur�ck, wenn die
Anfrage keine Ergebnismenge zur�ckgab (wenn die Anfrage zum Beispiel ein
@code{INSERT}-Statement war).

@code{mysql_store_results()} gibt auch einen NULL-Zeiger zur�ck, wenn das
Lesen der Ergebnismenge fehlschlug. Sie k�nnen pr�fen, ob Sie einen Fehler
erhielten, wenn @code{mysql_error()} keinen NULL-Zeiger zur�ckgibt, wenn
@code{mysql_errno()} ungleich 0 zur�ckgibt oder wenn
@code{mysql_field_count()} ungleich 0 zur�ckgibt.

Eine leere Ergebnismenge wird zur�ckgegeben, wenn keine Zeilen
zur�ckgegeben werden. (Eine leere Ergebnismenge unterscheidet sich als
R�ckgabewert von einem NULL-Zeiger.)

Nachdem Sie erst einmal @code{mysql_store_result()} aufgerufen und ein
Ergebnis erhalten haben, das kein NULL-Zeiger ist, k�nnen Sie
@code{mysql_num_rows()} aufrufen, um herauszufinden, wie viele Zeilen es in
der Ergebnismenge gibt.

Sie k�nnen @code{mysql_fetch_row()} aufrufen, um Zeilen aus der
Ergebnismenge zu holen, oder @code{mysql_row_seek()} und
@code{mysql_row_tell()}, um die aktuelle Zeilenposition innerhalb der
Ergebnismenge zu erhalten oder zu setzen.

Sie m�ssen @code{mysql_free_result()} aufrufen, wenn Sie mit der
Ergebnismenge fertig sind.

@xref{NULL mysql_store_result, , @code{NULL mysql_store_result()}}.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnisstruktur mit den Ergebnissen. @code{NULL},
wenn ein Fehler auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_OUT_OF_MEMORY
Kein Speicher mehr.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table


@node mysql_thread_id, mysql_use_result, mysql_store_result, C API functions
@c German node mysql_thread_id
@subsubsection @code{mysql_thread_id()}

@findex @code{mysql_thread_id()}

@code{unsigned long mysql_thread_id(MYSQL *mysql)}

@subsubheading Beschreibung

Gibt die Thread-Kennung der aktuellen Verbindung zur�ck. Der Wert kann als
Argument f�r @code{mysql_kill()} benutzt werden, um den Thread zu t�ten.

Wenn die Verbindung verloren ging und Sie sich mit @code{mysql_ping()}
erneut verbinden, �ndert sich die Thread-Kennung. Das hei�t, dass Sie
nicht die Thread-Kennung holen und f�r sp�tere Benutzung speichern sollten.
Sie sollten sie holen, wenn Sie sie ben�tigen.

@subsubheading R�ckgabewerte

Die Thread-Kennung der aktuellen Verbindung.

@subsubheading Fehler

Keine.


@node mysql_use_result,  , mysql_thread_id, C API functions
@c German node mysql_use_result
@subsubsection @code{mysql_use_result()}

@findex @code{mysql_use_result()}

@code{MYSQL_RES *mysql_use_result(MYSQL *mysql)}

@subsubheading Beschreibung

Sie m�ssen @code{mysql_store_result()} oder @code{mysql_use_result()} f�r
jede Anfrage aufrufen, die erfolgreich Daten abruft (@code{SELECT},
@code{SHOW}, @code{DESCRIBE}, @code{EXPLAIN}).

@code{mysql_use_result()} initiiert einen Ergebnismengen-Abruf, aber liest
die Ergebnismenge nicht tats�chlich in den Client wie
@code{mysql_store_result()}. Statt dessen muss jede Zeile individuell
abgerufen werden, indem Aufrufe von @code{mysql_fetch_row()} durchgef�hrt
werden. Das liest das Ergebnis einer Anfrage direkt vom Server, ohne es in
einer tempor�ren Tabelle oder einem lokalen Puffer zu speichern, was
manchmal schneller ist und viel weniger Speicher benutzt als
@code{mysql_store_result()}. Dem Client wird nur Speicher f�r die aktuelle
Zeile zugewiesen sowie ein Kommunikationspuffer, der bis zu
@code{max_allowed_packet} Bytes Gro� werden kann.

Auf der anderen Seite sollten Sie @code{mysql_use_result()} nicht benutzen,
wenn Sie viele Verarbeitungen f�r jede Zeile auf der Client-Seite
durchf�hren oder wenn die Ausgabe auf den Bildschirm geschickt wird, auf
dem der Benutzer @code{^S} (stop scroll) eingeben kann. Das bindet den
Server und verhindert, dass andere Threads irgend welche Tabellen
aktualisieren k�nnen, von denen gerade Daten geholt werden.

Wenn Sie @code{mysql_use_result()} benutzen, m�ssen Sie
@code{mysql_fetch_row()} ausf�hren, bis ein @code{NULL}-Wert zur�ckgegeben
wird, denn ansonsten werden die nicht geholten Zeilen als Teil der
Ergebnismenge bei Ihrer n�chsten Anfrage zur�ckgegeben. Die C-API gibt den
Fehler @code{Commands out of sync; You can't run this command now} aus,
wenn Sie das vergessen!

Sie k�nnen @code{mysql_data_seek()}, @code{mysql_row_seek()},
@code{mysql_row_tell()}, @code{mysql_num_rows()} oder
@code{mysql_affected_rows()} nicht bei einem Ergebnis verwenden, das von
@code{mysql_use_result()} zur�ckgegeben wird. Ausserdem d�rfen Sie keine
anderen Anfragen absetzen, bis @code{mysql_use_result()} beendet ist.
(Nachdem Sie alle Zeilen abgeholt haben, wird @code{mysql_num_rows()}
jedoch exakt die Anzahl der geholten Zeilen zur�ckgeben.)

Sie m�ssen @code{mysql_free_result()} aufrufen, wenn Sie mit der
Ergebnismenge fertig sind.

@subsubheading R�ckgabewerte

Eine @code{MYSQL_RES}-Ergebnisstruktur. @code{NULL}, wenn ein Fehler
auftrat.

@subsubheading Fehler

@table @code
@item CR_COMMANDS_OUT_OF_SYNC
Befehle wurden nicht in der korrekten Reihenfolge ausgef�hrt.
@item CR_OUT_OF_MEMORY
Kein Speicher mehr.
@item CR_SERVER_GONE_ERROR
Der MySQL-Server ist weg.
@item CR_SERVER_LOST
Die Verbindung zum Server ging w�hrend der Anfrage verloren.
@item CR_UNKNOWN_ERROR
Ein unbekannter Fehler trat auf.
@end table

@node C Thread functions, C Embedded Server func, C API functions, C
@c German node C-Thread-Funktionen
@subsection C-Threaded-Funktionsbeschreibungen

Sie ben�tigen folgende Funktionen, wenn Sie einen threaded Client erstellen
wollen. @xref{Threaded clients}.


@menu
* my_init::                     
* mysql_thread_init::           
* mysql_thread_end::            
* mysql_thread_safe::           
@end menu

@node my_init, mysql_thread_init, C Thread functions, C Thread functions
@c German node my_init()
@subsubsection @code{my_init()}

@findex @code{my_init()}

@subsubheading Beschreibung

Diese Funktion muss einmal im Programm aufgerufen werden, bevor Sie irgend
eine MySQL-Funktion aufrufen. Sie initialisiert einige globale Variablen,
die MySQL braucht. Wenn Sie eine Thread-sichere Client-Bibliothek benutzen,
wird diese ebenfalls @code{mysql_thread_init()} f�r diesen Thread aufrufen.

Diese Funktion wird automatisch von @code{mysql_init()},
@code{mysql_server_init()} und @code{mysql_connect()} aufgerufen.

@subsubheading R�ckgabewerte

Keine.

@node mysql_thread_init, mysql_thread_end, my_init, C Thread functions
@c German node mysql_thread_init()
@subsubsection @code{mysql_thread_init()}

@findex @code{mysql_thread_init()}

@subsubheading Beschreibung

Diese Funktion muss f�r jeden erzeugten Thread aufgerufen werden, um
Thread-spezifische Variablen zu initialisieren.

Diese Funktion wird automatisch von @code{my_init()} und
@code{mysql_connect()} aufgerufen.

@subsubheading R�ckgabewerte

Keine.

@node mysql_thread_end, mysql_thread_safe, mysql_thread_init, C Thread functions
@c German node mysql_thread_end()
@subsubsection @code{mysql_thread_end()}

@findex @code{mysql_thread_end()}

@subsubheading Beschreibung

Diese Funktion muss vor dem Aufruf von @code{pthread_exit()} aufgerufen
werden, um den von @code{mysql_thread_init()} zugewiesenen Speicher
freizusetzen.

Beachten Sie, dass diese Funktion @strong{nicht automatisch} von der
Client-Bibliothek aufgerufen wird. Sie muss explizit aufgerufen werden, um
Speicherlecks zu vermeiden.

@subsubheading R�ckgabewerte

Keine.

@node mysql_thread_safe,  , mysql_thread_end, C Thread functions
@c Arjen note: new @node 2002-04-19, please translate text!
@subsubsection @code{mysql_thread_safe()}

@findex @code{mysql_thread_safe()}

@code{unsigned int mysql_thread_safe(void)}

@subsubheading Description

This function indicates whether the client is compiled as thread safe.

@subsubheading Return Values

1 is the client is thread safe, 0 otherwise.

@node C Embedded Server func, C API problems, C Thread functions, C
@c German node C-Embedded-Server-Funktionen
@subsection C-Embedded-Server-Funktionsbeschreibungen

Sie m�ssen folgende Funktionen benutzen, wenn Sie wollen, dass Ihre
Applikation gegen die eingebettete MySQL-Server-Bibliothek gelinkt werden
kann. @xref{libmysqld}.

Wenn das Programm mit @code{-lmysqlclient} anstelle von @code{-lmysqld}
gelinkt wird, tun diese Funktionen nicht. Das erm�glicht die Auswahl
zwischen der Benutzung des eingebetteten MySQL-Servers und eines
Standalone-Servers, ohne irgend welchen Code zu ver�ndern.


@menu
* mysql_server_init::           
* mysql_server_end::            
@end menu

@node mysql_server_init, mysql_server_end, C Embedded Server func, C Embedded Server func
@c German node mysql_server_init()
@subsubsection @code{mysql_server_init()}

@findex @code{mysql_server_init()}

@code{void mysql_server_init(int argc, const char **argv, const char **groups)}

@subsubheading Beschreibung

Diese Funktion @strong{muss} einmal im Programm aufgerufen werden, bevor
irgend eine andere MySQL-Funktion aufgerufen wird. Sie startet den Server
und initialisiert jegliche Subsysteme (@code{mysys}, InnoDB usw.), die der
Server benutzt. Wenn diese Funktion nicht aufgerufen wird, st�rzt das
Programm ab.

Die @code{argc}- und @code{argv}-Argumente sind analog zu den Argumenten
f�r @code{main()}. Das erste Element von @code{argv} wird ignoriert (es
enth�lt typischerweise den Programmnamen). Aus Bequemlichkeitsgr�nden kann
@code{argc} @code{0} sein, wenn es keine Kommandozeilenargumente f�r den
Server gibt.

Die @code{NULL}-begrenzte Liste von Zeichenketten in @code{groups} w�hlt
aus, welche Gruppen in den Optionsdateien aktiv sind.
@xref{Option files}. Aus Bequemlichkeitsgr�nden kann @code{groups}
@code{NULL} sein. In diesem Fall ist die @code{[server]}-Gruppe aktiv.

@subsubheading Beispiel

@example
#include <mysql.h>
#include <stdlib.h>

static char *server_args[] = @{
  "Mein Programm",       /* Diese Zeichenkette ist unbenutzt */
  "--datadir=.",
  "--set-variable=key_buffer_size=32M"
@};
static char *server_groups[] = @{
  "server",
  "Dieser_Programm_SERVER",
  (char *)NULL
@};

int main(void) @{
  mysql_server_init(sizeof(server_args) / sizeof(char *),
                    server_args, server_groups);

  /* Hier k�nnen Sie irgend welche MySQL-API-Funktionen benutzen */

  mysql_server_end();

  return EXIT_SUCCESS;
@}
@end example

@subsubheading R�ckgabewerte

Keine.

@node mysql_server_end,  , mysql_server_init, C Embedded Server func
@c German node mysql_server_end()
@subsubsection @code{mysql_server_end()}

@findex @code{mysql_server_end()}

@subsubheading Beschreibung

Diese Funktion @strong{muss} einmal im Programm nach allen anderen
MySQL-Funktionen aufgerufen werden. Sie f�hrt den eingebetteten Server
herunter.

@subsubheading R�ckgabewerte

Keine.

@node C API problems, Building clients, C Embedded Server func, C
@c German node C-API-Probleme
@subsection H�ufige Fragen und Probleme bei der Benutzung der C-API

@tindex @code{mysql_query()}
@tindex @code{mysql_store_result()}



@menu
* NULL mysql_store_result::     
* Query results::               
* Getting unique ID::           
* C API linking problems::      
@end menu

@node NULL mysql_store_result, Query results, C API problems, C API problems
@c German node NULL mysql_store_result
@subsubsection Warum gibt @code{mysql_store_result()} manchmal @code{NULL} zur�ck, nachdem @code{mysql_query()} Erfolg zur�ckgegeben hat?

@code{mysql_store_result()} kann @code{NULL} zur�ckgeben, auch nach einem
erfolgreichen Aufruf von @code{mysql_query()}. Wenn das passiert, bedeutet
das, dass eine der folgenden Bedingungen eingetreten ist:

@itemize @bullet
@item
Es gab einen @code{malloc()}-Fehler (zum Beispiel, wenn die Ergebnismenge
zu Gro� war).

@item
Die Daten konnten nicht gelesen werden (ein Fehler mit der Verbindung trat
auf).

@item
Die Anfrage gab keine Daten zur�ck (sie war zum Beispiel ein @code{INSERT},
@code{UPDATE} oder @code{DELETE}).
@end itemize

Sie k�nnen jederzeit pr�fen, ob das Statement eine leere Ergebnismenge
geliefert haben sollte oder nicht, indem Sie @code{mysql_field_count()}
aufrufen. Wenn @code{mysql_field_count()} 0 zur�ckliefert, ist das Ergebnis
leer und die letzte Anfrage war ein Statement, die keine R�ckgabewerte
liefert (zum Beispiel ein @code{INSERT} oder ein @code{DELETE}). Wenn
@code{mysql_field_count()} einen Nicht-0-Wert zur�ckgibt, h�tte das
Statement ein nicht leeres Ergebnis zur�ckliefern sollen. Sehen Sie in der
Beschreibung von @code{mysql_field_count()}-Funktion wegen eines Beispiels
nach.

Sie k�nnen durch Aufruf von @code{mysql_error()} oder @code{mysql_errno()}
auf einen Fehler �berpr�fen.

@cindex Anfragen, C-API-Ergebnisse


@node Query results, Getting unique ID, NULL mysql_store_result, C API problems
@c German node Anfrageergebnisse
@subsubsection Welche Ergebnisse kann ich von einer Anfrage bekommen?

Zus�tzlich zur Ergebnismenge, die von einer Anfrage zur�ckgegeben wird,
k�nnen Sie auch folgende Informationen bekommen:

@itemize @bullet
@item
@code{mysql_affected_rows()} gibt die Anzahl von Zeilen zur�ck, die durch
die letzte Anfrage betroffen wurden, wenn Sie ein @code{INSERT},
@code{UPDATE} oder @code{DELETE} ausf�hren. Eine Ausnahme besteht darin,
wenn @code{DELETE} ohne eine @code{WHERE}-Klausel benutzt wird. In diesem
Fall wird die Tabelle leer neu erzeugt, was viel schneller ist! Daher gibt
@code{mysql_affected_rows()} 0 f�r die Anzahl betroffener Datens�tze
zur�ck.

@item
@code{mysql_num_rows()} gibt die Anzahl von Zeilen in einer Ergebnismenge
zur�ck. Bei @code{mysql_store_result()} kann @code{mysql_num_rows()}
aufgerufen werden, sobald @code{mysql_store_result()} etwas zur�ckgibt. Bei
@code{mysql_use_result()} kann @code{mysql_num_rows()} erst aufgerufen
werden, nachdem Sie alle Zeilen mit @code{mysql_fetch_row()} geholt haben.

@item
@code{mysql_insert_id()} gibt die Kennung zur�ck, die von der letzten
Anfrage erzeugt wurde, die eine Zeile in eine Tabelle mit einem
@code{AUTO_INCREMENT}-Index einf�gte. @xref{mysql_insert_id, ,
@code{mysql_insert_id()}}.

@item
Einige Anfragen (@code{LOAD DATA INFILE ...}, @code{INSERT INTO ... SELECT
...}, @code{UPDATE}) geben zus�tzliche Informationen zur�ck. Das Ergebnis
wird von @code{mysql_info()} zur�ckgegeben. Siehe die Beschreibung f�r
@code{mysql_info()} hinsichtlich des Formats der Zeichenkette, die diese
Funktion zur�ckgibt. @code{mysql_info()} gibt einen @code{NULL}-Zeiger
zur�ck, wenn es keine zus�tzlichen Informationen gibt.
@end itemize


@node Getting unique ID, C API linking problems, Query results, C API problems
@c German node Eindeutige Kennung erhalten
@subsubsection Wie erhalte ich die eindeutige Kennung f�r die letzte eingef�gte Zeile?

@cindex eindeutige Kennung
@cindex letzte Zeile, eindeutige Kennung
@cindex Kennung, eindeutige
@cindex Tabellen, eindeutige Kennung f�r die letzte Zeile

Wenn Sie einen Datensatz in eine Tabelle einf�gen, der eine Spalte enth�lt,
die das @code{AUTO_INCREMENT}-Attribut hat, erhalten Sie die letzte
erzeugte Kennung durch Aufruf der @code{mysql_insert_id()}-Funktion.

Sie k�nnen die Kennung auch dadurch abrufen, dass Sie die
@code{LAST_INSERT_ID()}-Funktion in einer Anfrage-Zeichenkette verwenden,
die Sie an @code{mysql_query()} �bergeben.

Sie k�nnen �berpr�fen, ob ein @code{AUTO_INCREMENT}-Index benutzt wird,
wenn Sie folgenden Code ausf�hren. Er pr�ft auch, ob die Anfrage ein
@code{INSERT} mit einem @code{AUTO_INCREMENT}-Index war:

@example
if (mysql_error(&mysql)[0] == 0 &&
    mysql_num_fields(ergebnis) == 0 &&
    mysql_insert_id(&mysql) != 0)
@{
    used_id = mysql_insert_id(&mysql);
@}
@end example

Die letzte erzeugte Kennung wird im Server auf der Grundlage der jeweiligen
Verbindung gewartet. Sie wird nicht durch andere Clients ge�ndert. Sie wird
nicht einmal ge�ndert, wenn Sie eine andere @code{AUTO_INCREMENT}-Spalte
mit einem nicht magischen Wert aktualisieren (einem Wert, der nicht
@code{NULL} und nicht @code{0} ist).

Wenn Sie die Kennung benutzen wollen, die f�r eine Tabelle erzeugt wurde,
um sie in eine zweite Tabelle einzuf�gen, k�nnen Sie SQL-Statements wie
folgt benutzen:

@example
INSERT INTO foo (auto,text)
    VALUES(NULL,'text');              # Kennung durch Einf�gen von NULL erzeugen
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # Kennung in zweiter Tabelle benutzen
@end example


@node C API linking problems,  , Getting unique ID, C API problems
@c German node C-API-Linking-Probleme
@subsubsection Probleme beim Linken mit der C-API

@cindex Linken, Probleme
@cindex C-API, Link-Probleme

Wenn Sie mit der C-API linken, k�nnen auf manchen Systemen folgende Fehler
auftreten:

@example
gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnsl

Undefined        first referenced
 symbol          in file
floor            /usr/local/lib/mysql/libmysqlclient.a(password.o)
ld: fatal: Symbol referencing errors. No output written to client
@end example

Wenn das auf Ihrem System passiert, m�ssen Sie die math-Bibliothek
einschlie�en, indem Sie @code{-lm} am Ende der Kompilier- / Link-Zeile
hinzuf�gen.


@node Building clients, Threaded clients, C API problems, C
@c German node Clients bauen
@subsection Client-Programme bauen

@cindex Client-Programme, bauen
@cindex linken
@cindex bauen, Client-Programme
@cindex Programme, Client

Wenn Sie MySQL-Clients kompilieren, die Sie selbst geschrieben oder von
Dritten erhalten haben, m�ssen diese mit der @code{-lmysqlclient
-lz}-Option f�r den Link-Befehl gelinkt werden. Eventuell sollten Sie auch
eine @code{-L}-Option verwenden, um dem Linker mitzuteilen, wo sich die
Bibliothek befindet. Wenn zum Beispiel die Bibliothek in
@file{/usr/local/mysql/lib} installiert ist, benutzen Sie
@code{-L/usr/local/mysql/lib -lmysqlclient -lz} f�r den Link-Befehl.

F�r Clients, die MySQL-Header-Dateien benutzen, m�ssen Sie eventuell eine
@code{-I}-Option angeben, wenn Sie sie kompilieren (zum Beispiel
@code{-I/usr/local/mysql/include}), so dass der Kompiler die Header-Dateien
finden kann.


@node Threaded clients, libmysqld, Building clients, C
@c German node Threaded Clients
@subsection Wie man einen threaded Client herstellt

@cindex Clients, Threaded
@cindex Threaded Clients

Die Client-Bibliothek ist fast Thread-sicher. Das gr��te Problem besteht
darin, dass die Subroutinen in @file{net.c}, die von Sockets lesen, nicht
Interrupt-sicher sind. Das wurde mit dem Hintergedanken gemacht, dass Sie
eventuell Ihre eigenen Alarme haben m�chten, die ein langes Lesen vom
Server unterbrechen k�nnen. Wenn Sie Interrupt-Handler f�r den
@code{SIGPIPE}-Interrupt installieren, sollte die Socket-Handhabung
Thread-sicher sein.

In den �lteren Bin�rdistributionen wurden die Client-Bibliotheken
normalerweise nicht mit der Thread-sicheren Option kompiliert (die
Windows-Bin�rdateien sind vorgabem��ig Thread-sicher kompiliert). Neuere
Bin�rdistributionen sollten sowohl eine normale als auch eine
Thread-sichere Client-Bibliothek haben.

Um einen threaded Client zu erhalten, bei dem Sie den Client durch andere
Threads unterbrechen (interrupt) und Zeit�berschreitungen (Timeouts) setzen
k�nnen, wenn Sie mit dem MySQL-Server kommunizieren, sollten Sie die
@code{-lmysys}-, @code{-lstring}-, und @code{-ldbug}-Bibliotheken und den
@code{net_serv.o}-Code benutzen, den der Server benutzt.

Wenn Sie keine Unterbrechungen (Interrupts) oder Zeit�berschreitungen
(Timeouts) ben�tigen, k�nnen Sie einfach eine Thread-sicher
Client-Bibliothek @code{(mysqlclient_r)} kompilieren und diese benutzen.
@xref{C,,MySQL-C-API}. In diesem Fall m�ssen Sie sich nicht um die
@code{net_serv.o}-Objektdatei oder die anderen MySQL-Bibliotheken k�mmern.

Wenn Sie einen threaded Client benutzen und Unterbrechungen (Interrupts)
und Zeit�berschreitungen (Timeouts) benutzen wollen, k�nnen Sie in
umfangreicher Weise die Routinen in der @file{thr_alarm.c}-Datei benutzen.
Wenn Sie Routinen aus der @code{mysys}-Bibliothek benutzen, m�ssen Sie
lediglich daran denken, @code{my_init()} zuerst aufzurufen!
@xref{C Thread functions}.

Alle Funktionen ausser @code{mysql_real_connect()} sind vorgabem��ig
Thread-sicher. Die folgenden Hinweise beschreiben, wie man eine
Thread-sichere Client-Bibliothek kompiliert und sie auf Thread-sichere
Weise benutzt. (Die unten stehenden Hinweise f�r
@code{mysql_real_connect()} beziehen sich in der Tat auch auf
@code{mysql_connect()}. Weil aber @code{mysql_connect()} veraltet ist,
sollten Sie in jedem Fall @code{mysql_real_connect()} benutzen.)

Um @code{mysql_real_connect()} Thread-sicher zu machen, m�ssen Sie die
Client-Bibliothek mit diesem Befehl neu kompilieren:

@example
shell> ./configure --enable-thread-safe-client
@end example

Das erzeugt eine Thread-sichere Client-Bibliothek @code{libmysqlclient_r}.
@code{--enable-thread-safe-client}. Diese Bibliothek ist pro Verbindung
Thread-sicher. Sie k�nnen zwei Threads dieselbe Verbindung benutzen lassen,
solange Sie folgendes tun:

@itemize @bullet
@item
Zwei Threads k�nnen zur gleichen Zeit keine Anfrage an MySQL �ber dieselbe
Verbindung schicken. Insbesondere m�ssen Sie sicherstellen, dass zwischen
einem @code{mysql_query()} und einem @code{mysql_store_result()} kein
anderer Thread dieselbe Verbindung benutzt.
@item
Viele Threads k�nnen auf unterschiedliche Ergebnismengen zugreifen, die mit
@code{mysql_store_result()} abgerufen wurden.
@item
Wenn Sie @code{mysql_use_result} benutzen, m�ssen Sie sicherstellen, dass
kein anderer Thread irgend etwas �ber dieselbe Verbindung anfragt, bis die
Ergebnismenge geschlossen wurde. F�r threaded Clients, die dieselbe
Verbindung benutzen, ist es jedoch am besten, @code{mysql_use_result()} zu
benutzen.
@item

Wenn Sie mehrfache Threads �ber dieselbe Verbindung benutzen wollen, m�ssen
Sie eine mutex-Sperre um Ihre @code{mysql_query()}- und
@code{mysql_store_result()}-Aufruf-Kombination haben. Sobald
@code{mysql_store_result()} fertig ist, kann die Sperre aufgehoben werden
und andere Threads k�nnen �ber dieselbe Verbindung anfragen.
@item
Wenn Sie mit POSIX-Threads programmieren, k�nnen Sie
@code{pthread_mutex_lock()} und @code{pthread_mutex_unlock()} benutzen, um
eine mutex-Sperre aufzubauen und aufzuheben.
@end itemize

Sie m�ssen folgendes wissen, wenn Sie einen Thread haben, der
MySQL-Funktionen aufruft, dieser Thread aber keine Verbindung zur
MySQL-Datenbank aufgebaut hat:

Wenn Sie @code{mysql_init()} oder @code{mysql_connect()} aufrufen, erzeugt
MySQL eine Thread-spezifische Variable f�r diesen Thread, die von der
Debug-Bibliothek benutzt wird (unter anderem).

Wenn Sie in einem Thread-Aufruf eine MySQL-Funktion haben, bevor ein Thread
@code{mysql_init()} oder @code{mysql_connect()} aufgerufen hat, hat der
Thread nicht notwendigerweise Thread-spezifische Variablen zur Hand, und
Sie werden wahrscheinlich fr�her oder sp�ter einen Coredump erhalten.
 
Damit alles reibungslos funktioniert, m�ssen Sie folgendes tun:

@enumerate
@item
Rufen Sie bei Programmbeginn @code{my_init()} auf, wenn Ihr Programm
irgend welche MySQL-Funktion vor dem Aufruf von @code{mysql_real_connect()}
benutzt.
@item
Rufen Sie @code{mysql_thread_init()} im Thread-Handler auf, bevor Sie
irgend welche MySQL-Funktionen aufrufen.
@item
Rufen Sie im Thread @code{mysql_thread_end()} auf, bevor Sie
@code{pthread_exit()} aufrufen. Das gibt Speicher frei, der von
MySQL-Thread-spezifischen Variablen benutzt wird.
@end enumerate

Eventuell erhalten Sie Fehler wegen undefinierter Symbole, wenn Sie Ihren
Client mit @code{mysqlclient_r} linken. In den meisten F�llen liegt das
daran, dass Sie die Thread-Bibliotheken nicht auf der Link- /
Kompilierzeile eingeschlossen haben.

@node libmysqld,  , Threaded clients, C
@c German node libmysqld
@subsection libmysqld, die eingebettete MySQL-Server-Bibliothek

@cindex libmysqld
@cindex eingebettete MySQL-Server-Bibliothek


@menu
* libmysqld overview::          
* libmysqld compiling::         
* libmysqld example::           
* libmysqld licensing::         
@end menu

@node libmysqld overview, libmysqld compiling, libmysqld, libmysqld
@c German node libmysqld �berblick
@subsubsection �berblick �ber die eingebettete MySQL-Server-Bibliothek

Die eingebettete MySQL-Server-Bibliothek erm�glicht es, einen MySQL-Server
mit allen Features innerhalb einer Client-Applikation laufen zu lassen. Die
haupts�chlichen Vorteile sind erh�hte Geschwindigkeit und einfachere
Verwaltung eingebetteter Applikationen.

@node libmysqld compiling, libmysqld example, libmysqld overview, libmysqld
@c German node libmysqld kompilieren
@subsubsection Programme mit @code{libmysqld} kompilieren

Momentan m�ssen alle unterst�tzten Bibliotheken explizit aufgelistet
werden, wenn Sie mit @code{-lmysqld} linken. In Zukunft wird
@code{mysql_config --libmysqld-libs} die Bibliotheken benennen, um das zu
erleichtern. Dar�ber hinaus werden alle unterst�tzten Bibliotheken
wahrscheinlich in libmysqld eingeschlossen werden, um dies noch weiter zu
vereinfachen.

Die korrekten Flags zum Kompilieren und Linken eines threaded Programms
m�ssen benutzt werden, selbst wenn Sie nicht direkt irgend welche
Thread-Funktionen in Ihrem Code aufrufen.

@node libmysqld example, libmysqld licensing, libmysqld compiling, libmysqld
@c German node libmysqld Beispiel
@subsubsection Ein einfaches Embedded-Server-Beispiel

Dieses Beispiel-Programm und makefile sollten ohne �nderungen auf einem
Linux- oder FreeBSD-System funktionieren. Bei anderen Betriebssystemen sind
kleinere �nderungen notwendig. Dieses Beispiel ist so angelegt, dass
gen�gend Details dargestellt werden, um die Problematik zu verstehen, ohne
zu viel "Verwirrendes" einzubringen, das Teil einer echten Applikation ist.

Um das Beispiel auszuprobieren, erzeugen Sie ein @file{example}-Verzeichnis
auf derselben Ebene wie das mysql-4.0-Quell-Verzeichnis. Speichern Sie die
@file{example.c}-Quelle und das @file{GNUmakefile} im Verzeichnis und
lassen Sie GNU-@file{make} innerhalb des @file{example}-Verzeichnisses
laufen.

@file{example.c}
@example
/*
 * Ein einfacher Beispiel-Client, der die eingebettete
 * MySQL-Server-Bibliothek benutzt
 */

#include <mysql.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

enum on_error @{ E_okay, E_warn, E_fail @};

static void   die(MYSQL *db, char *fmt, ...);
MYSQL *db_connect(const char *dbname);
void db_disconnect(MYSQL *db);
void db_do_Anfrage(MYSQL *db, const char *query, enum on_error on_error);

const char *server_groups[] = @{ "test_client_SERVER", "server", NULL @};

int
main(int argc, char **argv)
@{
  MYSQL *one, *two;

  /* Das muss vor allen weiteren mysql-Funktionen aufgerufen werden.
   *
   * Sie k�nnen mysql_server_init(0, NULL, NULL) benutzen, 
   * was den Server initialisiert und die Gruppen
   * groups = @{ "server", NULL @} benutzt.
   *
   * In Ihre $HOME/.my.cnf-Datei sollten Sie folgendes eintragen:

[test_client_SERVER]
language = /pfad/zur/quelle/von/mysql/sql/share/english

   * Nat�rlich k�nnen Sie auch argc und argv �ndern,
   * bevor Sie sie an diese Funktion �bergeben.
   * Oder erzeugen Sie neue auf jede Art, die Sie wollen.
   * Alle Argumente in argv (ausser argv[0], was der Programmname ist)
   * m�ssen allerdings g�ltige Optionen f�r den MySQL-Server sein.
   * Wenn Sie diesen Client gegen die normale mysqlclient-
   * Bibliothek linken, ist diese Funktion nur ein Stumpf, der nichts tut.
   */
  mysql_server_init(argc, argv, server_groups);

  one = db_connect("test");
  two = db_connect(NULL);

  db_do_query(one, "show table status", E_fail);
  db_do_query(two, "show databases", E_fail);

  mysql_close(two);
  mysql_close(one);

  /* Folgendes muss nach allen anderen mysql-Funktionen aufgerufen werden */
  mysql_server_end();

  exit(EXIT_SUCCESS);
@}

void
die(MYSQL *db, char *fmt, ...)
@{
  va_list ap;
  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  putc('\n', stderr);
  if (db)
    db_disconnect(db);
  exit(EXIT_FAILURE);
@}

MYSQL *
db_connect(const char *dbname)
@{
  MYSQL *db = mysql_init(NULL);
  if (!db)
    die(db, "mysql_init fehlgeschlagen: kein Speicher mehr");
  mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "simple");
  if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0))
    die(db, "mysql_real_connect fehlgeschlagen: %s", mysql_error(db));

  return db;
@}

void
db_disconnect(MYSQL *db)
@{
  mysql_close(db);
@}

/*
 * show_query: Dieser Code ist aus mysql.cc. Diese Funktion
 * ist daf�r gedacht, intern f�r db_do_query() benutzt zu werden.
 */
static char *
show_query(MYSQL *db)
@{
  MYSQL_RES   *res;
  MYSQL_FIELD *field;
  MYSQL_ROW    row;
  char         sep[256], *psep = sep;
  char        *is_num = 0;
  char        *err = 0;
  unsigned int length = 1;      /* anfangs "|" */
  unsigned int off;

  if (!(res = mysql_store_result(db)))
    return mysql_error(db);

  if (!(is_num = malloc(mysql_num_fields(res))))
  @{
    err = "Kein Speicher mehr";
    goto err;
  @}

  /* set up */
  *psep++ = '+';
  while ((field = mysql_fetch_field(res)))
  @{
    unsigned int len = strlen(field->name);
    if (len < field->max_length)
      len = field->max_length;
    if (len < 2 && !IS_NOT_NULL(field->flags))
      len = 2;  /* \N */
    field->max_length = len + 1;        /* die API verbiegen ... */
    len += 2; length += len + 1;        /* " " davor, " |" danach */
    if (length >= 255)
    @{
      err = "Zeile zu lang";
      goto err;
    @}
    memset(psep, '-', len); psep += len;
    *psep++ = '+';
    *psep   = '\0';
  @}

  /* Spalten�berschriften */
  puts(sep);
  mysql_field_seek(res,0);
  fputc('|',stdout);
  f�r (off=0; (field = mysql_fetch_field(res)) ; off++)
  @{
    printf(" %-*s|",field->max_length, field->name);
    is_num[off]= IS_NUM(field->type);
  @}
  fputc('\n',stdout);
  puts(sep);

  /* Zeilen */
  while ((row = mysql_fetch_row(res)))
  @{
    (void) fputs("|",stdout);
    mysql_field_seek(res,0);
    for (off=0 ; off < mysql_num_fields(res); off++)
    @{
      field = mysql_fetch_field(res);
      printf(is_num[off] ? "%*s |" : " %-*s|",
             field->max_length, row[off] ? (char*) row[off] : "NULL");
    @}
    (void) fputc('\n',stdout);
  @}
  puts(sep);

err:
  if (is_num)
    free(is_num);
  mysql_free_result(res);

  return err;
@}

void
db_do_query(MYSQL *db, const char *query, enum on_error on_error)
@{
  char *err = 0;
  if (mysql_query(db, query) != 0)
    goto err;

  if (mysql_field_count(db) > 0)
  @{
    if ((err = show_query(db)))
      goto err;
  @}
  else if (mysql_affected_rows(db))
    printf("Betroffene Zeilen: %lld [%s]\n", mysql_affected_rows(db), query);

  return;

err:
  switch (on_error) @{
  case E_okay:
    break;
  case E_warn:
    fprintf(stderr, "db_do_query fehlgeschlagen: %s [%s]\n",
        err ? err : mysql_error(db), query);
    break;
  case E_fail:
    die(db, "db_do_query fehlgeschlagen: %s [%s]",
        err ? err : mysql_error(db), query);
    break;
  @}
@}
@end example

@file{GNUmakefile}
@example
# Platzieren Sie diese in Ihr mysql-Quell-Verzeichnis
m        := ../mysql-4.0

CC       := cc
CPPFLAGS := -I$m/include -D_thread_SAFE -D_REENTRANT
CFLAGS   := -g -W -Wall
LDFLAGS  := -static
LDLIBS    = $(embed_libs) -lz -lm -lcrypt

ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null))
# FreeBSD
LDFLAGS += -pThread
else
# Linux wird angenommen
LDLIBS += -lpThread
endif


# Standard-Bibliotheken

embed_libs := \
        $m/libmysqld/.libs/libmysqld.a \
        $m/isam/libnisam.a \
        $m/myisam/libmyisam.a \
        $m/heap/libheap.a \
        $m/merge/libmerge.a \
        $m/myisammrg/libmyisammrg.a


# Optional gebaute Bibliotheken

ifneq (,$(shell test -r $m/innobase/usr/libusr.a && echo "yes"))
embed_libs += \
        $m/innobase/usr/libusr.a \
        $m/innobase/odbc/libodbc.a \
        $m/innobase/srv/libsrv.a \
        $m/innobase/que/libque.a \
        $m/innobase/srv/libsrv.a \
        $m/innobase/dict/libdict.a \
        $m/innobase/ibuf/libibuf.a \
        $m/innobase/row/librow.a \
        $m/innobase/pars/libpars.a \
        $m/innobase/btr/libbtr.a \
        $m/innobase/trx/libtrx.a \
        $m/innobase/read/libread.a \
        $m/innobase/usr/libusr.a \
        $m/innobase/buf/libbuf.a \
        $m/innobase/ibuf/libibuf.a \
        $m/innobase/eval/libeval.a \
        $m/innobase/log/liblog.a \
        $m/innobase/fsp/libfsp.a \
        $m/innobase/fut/libfut.a \
        $m/innobase/fil/libfil.a \
        $m/innobase/lock/liblock.a \
        $m/innobase/mtr/libmtr.a \
        $m/innobase/page/libpage.a \
        $m/innobase/rem/librem.a \
        $m/innobase/thr/libthr.a \
        $m/innobase/com/libcom.a \
        $m/innobase/sync/libsync.a \
        $m/innobase/data/libdata.a \
        $m/innobase/mach/libmach.a \
        $m/innobase/ha/libha.a \
        $m/innobase/dyn/libdyn.a \
        $m/innobase/mem/libmem.a \
        $m/innobase/sync/libsync.a \
        $m/innobase/ut/libut.a \
        $m/innobase/os/libos.a \
        $m/innobase/ut/libut.a
endif

ifneq (,$(shell test -r $m/bdb/build_unix/libdb.a && echo "yes"))
embed_libs += $m/bdb/build_unix/libdb.a
endif


# Unterst�tzte Bibliotheken

embed_libs += \
        $m/mysys/libmysys.a \
        $m/strings/libmystrings.a \
        $m/dbug/libdbug.a \
        $m/regex/libregex.a


# Optional gebaute unterst�tzte Bibliotheken

ifneq (,$(shell test -r $m/readline/libreadline.a && echo "yes"))
embed_libs += $m/readline/libreadline.a
endif

# Das funktioniert bei einfachen Ein-Datei-Test-Programmen
sources := $(wildcard *.c)
objects := $(patsubst %c,%o,$(sources))
targets := $(basename $(sources))

all: $(targets)

clean:
	rm -f $(targets) $(objects) *.core
@end example

@node libmysqld licensing,  , libmysqld example, libmysqld
@c German node libmysqld Lizensierung
@subsubsection Lizensierung des eingebetteten Servers

Der MySQL-Quelltext wird von der GNU-GPL-Lizenz abgedeckt
(@pxref{GPL license}). Eine Folge davon ist, dass jegliches Programm, das
durch Linken mit @code{libmysqld} den MySQL-Quelltext enth�lt, als freie
Software (unter einer mit der GPL kompatiblen Lizenz) ver�ffentlicht werden
muss.

Wir ermutigen jeden, freie Software durch Ver�ffentlichung von Code unter
der GPL oder einer kompatiblen Lizenz zu f�rdern. F�r diejenigen, die dazu
nicht in der Lage sind, ist eine weitere Option, den MySQL-Code von MySQL
AB unter einer lockereren Lizenz zu erwerben. Wegen Details betreffs dieses
Themas siehe unter @ref{Lizenzpolitik}.

@node Cplusplus, Java, C, Clients
@c German node Cplusplus
@section MySQL-C++-APIs



@cindex C++-APIs

Zwei APIs sind im
MySQL-@uref{http://www.mysql.com/Downloads/Contrib/,Contrib-Verzeichnis}
verf�gbar.


@menu
* Borland C++::                 
@end menu

@node Borland C++,  , Cplusplus, Cplusplus
@c German node Borland C++
@subsection Borland C++

@cindex Borland C++-Kompiler

Sie k�nnen den MySQL-Windows-Quellcode mit Borlund C++ 5.02 kompilieren.
(Der Windows-Quellcode beinhaltet nur Projekte f�r Microsoft VC++, f�r
Borland C++ m�ssen Sie die Projektdateien selbst erstellen).

Ein bekanntes Problem bei Borland C++ ist, dass es eine andere
Strukturanordnung benutzt als VC++. Das bedeutet, dass Sie Probleme
bekommen, wenn Sie versuchen, die vorgabem��igen
@code{libmysql.dll}-Bibliotheken (die mit VC++ kompiliert wurden) mit
Borland C++ zu verwenden. Sie k�nnen eins der folgenden Dinge tun, um
dieses Problem zu vermeiden:

@itemize @bullet
@item
Sie k�nnen statische MySQL-Bibliotheken f�r Borland C++ verwenden, die Sie
unter @uref{http://www.mysql.com/downloads/os-win32.html} finden.
@item
Rufen Sie @code{mysql_init()} nur mit @code{NULL} als Argument auf, kein
vorher zugewiesenes (pr�-alloziertes) MySQL-Strukt.
@end itemize


@node Java, Python, Cplusplus, Clients
@c German node Java
@section MySQL Java Connectivity (JDBC)

@cindex Java-Connectivity
@cindex JDBC

Es gibt 2 unterst�tzte JDBC-Treiber f�r MySQL (den mm-Treiber und den
Reisin JDBC-Treiber). Sie finden den mm-Treiber unter
@uref{http://mmmysql.sourceforge.net/} oder
@uref{http://www.mysql.com/Downloads/Contrib/} und den Reisin-Treiber unter
@uref{http://www.caucho.com/Projekte/jdbc-mysql/index.xtp}. Wegen der
Dokumentation sehen Sie sich irgend eine JDBC-Dokumentation durch sowie die
eigene Dokumentation der Treiber wegen MySQL-spezifischer Features.


@node Python, Tcl, Java, Clients
@c German node Python
@section MySQL-Python-APIs

@cindex Python-APIs

Das
MySQL-@uref{http://www.mysql.com/Downloads/Contrib/,Contrib-Verzeichnis}
enth�lt eine Python-Schnittstelle, die von Joseph Skinner geschrieben
wurde.

Sie k�nnen auch die Python-Schnittstelle zu iODBC benutzen, um auf einen
MySQL-Server zuzugreifen.
@uref{http://starship.skyport.net/~lemburg/,mxODBC}


@node Tcl, Eiffel, Python, Clients
@c German node Tcl
@section MySQL-Tcl-APIs

@cindex Tcl-APIs

@uref{http://www.binevolve.com/~tdarugar/tcl-sql/, Tcl bei binevolve}.
Das
@uref{http://www.mysql.com/Downloads/Contrib,Contrib-Verzeichnis} enth�lt
eine Tcl-Schnittstelle, die auf msqltcl 1.50 basiert.


@node Eiffel,  , Tcl, Clients
@c German node Eiffel
@section MySQL-Eiffel-Wrapper

@cindex Eiffel-Wrapper
@cindex Wrapper, Eiffel

Das
MySQL-@uref{http://www.mysql.com/Downloads/Contrib/,Contrib-Verzeichnis}
enth�lt einen Eiffel-Wrapper, der von Michael Ravits geschrieben wurde.


@node Extending MySQL, Problems, Clients, Top
@c German node MySQL erweitern
@chapter MySQL erweitern



@menu
* MySQL internals::             
* Adding procedures::           
* MySQL-Interna::               
@end menu

@node MySQL internals, Adding procedures, Extending MySQL, Extending MySQL
@c German node Hinzuf�gen von Funktionen
@section Hinzuf�gen neuer Funktionen zu MySQL

@cindex Funktionen, neue
@cindex hinzuf�gen, neue Funktionen
@cindex benutzerdefinierte Funktionen, hinzuf�gen
@cindex UDFs, Definition
@cindex Funktionen, benutzerdefinierte

Es gibt zwei M�glichkeiten, MySQL neue Funktionen hinzuzuf�gen:

@itemize @bullet
@item
Sie k�nnen die Funktion �ber die benutzerdefinierbare Funktions-
(UDF-) Schnittstelle hinzuf�gen. Benutzerdefinierbare Funktionen werden
dynamisch mittels @code{CREATE FUNCTION} und @code{DROP
FUNCTION}-Statements hinzugef�gt bzw. gel�scht.
@xref{CREATE FUNCTION, ,@code{CREATE FUNCTION}}.

@item
Sie k�nnen die Funktion als native (eingebaute) MySQL-Funktion hinzuf�gen.
Native Funktionen werden in den @code{mysqld}-Server kompiliert und stehen
dann dauerhaft zur Verf�gung.
@end itemize

Jede Methode hat Vorteile und Nachteile:

@itemize @bullet
@item
Wenn Sie eine benutzerdefinierte Funktion schreiben, m�ssen Sie die
Objekt-Datei zus�tzlich zum Server selbst installieren. Wenn Sie Ihre
Funktion in den Server einkompilieren, brauchen Sie das nicht zu tun.
@item
Sie k�nnen der bin�ren MySQL-Distribution benutzerdefinierte Funktionen
hinzuf�gen. Native Funktionen erfordern, dass Sie eine Quelldistribution
ver�ndern.
@item
Wenn Sie Ihre MySQL-Distribution aktualisieren, k�nnen Sie weiterhin Ihre
vorher installierten benutzerdefinierten Funktionen benutzen. Bei nativen
Funktionen m�ssen Sie Ihre �nderungen jedes Mal wiederholen, wenn Sie
aktualisieren.
@end itemize

Gleich welche Methode Sie zum Hinzuf�gen neuer Funktionen verwenden, k�nnen
Sie diese genau wie die nativen Funktionen, z. B. @code{ABS()} oder
@code{SOUNDEX()}, benutzen.



@menu
* CREATE FUNCTION::             
* Adding UDF::                  
* Adding native function::      
@end menu

@node CREATE FUNCTION, Adding UDF, MySQL internals, MySQL internals
@c German node CREATE FUNCTION
@subsection @code{CREATE FUNCTION / DROP FUNCTION}-Syntax

@findex CREATE FUNCTION
@findex DROP FUNCTION
@findex UDF-Funktionen
@findex benutzerdefinierte Funktionen
@findex Funktionen, benutzerdefinierte

@example
CREATE [AGGREGATE] FUNCTION funktion RETURNS @{STRING|REAL|INTEGER@}
       SONAME gemeinsame_bibliothek

DROP FUNCTION funktion
@end example

Eine benutzerdefinierte Funktion (UDF) ist eine M�glichkeit, MySQL durch
eine neue Funktion zu erweitern, die wie die nativen (eingebauten)
MySQL-Funktionen, z. B. @code{ABS()} und @code{CONCAT()}, funktioniert.

@code{AGGREGATE} ist eine neue Option f�r MySQL-Version 3.23. Eine
@code{AGGREGATE}-Funktion funktioniert genau wie eine native MySQL-
@code{GROUP}-Funktion wie @code{SUM} oder @code{COUNT()}.

@code{CREATE FUNCTION} speichert den Funktionnamen, -typ und die gemeinsam
genutzte Bibliothek in der @code{mysql.func}-Systemtabelle. Sie ben�tigen
die @strong{insert}- und @strong{delete}-Berechtigungen f�r die
@code{mysql}-Datenbank, um Funktionen zu erzeugen und zu l�schen.

Alle aktiven Funktionen werden jedes Mal wieder geladen, wenn der Server
startet, es sei denn, Sie starten ihn mit der
@code{--skip-grant-tables}-Option. In diesem Fall wird die
UDF-Initialisierung �bersprungen, so dass UDFs nicht verf�gbar sind. (Eine
aktive Funktion ist eine, die mit @code{CREATE FUNCTION} geladen und nicht
mit @code{DROP FUNCTION} entfernt wurde.)

Wegen weiterer Anleitungen zum Schreiben benutzerdefinierte Funktionen
siehe @ref{MySQL internals}. Damit der UDF-Mechanismus
funktioniert, m�ssen Funktionen in C oder C++ geschrieben sein. Ihr
Betriebssystem muss dynamisches Laden unterst�tzen und Sie m�ssen
@code{mysqld} dynamisch (nicht statisch) kompiliert haben.

Beachten Sie, dass Sie f�r das Funktionieren von @code{AGGREGATE} eine
@code{mysql.func}-Tabelle ben�tigen, die die Spalte @code{typ} enth�lt.
Wenn das nicht der Fall ist, sollten Sie das Skript
@code{mysql_fix_privilege_tables} laufen lassen, um diesen Mangel zu
beheben.


@node Adding UDF, Adding native function, CREATE FUNCTION, MySQL internals
@c German node UDF hinzuf�gen
@subsection Hinzuf�gen einer neuen benutzerdefinierten Funktion

@cindex hinzuf�gen, benutzerdefinierte Funktionen
@cindex benutzerdefinierte Funktionen, hinzuf�gen
@cindex Funktionen, benutzerdefinierte, hinzuf�gen



Damit der UDF-Mechanismus funktioniert, m�ssen Funktionen in C oder C++
geschrieben sein. Ihr Betriebssystem muss dynamisches Laden unterst�tzen
und Sie m�ssen @code{mysqld} dynamisch (nicht statisch) kompiliert
haben. Die MySQL-Quelldistribution enth�lt eine Datei
@file{sql/udf_example.cc}, die 5 neue Funktionen definiert. Sehen Sie in
dieser Datei nach, wie die UDF-Aufruf-Konventionen funktionieren.

Damit @code{mysqld} UDF-Funktionen benutzen kann, sollten Sie MySQL mit
@code{--with-mysqld-ldflags=-rdynamic} konfigurieren. Der Grund liegt
darin, dass Sie auf vielen Plattformen (inklusive Linux) eine dynamische
Bibliothek (mit @code{dlopen()}) von einem statisch gelinkten Programm
laden k�nnen, was Sie erhalten w�rden, wenn Sie
@code{--with-mysqld-ldflags=-all-static} benutzen. Wenn Sie eine UDF
benutzen wollen, die auf Symbole von @code{mysqld} zugreifen muss (wie das
@code{methaPhone}-Beispiel in @file{sql/udf_example.cc}, das
@code{default_charset_info} benutzt), m�ssen Sie das Programm mit
@code{-rdynamic} benutzen (siehe @code{man dlopen}).

F�r jede Funktion, die Sie in SQL-Statements benutzen wollen, sollten Sie
die entsprechenden C- (oder C++-) Funktionen benutzen. In den unten
stehenden Ausf�hrungen wird ``xxx'' als Beispiel-Funktionsname benutzt. Um
zwischen SQL- und C-/C++-Benutzung zu unterscheiden, kennzeichnet
@code{XXX()} (Gro�schreibung) einen SQL-Funktionsaufruf und @code{xxx()}
(Kleinschreibung) einen C-/C++-Funktionsaufruf.

The C-/C++-Funktionen, die Sie f�r die Implementierung der Schnittstelle
f�r @code{XXX()} schreiben, sind:

@table @asis
@item @code{xxx()} (required)
Die Hauptfunktion. Hier wird das Funktionsergebnis berechnet. Der
Zusammenhang zwischen dem SQL-Typ und dem R�ckgabe-Typ Ihrer
C-/C++-Funktion ist unten dargestellt:

@multitable @columnfractions .2 .8
@item @strong{SQL-Typ} @tab @strong{C-/C++-Typ}
@item @code{STRING}     @tab @code{char *}
@item @code{INTEGER}    @tab @code{long long}
@item @code{REAL}       @tab @code{double}
@end multitable

@item @code{xxx_init()} (optional)
Die Initialisierungsfunktion f�r @code{xxx()}. Sie kann f�r folgendes
benutzt werden:

@itemize @bullet
@item
Um die Anzahl von Argumenten f�r @code{XXX()} zu pr�fen.
@item
Um zu pr�fen, ob die Argumente vom erforderlichen Typ sind oder,
alternativ, MySQL mitzuteilen, den Argumenttyp zu erzwingen, den Sie beim
Aufruf der Hauptfunktion brauchen.
@item
Um jeglichen Speicher zuzuweisen, der von der Hauptfunktion ben�tigt wird.
@item
Um die maximale L�nge des Ergebnisses anzugeben.
@item
Um (f�r @code{REAL}-Funktionen) die maximale Anzahl von Dezimalstellen
anzugeben.
@item
Um festzulegen, ob das Ergebnis @code{NULL} sein darf oder nicht.
@end itemize

@item @code{xxx_deinit()} (optional)
Die Deinitialisierungsfunktion f�r @code{xxx()}. Sie sollte jeglichen
Speicher freigeben (deallozieren), der durch die Initialisierungsfunktion
zugewiesen wurde.
@end table

Wenn ein SQL-Statement @code{XXX()} aufruft, ruft MySQL die
Initialisierungsfunktion @code{xxx_init()} auf, damit diese die notwendige
Einrichtung vornehmen kann wie Argumente pr�fen oder Speicherzuweisung.
Wenn @code{xxx_init()} einen Fehler zur�ckgibt, wird das SQL-Statement mit
einer Fehlermeldung abgebrochen, die Haupt- und
Deinitialisierungsfunktionen werden nicht aufgerufen. Ansonsten wird die
Hauptfunktion @code{xxx()} f�r jede Zeile aufgerufen. Nachdem alle Zeilen
abgearbeitet sind, wird die Deinitialisierungsfunktion @code{xxx_deinit()}
aufgerufen, damit sie die erforderlichen Aufr�umarbeiten ausf�hren kann.

Alle Funktionen m�ssen Thread-sicher sein (nicht nur die Hauptfunktion,
sondern auch die Initialisierungs- und Deinitialisierungsfunktionen). Das
hei�t, dass Sie keinerlei globale oder statische Variablen zuweisen
d�rfen, die sich �ndern! Wenn Sie Speicher brauchen, sollten Sie ihn in
@code{xxx_init()} zuweisen und in @code{xxx_deinit()} freigeben.


@menu
* UDF calling::                 
* UDF arguments::               
* UDF return values::           
* UDF compiling::               
@end menu

@node UDF calling, UDF arguments, Adding UDF, Adding UDF
@c German node UDF-Aufruf-Sequenzen
@subsubsection UDF-Aufruf-Sequenzen

@cindex Sequenzen aufrufen, UDF

Die Hauptfunktion sollte wie unten dargestellt deklariert werden. Beachten
Sie, dass sich der R�ckgabetyp und der Parameter unterscheiden, abh�ngig
davon, wie Sie die SQL-Funktion @code{XXX()} deklarieren, damit sie
@code{STRING}, @code{INTEGER} oder @code{REAL} im @code{CREATE
FUNCTION}-Statement zur�ckgibt:

@noindent
Bei @code{STRING}-Funktionen:

@example
char *xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *result, unsigned long *length,
              char *is_null, char *error);
@end example

@noindent
Bei @code{INTEGER}-Funktionen:

@example
long long xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);
@end example

@noindent
Bei @code{REAL}-Funktionen:

@example
double xxx(UDF_INIT *initid, UDF_ARGS *args,
              char *is_null, char *error);
@end example

Die Initialisierungs- und Deinitialisierungsfunktionen werden wie folgt
deklariert:

@example
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

void xxx_deinit(UDF_INIT *initid);
@end example

Der @code{initid}-Parameter wird an alle drei Funktionen �bergeben. Er
zeigt auf eine @code{UDF_INIT}-Struktur, die benutzt wird, um Informationen
zwischen den Funktionen zu �bermitteln. Die
@code{UDF_INIT}-Strukturmitglieder sind unten aufgelistet. Die
Initialisierungsfunktion sollte alle Mitglieder ausf�llen, die sie �ndern
will. (Um f�r ein Mitglied den Vorgabewert zu verwenden, lassen Sie es
unver�ndert.)

@table @code
@item my_bool maybe_null
@code{xxx_init()} sollte @code{maybe_null} auf @code{1} setzen, wenn
@code{xxx()} @code{NULL} zur�ckgeben kann. Der Vorgabewert ist @code{1},
wenn irgend eins der Argumente als @code{maybe_null} deklariert ist.

@item unsigned int Dezimalstellen
Anzahl von Dezimalstellen. Der Vorgabewert ist die maximale Anzahl von
Dezimalstellen in den Argumenten, die an die Hauptfunktion �bergeben
werden. (Wenn der Funktion beispielsweise die Argumente @code{1.34},
@code{1.345} und @code{1.3} �bergeben werden, w�re der Vorgabewert 3, weil
@code{1.345} 3 Dezimalstellen hat.

@item unsigned int max_length
Die maximale L�nge des Zeichenkettenergebnisses. Der Vorgabewert ist
unterschiedlich, abh�ngig vom Ergebnistyp der Funktion. Bei
Zeichenketten-Funktionen ist die Vorgabe die L�nge des l�ngsten Arguments.
Bei Ganzzahl-Funktionen ist die Vorgabe 21 Ziffern. Bei REAL-Funktionen ist
die Vorgabe 13 plus die Anzahl von Dezimalstellen, die von
@code{initid->Dezimalstellen} angezeigt werden. (Bei numerischen Funktionen
enth�lt die L�nge jedes Vorzeichen- oder Dezimalpunkt-Zeichen.)

Wenn Sie einen Blob zur�ckgeben wollen, k�nnen Sie diesen auf 65 KB oder
16MB setzen. Der Speicher wird nicht zugewiesen, aber dazu verwendet, um zu
entscheiden, welcher Spaltentyp benutzt werden soll, falls es notwendig
werden sollte, Daten tempor�r zu speichern.

@item char *ptr
Ein Zeiger, den die Funktion f�r eigene Zwecke verwenden kann.
Beispielsweise k�nnen Funktionen @code{initid->ptr} benutzen, um
Informationen �ber den zugewiesenen Speicher zwischen den Funktionen zu
kommunizieren. Beispiel, um in @code{xxx_init()} Speicher zuzuweisen und
ihn diesem Zeiger zuzuordnen:

@example
initid->ptr = allocated_memory;
@end example

In @code{xxx()} und @code{xxx_deinit()} verweisen Sie auf
@code{initid->ptr}, um Speicher zu verwenden oder freizugeben.
@end table


@node UDF arguments, UDF return values, UDF calling, Adding UDF
@c German node UDF-Argumente
@subsubsection Verarbeitung von Argumenten

@cindex Verarbeitung von Argumenten
@cindex Verarbeitung, Argumente

Der @code{args}-Parameter zeigt auf eine @code{UDF_ARGS}-Struktur, die
unten aufgelistete Mitglieder hat:

@table @code
@item unsigned int arg_count
Die Anzahl von Argumenten. Pr�fen Sie diesen Wert in der
Initialisierungsfunktion, wenn Sie wollen, dass Ihre Funktion mit einer
bestimmten Anzahl von Argumenten aufgerufen wird. Beispiel:

@example
if (args->arg_count != 2)
@{
    strcpy(message,"XXX() benoetigt zwei Argumente");
    return 1;
@}
@end example


@item enum Item_result *arg_type
Die Typen f�r jedes Argument. Die m�glichen Typenwerte sind
@code{STRING_RESULT}, @code{INT_RESULT} und @code{REAL_RESULT}.

Um sicherzustellen, dass die Argumente vom angegebenen Typ sind und einen
Fehler zur�ckgeben, falls nicht, pr�fen Sie das @code{arg_type}-Array in
der Initialisierungsfunktion. Beispiel:

@example
if (args->arg_type[0] != STRING_RESULT ||
    args->arg_type[1] != INT_RESULT)
@{
    strcpy(message,"XXX() erfordert eine Zeichenkette und eine Ganzzahl");
    return 1;
@}
@end example

Als Alternative dazu, dass Ihre Funktionsargumente von bestimmten Typen
sein m�ssen, k�nnen Sie die Initialisierungsfunktion benutzen, um die
@code{arg_type}-Elemente auf die Typen zu setzen, die Sie wollen. Das
veranlasst MySQL, die Typen der Argumente bei jedem Aufruf von @code{xxx()}
zu erzwingen. Um beispielsweise zu erzwingen, dass die ersten zwei
Argumente Zeichenkette und Ganzzahl sind, geben Sie in @code{xxx_init()}
folgendes ein:

@example
args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;
@end example

@item char **args
@code{args->args} kommuniziert der Initialisierungsfunktion Informationen
�ber die allgemeine Natur der Argumente, mit der Ihre Funktion aufgerufen
wurde. Bei einem Konstanten-Argument @code{i} zeigt @code{args->args[i]}
auf den Argumentwert. (Siehe unten wegen Anleitungen, wie auf diesen Wert
korrekt zugegriffen wird.) Bei einem Nicht-Konstanten-Argument ist
@code{args->args[i]} @code{0}. Ein Konstanten-Argument ist ein Ausdruck,
der nur Konstanten wie @code{3} oder @code{4*7-2} oder @code{SIN(3.14)}
benutzt. Ein Nicht-Konstanten-Argument ist ein Ausdruck, der auf Werte
verweist, die sich von Zeile zu Zeile �ndern k�nnen, wie Spaltennamen oder
Funktionen, die mit Nicht-Konstanten-Argumenten aufgerufen werden.

Bei jedem Aufruf der Hauptfunktion enth�lt @code{args->args} die
tats�chlichen Argumente, die f�r die Zeile �bergeben werden, die momentan
verarbeitet wird.

Funktionen k�nnen auf ein Argument @code{i} wie folgt verweisen:

@itemize @bullet
@item
Ein Argument des Typs @code{STRING_RESULT} wird als ein Zeichenkettenzeiger
plus einer L�nge angegeben, um die Handhabung von Bin�rdaten oder Daten
beliebiger L�nge zu erlauben. Die Zeichenketten-Inhalte sind als
@code{args->args[i]} und die Zeichenkettenl�nge als @code{args->lengths[i]}
verf�gbar. Sie sollten nicht davon ausgehen, dass Zeichenketten
null-terminiert sind.

@item
Bei einem Argument des Typs @code{INT_RESULT} m�ssen Sie
@code{args->args[i]} zu einem @code{long long}-Wert machen (cast):

@example
long long int_val;
int_val = *((long long*) args->args[i]);
@end example

@item
Bei einem Argument des Typs @code{REAL_RESULT} m�ssen Sie
@code{args->args[i]} zu einem @code{double}-Wert machen (cast):

@example
double    real_val;
real_val = *((double*) args->args[i]);
@end example
@end itemize

@item unsigned long *lengths
Bei der Initialisierungsfunktion gibt das @code{lengths}-Array die maximale
Zeichenkettenl�nge jedes Arguments an. Bei jedem Aufruf der Hauptfunktion
enth�lt @code{lengths} die tats�chlichen L�ngen jeglicher
Zeichenketten-Argumente, die f�r die momentan verarbeitete Zeile �bergeben
werden. Bei Argumenten des Typs @code{INT_RESULT} oder @code{REAL_RESULT}
enth�lt @code{lengths} immer noch die maximale L�nge des Arguments (wie bei
der Initialisierungsfunktion).
@end table


@node UDF return values, UDF compiling, UDF arguments, Adding UDF
@c German node UDF-R�ckgabewerte
@subsubsection R�ckgabewerte und Fehlerbehandlung

@cindex UDFs, R�ckgabewerte
@cindex R�ckgabewerte, UDFs
@cindex Fehler, Handhabung in UDFs
@cindex Handhabung, Fehler

Die Initialisierungsfunktion sollte @code{0} zur�ckgeben, wenn kein Fehler
auftrat, ansonsten @code{1}. Wenn ein Fehler auftritt, sollte
@code{xxx_init()} eine null-terminierte Fehlermeldung im
@code{message}-Parameter enthalten. Die Meldung wird an den Client
�bergeben. Der Meldungspuffer ist @code{MYSQL_ERRMSG_SIZE} Zeichen lang,
aber Sie sollten versuchen, die Meldung kleiner als 80 Zeichen zu halten,
damit sie auf die Anzeigebreite eines Standard-Terminals passt.

Der R�ckgabewert der Hauptfunktion @code{xxx()} ist der Funktionswert, bei
@code{long long}- und @code{double}-Funktionen. Eine Zeichenkettenfunktion
sollte einen Zeiger auf das Ergebnis und die L�nge der Zeichenkette in den
@code{length}-Argumenten zur�ckgeben.

Setzen Sie diese auf die Inhalte und L�nge des R�ckgabewerts. Beispiel:

@example
memcpy(result, "ergebnis_zeichenkette", 13);
*length = 13;
@end example

Der @code{result}-Puffer, der an die Berechnungsfunktionen �bergeben wird,
ist 255 Byte Gro�. Wenn Ihr Ergebnis dort hinein passt, m�ssen Sie sich um
die Speicherzuweisung f�r Ergebnisse nicht k�mmern.

Wenn Ihre Zeichenketten-Funktion eine Zeichenkette zur�ckgeben muss, die
l�nger als 255 Bytes ist, m�ssen Sie den Platz daf�r mit @code{malloc()} in
Ihrer @code{xxx_init()}-Funktion oder Ihrer @code{xxx()}-Funktion zuweisen
und in Ihrer @code{xxx_deinit()}-Funktion freigeben. Sie k�nnen den
zugewiesenen Speicher im @code{ptr}-Slot in der @code{UDF_INIT}-Struktur
f�r erneute Benutzung durch zuk�nftige @code{xxx()}-Aufrufe speichern.
@xref{UDF calling}.

Um einen R�ckgabewert von @code{NULL} in der Hauptfunktion anzuzeigen,
setzen Sie @code{is_null} auf @code{1}:

@example
*is_null = 1;
@end example

Um eine Fehlerr�ckgabe in der Hauptfunktion anzuzeigen, setzen Sie den
@code{error}-Parameter auf @code{1}:

@example
*error = 1;
@end example

Wenn @code{xxx()} @code{*error} f�r beliebige Zeilen auf @code{1} setzt,
ist der Funktionswert der aktuellen Zeile @code{NULL}, was auch f�r
nachfolgende Zeilen gilt, die von dem Statement verarbeitet werden, in dem
@code{XXX()} aufgerufen wurde. (@code{xxx()} wird f�r nachfolgende Zeilen
nicht einmal aufgerufen.) @strong{HINWEIS:} In MySQL-Versionen vor 3.22.10
sollten Sie sowohl @code{*error} als auch und @code{*is_null} setzen:

@example
*error = 1;
*is_null = 1;
@end example


@node UDF compiling,  , UDF return values, Adding UDF
@c German node UDF kompilieren
@subsubsection Kompilieren und Installieren benutzerdefinierter Funktionen

@cindex Kompilieren, benutzerdefinierte Funktionen
@cindex UDFs, kompilieren
@cindex installieren, benutzerdefinierte Funktionen

Dateien, die UDFs implementieren, m�ssen auf dem Host kompiliert und
installiert werden, auf dem der Server l�uft. Dieser Prozess wird unten am
Beispiel der UDF-Datei @file{udf_example.cc} beschrieben, die in der
MySQL-Quelldistribution enthalten ist. Diese Datei enth�lt folgende
Funktionen:

@itemize @bullet
@item
@code{metaphon()} gibt eine metaphon-Zeichenkette des
Zeichenkettenarguments zur�ck. Das ist etwas wie eine Soundex-Zeichenkette,
nur etwas besser f�r englisch angepasst.
@item
@code{myfunc_double()} gibt die Summe der ASCII-Werte der Zeichen in ihren
Argumenten zur�ck, geteilt durch die Summe der L�ngen ihrer Argumente.
@item
@code{myfunc_int()} gibt die Summe der L�ngen ihrer Argumente zur�ck.
@item
@code{sequence([const int])} gibt eine Sequenz zur�ck, die mit der
angegebenen Zahl startet oder mit 1, wenn keine Zahl angegeben wurde.
@item
@code{lookup()} gibt die IP-Nummer f�r einen Hostnamen zur�ck.
@item
@code{reverse_lookup()} gibt den Hostnamen f�r eine IP-Nummer zur�ck. Die
Funktion kann mit einer Zeichenkette @code{"xxx.xxx.xxx.xxx"} oder mit vier
Zahlen aufgerufen werden.
@end itemize

Eine dynamisch ladbare Datei sollte als gemeinsam nutzbare Objektdatei
kompiliert werden, etwa mit folgendem Befehl:

@example
shell> gcc -shared -o udf_example.so myfunc.cc
@end example

Die korrekten Kompiler-Optionen f�r Ihr System finden Sie leicht heraus,
wenn Sie diesen Befehl im @file{sql}-Verzeichnis Ihres MySQL-Quellbaums
laufen lassen:

@example
shell> make udf_example.o
@end example

Sie sollten einen Kompilierbefehl laufen lassen, der dem �hnelt, was
@code{make} anzeigt, ausser dass Sie die @code{-c}-Option kurz vor dem
Zeilenende entfernen und @code{-o udf_example.so} am Zeilenende hinzuf�gen
sollten. (Auf manchen Systemen k�nnen Sie @code{-c} im Befehl lassen.)

Wenn Sie ein gemeinsam genutztes Objekt kompiliert haben, das UDFs enth�lt,
m�ssen Sie es danach installieren und MySQL dar�ber informieren. Wenn Sie
ein gemeinsam genutztes Objekt von @file{udf_example.cc} kompilieren, wird
eine Datei etwa mit dem Namen @file{udf_example.so} erzeugt (der exakte
Name variiert von Plattform zu Plattform). Kopieren Sie diese Datei in ein
Verzeichnis, das von @code{ld} durchsucht wird, wie @file{/usr/lib}. Auf
vielen Systemen k�nnen Sie die @code{LD_LIBRARY}- oder
@code{LD_LIBRARY_PATH}-Umgebungsvariable so setzen, dass sie auf das
Verzeichnis zeigt, wo Sie Ihre UDF-Funktionsdateien haben. Das
@code{dlopen}-Handbuch sagt Ihnen, welche Variable Sie auf Ihrem System
setzen sollten. Sie sollten diese auf @code{mysql.server} oder
@code{safe_mysqld} setzen und @code{mysqld} neu starten.

Nachdem die Bibliothek installiert ist, unterrichten Sie @code{mysqld} �ber
die neuen Funktionen mit diesen Befehlen:

@example
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";
mysql> CREATE AGGREGATE FUNCTION avgcost RETURNS REAL SONAME "udf_example.so";
@end example

Funktionen k�nnen mit @code{DROP FUNCTION} gel�scht werden:

@example
mysql> DROP FUNCTION metaphon;
mysql> DROP FUNCTION myfunc_double;
mysql> DROP FUNCTION myfunc_int;
mysql> DROP FUNCTION lookup;
mysql> DROP FUNCTION reverse_lookup;
mysql> DROP FUNCTION avgcost;
@end example

Die @code{CREATE FUNCTION}- und @code{DROP FUNCTION}-Statements
aktualisieren die Systemtabelle @code{func} in der @code{mysql}-Datenbank.
Der Funktionsname, -typ und gemeinsam genutzte Bibliothek werden in der
Tabelle gespeichert. Sie ben�tigen die @strong{insert}- und
@strong{delete}-Berechtigungen f�r die @code{mysql}-Datenbank, um
Funktionen zu erzeugen und zu l�schen.

Sie sollten @code{CREATE FUNCTION} nicht benutzen, um eine Funktion
hinzuzuf�gen, die bereits erzeugt wurde. Wenn Sie eine Funktion erneut
installieren wollen, sollten Sie sie zuerst mit @code{DROP FUNCTION}
entfernen und dann mit @code{CREATE FUNCTION} erneut installieren. Sie
m�ssen so etwas zum Beispiel tun, wenn Sie eine neue Version Ihrer Funktion
kompilieren, damit @code{mysqld} die neue Version erh�lt. Ansonsten w�rde
der Server mit der alten Version weitermachen.

Aktive Funktionen werden jedes Mal neu geladen, wenn der Server startet, es
sei denn, Sie starten @code{mysqld} mit der
@code{--skip-grant-tables}-Option. In diesem Fall wird die
UDF-Initialisierung �bersprungen und UDFs sind nicht verf�gbar. (Eine
aktive Funktion ist eine, die mit @code{CREATE FUNCTION} geladen und nicht
mit @code{DROP FUNCTION} entfernt wurde.)


@node Adding native function,  , Adding UDF, MySQL internals
@c German node Native Funktion hinzuf�gen
@subsection Hinzuf�gen einer neuen nativen Function

@cindex hinzuf�gen, native Funktionen
@cindex native Funktionen, hinzuf�gen
@cindex Funktionen, native, hinzuf�gen

Die Prozedur zum Hinzuf�gen einer neuen nativen Funktion wird hier
beschrieben. Beachten Sie, dass Sie einer Bin�rdistribution keine nativen
Funktionen hinzuf�gen k�nnen, weil die Prozedur die �nderung des
MySQL-Quelltextes beinhaltet. Sie m�ssen MySQL selbst aus einer
Quelldistribution kompilieren. Beachten Sie auch, dass Sie die Prozedur
wiederholen m�ssen, wenn Sie auf eine andere Version von MySQL
aktualisieren (beispielsweise wenn eine neue Version herauskommt).

Um eine neue native MySQL-Funktion hinzuzuf�gen, gehen Sie wie folgt vor:

@enumerate
@item
F�gen Sie @file{lex.h} eine neue Zeile hinzu, die den Funktionsnamen im
@code{sql_functions[]}-Array definiert.
@item
Wenn der Funktionsprototyp einfach ist (nur keins, eins, zwei oder drei
Argumente entgegennimmt), sollten Sie in lex.h SYM(FUNC_ARG#) angeben
(wobei # die Anzahl von Argumenten ist), als zweites Argument im
@code{sql_functions[]}-Array, und eine Funktion hinzuf�gen, die ein
Funktionsobjekt in @file{item_create.cc} erzeugt. Sehen Sie sich als
Beispiel hierf�r @code{"ABS"} und @code{create_funcs_abs()} an.

Wenn der Funktionsprototyp kompliziert ist (zum Beispiel eine variable
Anzahl von Argumenten entgegennimmt), sollten Sie zwei Zeile zu
@file{sql_yacc.yy} hinzuf�gen. Eine gibt das Pr�prozessorsymbol an, das
@code{yacc} definieren soll (das sollte am Anfang der Datei stehen).
Definieren Sie dann die Funktionsparameter und f�gen Sie ein ``item'' mit
diesen Parametern zur @code{simple_expression}-Parsing-Regel hinzu. Sehen
Sie sich als Beispiel alle Vorkommen von @code{ATAN} in @file{sql_yacc.yy}
an, um zu sehen, wie das gemacht wird.
@item
Deklarieren Sie in @file{item_func.h} eine Klasse, die von
@code{Item_num_func} oder @code{Item_str_func} erbt, je nachdem, ob Ihre
Funktion eine Zahl oder eine Zeichenkette zur�ckgibt.
@item
F�gen Sie in @file{item_func.cc} eine der folgenden Deklarationen hinzu, je
nachdem, ob Sie eine numerische oder eine Zeichenketten-Funktion
definieren:
@example
double   Item_func_newname::val()
longlong Item_func_newname::val_int()
String  *Item_func_newname::Str(String *str)
@end example

Wenn Sie Ihr Objekt von irgend einem der Standard-Items erben (wie von
@code{Item_num_func}, m�ssen Sie wahrscheinlich eine der oben genannten
Funktionen definieren und das Elternobjekt sich um die anderen Funktionen
k�mmern lassen. Beispielsweise definiert die @code{Item_str_func}-Klasse
eine @code{val()}-Funktion, die @code{atof()} auf dem Wert ausf�hrt, der
von @code{::str()} zur�ckgegeben wurde.

@item
Sie m�ssen wahrscheinlich auch die folgende Objektfunktion definieren:
@example
void Item_func_newname::fix_length_und_dec()
@end example
Diese Funktion sollte zumindest @code{max_length} basierend auf den
angegebenen Argumenten berechnen. @code{max_length} ist die maximale Anzahl
von Zeichen, die die Funktion zur�ckgeben kann. Diese Funktion sollte auch
@code{maybe_null = 0} setzen, wenn die Hauptfunktion keinen
@code{NULL}-Wert zur�ckgeben kann. Die Funktion kann pr�fen, ob irgend eins
der Funktionsargumente @code{NULL} zur�ckgeben kann, indem die Argumente
der @code{maybe_null}-Variable gepr�ft werden. Sehen Sie sich als typisches
Beispiel, wie das gemacht wird, @code{Item_func_mod::fix_length_and_dec}
an.
@end enumerate

Alle Funktionen m�ssen Thread-sicher sein (mit anderen Worten: Benutzen Sie
keine globalen oder statischen Variablen in den Funktionen, ohne sie mit
mutexes zu sch�tzen).

Wenn Sie von @code{::val()}, @code{::val_int()} oder @code{::str()}
@code{NULL} zur�ckgeben wollen, sollten Sie @code{null_value} auf 1 setzen
und 0 zur�ckgeben.

Bei @code{::str()}-Objektfunktionen gibt es einige zus�tzliche
�berlegungen, auf die man achten sollte:

@itemize @bullet
@item
Das @code{String *str}-Argument stellt einen Zeichenketten-Puffer zur
Verf�gung, der benutzt werden kann, um das Ergebnis zu speichern. (Weitere
Informationen �ber den @code{String}-Typ finden Sie durch einen Blick in
die @file{sql_string.h}-Datei.)
@item
Die @code{::str()}-Funktion sollte die Zeichenkette zur�ckgeben, die das
Ergebnis enth�lt, oder @code{(char*) 0}, wenn das Ergebnis @code{NULL} ist.
@item
Alle aktuellen Zeichenketten-Funktionen versuchen, die Zuweisung jeglichen
Speichers zu vermeiden, ausser wenn das absolut notwendig ist!
@end itemize


@node Adding procedures, MySQL-Interna, MySQL internals, Extending MySQL
@c German node Hinzuf�gen von Prozeduren
@section Hinzuf�gen neuer Prozeduren zu MySQL

@cindex Prozeduren, hinzuf�gen
@cindex hinzuf�gen, Prozeduren
@cindex neue Prozeduren, hinzuf�gen

In MySQL k�nnen Sie eine Prozedur in C++ definieren, die auf Daten in einer
Anfrage zugreifen und diese �ndern kann, bevor sie an den Client geschickt
werden. Die �nderung kann Zeile f�r Zeile oder auf @code{GROUP BY}-Ebene
geschehen.

Wir haben eine Beispiel-Prozedur in MySQL-Version 3.23 erzeugt, um zu
zeigen, was getan werden kann.

Zus�tzlich empfehlen wir, dass Sie einen Blick auf 'mylua' werfen, das Sie
im Contrib-Verzeichnis finden. @xref{Contrib}. Hiermit k�nnen Sie die
LUA-Sprache benutzen, um eine Prozedur zur Laufzeit in @code{mysqld} zu
laden.



@menu
* procedure analyse::           
* Writing a procedure::         
@end menu

@node procedure analyse, Writing a procedure, Adding procedures, Adding procedures
@c German node Prozeduranalyse
@subsection Prozeduranalyse

@code{analyse([max Elemente,[max memory]])}

Diese Prozedur ist in @file{sql/sql_analyse.cc} definiert. Sie untersucht
das Ergebnis Ihrer Anfrage und gibt eine Analyse des Ergebnisses zur�ck:

@itemize @bullet
@item
@code{max elements} (Vorgabe 256) ist die maximale Anzahl unterschiedlicher
Werte, die @code{analyse} pro Spalte findet. Dieses wird von @code{analyse}
benutzt, um zu pr�fen, ob der optimale Spaltentyp vom Typ @code{ENUM} sein
sollte.
@item
@code{max memory} (Vorgabe 8.192) ist der maximale Speicher, den
@code{analyse} pro Spalte zuweisen sollte, wenn Sie versuchen, alle
unterschiedlichen (distinct) Werte zu finden.
@end itemize

@example
SELECT ... FROM ... WHERE ... Prozeduranalyse([max elements,[max memory]])
@end example


@node Writing a procedure,  , procedure analyse, Adding procedures
@c German node Eine Prozedur schreiben
@subsection Eine Prozedur schreiben

Im Moment ist die einzige Dokumentation hierf�r der Quelltext.

Sie finden alle Informationen �ber Prozeduren, wenn Sie folgende Dateien
untersuchen:

@itemize @bullet
@item @file{sql/sql_analyse.cc}
@item @file{sql/procedure.h}
@item @file{sql/procedure.cc}
@item @file{sql/sql_select.cc}
@end itemize


@node MySQL-Interna,  , Adding procedures, Extending MySQL
@c German node <no English equivalent>
@section MySQL-Interna

@cindex Interna
@cindex Thread

Dieses Kapitel beschreibt viele Dinge, die Sie wissen m�ssen, wenn Sie am
MySQL-Code arbeiten. Wenn Sie an der MySQL-Entwicklung mitarbeiten wollen,
Zugriff auf den messerscharfen Code von Zwischenversionen haben wollen,
oder einfach nur �ber die Entwicklung auf dem Laufenden bleiben wollen,
folgen Sie den Anweisungen unter @xref{Installing source}.
Wenn Sie an MySQL-Interna interessiert sind, sollten Sie auch
@email{internals@@lists.mysql.com} abonnieren. Das ist eine Liste mit
relativ geringem Verkehr, verglichen mit @email{mysql@@lists.mysql.com}.



@menu
* MySQL-Thread::                
* MySQL-Test-Suite::            
@end menu

@node MySQL-Thread, MySQL-Test-Suite, MySQL-Interna, MySQL-Interna
@c German node <no English equivalent>
@subsection MySQL-Thread

Der MySQL-Server erzeugt folgenden Thread:

@itemize @bullet

@item
Der TCP/IP-Verbindungs-Thread erledigt alle Verbindungsanfragen und erzeugt
einen neuen dedizierten Thread, um die Verarbeitung von Authentifizierung
und SQL-Anfragen f�r jede Verbindung zu handhaben.

@item
Unter Windows NT gibt es einen Named-Pipe-Handler-Thread, der dasselbe tut
wie der TCP/IP-Verbindungs-Thread, auf Named-Pipe-Verbindungsanforderungen.

@item
Der Signal-Thread handhabt alle Signale. Dieser Thread handhabt
normalerweise auch Alarme und Aufrufe von @code{process_alarm()}, um
Zeit�berschreitungen auf Verbindungen zu erzwingen, die zu lange im
Leerlauf waren.

@item
Wenn @code{mysqld} mit @code{-DUSE_ALARM_THREAD} kompiliert wird, wird ein
dedizierter Thread erzeugt, der Alarme handhabt. Das ist nur n�tzlich auf
manchen Systemen, auf denen es Probleme mit @code{sigwait()} gibt, oder
wenn man den @code{thr_alarm()}-Code in seiner Applikation ohne einen
dedizierten Signal-Handhabungs-Thread benutzen will.

@item
Wenn man die @code{--flush_time=#}-Option benutzt, wird ein dedizierter
Thread erzeugt, der alle Tabellen im angegebenen Intervall auf Platte
zur�ckschreibt.

@item
Jede Verbindung hat ihren eigenen Thread.

@item
Jede unterschiedliche Tabelle, auf der man @code{INSERT DELAYED} benutzt,
erh�lt ihren eigenen Thread.

@item
Wenn Sie @code{--master-host} benutzen, wird ein Slave-Replikations-Thread
gestartet, der Aktualisierungen vom Master liest und anwendet.
@end itemize

@code{mysqladmin processlist} zeigt nur die Verbindungs-, @code{INSERT
DELAYED}- und Replikations-Threads.


@node MySQL-Test-Suite,  , MySQL-Thread, MySQL-Interna
@c German node <no English equivalent>
@subsection MySQL-Test-Suite

@cindex mysqltest, MySQL-Test-Suite
@cindex mysqld testen, mysqltest

Bis vor Kurzem basierte unsere vollumf�ngliche Haupt-Test-Suite auf
propriet�ren Kundendaten und war deshalb nicht �ffentlich verf�gbar. Der
einzige �ffentlich verf�gbare Teil unseres Testprozesses bestand aus dem
@code{Crash-me}-Test, einem Perl-DBI/DBD-Benchmark, der im
@code{sql-bench}-Verzeichnis liegt, und verschiedenen Tests im
@code{tests}-Verzeichnis. Das Fehlen einer standardisierten, �ffentlich
verf�gbaren Test-Suite machte es unseren Benutzern und auch Entwicklern
schwer, Regressionstests auf den MySQL-Code durchzuf�hren. Um das Problem
anzugehen, haben wir ein neues Testsystem geschaffen, das ab Version
3.23.29 den Quell- und Bin�rdistributionen beiliegt.

Der aktuelle Satz von Testf�llen testet nicht alles in MySQL, sollte aber
die offensichtlichsten Bugs im SQL-Verarbeitungscode offen legen, sowie
Betriebssystem- und Bibliotheks-Probleme, und er testet recht gr�ndlich die
Replikation. Unser letztliches Ziel ist es, dass die Tests 100% des Codes
abdecken. Beitr�ge zu unserer Test-Suite sind herzlich willkommen,
besonders Tests, die die Funktionalit�t untersuchen, die f�r Ihr System
kritisch ist, weil das sicherstellt, dass alle zuk�nftigen MySQL-Releases
mit Ihren Applikationen funktionieren.



@menu
* mysqltest laufen lassen::     
* MySQL-Tests erweitern::       
* mysqltest-Bugs berichten::    
@end menu

@node mysqltest laufen lassen, MySQL-Tests erweitern, MySQL-Test-Suite, MySQL-Test-Suite
@c German node <no English equivalent>
@subsubsection Die MySQL-Test-Suite laufen lassen

Das Testsystem besteht aus einem Test-Sprachinterpreter (@code{mysqltest}),
einem Shell-Skript, um alle Tests laufen zu lassen
tests(@code{mysql-test-run}), den eigentlichen Testf�llen, die in einer
speziellen Testsprache geschrieben sind, und ihren erwarteten Ergebnissen.
Um die Test-Suite nach dem Bauen auf Ihrem System laufen zu lassen, geben
Sie @code{make test} oder @code{mysql-test/mysql-test-run} von der Wurzel
der Quellinstallation aus ein. Wenn Sie eine Bin�rdistribution installiert
haben, wechseln Sie (@code{cd}) zur Wurzel der Installation (zum Beispiel
@code{/usr/local/mysql}) und geben @code{scripts/mysql-test-run} ein. Alle
Tests sollten erfolgreich durchlaufen. Wenn nicht, sollten Sie versuchen,
den Grund herauszufinden, und das Problem zu berichten, wenn es ein Bug in
MySQL ist. @xref{mysqltest-Bugs berichten}.

Wenn eine Kopie von @code{mysqld} auf Ihrer Maschine l�uft, wo Sie die
Test-Suite laufen lassen wollen, m�ssen Sie ihn nicht anhalten, solange er
nicht die Ports @code{9306} und @code{9307} benutzt. Wenn einer dieser
Ports belegt ist, sollten Sie @code{mysql-test-run} editieren und die Werte
des Master- und / oder Slave-Ports auf verf�gbare Ports �ndern.

Sie k�nnen einen einzelnen Testfall mit @code{mysql-test/mysql-test-run
test_name} laufen lassen.

Wenn ein Test fehlschl�gt, sollten Sie versuchen, @code{mysql-test-run} mit
der @code{--force}-Option laufen zu lassen, um zu pr�fen, ob irgend ein
weiterer Test fehlschl�gt.


@node MySQL-Tests erweitern, mysqltest-Bugs berichten, mysqltest laufen lassen, MySQL-Test-Suite
@c German node <no English equivalent>
@subsubsection Die MySQL-Test-Suite erweitern

Sie k�nnen die @code{mysqltest}-Sprache benutzen, um Ihre eigenen Testf�lle
zu schreiben. Leider gibt es noch keine komplette Dokumentation daf�r - das
soll in K�rze aber der Fall sein. Sie k�nnen sich jedoch die aktuellen
Testf�lle ansehen und sie als Beispiel benutzen. Folgende Punkte sollen
Ihnen beim Start helfen:

@itemize @bullet
@item
Die Tests liegen in @code{mysql-test/t/*.test}

@item
Ein Testfall besteht aus @code{;}-begrenzten Statements und ist �hnlich der
Eingabe in den @code{mysql}-Kommandozeilen-Client. Ein Statement ist
vorgabem��ig eine Anfrage, die an den MySQL-Server geschickt werden soll,
es sei denn, es wird als interner Befehl erkannt (zum Beispiel
@code{sleep}).

@item
Alle Anfragen, die Ergebnisse produzieren, zum Beispiel @code{SELECT},
@code{SHOW}, @code{EXPLAIN} usw., m�ssen mit
@code{@@/pfad/zu/ergebnis/datei} beginnen. Die Datei muss die erwarteten
Ergebnisse enthalten. Eine einfache Art, die Ergebnisdatei zu erzeugen,
ist, @code{mysqltest -r < t/test-case-name.test} vom
@code{mysql-test}-Verzeichnis aus laufen zu lassen und dann die erzeugten
Ergebnisdateien zu editieren und sie - falls n�tig - an die erwartete
Ausgabe anzupassen. Seien Sie in diesem Fall sehr vorsichtig, keine
unsichtbaren Zeichen hinzuzuf�gen oder zu l�schen - stellen Sie sicher,
dass Sie nur den Text �ndern und / oder Zeilen l�schen. Wenn Sie eine Zeile
einf�gen m�ssen, achten Sie darauf, dass die Felder mit einem harten
Tabulator-Zeichen getrennt sind und dass es ein hartes Tabulator-Zeichen am
Zeilenende gibt. Gegebenfalls sollten Sie @code{od -c} benutzen, um sich zu
vergewissern, dass Ihr Texteditor beim Editieren nichts durcheinander
gebracht hat. Wir hoffen nat�rlich, dass Sie die Ausgabe von
@code{mysqltest -r} nie editieren m�ssen, weil das nur der Fall ist, wenn
Sie einen Bug finden.

@item
Um mit unserer Einrichtung konsistent zu sein, sollten Sie Ihre
Ergebnisdateien ins @code{mysql-test/r}-Verzeichnis stellen und sie
@code{test_name.result} nennen. Wenn der Test mehr als ein Ergebnis
erzeugt, sollten Sie @code{test_name.a.result}, @code{test_name.b.result}
usw. verwenden.

@item
Wenn ein Statement einen Fehler zur�ckgibt, sollten Sie die Zeile vor dem
Statement mit @code{--error fehler_nummer} kennzeichnen. Die Fehlernummer
kann eine Auflistung m�glicher Fehlerzahlen sein, getrennt durch
@code{','}.

@item
Wenn Sie einen Replikations-Testfall schreiben, sollten Sie in die erste
Zeile der Testdatei @code{source include/master-slave.inc;} schreiben. Um
zwischen Master und Slave umzuschalten, benutzen Sie @code{connection
master;} und @code{connection slave;}. Wenn Sie etwas auf einer
abwechselnden Verbindung machen m�ssen, k�nnen Sie @code{connection
master1;} f�r den Master und @code{connection slave1;} f�r den Slave
eingeben.

@item
Wenn Sie etwas in einer Schleife ausf�hren m�ssen, k�nnen Sie zum Beispiel
folgendes tun:
@example
let $1=1000;
while ($1)
@{
 # machen Sie Ihre Anfragen hier
 dec $1;
@}
@end example

@item
Um zwischen Anfragen zu schlafen, benutzen Sie den @code{sleep}-Befehl. Er
unterst�tzt Bruchteile von Sekunden, daher k�nnen Sie zum Beispiel
@code{sleep 1.3;} ausf�hren, um 1,3 Sekunden zu schlafen.

@item
Um den Slave f�r Ihren Testfall mit zus�tzlichen Optionen laufen zu lassen,
geben Sie diese im Kommandozeilenformat in
@code{mysql-test/t/test_name-slave.opt} ein. F�r den Master geben Sie sie
in @code{mysql-test/t/test_name-master.opt} ein.

@item
Wenn Sie eine Frage zur Test-Suite haben oder einen Testfall beisteuern
wollen, schicken Sie eine E-Mail an @email{Interna@@lists.mysql.com}. Weil
die Liste keine Dateianh�nge akzeptiert, sollten Sie alle relevanten
Dateien per FTP an @url{ftp://support.mysql.com/pub/mysql/Incoming}
schicken.

@end itemize


@node mysqltest-Bugs berichten,  , MySQL-Tests erweitern, MySQL-Test-Suite
@c German node <no English equivalent>
@subsubsection Bugs in der MySQL-Test-Suite berichten

Wenn Ihre MySQL-Version die Test-Suite nicht fehlerfrei durchl�uft, sollten
Sie folgendes tun:

@itemize @bullet
@item
Schicken Sie keinen Bug-Bericht, bevor Sie so weit wie m�glich
herausgefunden haben, was schief ging! Benutzen Sie f�r den Bug-Bericht
bitte das @code{mysqlbug}-Skript, so dass wir Informationen �ber Ihr System
und die @code{MySQL}-Version erhalten. @xref{Bug reports}.
@item
Stellen Sie sicher, dass die Ausgabe von @code{mysql-test-run} beiliegt,
sowie alle Inhalte aller @code{.reject}-Dateien im
@code{mysql-test/r}-Verzeichnis.
@item
Wenn ein Test in der Test-Suite fehlschl�gt, pr�fen Sie, ob der Test auch
fehlschl�gt, wenn er allein laufen gelassen wird:

@example
cd mysql-test
mysql-test-run --local test-name
@end example

Wenn das fehlschl�gt, sollten Sie MySQL mit @code{--with-debug}
konfigurieren und @code{mysql-test-run} mit der @code{--debug}-Option
laufen lassen. Wenn auch das fehlschl�gt, schicken Sie dei Trace-Datei
@file{var/tmp/master.trace} an ftp://support.mysql.com/pub/mysql/secret, so
dass wir sie untersuchen k�nnen. Denken Sie bitte daran, eine volle
Beschreibung Ihres Systems beizuf�gen sowie die Version Ihrer
mysqld-Bin�rdatei und wie Sie sie kompiliert haben.

@item
Versuchen Sie auch, @code{mysql-test-run} mit der @code{--force}-Option
laufen zu lassen, um zu sehen, ob auch andere Tests fehlschlagen.

@item
Wenn Sie MySQL selbst kompiliert haben, sehen Sie im Handbuch nach, wie
MySQL auf Ihrer Plattform kompiliert wird, oder benutzen Sie vorzugsweise
eine der Bin�rdateien, die wir f�r Sie kompiliert haben und die Sie unter
@uref{http://www.mysql.com/downloads/} finden. Alle unsere
Standard-Bin�rdateien sollten die Test-Suite fehlerfrei durchlaufen!

@item
Wenn Sie einen Fehler wie @code{Result length mismatch} oder @code{Result
content mismatch} erhalten, hei�t das, dass die Ausgabe des Tests nicht
genau mit der erwarteten Ausgabe �bereinstimmt. Das k�nnte ein Bug in MySQL
sein, k�nnte aber auch hei�en, dass Ihre mysqld-Version unter bestimmten
Umst�nden leicht abweichende Ausgaben erzeugt.

Fehlgeschlagene Testergebnisse werden in eine Datei mit demselben Namen wie
die Ergebnisdatei, mit der Endung @code{.reject}, gestellt. Wenn Ihr
Testfall fehlschl�gt, sollten Sie ein DIFF beider Dateien vornehmen. Wenn
Sie nicht erkennen k�nnen, in welcher Hinsicht sie sich unterscheiden,
untersuchen Sie beide mit @code{od -c} und pr�fen Sie auch ihre L�ngen.

@item
Wenn ein Testfall v�llig fehlschl�gt, sollten Sie die Log-Dateien im
@code{mysql-test/var/log}-Verzeichnis nach Hinweisen untersuchen, was
schief ging.

@item
Wenn Sie MySQL mit Debugging kompiliert haben, k�nnen Sie versuchen, das zu
debuggen, indem Sie @code{mysql-test-run} mit den @code{--gdb}- und / oder
@code{--debug}-Optionen laufen lassen.
@xref{Making trace files}.

Wenn Sie MySQL nicht f�r Debugging kompiliert haben, sollten Sie das besser
tun. Geben Sie einfach die @code{--with-debug}-Option f�r @code{configure}
an! @xref{Installing source}.
@end itemize




@node Problems, Benutzer, Extending MySQL, Top
@c German node Probleme
@appendix Probleme und h�ufige Fehler

@cindex Probleme, h�ufige Fehler
@cindex Fehler, h�ufige


Dieses Kapitel listet einige gebr�uchliche Probleme und Fehlermeldungen
auf, denen Benutzer in die Arme laufen. Sie lernen herauszufinden, was das
Problem ist und wie Sie es l�sen. Hier finden sich auch korrekte L�sungen
einiger h�ufiger Probleme.


@menu
* What is crashing::            
* Common errors::               
* Installation Issues::         
* Administration Issues::       
* Query Issues::                
* Table Definition Issues::     
@end menu

@node What is crashing, Common errors, Problems, Problems
@c German node Was ist ein Absturz
@appendixsec Wie man feststellt, was Probleme verursacht

Wenn Sie Probleme bekommen, sollten Sie als erstes herausfinden, welches
Programm oder Hardware-Teil die Probleme verursacht:

@itemize @bullet
@item
Wenn Sie eins der folgenden Symptome beobachten, gibt es wahrscheinlich ein
Hardware- (Speicher, Hauptplatine, Prozessor oder Festplatte) oder
Kernel-Problem:
@itemize @minus
@item
Die Tastatur funktioniert nicht. Normalerweise k�nnen Sie das durch Dr�cken
der Feststelltaste (Caps Lock) �berpr�fen. Wenn sich die Anzeigeleuchte
beim Dr�cken nicht an- und ausschaltet, m�ssen Sie Ihre Tastatur ersetzen.
(Bevor Sie das tun, sollten Sie Ihren Computer neu starten und alle
Kabelverbindungen zur Tastatur �berpr�fen.)
@item
Der Mauszeiger bewegt sich nicht.
@item
Die Maschine antwortet auf entfernte Ping-Versuche nicht.
@item
Andere Programme, die mit MySQL nichts zu tun haben, funktionieren nicht
korrekt.
@item
Wenn Ihr System unerwartet neu startet (ein fehlerhaftes Programm auf
Benutzerebene sollte NIE in der Lage sein, Ihr System zum Absturz zu
bringen).
@end itemize

In solchen F�llen sollten Sie zun�chst alle Kabel �berpr�fen und
Diagnoseprogramme laufen lassen, um Ihre Hardware zu untersuchen! Sie
sollten auch pr�fen, ob Patches, Aktualisierungen oder Service-Packs f�r
Ihre Betriebssystem verf�gbar sind, die Ihre Probleme m�glicherweise l�sen.
Pr�fen Sie auch, ob Ihre Bibliotheken (wie glibc) aktuell sind.

Es ist immer eine gute Idee, eine Maschine mit ECC-Speicher zu benutzen, um
Speicherprobleme fr�hzeitig zu erkennen!
@item
Wenn Ihre Tastatur gesperrt ist, k�nnen Sie das eventuell beheben, indem
Sie sich von einer anderen Maschine aus verbinden und @code{kbd_mode -a}
ausf�hren.

@item
Untersuchen Sie Ihre System-Log-Datei (/var/log/messages oder �hnliches)
nach Gr�nden f�r Ihre Probleme. Wenn Sie glauben, dass das Problem an MySQL
liegt, sollten Sie auch die Log-Dateien von MySQL �berpr�fen.
@xref{Update log}.

@item
Wenn Sie nicht glauben, ein Hardware-Problem zu haben, sollten Sie
herausfinden, welches Programm die Probleme verursacht.

Probieren Sie @code{top}, @code{ps}, @code{taskmanager} oder ein �hnliches
Programm, um zu pr�fen, welches Programm die gesamte Prozessorzeit
konsumiert oder die Maschine blockiert.

@item
Pr�fen Sie mit @code{top}, @code{df} oder einem �hnlichen Programm, wenn
Sie keinen freien Arbeitsspeicher, Festplattenspeicher, verf�gbare
Datei-Handler oder eine andere kritische Ressource mehr haben.

@item
Wenn das Problem an einem aus dem Ruder gelaufenen Prozess liegt, k�nnen
Sie versuchen, diesen zu killen. Wenn er nicht sterben will, gibt es
wahrscheinlich einen Bug im Betriebssystem.
@end itemize

Wenn Sie alle anderen M�glichkeiten untersucht und ausgeschlossen haben und
zur Schlussfolgerung gekommen sind, dass die Probleme durch den
MySQL-Server oder ein MySQL-Client-Programm verursacht werden, ist es an
der Zeit, einen Bug-Bericht f�r die Mailing-Liste oder unser Support-Team
zu schreiben. Machen Sie im Bug-Bericht eine sehr detaillierte
Beschreibung, wie sich Ihr System verh�lt und was Sie vermuten, was
passiert. Sie sollten auch angeben, warum Sie denken, dass MySQL die
Probleme verursacht. Ziehen Sie alle Situationen in diesem Kapitel in
Betracht. Geben Sie genau an, welche Probleme wie auftauchen, wenn Sie Ihr
System untersuchen. Benutzen Sie Kopieren und Einf�gen, wenn Sie Ausgaben
und / oder Fehlermeldungen von Programmen oder aus Log-Dateien beif�gen!

Versuchen Sie detailliert zu beschreiben, welches Programm nicht
funktioniert, und alle Symptome, die Sie sehen! In der Vergangenheit haben
wir viele Bug-Berichte erhalten, in denen schlicht steht, dass "das System
nicht funktioniert". Daraus k�nnen wir nat�rlich keinerlei Informationen
ziehen, wie das Problem gel�st werden k�nnte.

Wenn ein Programm fehlschl�gt, ist es immer n�tzlich, folgendes zu wissen:

@itemize @bullet
@item
Hat das fragliche Programm einen Segmentation-Fehler verursacht (Core
Dump)?
@item
Nimmt das Programm sich die gesamte Prozessorleistung? �berpr�fen Sie das
mit @code{top}. Lassen Sie das Programm eine Weile laufen, denn vielleicht
evaluiert es gerade nur etwas Schwieriges.
@item
Wenn der @code{mysqld}-Server Probleme verursacht, k�nnen Sie dann
@code{mysqladmin -u root ping} oder @code{mysqladmin -u root processlist}
ausf�hren?
@item
Was sagt ein Client-Programm (zum Beispiel @code{mysql}), wenn Sie
versuchen, sich mit dem MySQL-Server zu verbinden? Bricht der Client
zusammen? Erhalten Sie von diesem Programm irgend welche Ausgaben?
@end itemize

Wenn Sie einen Bug-Bericht senden, sollten Sie immer den Angaben folgen,
die in diesem Handbuch beschrieben sind. @xref{Asking questions}.


@node Common errors, Installation Issues, What is crashing, Problems
@c German node H�ufige Fehler
@appendixsec Einige gebr�uchliche Fehler bei der Benutzung von MySQL

@cindex errors, Auflistung



Dieser Abschnitt listet einige Fehler auf, die Benutzer h�ufig erhalten.
Hier finden Sie Beschreibungen dieser Fehler und wie man die Probleme l�st.


@menu
* Error Access denied::         
* Gone away::                   
* Can not connect to server::   
* Blocked host::                
* Too many connections::        
* Non-transactional tables::    
* Out of memory::               
* Packet too large::            
* Communication errors::        
* Full table::                  
* Cannot create::               
* Commands out of sync::        
* Ignoring user::               
* Cannot find table::           
* Cannot initialize character set::  
* Not enough file handles::     
@end menu

@node Error Access denied, Gone away, Common errors, Common errors
@c German node Zugriff-verweigert-Fehler
@appendixsubsec @code{Access denied}-Fehler

@cindex Fehler, Zugriff verweigert
@cindex Probleme, Zugriff-verweigert-Fehler
@cindex access denied

@xref{Privileges}, insbesondere @xref{Access denied}.


@node Gone away, Can not connect to server, Error Access denied, Common errors
@c German node Weg gegangen
@appendixsubsec @code{MySQL server has gone away}-Fehler

Dieser Abschnitt behandelt auch den verwandten @code{Lost connection to
server during query}-Fehler.

Der h�ufigste Grund f�r den @code{MySQL server has gone away}-Fehler ist
eine Zeit�berschreitung, nach der der Server die Verbindung schloss.
Vorgabem��ig schlie�t der Server die Verbindung nach 8 Stunden, wenn
nichts passiert ist. Sie k�nnen diesen Wert mit der
@code{wait_timeout}-Variablen �ndern, die beim Start von @code{mysqld}
gesetzt wird.

Ein weiterer h�ufiger Grund f�r den @code{MySQL server has gone
away}-Fehler ist das Absetzen eines ``close'' auf Ihre MySQL-Verbindung mit
dem anschlie�enden Versuch, auf der geschlossenen Verbindung eine Anfrage
abzusetzen.

Sie k�nnen �berpr�fen, ob der MySQL-Server gestorben ist, indem Sie
@code{mysqladmin version} ausf�hren und die Uptime untersuchen.

Wenn Sie ein Skript haben, m�ssen Sie die Anfrage lediglich noch einmal f�r
den Client absetzen, um eine automatische Neuverbindung zu machen.

Normalerweise k�nnen Sie folgende Fehler-Codes f�r diesen Fall abfragen
(die Betriebssystem-abh�ngig sind):

@multitable @columnfractions .3 .7
@item @code{CR_SERVER_GONE_ERROR} @tab Der Client konnte keine Anfrage an
den Server schicken.
@item @code{CR_SERVER_LOST} @tab  Der Client erhielt beim Schreiben zum
Server keinen Fehler, bekam aber keine vollst�ndige (oder �berhaupt keine)
Antwort.
@end multitable

Sie erhalten diese Fehler auch, wenn Sie eine Anfrage zum Server schicken,
die falsch oder zu Gro� ist. Wenn @code{mysqld} ein Paket erh�lt, das zu
Gro� oder nicht in Ordnung ist, nimmt er hat, dass etwas mit dem Client
schief ging und schlie�t die Verbindung. Wenn Sie gro�e Anfragen brauchen
(beispielsweise wenn Sie mit @code{BLOB}-Spalten arbeiten), k�nnen Sie die
Anfragebeschr�nkung erh�hen, indem Sie @code{mysqld} mit der @code{-O
max_allowed_packet=#}-Option starten (Vorgabe 1 MB). Der zus�tzliche
Speicher wird bei Bedarf zugewiesen, daher benutzt @code{mysqld} nur dann
mehr Speicher, wenn Sie eine gro�e Anfrage ausf�hren oder wenn
@code{mysqld} ein gro�es Ergebnis zur�ckgeben muss!


@node Can not connect to server, Blocked host, Gone away, Common errors
@c German node Keine Verbindung zum Server
@appendixsubsec @code{Can't connect to [local] MySQL server}-Fehler

Ein MySQL-Client unter Unix kann sich auf zwei unterschiedliche Arten mit
dem @code{mysqld}-Server verbinden: Unix-Sockets, die sich durch eine Datei
im Dateisystem verbinden (Vorgabe @file{/tmp/mysqld.sock}) oder �ber
TCP/IP, was sich �ber eine Portnummer verbindet. Unix-Sockets sind
schneller als TCP/IP, k�nnen aber nur benutzt werden, wenn man sich zu
einem Server auf demselben Computer verbindet. Unix-Sockets werden benutzt,
wenn Sie keinen Hostnamen oder den speziellen Hostnamen @code{localhost}
angeben.

Unter Windows k�nnen Sie sich nur mit TCP/IP verbinden, wenn der
@code{mysqld}-Server unter Windows 95 / 98 l�uft. Wenn er unter Windows NT
l�uft, k�nnen Sie sich auch mit Named Pipes verbinden. Der Name der Named
Pipe ist MySQL. Wenn Sie bei der Verbindung zu @code{mysqld} keinen
Hostnamen angeben, versucht ein MySQL-Client zuerst, sich �ber die Named
Pipe zu verbinden. Erst wenn das fehlschl�gt, versucht er, sich �ber den
TCP/IP-Port zu verbinden. Sie k�nnen die Benutzung von Named Pipes unter
Windows erzwingen, indem Sie @code{.} als Hostnamen benutzen.

Der Fehler (2002) @code{Can't connect to ...} bedeutet normalerweise, dass
auf dem System kein MySQL-Server l�uft oder dass Sie eine falsche
Socket-Datei oder einen falschen TCP/IP-Port bei der Verbindung mit dem
@code{mysqld}-Server benutzen.

Pr�fen Sie zuerst mit @code{ps} oder dem Task-Manager unter Windows, ob es
einen laufenden Prozess namens @code{mysqld} auf Ihrem Server gibt! Wenn es
keinen @code{mysqld}-Prozess gibt, sollten Sie einen starten. @xref{Starting server}.

Wenn ein @code{mysqld}-Prozess l�uft, k�nnen Sie den Server mit diesen
unterschiedlichen Verbindungen �berpr�fen (die Portnummer und
Socket-Pfadnamen k�nnen auf Ihrem System nat�rlich anders sein):

@example
shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip_ihres_hosts' version
shell> mysqladmin --socket=/tmp/mysql.sock version
@end example

Beachten Sie die Benutzung umgedrehter Anf�hrungszeichen statt normaler
Anf�hrungszeichen beim @code{hostname}-Befehl. Diese verursachen, dass die
Ausgabe durch @code{hostname} (das hei�t des aktuellen Hostnamens) im
@code{mysqladmin}-Befehl ersetzt wird.

Hier sind einige Gr�nde f�r das Auftreten des @code{Can't connect to local
MySQL server}-Fehlers:

@itemize @bullet
@item
@code{mysqld} l�uft nicht.
@item
Sie fahren auf einem System, das MIT-pThread verwendet. Wenn Sie auf einem
System fahren, das keine nativen Threads hat, benutzt @code{mysqld} das
MIT-pThread-Paket. @xref{Which OS}. Nicht alle
MIT-pThread-Versionen unterst�tzen jedoch Unix-Sockets. Auf einem System
ohne Socket-Unterst�tzung m�ssen Sie den Hostnamen immer explizit angeben,
wenn Sie sich mit dem Server verbinden. Benutzen Sie diesen Befehl, um die
Verbindung zum Server zu �berpr�fen:
@example
shell> mysqladmin -h `hostname` version
@end example
@item
Jemand hat den Unix-Socket entfernt, den @code{mysqld} benutzt (Vorgabe
@file{/tmp/mysqld.sock}). Vielleicht gibt es einen @code{cron}-Job, der den
MySQL-Socket entfernt (beispielsweise ein Job, der alte Dateien aus dem
@file{/tmp}-Verzeichnis entfernt). Sie k�nnen  @code{mysqladmin version}
laufen lassen und �berpr�fen, dass der Socket, den @code{mysqladmin}
versucht zu benutzen, tats�chlich existiert. Die Probleml�sung besteht in
diesem Fall darin, den @code{cron}-Job so zu �ndern, dass er nicht
@file{mysqld.sock} entfernt oder den Socket an andere Stelle zu platzieren.
@xref{Problems with mysql.sock}.
@item
Sie haben den @code{mysqld}-Server mit der
@code{--socket=/pfad/zu/socket}-Option gestartet. Wenn Sie den
Socket-Pfadnamen zum Server �ndern, m�ssen Sie auch die MySQL-Clients
dar�ber unterrichten. Das k�nnen Sie tun, indem Sie den Socket-Pfad als
Argument an den Client �bergeben. @xref{Problems with mysql.sock}.
@item
Sie benutzen Linux und ein Thread ist gestorben (Core Dump). In diesem Fall
m�ssen Sie den anderen @code{mysqld}-Thread killen (beispielsweise mit dem
@code{mysql_zap}-Skript), bevor Sie einen neuen MySQL-Server starten
k�nnen. @xref{Crashing}.
@item
Eventuell haben Sie keine Lese- und Schreibberechtigungen entweder f�r das
Verzeichnis, in dem die Socket-Datei liegt, oder keine Berechtigung f�r die
Socket-Datei selbst. In diesem Fall k�nnen Sie entweder die Berechtigung
f�r die Datei und / oder das Verzeichnis �ndern oder @code{mysqld} neu
starten, so dass er ein Verzeichnis benutzt, auf das Sie Zugriff haben.
@end itemize

Wenn Sie die Fehlermeldung @code{Can't connect to MySQL server on
ein_hostname} erhalten, k�nnen Sie folgendes probieren, um den Grund des
Problems herauszufinden:

@itemize @bullet
@item
�berpr�fen Sie, ob der Server hochgefahren ist, indem Sie @code{telnet
ihr_hostname tcp-ip-port-nummer} ausf�hren und einige Male die Eingabetaste
(@code{RETURN}) dr�cken. Wenn es auf diesem Port einen laufenden
MySQL-Server gibt, sollten Sie eine Antwort erhalten, die die
Versionsnummer des Server enth�lt. Wenn Sie einen Fehler wie @code{telnet:
Unable to connect to remote host: Connection refused} erhalten, gibt es auf
diesem Port keinen laufenden Server.
@item
Versuchen Sie, sich mit dem @code{mysqld}-Daemon auf der lokalen Maschine
zu verbinden und pr�fen Sie den TCP/IP-Port, den @code{mysqld} laut
Konfiguration benutzen soll (Variable @code{port}), mit @code{mysqladmin
variables}.
@item
Pr�fen Sie, ob Ihr @code{mysqld}-Server nicht gestartet wurde, indem Sie
die @code{--skip-networking}-Option verwenden.
@end itemize


@node Blocked host, Too many connections, Can not connect to server, Common errors
@c German node Blockierter Host
@appendixsubsec @code{Host '...' is blocked}-Fehler

Wenn Sie einen Fehler wie folgt erhalten:

@example
Host 'hostname' is blocked because of too many connection errors.
Unblock with 'mysqladmin flush-hosts'
@end example

Bedeutet das, dass @code{mysqld} zu viele (@code{max_connect_errors})
Verbindungsanforderungen vom Host @code{'hostname'} erhalten hat, die
mittendrin unterbrochen wurden. Nach @code{max_connect_errors}
fehlgeschlagenen Anfragen nimmt @code{mysqld} an, dass etwas nicht stimmt
(wie ein Angriff eines Crackers) und blockiert weitere
Verbindungsanforderungen von der Site, bis jemand @code{mysqladmin
flush-hosts} ausf�hrt.

Vorgabem��ig blockiert @code{mysqld} einen Host nach 10
Verbindungsfehlern. Das k�nnen Sie leicht durch Starten des Servers wie
folgt �ndern:

@example
shell> safe_mysqld -O max_connect_errors=10000 &
@end example

Beachten Sie, dass Sie bei dieser Fehlermeldung f�r einen gegebenen Host
zun�chst pr�fen sollten, ob etwas mit den TCP/IP-Verbindungen von diesem
Host aus nicht stimmt. Wenn Ihre TCP/IP-Verbindungen nicht funktionieren,
n�tzt es Ihnen nichts, den Wert der @code{max_connect_errors}-Variablen
heraufzusetzen!


@node Too many connections, Non-transactional tables, Blocked host, Common errors
@c German node Zu viele Verbindungen
@appendixsubsec @code{Too many connections}-Fehler

Wenn Sie beim Verbindungsversuch den Fehler @code{Too many connections}
erhalten, hei�t das, dass es bereits @code{max_connections} Clients gibt,
die mit dem @code{mysqld}-Server verbunden sind.

Wenn Sie mehr Verbindungen als die Vorgabe (100) ben�tigen, k�nnen Sie 
@code{mysqld} mit einem gr��eren Wert f�r die
@code{max_connections}-Variable neu starten.

Beachten Sie, dass @code{mysqld} tats�chlich (@code{max_connections}+1)
Clients f�r Verbindungen zul��t. Die letzte Verbindung wird f�r einen
Benutzer mit der @strong{process}-Berechtigung reserviert. Wenn Sie keinem
normalen Benutzer diese Berechtigung geben (diese sollte sie nie
ben�tigen), kann sich ein Administrator mit dieser Berechtigung einloggen
und @code{SHOW PROCESSLIST} benutzen, um herauszufinden, was schief geht.
@xref{SHOW}.

Die maximale Anzahl von Verbindungen ist davon abh�ngig, wie gut die
Thread-Bibliothek auf der Plattform ist. Linux oder Solaris sollten in der
Lage sein, 500 bis 1000 gleichzeitige Verbindungen zu unterst�tzen, abh�ngig
davon, wie viel Arbeitsspeicher Sie haben und was Ihre Clients ausf�hren.


@node Non-transactional tables, Out of memory, Too many connections, Common errors
@c German node Nicht transaktionale Tabellen
@appendixsubsec @code{Some non-transactional changed tables couldn't be rolled back}-Fehler

@cindex Nicht transaktionale Tabellen

Wenn Sie den Fehler @code{Warning: Some non-transactional changed tables
couldn't be rolled back} erhalten, wenn Sie ein @code{ROLLBACK} versuchen,
bedeutet das, dass einige der bei der Transaktion benutzten Tabellen keine
Transaktionen unterst�tzen. Diese nicht transkationalen Tabellen werden vom
@code{ROLLBACK}-Statement nicht betroffen.

Der typischste Fall, bei dem dieser Fehler auftritt, ist, wenn Sie versucht
haben, eine Tabelle von einem Typ zu erzeugen, der von Ihrer
@code{mysqld}-Bin�rdatei nicht unterst�tzt wird. Wenn @code{mysqld} einen
Tabellentyp nicht unterst�tzt (oder wenn der Tabellentyp durch die
Startoption ausgeschaltet ist), wird statt dessen ein Tabellentyp erzeugt,
der dem angeforderten am n�chsten entspricht (wahrscheinlich
@code{MyISAM}.

Sie k�nnen den Tabellentyp f�r eine Tabelle wie folgt �berpr�fen:

@code{SHOW TABLE STATUS LIKE 'tabelle'}. @xref{SHOW TABLE STATUS}.

Sie k�nnen die Erweiterungen, die Ihre @code{mysqld}-Bin�rdatei
unterst�tzt, wie folgt �berpr�fen:

@code{show variables like 'have_%'}. @xref{SHOW VARIABLES}.


@node Out of memory, Packet too large, Non-transactional tables, Common errors
@c German node Kein Speicher verf�gbar
@appendixsubsec @code{No free memory}-Fehler

Wenn Sie eine Anfrage ausf�hren und etwas wie folgenden Fehler erhalten:

@example
mysql: No free memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 Bytes (12189k)
ERROR 2008: MySQL client ran No free memory
@end example

Beachten Sie, dass sich dieser Fehler auf den MySQL-Client @code{mysql}
bezieht. Der Grund f�r diesen Fehler ist einfach, dass der Client nicht
genug freien Speicher hat, um das gesamte Ergebnis zu speichern.

Um das Problem zu beheben, pr�fen Sie zun�chst, ob Ihre Anfrage korrekt
ist. Sollte sie vern�nftigerweise so viele Zeilen zur�ckgeben? Wenn das der
Fall ist, k�nnen Sie @code{mysql --quick} benutzen, was
@code{mysql_use_result()} benutzt, um die Ergebnismenge abzurufen.
Hierdurch wird Last vom Client auf den Server verlagert.


@node Packet too large, Communication errors, Out of memory, Common errors
@c German node Paket zu Gro�
@appendixsubsec @code{Packet too large}-Fehler

Wenn ein MySQL-Client oder der @code{mysqld}-Server ein Paket erh�lt, das
gr��er als @code{max_allowed_packet} Bytes ist, gibt er einen @code{Packet
too large}-Fehler aus und schlie�t die Verbindung.

Wenn Sie den @code{mysql}-Client benutzen, m�ssen Sie einen gr��eren
Puffer angeben, indem Sie den Client mit @code{mysql
--set-variable=max_allowed_packet=8M} starten.

Wenn Sie andere Clients benutzen, die die Angabe der maximalen Paketgr��e
nicht zulassen (wie @code{DBI}), m�ssen Sie die Paketgr��e beim Start des
Servers setzen. Sie k�nnen eine Kommandozeilenoption f�r @code{mysqld}
benutzen, um @code{max_allowed_packet} auf eine h�here Gr��e zu setzen.
Wenn Sie zum Beispiel beabsichtigen, die volle L�nge eines @code{BLOB} in
eine Tabelle zu speichern, m�ssen Sie den Server mit der
@code{--set-variable=max_allowed_packet=16M}-Option starten.

Sie k�nnen merkw�rdige Probleme mit gro�en Paketen erhalten, wenn Sie
gro�e Blobs benutzen, aber @code{mysqld} keinen Zugriff auf genug Speicher
gegeben haben, um die Anfrage zu handhaben. Wenn Sie vermuten, dass das der
Fall ist, versuchen Sie, am Anfang des @code{safe_mysqld}-Skripts
@code{ulimit -d 256000} hinzuzuf�gen, und starten Sie @code{mysqld} neu.

@node Communication errors, Full table, Packet too large, Common errors
@c German node Kommunikationsfehler
@appendixsubsec Kommunikationsfehler / Abgebrochene Verbindung

@cindex Abgebrochene Clients
@cindex Abgebrochene Verbindung
@cindex Verbindung, abgebrochen

Ab @code{MySQL 3.23.40} erhalten Sie den @code{Aborted connection}-Fehler
nur dann, wenn Sie @code{mysqld} mit @code{--warnings} starten.

Wenn Sie Fehler wie den folgenden in Ihrer Fehler-Log-Datei entdecken:

@example
010301 14:38:23  Aborted connection 854 to db: 'Benutzer' user: 'josh'
@end example

@xref{Error log}.

Bedeutet das, dass eins der folgenden Dinge passiert ist:

@itemize @bullet
@item
Das Client-Programm rief vor dem Beenden nicht @code{mysql_close()} auf.
@item
Der Client schlief l�nger als @code{wait_timeout} oder
@code{interactive_timeout}, ohne Anfragen auszuf�hren.
@c German FIX unsplit @xref
@xref{SHOW VARIABLES}.
@item
Das Client-Programm wurde abrupt w�hrend einer �bertragung beendet.
@end itemize

Wenn das oben Genannte passiert, wird die Servervariable
@code{Aborted_clients} heraufgez�hlt.

Die Servervariable @code{Aborted_connects} wird in folgenden F�llen
heraufgez�hlt:

@itemize @bullet
@item
Wenn ein Verbindungspaket nicht die richtigen Informationen enth�lt.
@item
Wenn der Benutzer keine Berechtigung hat, sich mit einer Datenbank zu
verbinden.
@item
Wenn ein Benutzer ein falsches Passwort angegeben hat.
@item
Wenn es l�nger als @code{connect_timeout} Sekunden dauert, um ein
Verbindungspaket zu erhalten.
@end itemize

Beachten Sie, dass obiges auch anzeigen k�nnte, dass jemand versucht, in
Ihre Datenbank einzubrechen!

@xref{SHOW VARIABLES}.

Andere Gr�nde f�r Probleme mit abgebrochenen Clients / abgebrochenen
Verbindungen:
@itemize @bullet
@item
Benutzung des Duplex-Ethernet-Protokolls, sowohl Halb- als auch
Voll-Duplex, unter Linux. Viele Linux-Ethernet-Treiber haben diesen Bug.
Sie k�nnen auf diesen Bug �berpr�fen, indem Sie eine sehr gro�e Datei via
FTP zwischen diesen beiden Maschinen �bertragen. Wenn ein Transfer nach dem
Schema schnelle �bertragung - Pause - schnelle �bertragung - Pause l�uft,
haben Sie ein Linux-Duplex-Syndrom. Die einzige L�sung besteht darin, Halb-
und Vollduplex auf Hubs und Switches auszuschalten.
@item
Probleme mit der Thread-Bibliothek, was Unterbrechungen bei Lesevorg�ngen
verursacht.
@item
Schlecht konfiguriertes TCP/IP.
@item
Fehlerhafte Ethernets, Hubs, Switches, Kabel usw. Das kann nur durch
Austausch von Hardware sauber diagnostiziert werden.
@item
@code{max_allowed_packet} ist zu klein oder Anfragen erfordern mehr
Speicher, als Sie f�r @code{mysqld} zugewiesen haben.
@c German FIX unwrapped @xref
@xref{Packet too large}.
@end itemize


@node Full table, Cannot create, Communication errors, Common errors
@c German node Tabelle voll
@appendixsubsec @code{The table is full}-Fehler

@cindex Tabelle ist voll

Der Fehler tritt in �lteren MySQL-Versionen auf, wenn eine
Hauptspeicher-basierende tempor�re Tabelle gr��er als
@code{tmp_table_size} Bytes wird. Um dieses Problem zu vermeiden, k�nnen
Sie die @code{-O tmp_table_size=#}-Option f�r @code{mysqld} benutzen, um
die Gr��e der tempor�ren Tabelle zu erh�hen, oder die SQL-Option
@code{SQL_BIG_TABLES} verwenden, bevor Sie die problematische Anfrage
abschicken. @xref{SET OPTION, , @code{SET OPTION}}.

Sie k�nnen auch @code{mysqld} mit der @code{--big-tables}-Option starten.
Das ist genau dasselbe, wie @code{SQL_BIG_TABLES} f�r alle Anfragen zu
benutzen.

In MySQL-Version 3.23 werden Hauptspeicher-basierende tempor�re Tabellen
automatisch in Festplatten-basierende @code{MyISAM}-Tabellen umgewandelt,
wenn die Tabelle gr��er als @code{tmp_table_size} wird.


@node Cannot create, Commands out of sync, Full table, Common errors
@c German node Kann nicht erzeugen
@appendixsubsec @code{Can't create/write to file}-Fehler

@cindex can't create/write to file

Wenn Sie f�r einige Anfragen Fehler folgenden Typs erhalten:

@example
Can't create/write to file '\\sqla3fe_0.ism'.
@end example

Bedeutet das, dass MySQL keine tempor�re Datei f�r die Ergebnismenge im
angegebenen tempor�ren Verzeichnis erzeugen kann. (Der obige Fehler ist
eine typische Fehlermeldung unter Windows; die Unix-Fehlermeldung ist
�hnlich.) Das Problem l��t sich beheben, indem Sie @code{mysqld} mit
@code{--tmpdir=pfad} starten oder folgendes in Ihrer Optionsdatei erg�nzen:

@example
[mysqld]
tmpdir=C:/temp
@end example

Unter der Annahme, dass das @file{c:\\temp}-Verzeichnis existiert.
@xref{Option files}.

�berpr�fen Sie auch den Fehler-Code, den Sie bei @code{perror} erhalten.
Ein Grund kann ein Fehler wegen fehlenden Festplattenspeichers sein:

@example
shell> perror 28
Error code  28:  No space left on device
@end example


@node Commands out of sync, Ignoring user, Cannot create, Common errors
@c German node Befehl nicht synchronisiert
@appendixsubsec @code{Command out of sync}-Fehler in Client

@cindex Befehle nicht synchronisiert

Wenn Sie den Fehler @code{command out of sync; You can't run this command
now} in Ihrem Client-Code erhalten, rufen Sie Client-Funktionen in der
falschen Reihenfolge auf!

Das kann zum Beispiel passieren, wenn Sie @code{mysql_use_result()}
benutzen und versuchen, eine neue Anfrage auszuf�hren, bevor Sie
@code{mysql_free_result()} aufgerufen haben. Der Fehler passiert ebenfalls,
wenn Sie versuchen, zwei Anfragen auszuf�hren, die Daten zur�ckgeben, ohne
zwischendrin @code{mysql_use_result()} oder @code{mysql_store_result()}
aufzurufen.


@node Ignoring user, Cannot find table, Commands out of sync, Common errors
@c German node Benutzer ignoriert
@appendixsubsec @code{User ignored}-Fehler

Wenn Sie folgenden Fehler erhalten:

@code{Found wrong password for user: 'benutzer@@ein_host'; User ignored}

Bedeutet das, dass @code{mysqld} beim Start oder nach dem Neuladen der
Berechtigungstabellen einen Eintrag in der @code{user}-Tabelle mit einem
ung�ltigen Passwort gefunden hat. Als Ergebnis wird der Eintrag vom
Berechtigungssystem einfach ignoriert.

M�gliche Gr�nde und Problembehebung:

@itemize @bullet
@item
Sie lassen eine neue Version von @code{mysqld} mit einer alten
@code{user}-Tabelle laufen. Das k�nnen Sie pr�fen, indem Sie
@code{mysqlshow mysql user} eingeben, um zu sehen, ob das Passwortfeld
k�rzer als 16 Zeichen ist. Wenn das der Fall ist, k�nnen Sie diesen Zustand
beheben, indem Sie das @code{scripts/add_long_password}-Skript laufen
lassen.

@item
Der Benutzer hat ein altes Passwort (8 Zeichen lang) und Sie haben
@code{mysqld} nicht mit der @code{--old-protocol}-Option gestartet.

@item
@findex PASSWORD()
Sie haben in der @code{user}-Tabelle ein Passwort eingegeben, ohne die
@code{PASSWORD()}-Funktion zu benutzen. Benutzen Sie @code{mysql}, um den
Benutzer in der @code{user}-Tabelle mit einem neuen Passwort zu
aktualisieren. Stellen Sie sicher, dass Sie die @code{PASSWORD()}-Funktion
benutzen:

@example
mysql> update user set password=PASSWORD('ihr_passwort')
           where user='XXX';
@end example
@end itemize


@node Cannot find table, Cannot initialize character set, Ignoring user, Common errors
@c German node Tabelle nicht gefunden
@appendixsubsec @code{Table 'xxx' doesn't exist}-Fehler

Wenn Sie den Fehler @code{Table 'xxx' doesn't exist} oder @code{Can't find
file: 'xxx' (errno: 2)} erhalten, bedeutet das, dass in der aktuellen
Datenbank keine Tabelle mit dem Namen @code{xxx} existiert.

Beachten Sie, dass Datenbank- und Tabellennamen @strong{abh�ngig von der
verwendeten Gro�-/Kleinschreibung} sind, weil MySQL Verzeichnisse und
Dateien benutzt, um Datenbanken und Tabellen zu speichern! (Unter Windows
sind Datenbank- und Tabellennamen unabh�ngig von der Schreibweise, aber
alle Verweise auf eine gegebene Tabelle innerhalb einer Anfrage m�ssen
dieselbe Schreibweise benutzen!)

Sie finden heraus, welche Tabellen sich in der aktuellen Datenbank
befinden, indem Sie @code{SHOW TABLES} eingeben. @xref{SHOW, ,
@code{SHOW}}.


@node Cannot initialize character set, Not enough file handles, Cannot find table, Common errors
@c German node Zeichensatz kann nicht initialisiert werden
@appendixsubsec @code{Can@'t initialize charset xxx}-Fehler.

@cindex Multibyte-Zeichens�tze

Wenn Sie folgenden Fehler erhalten:

@example
MySQL Connection Failed: Can't initialize charset xxx
@end example

Bedeutet das eins der folgenden Dinge:

@itemize @bullet
@item
Der Zeichensatz ist ein Multi-Byte-Zeichensatz und Ihr Client unterst�tzt
diesen Zeichensatz nicht.

In diesem Fall m�ssen Sie Ihren Client neu kompilieren und die
@code{--with-charset=xxx}- oder die @code{--with-extra-charsets=xxx}-Option
angeben. @xref{configure options}.

Alle Standard-MySQL-Bin�rdistributionen werden mit
@code{--with-extra-character-sets=complex} kompiliert, was die
Unterst�tzung f�r alle Multi-Byte-Zeichens�tze aktiviert.
@xref{Character sets}.

@item
Der Zeichensatz ist ein einfacher Zeichensatz, der nicht in @code{mysqld}
kompiliert wurde, und die Zeichensatz-Definitionsdateien sind nicht an der
Stelle, an der der Client sie erwartet.

In diesem Fall m�ssen Sie:

@itemize @bullet
@item
Den Client mit Unterst�tzung f�r den Zeichensatz neu kompilieren.
@xref{configure options}.
@item
Dem Client angeben, wo die Zeichensatz-Definitionsdateien sind. Bei vielen
Clients k�nnen Sie das mit der
@code{--character-sets-dir=pfad-to-charset-dir}-Option machen.
@item
Die Zeichensatz-Definitionsdatei in den Pfad kopieren, wo der Client sie zu
finden erwartet.
@end itemize
@end itemize


@node Not enough file handles,  , Cannot initialize character set, Common errors
@c German node Nicht genug Datei-Handles
@appendixsubsec File Not Found

Wenn Sie den Fehler @code{ERROR '...' not found (errno: 23)}, @code{Can't
open file: ... (errno: 24)} oder irgend einen anderen Fehler mit
@code{errno 23} oder @code{errno 24} erhalten, bedeutet das, dass Sie MySQL
nicht genug Datei-Deskriptoren zugewiesen haben. Sie k�nnen das
@code{perror}-Dienstprogramm benutzen, um eine Beschreibung dessen zu
erhalten, was die Fehlernummer bedeutet:

@example
shell> perror 23
File table overflow
shell> perror 24
Too many open files
shell> perror 11
Resource temporarily unavailable
@end example

Das Problem hierbei ist, dass @code{mysqld} versucht, zu viele Dateien
gleichzeitig offen zu halten. Sie k�nnen entweder @code{mysqld}
veranlassen, nicht so viele Dateien auf einmal zu �ffnen, oder die Anzahl
von Datei-Deskriptoren heraufsetzen, �ber die @code{mysqld} verf�gen kann.

Um @code{mysqld} anzuweisen, weniger Dateien zugleich offen zu halten,
k�nnen Sie den Tabellen-Cache kleiner machen, indem Sie die @code{-O
table_cache=32}-Option f�r @code{safe_mysqld} benutzen (der Vorgabewert ist
64). Wenn Sie den Wert von @code{max_connections} verringern, reduziert
auch das die Anzahl offener Dateien (der Vorgabewert ist 90).

@tindex ulimit
Um die Anzahl von Datei-Deskriptoren, die @code{mysqld} zur Verf�gung
stehen, zu �ndern, k�nnen Sie die @code{--open-files-limit=#}-Option f�r
@code{safe_mysqld} oder die @code{-O open-files-limit=#}-Option f�r
@code{mysqld} benutzen. @xref{SHOW VARIABLES}. Die einfachste Art, das zu
tun, besteht darin, eine Option zu Ihrer Optionsdatei hinzuzuf�gen.
@xref{Option files}. Wenn Sie eine alte @code{mysqld}-Version haben, die
das nicht unterst�tzt, k�nnen Sie das @code{safe_mysqld}-Skript editieren.
Es gibt dort eine auskommentierte Zeile @code{ulimit -n 256}. Entfernen Sie
das @code{'#'}-Zeichen, um diese Zeile zu aktivieren, und �ndern Sie die
Anzahl 256, um die Anzahl verf�gbarer Datei-Deskriptoren zu beeinflussen.

Mit @code{ulimit} (und @code{open-files-limit}) kann man die Anzahl von
Datei-Deskriptoren heraufsetzen, aber nur bis zu der Grenze, die das
Betriebssystem vorgibt. Dar�ber hinaus gibt es eine 'harte' Grenze, die nur
�berschrieben werden kann, wenn Sie @code{safe_mysqld} oder @code{mysqld}
als Root starten (denken Sie daran, dass Sie in diesem Fall auch die
@code{--user=..}-Option benutzen m�ssen). Wenn Sie die
Betriebssystem-Grenze hinsichtlich der Anzahl von Datei-Deskriptoren, die
f�r jeden Prozess verf�gbar sind, heraufsetzen m�ssen, schauen Sie in der
Dokumentation Ihres Betriebssystems nach.

Beachten Sie, dass @code{ulimit} nicht funktioniert, wenn Sie die
@code{tcsh}-Shell laufen lassen! @code{tcsh} berichtet auch nicht korrekte
Werte, wenn Sie die aktuellen Grenzen abfragen! In diesem Fall sollten Sie
@code{safe_mysqld} mit @code{sh} starten!


@node Installation Issues, Administration Issues, Common errors, Problems
@c German node Installationsprobleme
@appendixsec Installationsbezogene Themen



@menu
* Link errors::                 
* Changing MySQL user::         
* File permissions ::           
@end menu

@node Link errors, Changing MySQL user, Installation Issues, Installation Issues
@c German node Link-Fehler
@appendixsubsec Probleme beim Linken mit der MySQL-Client-Bibliothek

@cindex linken, Fehler
@cindex Fehler, linken
@cindex Probleme, linken

Wenn Sie Ihr Programm linken und Fehler f�r unreferenzierte Symbole
erhalten, die mit @code{mysql_} beginnen, wie folgende:

@example
/tmp/ccFKsdPa.o: In function `main':
/tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
/tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect'
/tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
/tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
@end example

Sollten Sie das durch Hinzuf�gen von
@code{-Lpath-to-the-mysql-library-lmysqlclient} als @strong{LETZTES} in
Ihrer Link-Zeile beheben k�nnen.

Wenn Sie @code{undefined reference}-Fehler bei der @code{uncompress}- oder
@code{compress}-Funktion erhalten, f�gen Sie @code{-lz} als
@strong{LETZTES} zu Ihrer Link-Zeile hinzu und versuchen Sie es noch
einmal!

Wenn Sie @code{undefined reference}-Fehler bei Funktionen erhalten, die es
auf Ihrem System geben sollte, wie @code{connect}, sehen Sie in der
Handbuch-Seite (ManPage) f�r die fragliche Funktion nach, welche
Bibliotheken Sie zur Link-Zeile hinzuf�gen sollten!

Wenn Sie @code{undefined reference}-Fehler bei Funktionen erhalten, die es
auf Ihrem System nicht gibt, wie folgenden:

@example
mf_format.o(.text+0x201): undefined reference to `__lxstat'
@end example

Hei�t das �blicherweise, dass Ihre Bibliothek auf einem System kompiliert
wurde, das nicht 100% kompatibel zu Ihrem System ist. In diesem Fall
sollten Sie die letzte MySQL-Quelldistribution herunter laden und sie
selbst kompilieren. @xref{Installing source}.

Wenn Sie versuchen, ein Programm laufen zu lassen und Fehler f�r
unreferenzierte Symbole erhalten, die mit @code{mysql_} anfangen, oder den
Fehler, dass die @code{mysqlclient}-Bibliothek nicht gefunden werden kann,
hei�t das, dass Ihr System die gemeinsam genutzte
@code{libmysqlclient.so}-Bibliothek nicht findet.

Das Problem beheben Sie, indem Sie Ihr System anweisen, dort nach gemeinsam
genutzten Bibliotheken zu suchen, wo sich die Bibliothek befindet, mit
einer der folgenden Methoden:

@itemize @bullet
@item
F�gen Sie den Pfad zum Verzeichnis, in dem Sie @code{libmysqlclient.so}
haben, der @code{LD_LIBRARY_PATH}-Umgebungsvariablen hinzu.
@item
F�gen Sie den Pfad zum Verzeichnis, in dem Sie @code{libmysqlclient.so}
haben, der @code{LD_LIBRARY}-Umgebungsvariablen hinzu.
@item
Kopieren Sie @code{libmysqlclient.so} an eine Stelle, die von Ihrem System
durchsucht wird, wie @file{/lib}, und aktualisieren Sie die Informationen
�ber gemeinsam genutzte Bibliotheken, indem Sie @code{ldconfig} ausf�hren.
@end itemize

Eine weitere M�glichkeit, dieses Problem zu l�sen, besteht darin, Ihr
Programm statisch mit @code{-static} zu linken oder die dynamischen
MySQL-Bibliotheken zu entfernen, bevor Sie Ihren Code linken. Im letzteren
Fall sollten Sie sicherstellen, dass keine anderen Programme die
dynamischen Bibliotheken benutzen!


@node Changing MySQL user, File permissions , Link errors, Installation Issues
@c German node �nderung des MySQL-Benutzers
@appendixsubsec Wie man MySQL als normaler Benutzer laufen l��t

@cindex starten, @code{mysqld}
@cindex @code{mysqld}, starten

Der MySQL-Server @code{mysqld} kann von jedem beliebigen Benutzer gestartet
werden und unter diesem laufen. Damit @code{mysqld} als Unix-Benutzer
@code{benutzername} l�uft, m�ssen Sie folgendes tun:

@enumerate
@item
Halten Sie den Server an, falls er l�uft (benutzen Sie @code{mysqladmin
shutdown}).

@item
�ndern Sie die Datenbankverzeichnisse und Dateien so, dass
@code{benutzername} die Berechtigungen zum Lesen und Schreiben von Dateien
darin hat (das m�ssen Sie eventuell als Unix-@code{root}-Benutzer machen):

@example
shell> chown -R benutzername /pfad/zu/mysql/datadir
@end example

Wenn Verzeichnisse oder Dateien im MySQL-Daten-Verzeichnis symbolische
Links sind, m�ssen Sie auch diesen Verkn�pfungen folgen und die
Verzeichnisse und Dateien, auf die sie zeigen, �ndern. @code{chown -R} kann
SymLinks f�r Sie folgen.

@item
Starten Sie den Server als Benutzer @code{benutzername} oder, wenn Sie
MySQL-Version 3.22 oder sp�ter benutzen, starten Sie @code{mysqld} als
Unix-@code{root}-Benutzer und benutzen Sie die
@code{--user=benutzername}-Option. @code{mysqld} schaltet um und l�uft dann
unter Unix-Benutzer @code{benutzername}, bevor er irgend welche
Verbindungen annimmt.

@item
Um den Server automatisch beim Hochfahren des Systems unter dem angegebenen
Benutzernamen zu starten, f�gen Sie zur @code{[mysqld]}-Gruppe der
@file{/etc/my.cnf}-Optionendatei oder der @file{my.cnf}-Optionendatei im
Datenverzeichnis des Servers eine @code{user}-Zeile hinzu, die den
Benutzernamen angibt. Beispiel:

@example
[mysqld]
user=benutzername
@end example
@end enumerate

Nunmehr sollte Ihr @code{mysqld}-Prozess korrekt unter dem Unix-Benutzer
@code{benutzername} laufen. Dennoch hat sich eins nicht ge�ndert: Die
Inhalte der Berechtigungstabellen. Vorgabem��ig (direkt nach dem
Laufenlassen des Skripts @code{mysql_install_db}, das die
Berechtigungstabellen installiert), ist der MySQL-Benutzer @code{root} der
einzige Benutzer mit Zugriffsrechten auf die @code{mysql}-Datenbank. Er ist
auch der einzige, der Datenbanken erzeugen und l�schen kann. Wenn Sie diese
Berechtigungen nicht ge�ndert haben, sind sie noch g�ltig. Das sollte Sie
nicht davon abhalten, auf MySQL als der MySQL-@code{root}-Benutzer
zuzugreifen, wenn Sie als ein anderer Unix-Benutzer als @code{root}
eingeloggt sind. Geben Sie einfach f�r Client-Programme die @code{-u
root}-Option an.

Beachten Sie, dass der Zugriff auf MySQL als @code{root} (indem Sie
@code{-u root} auf der Kommandozeile eingeben) @emph{nichts} damit zu tun
hat, dass Sie MySQL als Unix-@code{root}-Benutzer laufen lassen oder als
irgend ein anderer Unix-Benutzer. Die Zugriffsberechtigungen und
Benutzernamen von MySQL sind komplett unterschiedlich von den
Unix-Benutzernamen. Die einzige Verbindung mit Unix-Benutzernamen besteht
darin, dass ein Client versuchen wird, sich mit Ihrem Unix-Login-Namen als
MySQL-Benutzernamen zu verbinden, wenn Sie beim Aufruf eines
Client-Programms keine @code{-u}-Option angeben.

Wenn Ihre Unix-Box selbst nicht abgesichert ist, sollten Sie zumindest ein
Passwort f�r den MySQL-@code{root}-Benutzer in den Berechtigungstabellen
angeben. Ansonsten kann jeder beliebige Benutzer mit einem Konto auf der
Maschine @code{mysql -u root datenbank} eingeben und tun, was er will.


@node File permissions ,  , Changing MySQL user, Installation Issues
@c German node Dateirechte 
@appendixsubsec Probleme mit Dateirechten

@cindex Dateien, Rechte
@cindex Fehlermeldungen, can't find file
@cindex Dateien, Nachricht not found

Wenn Sie Probleme mit Dateirechten haben, wenn @code{mysql} zum Beispiel
folgende Fehlermeldung beim Erzeugen einer Tabelle ausgibt:

@example
Error: Can't find file: 'pfad/mit/dateiname.frm' (Errcode: 13)
@end example

@tindex UMASK-Umgebungsvariable
@tindex Umgebungsvariable, UMASK
Kann es sein, dass die Umgebungsvariable @code{UMASK} falsch gesetzt ist,
wenn @code{mysqld} startet. Der vorgabem��ige umask-Wert ist @code{0660}.
Sie k�nnen dieses Verhalten �ndern, indem Sie @code{safe_mysqld} wie folgt
starten:

@example
shell> UMASK=384  # = 600 in oktal
shell> export UMASK
shell> /pfad/zu/safe_mysqld &
@end example

@tindex UMASK_DIR-Umgebungsvariable
@tindex Umgebungsvariable, UMASK_DIR
Vorgabem��ig erzeugt MySQL Datenbank- und @code{RAID}-Verzeichnisse mit
dem Berechtigungstyp 0700. Dieses Verhalten k�nnen Sie durch Setzen der
@code{UMASK_DIR}-Variablen �ndern. Wenn Sie diese setzen, werden neue
Verzeichnisse mit kombiniertem @code{UMASK} und @code{UMASK_DIR} erzeugt.
Wenn Sie zum Beispiel Gruppenzugriff auf alle neuen Verzeichnisse geben
wollen, k�nnen Sie folgendes tun:

@example
shell> UMASK_DIR=504  # = 770 in oktal
shell> export UMASK_DIR
shell> /pfad/zu/safe_mysqld &
@end example

Ab MySQL-Version 3.23.25 nimmt MySQL an, dass die Werte f�r @code{UMASK}
und @code{UMASK_DIR} in oktal angegeben sind, wenn sie mit einer 0
anfangen.

@xref{Environment variables}.


@node Administration Issues, Query Issues, Installation Issues, Problems
@c German node Administrationsprobleme
@appendixsec Administrationsbezogene Themen



@menu
* Crashing::                    
* Resetting permissions::       
* Full disk::                   
* Temporary files::             
* Problems with mysql.sock::    
* Timezone problems::           
@end menu

@node Crashing, Resetting permissions, Administration Issues, Administration Issues
@c German node Abst�rze
@appendixsubsec Was zu tun ist, wenn MySQL andauernd abst�rzt

@cindex Absturz, wiederholter

Alle MySQL-Versionen werden auf vielen Plattformen getestet, bevor sie
herausgegeben werden. Das hei�t nicht, dass es keinerlei Bugs in MySQL
gibt, aber es hei�t, dass, wenn es Bugs gibt, diese sehr wenige und schwer
zu finden sind. Wenn Sie ein Problem haben, ist es immer hilfreich
herauszufinden, was Ihr System zum Absturz bringt, weil Sie dann viel
bessere Chancen haben, es schnell zu beheben.

Zun�chst sollten Sie versuchen herauszufinden, ob das Problem darin
besteht, dass Ihr @code{mysqld}-Daemon stirbt, oder ob Sie ein Problem mit
Ihrem Client haben. Sie k�nnen herausfinden, seit wann Ihr
@code{mysqld}-Server hochgefahren ist, indem Sie @code{mysqladmin version}
ausf�hren. Wenn @code{mysqld} gestorben ist, finden Sie den Grund hierf�r
wom�glich in der Datei @file{mysql-daten-verzeichnis/`hostname`.err}.
@xref{Error log}.

Viele Abst�rze von MySQL werden durch besch�digte Index- oder Daten-Dateien
verursacht. MySQL aktualisiert die Daten auf Platte mit dem @code{write()}
Systemaufruf, nach jedem SQL-Statement und bevor der Client �ber das
Ergebnis unterrichtet wird. (Das gilt nicht, wenn Sie mit
@code{delayed_key_writes} fahren, denn in diesem Fall werden nur die Daten
geschrieben.) Das bedeutet, dass die Daten sicher sind, selbst wenn
@code{mysqld} abst�rzt, weil das Betriebssystem sicherstellt, dass die
nicht von MySQL zur�ckgeschriebenen Daten (flush) auf Platte
zur�ckgeschrieben werden. Sie k�nnen MySQL zwingen, alles nach jedem
SQL-Befehl auf Platte zur�ckzusynchronisieren,  indem Sie @code{mysqld} mit
@code{--flush} starten.

Das Gesagte bedeutet, dass Sie normalerweise keine besch�digten Tabellen
erhalten sollten, ausser in folgenden F�llen:

@itemize @bullet
@item
Jemand oder etwas killte @code{mysqld} oder die Maschine mitten w�hrend
einer Aktualisierung.
@item
Sie haben einen Bug in @code{mysqld} gefunden, der dazu f�hrte, dass er
mitten w�hrend einer Aktualisierung starb.
@item
Jemand manipuliert die Daten- / Index-Dateien ausserhalb von
@strong{mysqld}, ohne die Tabelle korrekt zu sperren.
@item
Wenn Sie viele @code{mysqld}-Server auf denselben Daten auf einem System
laufen lassen, das Dateisystem-Sperren nicht gut unterst�tzt (das wird
normalerweise vom @code{lockd}-Daemon gehandhabt) oder wenn Sie mehrere
Server mit @code{--skip-locking} fahren.
@item
Wenn Sie eine besch�digte Index- / Daten-Datei haben, die sehr falsche
Daten enth�lt, die @code{mysqld} durcheinander brachten.
@item
Sie haben einen Bug im Datenspeicher-Code gefunden. Das ist nicht sehr
wahrscheinlich, aber zumindest m�glich. In diesem Fall k�nnen Sie
versuchen, den Dateityp auf einen anderen Datenbank-Handler umzustellen,
indem Sie @code{ALTER TABLE} auf eine reparierte Kopie der Tabelle
anwenden!
@end itemize

Weil es sehr schwierig ist herauszufinden, warum etwas abst�rzt, versuchen
Sie zuerst herauszufinden, ob Dinge, die bei anderen funktionieren, bei
Ihnen abst�rzen, oder ob das nicht der Fall ist. Versuchen Sie bitte
folgendes:

@itemize @bullet
@item
Fahren Sie den @code{mysqld}-Daemon mit @code{mysqladmin shutdown} herunter
und f�hren Sie @code{myisamchk --silent --force */*.MYI} auf alle Tabellen
aus. Starten Sie den @code{mysqld}-Daemon erneut. Das stellt sicher, dass
Sie von einem sauberen Ausgangszustand aus fahren.
@xref{MySQL Database Administration}.

@item
Benutzen Sie @code{mysqld --log} und versuchen Sie den Informationen im Log
zu entnehmen, ob eine bestimmte Anfrage den Server killt oder nicht. Etwa
95% aller Bugs beziehen sich auf eine bestimmte Anfrage! Normalerweise ist
das eine der letzten Anfragen in der Log-Datei, direkt bevor MySQL neu
startete. @xref{Query log}. Wenn Sie MySQL wiederholt mit einer
der Anfragen killen, selbst wenn Sie alle Tabellen direkt vor der
Ausf�hrung der Anfrage �berpr�ft haben, haben Sie den Bug eingegrenzt und
sollten daf�r einen Bug-Bericht schreiben! @xref{Bug reports}.

@item
Versuchen Sie, einen Testfall herzustellen, den wir zur Reproduzierung des
Problems verwenden k�nnen. @xref{Reproduceable test case}.

@item
Versuchen Sie, die beigef�gten mysql-test test und MySQL-Benchmarks laufen
zu lassen. @xref{MySQL-Test-Suite}. Sie k�nnen MySQL recht gut pr�fen. Sie
k�nnen den Benchmarks auch selbst Code hinzuf�gen, der Ihre Applikation
simuliert! Die Benchmarks finden sich im @file{bench}-Verzeichnis in der
Quelldistribution oder bei einer Bin�rdistribution im
@file{sql-bench}-Verzeichnis unter Ihrem MySQL-Installationsverzeichnis.

@item
Probieren Sie @code{fork_test.pl} und @code{fork2_test.pl}.

@item
Wenn Sie MySQL zum Debuggen konfigurieren, ist es wesentlich einfacher,
Informationen �ber m�gliche Fehler zu erhalten, wenn etwas schief geht.
Konfigurieren Sie MySQL mit der @code{--with-debug}-Option oder mit der
@code{--with-debug=full}-Option f�r @code{configure} neu und kompilieren
Sie neu. @xref{Debugging server}.

@item
Wenn MySQL zum Debuggen konfiguriert wird, wird ein sicherer
Speicher-Zuweiser (Memory Allocator) hinzugef�gt, der einige Fehler finden
kann. Ausserdem erfolgen etliche Ausgaben �ber das, was gerade geschieht.

@item
Haben Sie die neuesten Patches f�r Ihr Betriebssystem installiert?

@item
Benutzen Sie die @code{--skip-locking}-Option f�r @code{mysqld}. Auf
manchen Systemen arbeitet der @code{lockd}-Sperrmanager nicht korrekt. Die
@code{--skip-locking}-Option weist @code{mysqld} an, keine externen Sperren
zu benutzen. (Das hei�t, dass Sie nicht zwei @code{mysqld}-Server auf
denselben Daten laufen lassen k�nnen und dass Sie vorsichtig sein m�ssen,
wenn Sie @code{myisamchk} benutzen, aber es kann aufschlussreich sein, die
Option testweise zu benutzen.)

@item
Haben Sie @code{mysqladmin -u root processlist} ausprobiert, wenn
@code{mysqld} zu laufen scheint, aber nicht antwortet? Manchmal ist
@code{mysqld} nicht komat�s, obwohl es so aussieht. Das Problem kann darin
bestehen, dass alle Verbindungen in Benutzung sind, oder es kann ein
internes Sperrproblem vorliegen. @code{mysqladmin processlist} ist
�blicherweise in der Lage, in solchen F�llen eine Verbindung aufzubauen und
kann n�tzliche Informationen �ber die momentane Anzahl von Verbindungen und
ihren Status liefern.

@item
Lassen Sie den Befehl @code{mysqladmin -i 5 status} oder @code{mysqladmin
-i 5 -r status} in einem separaten Fenster laufen, um statistische
Informationen auszugeben, w�hrend Sie Ihre anderen Anfragen laufen lassen.

@item
Versuchen Sie folgendes:
@enumerate
@item
Starten Sie @code{mysqld} von @code{gdb} aus (oder in einem anderen
Debugger).
@xref{Using gdb on mysqld}.

@item
Lassen Sie Ihre Test-Skripts laufen.

@item
Geben Sie die Ablaufverfolgung (Backtrace) und die lokalen Variablen der
untersten 3 Ebenen aus. In gdb k�nnen Sie das mit folgenden Befehle tun,
wenn @code{mysqld} innerhalb von gdb abgest�rzt ist:

@example
backtrace
info local
up
info local
up
info local
@end example

Mit gdb k�nnen Sie auch untersuchen, welchen Thread es gibt (mit @code{info
thread} und zu einem speziellen Thread umschalten (mit @code{thread #},
wobei @code{#} die Thread-Kennung ist).
@end enumerate

@item
Versuchen Sie, Ihre Applikation mit einem Perl-Skript zu simulieren, um
MySQL zu zwingen, abzust�rzen oder fehlerhaftes Verhalten an den Tag zu
legen.

@item
Senden Sie einen normalen Bug-Bericht. @xref{Bug reports}. Geben Sie mehr
Details an als �blich. Weil MySQL bei vielen Leuten funktioniert, kann es
sein, dass der Absturz das Ergebnis von etwas ist, das nur auf Ihrem
Computer existiert (beispielsweise ein Fehler, der aus Ihren besonderen
Systembibliotheken resultiert).

@item
Wenn Sie ein Problem mit Tabellen haben, die Zeilen dynamischer L�nge
enthalten, und Sie nicht @code{BLOB/TEXT}-Spalten benutzen (sondern nur
@code{VARCHAR}-Spalten), k�nnen Sie versuchen, alle @code{VARCHAR}- in
@code{CHAR}-Spalten umzuwandeln, indem Sie @code{ALTER TABLE} verwenden.
Das erzwingt, dass MySQL Zeilen fester L�nge verwendet. Zeilen fester L�nge
ben�tigen etwas mehr Platz, sind aber fehlertoleranter gegen�ber
Besch�digungen!

Der aktuelle Code mit dynamischen Zeilen ist bei MySQL AB seit mindestens
drei Jahren ohne jedes Problem in Benutzung, aber naturgem�� sind Zeilen
dynamischer L�nge fehleranf�lliger. Daher kann es eine gute Idee sein, das
oben Gesagte auszuprobieren.
@end itemize


@node Resetting permissions, Full disk, Crashing, Administration Issues
@c German node Berechtigungen zur�cksetzen
@appendixsubsec Wie ein vergessenes Passwort zur�ckgesetzt wird

@cindex Passw�rter, vergessen
@cindex Passw�rter, zur�cksetzen
@cindex Root-Benutzer, Passwort zur�cksetzen

Wenn Sie das @code{root}-Benutzerpasswort f�r MySQL vergessen haben, k�nnen
Sie es mit folgender Prozedur wiederherstellen:

@enumerate
@item
Fahren Sie den @code{mysqld}-Server durch Senden von @code{kill} (nicht
@code{kill -9}) an den @code{mysqld}-Server herunter. Die Prozess-Kennung
(PID) wird in einer @code{.pid}-Datei gespeichert, die sich normalerweise
im MySQL-Datenbank-Verzeichnis befindet:

@example
kill `cat /mysql-daten-verzeichnis/hostname.pid`
@end example

Hierf�r m�ssen Sie entweder der Unix-@code{root}-Benutzer sein oder
derselbe Benutzer, unter dem der Server l�uft.

@item
Starten Sie @code{mysqld} mit der @code{--skip-grant-tables}-Option neu.
@item
Verbinden Sie sich mit dem @code{mysqld}-Server mit @code{mysql -h hostname
mysql} und �ndern Sie das Passwort mit einem @code{GRANT}-Befehl.
@xref{GRANT,,@code{GRANT}}. Sie k�nnen dasselbe auch mit @code{mysqladmin
-h hostname -u benutzer password 'neues_passwort'} machen.

@item
Laden Sie die Berechtigungstabellen neu mit @code{mysqladmin -h hostname
flush-privileges} oder mit dem SQL-Befehl @code{FLUSH PRIVILEGES}.
@end enumerate

Beachten Sie, dass nach dem Start von @code{mysqld} mit
@code{--skip-grant-tables} jede Benutzung von @code{GRANT}-Befehlen zu
einem @code{Unknown command}-Fehler f�hrt, bis Sie @code{FLUSH PRIVILEGES}
ausgef�hrt haben.


@node Full disk, Temporary files, Resetting permissions, Administration Issues
@c German node Platte voll
@appendixsubsec Wie MySQL mit vollen Festplatten umgeht

@cindex volle Festplatte
@cindex Festplatte voll

@noindent
Wenn etwas hinsichtlich der Festplatte passiert, tut MySQL folgendes:

@itemize @bullet
@item
Er pr�ft einmal pro Minute, um festzustellen, ob es genug Platz gibt, um
die aktuelle Zeile zu schreiben oder nicht. Wenn genug Platz vorhanden ist,
wird fortgefahren, als sei nichts geschehen.
@item
Alle 6 Minuten schreibt er einen Eintrag in die Log-Datei mit einer Warnung
wegen voller Festplatte.
@end itemize

@noindent
Um das Problem abzumildern, k�nnen Sie folgende Aktionen unternehmen:

@itemize @bullet
@item
Um einfach weiterzumachen, m�ssen Sie lediglich genug Festplattenplatz
freigeben, damit alle Datens�tze eingef�gt werden k�nnen.
@item
Um den Thread abzubrechen, m�ssen Sie @code{mysqladmin kill} an den Thread
senden. Der Thread wird beim n�chsten Mal, wenn er die Festplatte pr�ft (in
1 Minute) abgebrochen.
@item
Beachten Sie, dass eventuell ein anderer Thread auf die Tabelle wartet, die
den Zustand ``Platte voll'' verursachte. Wenn Sie mehrere ``gesperrte''
Threads haben, kann es sein, dass Sie einen Thread killen, der wegen
``Platte voll'' wartet, dass daf�r aber ein anderer Thread weitermacht.
@end itemize

Ausnahmen zum obigen Verhalten treten bei der Benutzung von @code{REPAIR}
oder @code{OPTIMIZE} auf, oder wenn die Indexe nach einem @code{LOAD DATA
INFILE}- oder einem @code{ALTER TABLE}-Statement im Stapel erzeugt werden.

Alle obigen Befehle benutzen eventuell gro�e tempor�re Dateien, die - sich
selbst �berlassen - f�r den Rest des Systems gro�e Probleme verursachen
k�nnen. Wenn MySQL ein ``Platte voll'' erh�lt, w�hrend irgend eine der
obigen Operationen ausgef�hrt wird, entfernt er die gro�en tempor�ren
Dateien und markiert die Tabelle als besch�digt (ausser bei @code{ALTER
TABLE}, wobei die alte Tabelle unver�ndert gelassen wird).


@node Temporary files, Problems with mysql.sock, Full disk, Administration Issues
@c German node Tempor�re Dateien
@appendixsubsec Wohin MySQL tempor�re Dateien speichert

MySQL benutzt den Wert der @code{TMPDIR}-Umgebungsvariablen als Pfadnamen
des Verzeichnisses, in dem tempor�re Dateien gespeichert werden. Wenn Sie
@code{TMPDIR} nicht gesetzt haben, benutzt MySQL die System-Vorgabe, die
normalerweise @file{/tmp} oder @file{/usr/tmp} ist. Wenn das Dateisystem,
das Ihr Verzeichnis f�r tempor�re Dateien enth�lt, zu klein ist, sollten
Sie @code{safe_mysqld} editieren, um @code{TMPDIR} so zu setzen, dass sie
auf ein Verzeichnis in einem Dateisystem zeigt, wo Sie genug Platz haben!
Sie k�nnen das tempor�re Verzeichnis auch mit der @code{--tmpdir}-Option
f�r @code{mysqld} setzen.

MySQL erzeugt alle tempor�ren Dateien als versteckte Dateien. Das stellt
sicher, dass die tempor�ren Dateien entfernt werden, wenn @code{mysqld}
beendet wird. Der Nachteil versteckter Dateien ist, dass Sie eine gro�e
tempor�re Datei nicht sehen, die das Dateisystem auff�llt, in dem sich das
Verzeichnis f�r tempor�re Dateien befindet.

Zum Sortieren (@code{ORDER BY} oder @code{GROUP BY}) benutzt MySQL
normalerweise ein oder zwei tempor�re Dateien. Der maximal ben�tigte
Speicherplatz ist:

@example
(laenge_dessen_was_sortiert_wird + groesse_von(datenbank_zeiger)) *
anzahl_uebereinstimmender_zeilen * 2
@end example

@code{groesse_von(datenbank_zeiger)} ist �blicherweise 4, kann in Zukunft
aber f�r wirklich gro�e Tabellen anwachsen.

Bei einigen @code{SELECT}-Anfragen erzeugt MySQL zus�tzliche tempor�re
SQL-Tabellen. Diese sind nicht versteckt und haben Namen der Form
@file{SQL_*}.

@code{ALTER TABLE} erzeugt eine tempor�re Tabelle im selben Verzeichnis, in
dem sich die Original-Tabelle befindet.


@node Problems with mysql.sock, Timezone problems, Temporary files, Administration Issues
@c German node Probleme mit mysql.sock
@appendixsubsec Wie Sie die MySQL-Socket-Datei @file{/tmp/mysql.sock} sch�tzen oder �ndern

@cindex @code{mysql.sock}, sch�tzen
@cindex l�schen, @code{mysql.sock}

Wenn Sie Probleme damit haben, dass jeder beliebige den
MySQL-Kommunikations-Socket @file{/tmp/mysql.sock} l�schen kann, k�nnen Sie
unter den meisten Versionen von Unix Ihr @file{/tmp}-Dateisystem sch�tzen,
indem Sie darauf das @code{sticky} Bit setzen. Loggen Sie sich als
@code{root} ein und tun Sie folgendes:

@example
shell> chmod +t /tmp
@end example

Das sch�tzt Ihr @file{/tmp}-Dateisystem, so dass Dateien nur von ihren
Besitzern oder dem Superuser (@code{root}) gel�scht werden k�nnen.

Sie k�nnen �berpr�fen, ob das @code{sticky} Bit gesetzt ist, indem Sie
@code{ls -ld /tmp} ausf�hren. Wenn das letzte Berechtigungsbit @code{t}
ist, ist das Bit gesetzt.

@cindex Speicherort des Sockets �ndern

Sie k�nnen den Speicherort �ndern, den MySQL benutzt, um die Socket-Datei
Socket-Datei abzulegen, indem Sie eine der folgenden Prozeduren ausf�hren:

@itemize @bullet
@item
Geben Sie den Pfad in einer globalen oder lokalen Optionsdatei an.
Beispielsweise k�nnen Sie in @code{/etc/my.cnf} eintragen:

@example
[client]
socket=pfad-fuer-socket-datei

[mysqld]
socket=pfad-fuer-socket-datei
@end example
@xref{Option files}.
@item
Geben Sie den Pfad auf der Kommandozeile f�r @code{safe_mysqld} und die
meisten Clients mit der @code{--socket=pfad-fuer-socket-datei}-Option an.
@item
Geben Sie den Pfad zum Socket in der
@code{MYSQL_UNIX_PORT}-Umgebungsvariablen an.
variable.
@item
Definieren Sie den Pfad mit der @code{configure}-Option
@code{--with-unix-socket-path=pfad-fuer-socket-datei}.
@xref{configure options}.
@end itemize

Mit folgendem Befehl k�nnen Sie testen, ob der Socket funktioniert:

@example
shell> mysqladmin --socket=/pfad/zu/socket version
@end example

@node Timezone problems,  , Problems with mysql.sock, Administration Issues
@c German node Zeitzonen-Probleme
@appendixsubsec Zeitzonen-Probleme

@cindex Zeitzonen-Probleme
@cindex Probleme, Zeitzone

@tindex TZ-Umgebungsvariable
@tindex Umgebungsvariable, TZ

Wenn es Probleme damit gibt, dass @code{SELECT NOW()} Werte in GMT
(Greenwich Mean Time) zur�ckgibt und nicht in Ihrer lokalen Zeit, m�ssen
Sie die @code{TZ}-Umgebungsvariable auf Ihre aktuelle Zeitzone setzen. Das
sollte f�r die Umgebung gemacht werden, in der der Server l�uft, zum
Beispiel in @code{safe_mysqld} oder @code{mysql.server}.
@xref{Environment variables}.


@node Query Issues, Table Definition Issues, Administration Issues, Problems
@c German node Anfragenprobleme
@appendixsec Anfragenbezogene Themen



@menu
* Case sensitivity::            
* Using DATE::                  
* Problems with NULL::          
* Problems with alias::         
* Deleting from related tables::  
* No matching rows::            
@end menu

@node Case sensitivity, Using DATE, Query Issues, Query Issues
@c German node Gro�-/Kleinschreibung
@appendixsubsec Gro�-/Kleinschreibung beim Suchen

@cindex Gro�-/Kleinschreibung, beim Suchen
@cindex Suchen und Gro�-/Kleinschreibung
@cindex chinesisch
@cindex Big5, chinesische Zeichensatz-Kodierung

Vorgabem��ig sind MySQL-Suchen unabh�ngig von der verwendeten
Gro�-/Kleinschreibung (obwohl es einige Zeichens�tze gibt, die nie
unabh�ngig von der verwendeten Gro�-/Kleinschreibung sind, wie
@code{tschechisch}). Wenn Sie daher mit @code{spalten_name LIKE 'a%'}
suchen, erhalten Sie alle Spaltenwerte, die mit @code{A} oder @code{a}
anfangen. Wenn Sie die Suche abh�ngig von der verwendeten
Gro�-/Kleinschreibung machen wollen, verwenden Sie etwas wie
@code{INSTR(spalten_name, "A")=1}, um ein Pr�fix zu �berpr�fen, oder
benutzen Sie @code{STRCMP(spalten_name, "A") = 0}, wenn der Spaltenwert
exakt @code{"A"} sein muss.

Einfache Vergleichsoperationen (@code{>=, >, = , < , <=}, Sortieren und
Gruppieren) basieren auf dem ``Sortierwert'' jedes Zeichens. Buchstaben mit
demselben Sortierwert (wie E, e und �) werden als dasselbe Zeichen
behandelt!

In �lteren MySQL-Versionen wurden @code{LIKE}-Vergleiche mit dem
Gro�schreibungswert jedes Zeichens durchgef�hrt (E == e, aber E <> �). In
neueren MySQL-Versionen funktioniert @code{LIKE} genau wie die anderen
Vergleichsoperatoren.

Wenn Sie wollen, dass eine Spalte immer abh�ngig von der verwendeten
Gro�-/Kleinschreibung behandelt wird, deklarieren Sie sie als
@code{BINARY}. @xref{CREATE TABLE, , @code{CREATE TABLE}}.

Wenn Sie chinesische Daten in der so genannten Big5-Kodierung verwenden,
sollten Sie alle Zeichenspalten @code{BINARY} machen. Das funktioniert,
weil die Sortierreihenfolge von Big5-Zeichen auf der Reihenfolge von
ASCII-Codes basiert.


@node Using DATE, Problems with NULL, Case sensitivity, Query Issues
@c German node Benutzung von DATE
@appendixsubsec Probleme bei der Benutzung von @code{DATE}-Spalten

@findex DATE

@cindex DATE-Spalten, Probleme
@cindex Probleme, @code{DATE}-Spalten

Das Format eines @code{DATE}-Werts ist @code{'YYYY-MM-DD'}. Gem�� ANSI-SQL
ist kein anderes Format zul�ssig. Sie sollten dieses Format in
@code{UPDATE}-Ausdr�cken und in der WHERE-Klausel von
@code{SELECT}-Statements benutzen. Beispiel:

@example
mysql> SELECT * FROM tabelle WHERE date >= '1997-05-05';
@end example

Aus Gr�nden der Annehmlichkeit konvertiert MySQL automatisch ein Datum in
eine Zahl, wenn das Datum in einem numerischen Zusammenhang benutzt wird
(und umgekehrt). MySQL unterst�tzt ausserdem ein ``entspanntes''
Zeichenkettenformat beim Aktualisieren und in einer @code{WHERE}-Klausel,
die ein Datum mit einer @code{TIMESTAMP}-, @code{DATE}- oder einer
@code{DATETIME}-Spalte vergleicht. (Entspannt hei�t hierbei, dass jedes
beliebige Satzzeichen als Trennzeichen zwischen Bestandteilen benutzt
werden darf. Beispielsweise sind @code{'1998-08-15'} und
@code{'1998#08#15'} �quivalent.) MySQL kann auch eine Zeichenkette
umwandeln, die keine Trennzeichen enth�lt (wie @code{'19980815'}),
vorausgesetzt, dass diese als Datum einen Sinn ergibt.

Das spezielle Datum @code{'0000-00-00'} kann als @code{'0000-00-00'}
gespeichert und abgerufen werden. Wenn man ein @code{'0000-00-00'}-Datum
�ber @strong{MyODBC} benutzt, wird es automatisch in @code{NULL}
umgewandelt (@strong{MyODBC}-Version 2.50.12 und h�her), weil ODBC diese
Art von Datum nicht handhaben kann.

Weil MySQL die oben genannten Umwandlungen durchf�hrt, funktionieren
folgende Statements:

@example
mysql> INSERT INTO tabelle (idate) VALUES (19970505);
mysql> INSERT INTO tabelle (idate) VALUES ('19970505');
mysql> INSERT INTO tabelle (idate) VALUES ('97-05-05');
mysql> INSERT INTO tabelle (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tabelle (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tabelle (idate) VALUES ('0000-00-00');

mysql> SELECT idate FROM tabelle WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tabelle WHERE idate >= 19970505;
mysql> SELECT mod(idate,100) FROM tabelle WHERE idate >= 19970505;
mysql> SELECT idate FROM tabelle WHERE idate >= '19970505';
@end example

@noindent
Folgendes jedoch funktioniert nicht:

@example
mysql> SELECT idate FROM tabelle WHERE STRCMP(idate,'19970505')=0;
@end example

@code{STRCMP()} ist eine Zeichenkettenfunktion, daher wird @code{idate} in
eine Zeichenkette umgewandelt und ein Zeichenkettenvergleich durchgef�hrt.
MySQL wandelt @code{'19970505'} nicht in ein Datum um und f�hrt einen
Datumsvergleich durch.

Beachten Sie, dass MySQL nicht pr�ft, ob ein Datum korrekt ist oder nicht.
Wenn Sie ein falsches Datum wie @code{'1998-2-31'} speichern, wird das
falsche Datum gespeichert. Wenn das Datum in keinen vern�nftigen Wert
umgewandelt werden kann, wird @code{0} im @code{DATE}-Feld gespeichert. Das
ist haupts�chlich eine Sache der Geschwindigkeit, und wir sind der Meinung,
dass es Sache der Applikation und nicht des Servers ist, Datumsangaben zu
�berpr�fen.


@node Problems with NULL, Problems with alias, Using DATE, Query Issues
@c German node Probleme mit NULL
@appendixsubsec Probleme mit @code{NULL}-Werten

@cindex @code{NULL}-Werte im Vergleich mit leeren Werten

@tindex NULL

Das Konzept des @code{NULL}-Wert ist eine h�ufige Quelle der Verwirrung f�r
SQL-Anf�nger. Diese denken h�ufig, @code{NULL} sei dasselbe wie eine leere
Zeichenkette @code{''}. Das ist nicht der Fall! So sind zum Beispiel
folgende Statements grundverschieden:

@example
mysql> INSERT INTO meine_tabelle (Telefon) VALUES (NULL);
mysql> INSERT INTO meine_tabelle (Telefon) VALUES ("");
@end example

Beide Statements f�gen einen Wert in die @code{Telefon}-Spalte ein, aber
das erste f�gt einen @code{NULL}-Wert und das zweite eine leere
Zeichenkette ein. Die Bedeutung des ersten ist etwa ``Telefonnummer
unbekannt'' und des zweiten ``Keine Telefonnummer''.

In SQL ist der @code{NULL}-Wert im Vergleich mit jedem anderen Wert immer
UNWAHR (false), selbst im Vergleich mit @code{NULL}. Ein Ausdruck, der
@code{NULL} enth�lt, erzeugt immer einen @code{NULL}-Wert, ausser wenn es
in der Dokumentation der Operatoren und Funktionen, die im Ausdruck
beteiligt sind, anders angegeben ist. Alle Spalten im folgenden Beispiel
geben @code{NULL} zur�ck:

@example
mysql> SELECT NULL,1+NULL,CONCAT('unsichtbar',NULL);
@end example

Wenn Sie nach Spaltenwerten suchen, die @code{NULL} sind, k�nnen Sie nicht
@code{=NULL} benutzen. Folgendes Statement gibt keine Zeilen zur�ck, weil
@code{ausdruck = NULL} f�r jeden beliebigen Ausdruck UNWAHR (false) ist:

@example
mysql> SELECT * FROM meine_tabelle WHERE Telefon = NULL;
@end example

Um nach @code{NULL}-Werten zu suchen, m�ssen Sie @code{IS NULL} benutzen.
Folgende Beispiele zeigen, wie Sie die @code{NULL}-Telefonnummer und die
leere Telefonnummer finden:

@example
mysql> SELECT * FROM meine_tabelle WHERE Telefon IS NULL;
mysql> SELECT * FROM meine_tabelle WHERE Telefon = "";
@end example

In MySQL k�nnen Sie - wie bei vielen anderen SQL-Servern - keine Spalten
indexieren, die @code{NULL}-Werte enthalten d�rfen. Sie m�ssen solche
Spalten aus @code{NOT NULL} deklarieren. Sie d�rfen in eine indexierte
Spalte keine @code{NULL}-Werte einf�gen.

@findex LOAD DATA INFILE
Wenn Sie Daten mit @code{LOAD DATA INFILE} einlesen, werden leere Spalten
mit @code{''} aktualisiert. Wenn Sie einen @code{NULL}-Wert in einer Spalte
haben wollen, m�ssen Sie in der Textdatei @code{\N} benutzen. Unter manchen
Umst�nden kann auch das Literalwort @code{'NULL'} benutzt werden.
@xref{LOAD DATA, , @code{LOAD DATA}}.

Wenn Sie @code{ORDER BY} benutzen, werden @code{NULL}-Werte zuerst
angezeigt. Wenn Sie mit @code{DESC} in absteigender Reihenfolge sortieren,
werden @code{NULL}-Werte zuletzt angezeigt. Wenn Sie @code{GROUP BY}
benutzen, werden alle @code{NULL}-Werte als gleich betrachtet.

Um die Handhabung von @code{NULL} zu erleichtern, k�nnen Sie die @code{IS
NULL}- und @code{IS NOT NULL}-Operatoren und die @code{IFNULL()}-Funktion
benutzen.

@cindex @code{TIMESTAMP} und @code{NULL}-Werte
@cindex @code{AUTO_INCREMENT} und @code{NULL}-Werte
@cindex @code{NULL}-Werte und @code{TIMESTAMP}-Spalten
@cindex @code{NULL}-Werte und @code{AUTO_INCREMENT}-Spalten
Bei manchen Spaltentypen werden @code{NULL}-Werte besonders behandelt. Wenn
Sie @code{NULL} in die erste @code{TIMESTAMP}-Spalte einer Tabelle
einf�gen, werden das aktuelle Datum und die aktuelle Zeit eingef�gt. Wenn
Sie @code{NULL} in eine @code{AUTO_INCREMENT}-Spalte einf�gen, wird die
n�chste Zahl in der Zahlenfolge eingef�gt.


@node Problems with alias, Deleting from related tables, Problems with NULL, Query Issues
@c German node Probleme mit alias
@appendixsubsec Probleme mit @code{alias}

@tindex alias

Sie k�nnen ein Alias verwenden, um auf eine Spalte im @code{GROUP BY}-,
@code{ORDER BY}- oder @code{HAVING}-Teil zu verweisen. Aliase k�nnen auch
verwendet werden, um Spalten bessere Namen zu geben:

@example
SELECT SQRT(a*b) as wurzel FROM tabelle GROUP BY wurzel HAVING wurzel > 0;
SELECT id,COUNT(*) AS zaehl FROM tabelle GROUP BY id HAVING zaehl > 0;
SELECT id AS "kunden-kennung" FROM tabelle;
@end example

Beachten Sie, dass ANSI-SQL verbietet, in einer @code{WHERE}-Klausel auf
ein Alias zu verweisen. Das liegt daran, dass der Spaltenwert
m�glicherweise noch nicht feststeht, wenn der @code{WHERE}-Code ausgef�hrt
wird. Folgende Anfrage zum Beispiel ist @strong{unzul�ssig}:

@example
SELECT id,COUNT(*) AS zaehl FROM tabelle WHERE zaehl > 0 GROUP BY id;
@end example

Das @code{WHERE}-Statement wird ausgef�hrt, um festzulegen, welche Zeilen
im @code{GROUP BY}-Teil enthalten sein sollen, w�hrend @code{HAVING}
benutzt wird, um zu entscheiden, welche Zeilen der Ergebnismenge benutzt
werden sollten.


@node Deleting from related tables, No matching rows, Problems with alias, Query Issues
@c German node L�schen aus verwandten Tabellen
@appendixsubsec Zeilen aus verwandten Tabellen l�schen

@cindex l�schen, Zeilen
@cindex Zeilen, l�schen
@cindex Tabellen, Zeilen l�schen

Weil MySQL keine Sub-Selects oder die Benutzung von mehr als einer Tabelle
im @code{DELETE}-Statement unterst�tzt, m�ssen Sie folgenden Ansatz w�hlen,
um Zeilen aus zwei verwandten Tabellen zu l�schen:

@enumerate
@item
W�hlen (@code{SELECT}) Sie die Zeilen auf der Grundlage einer
@code{WHERE}-Bedingung in der Haupt-Tabelle aus.
@item
L�schen (@code{DELETE}) Sie die Zeilen in der Haupt-Tabelle auf der
Grundlage derselben Bedingung.
@item
L�schen Sie die Zeilen aus der verwandten Tabelle, bei denen die verwandte
Spalte in den ausgew�hlten Zeilen vorkommt (@code{DELETE FROM
verwandte_tabelle WHERE verwandte_spalte IN (ausgewaehlte_zeilen)}.
@end enumerate

Wenn die Gesamtzahl von Zeichen in der Anfrage mit @code{verwandte_spalte}
mehr als 1.048.576 betr�gt (der Vorgabewert von @code{max_allowed_packet},
sollten Sie sie in kleinere Teile aufspalten und mehrfache
@code{DELETE}-Statements ausf�hren. Wahrscheinlich geht das L�schen
(@code{DELETE}) am Schnellsten, wenn Sie nur 100 bis 1000
@code{verwandte_spalte}-Kennungen pro Anfrage l�schen, wenn
@code{verwandte_spalte} ein Index ist. Wenn @code{verwandte_spalte} kein
Index ist, ist die Geschwindigkeit unabh�ngig von der Anzahl von Argumenten
in der @code{IN}-Klausel.


@node No matching rows,  , Deleting from related tables, Query Issues
@c German node Keine �bereinstimmenden Zeilen
@appendixsubsec Probleme bei keinen �bereinstimmenden Zeilen l�sen

@cindex keine �bereinstimmenden Zeilen
@cindex Zeilen, �bereinstimmungsprobleme

Wenn Sie eine komplizierte Anfrage haben, die viele Tabellen hat und keine
Zeilen zur�ckgibt, sollten Sie folgende Prozedur benutzen, um
herauszufinden, was bei Ihrer Anfrage falsch ist:

@enumerate
@item
Testen Sie die Anfrage mit @code{EXPLAIN} und pr�fen Sie, ob Sie etwas
finden k�nnen, das offensichtlich falsch ist. @xref{EXPLAIN, ,
@code{EXPLAIN}}.

@item
W�hlen Sie in der @code{WHERE}-Klausel nur die Felder aus, die benutzt
werden.

@item
Entfernen Sie nacheinander Tabelle f�r Tabelle aus der Anfrage, bis sie
Zeilen zur�ckgibt. Wenn die Tabellen Gro� sind, ist es eine gute Idee,
@code{LIMIT 10} bei der Anfrage zu benutzen.

@item
Machen Sie ein @code{SELECT} f�r die Spalte, die mit einer Zeile h�tte
�bereinstimmen sollen, gegen die Tabelle, die als letzte aus der Anfrage
entfernt wurde.

@item
Wenn Sie @code{FLOAT}- oder @code{DOUBLE}-Spalten mit Zahlen vergleichen,
die Dezimalstellen haben, k�nnen Sie nicht @code{=} benutzen! Das Problem
tritt in den meisten Computersprachen auf, weil Flie�kommawerte keine
exakten Werte sind:

@example
mysql> SELECT * FROM tabelle WHERE float_spalte=3.5;
mysql> SELECT * FROM tabelle WHERE float_spalte between 3.45 und 3.55;
@end example

In den meisten F�llen kann dies durch Umwandlung von @code{FLOAT} in
@code{DOUBLE} behoben werden!

@item
Wenn Sie immer noch nicht herausfinden k�nnen, was schief geht, erzeugen
Sie einen minimalen Test, der mit @code{mysql test < anfrage.sql} laufen
gelassen werden kann, um Ihre Probleme aufzuzeigen. Sie k�nnen eine
Testdatei mit @code{mysqldump --quick datenbanktabellen > anfrage.sql}
erzeugen. �ffnen Sie die Datei in einem Editor, entfernen Sie ein paar
Einf�gezeilen (wenn es davon zu viele gibt) und f�gen Sie Ihr
SELECT--Statement am Ende der Datei an.

Testen Sie, ob es hiermit immer noch das Problem gibt:

@example
shell> mysqladmin create test2
shell> mysql test2 < anfrage.sql
@end example

Schicken Sie die Testdatei mittels @code{mysqlbug} an
@email{mysql@@lists.mysql.com}.
@end enumerate


@node Table Definition Issues,  , Query Issues, Problems
@c German node Tabellendefinitionsprobleme
@appendixsec Tabellendefinitionsbezogene Themen



@menu
* ALTER TABLE problems::        
* Change column order::         
* Temporary table problems::    
@end menu

@node ALTER TABLE problems, Change column order, Table Definition Issues, Table Definition Issues
@c German node Probleme mit ALTER TABLE
@appendixsubsec Probleme mit @code{ALTER TABLE}.

@tindex ALTER TABLE

@code{ALTER TABLE} �ndert eine Tabelle zum aktuellen Zeichensatz. Wenn Sie
w�hrend @code{ALTER TABLE} einen Fehler wegen doppelter Schl�sseleintr�ge
bekommen, liegt das entweder daran, dass die neuen Zeichens�tze auf bei
Schl�sseln auf dieselben Werte gemappt sind, oder dass die Tabelle
besch�digt ist, wobei Sie @code{REPAIR TABLE} auf die Tabelle laufen lassen
sollten.

Wenn @code{ALTER TABLE} mit einem Fehler wie folgt stirbt:

@example
Error on rename of './datenbank/name.frm' to './datenbank/B-a.frm' (Errcode: 17)
@end example

Kann das Problem darin bestehen, dass MySQL bei einem vorhergehenden
@code{ALTER TABLE} abgest�rzt ist und es eine alte Tabelle namens
@file{A-etwas} oder @file{B-etwas} gibt, die herum liegt. Gehen Sie in
diesem Fall ins MySQL-Daten-Verzeichnis und l�schen Sie alle Dateien, die
Namen wie @code{A-} oder @code{B-} haben. (Statt l�schen k�nnen Sie sie
auch an eine andere Stelle verschieben.)

@code{ALTER TABLE} funktioniert auf folgenden Weise:

@itemize @bullet
@item Erzeugt eine neue Tabellen namens @file{A-xxx} mit den angeforderten
�nderungen.
@item Alle Zeilen der alten Tabelle werden nach @file{A-xxx} kopiert.
@item Die alte Tabelle wird in @file{B-xxx} umbenannt.
@item @file{A-xxx} wird in Ihren alten Tabellennamen umbenannt.
@item @file{B-xxx} wird gel�scht.
@end itemize

Wenn etwas bei dieser Umbennungsoperation fehlschl�gt, versucht MySQL, die
�nderungen r�ckg�ngig zu machen. Wenn etwas Schwerwiegendes schief geht
(was nat�rlich passieren kann), l��t MySQL eventuell die alte Tabelle als
@file{B-xxx}, aber ein einfaches Umbenennen auf Systemebene sollte Ihre
Daten zur�ckbringen.


@node Change column order, Temporary table problems, ALTER TABLE problems, Table Definition Issues
@c German node �nderung der Spalten-Reihenfolge
@appendixsubsec Wie man die Reihenfolge der Spalten in einer Tabelle �ndert

@cindex neu sortieren, Spalten
@cindex Spalten, �ndern
@cindex �ndern, Spalten-Reihenfolge
@cindex Tabellen, Spalten-Reihenfolge �ndern

Im gro�en und Ganzen geht es bei SQL darum, die Applikation vom
Daten-Speicherformat zu abstrahieren. Sie sollten immer die Reihenfolge
angeben, in der Sie Ihre Daten abrufen wollen. Beispiel:

@example
SELECT spalten_name1, spalten_name2, spalten_name3 FROM tabelle;
@end example

Das gibt die Spalten in der Reihenfolge @code{spalten_name1},
@code{spalten_name2}, @code{spalten_name3} zur�ck, wohingegen:

@example
SELECT spalten_name1, spalten_name3, spalten_name2 FROM tabelle;
@end example

die Spalten in der Reihenfolge @code{spalten_name1}, @code{spalten_name3},
@code{spalten_name2} zur�ckgibt.

Sie sollten in einer Applikation @strong{NIE} @code{SELECT *} benutzen und
die Spalten basierend auf ihrer Position abrufen, weil die Reihenfolge, in
der Spalten zur�ckgegeben werden, im Zeitablauf @strong{NICHT} garantiert
werden kann. Eine einfache �nderung in Ihrer Datenbank kann dazu f�hren,
dass Ihre Applikation dramatisch scheitert.

Wenn Sie dennoch die Spalten-Reihenfolge �ndern wollen, k�nnen Sie das wie
folgt tun:

@enumerate
@item
Erzeugen Sie eine neue Tabelle mit den Spalten in der richtigen
Reihenfolge.
@item
F�hren Sie @code{INSERT INTO neue_tabelle SELECT
felder-in-der-reihenfolge-von-neue_tabelle FROM alte_tabelle} aus.
@item
L�schen Sie @code{alte_tabelle} oder benennen Sie sie um.
@item
F�hren Sie @code{ALTER TABLE neue_tabelle RENAME alte_tabelle} aus.
@end enumerate


@node Temporary table problems,  , Change column order, Table Definition Issues
@c German node Probleme mit tempor�ren Tabellen
@appendixsubsec TEMPORARY TABLE-Probleme

@cindex tempor�re Tabellen, Probleme

Im Folgenden eine Auflistung der Beschr�nkungen bei @code{TEMPORARY TABLES}.

@itemize @bullet
@item
Eine tempor�re Tabelle kann nur vom Typ @code{HEAP}, @code{ISAM} oder
@code{MyISAM} sein.
@item
Sie k�nnen tempor�re Tabellen nicht mehr als einmal in derselben Anfrage
benutzen. Folgendes zum Beispiel funktioniert nicht:

@example
select * from temporary_table, temporary_table as t2;
@end example

Das soll in Version 4.0 behoben werden.
@item
Sie k�nnen kein @code{RENAME} auf eine @code{TEMPORARY}-Tabelle benutzen.
Beachten Sie, dass @code{ALTER TABLE alter_name RENAME neuer_name} dagegen
funktioniert!
Das soll in Version 4.0 behoben werden.
@end itemize



@c German FIX this appendix should be removed (as was done from English ver.)
@node Benutzer, MySQL-Benutzung durch Kunden, Problems, Top
@c German node <no English equivalent>
@appendix Einige MySQL-Benutzer

@cindex Benutzer, von MySQL
@cindex News-Sites

Dieser Anhang listet einige Benutzer von MySQL auf, die uns ihre
Genehmigung erteilt haben, sie in dieser Dokumentation aufzuf�hren. Diese
Liste ist bei weitem nicht vollst�ndig, sollte aber eine allgemeine
Vorstellung davon geben, wer MySQL benutzt und wof�r es benutzt werden
kann.


@appendixsec Allgemeine News-Sites

@itemize @bullet

@item @uref{http://www.yahoo.com/, Yahoo!}

@item @uref{http://slashdot.org/, Slashdot: Eine Pro-Linux- / Tech-News- und Kommentar-/Diskussions-Site}

@item @uref{http://www.linux.com/, Alles �ber Linux}

@item @uref{http://www.linuxtoday.com/, Linuxtoday}

@item @uref{http://www.32bitsonline.com/, 32Bits Online: weil es mehr als eine Art zu computern gibt}

@item @uref{http://www.freshmeat.net/, Freshmeat: Neues �ber neue Versionen und computerbezogene Themen}

@end itemize

@cindex Suchmaschinen, web
@cindex Web-Suchmaschinen
@appendixsec Einige Web-Suchmaschinen

@itemize @bullet

@item @uref{http://www.aaa.com.au, AAA Matilda Web Search}

@item @uref{http://www.whatsnu.com/, What's New}

@item @uref{http://www.aladin.de/, Aladin}

@item @uref{http://www.columbus-finder.de/, Columbus Finder}

@item @uref{http://www.spider.de/, Spider}

@item @uref{http://www.blitzsuche.de/, Blitzsuche}

@item @uref{http://www.indoseek.co.id, Indoseek Indonesien}

@item @uref{http://www.yaboo.dk/, Yaboo - Yet Another BOOkmarker}


@item @uref{http://www.ozsearch.com.au, OzSearch Internet Guide}

@item @uref{http://www.splatsearch.com/, Splat! Search}

@item @uref{http://osdls.library.arizona.edu/, The Open Source Digital Library System Project}
@end itemize

@appendixsec Einige Informations-Suchmaschinen mit Konzentration auf bestimmte Felder

@itemize @bullet

@item @uref{http://www.spylog.ru/, SpyLOG ;  Eine sehr popul�re Web-Counter-Site}

@item @uref{http://www.tucows.com/, TuCows Network; Archiv f�r Freie Software}

@item @uref{http://www.jobvertise.com,Jobvertise: Angebot und Nachfrage nach Jobs}

@item @uref{http://www.musicdatabase.com, die Musik-Datenbank}

@item @uref{http://www.soccersearch.com, Fussball-Suchseite}

@item @uref{http://www.headrush.net/takedown, TAKEDOWN - Ringen}

@item @uref{http://www.lyrics.net, das internationale Liedtext-Netzwerk}

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://TheMatrix.com/~matrix/bund_search.phtml, Musiker die andere Musiker suchen (kostenloser Service)}

@item @uref{http://www.addall.com/AddBooks/Stores.html,AddALL B�chersuche und Preisvergleich}

@item @uref{http://www.herbaria.harvard.edu/Data/Gray/gray.html,Harvard's Gray Herbarium Index von Pflanzennamen}

@item @uref{http://www.game-Entwickler.com/, die Spiele-Entwicklungs-Suchmaschine}

@item @uref{www.theinnkeeper.com, der Innkeeper Reisef�hrer}

@item @uref{http://www.macgamedatabase.com/, die Mac-Game-Datenbank benutzt PHP und MySQL}
@c Von: Marc Antony Vose <suzerain@suzerain.com>

@item @uref{http://www.csse.monash.edu.au/publications/, Research
Ver�ffentlichungen an der Monash University in Australien}

@item @uref{http://www.ipielle.emr.it/bts/index.html,
Berufsbezogene Gesundheits- und Sicherheits-Website-Datenbank (ein Projekt f�r die ECC)}
@c c.presutti@ipielle.emr.it

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://data.mch.mcgill.ca/, Bioinformatik-Datenbanken am
Montreal-Kinderkrankenhaus die MySQL benutzen}
@c saeed@www.debelle.mcgill.ca
@end itemize

@cindex Online-Magazine
@cindex magazines, online
@appendixsec Online-Magazine

@itemize @bullet
@item @uref{http://www.spoiler.com, Spoiler Webzine}.
Ein Online-Magazin f�r Musik, Literatur, Kunst und Design.
@item @uref{http://www.linux-magazin.de/newsflash/, T�gliche Nachrichten �ber Linux in deutscher Sprache}
@item @uref{http://www.betazine.com,Betazine - Das ultimate Online-Betatester-Magazin}
@item @uref{http://www.currents.net/ccinfo/aboutcc.html,Computer Currents Magazine}
@end itemize

@cindex Websites
@appendixsec Websites die MySQL als Backend benutzen

@itemize @bullet

@item @uref{http://liftoff.msfc.nasa.gov, NASA}
@item @uref{http://kids.msfc.nasa.gov, NASA KIDS}
@item @uref{http://science.nasa.gov, Science@@NASA}

@item @uref{http://www.handy.de/, handy.de}

@item @uref{http://lindev.jmc.tju.edu/qwor, Qt Widget and Object Repository}

@item @uref{http://www.samba-choro.com.br, Brasilianische Samba-Site (auf portugiesisch)}

@item @uref{http://pgss.iss.uw.edu.pl/en_index.ISS, polnische allgemeine Sozial-Umschau}

@item @uref{http://www.expo2000.com, Expo2000} Weltweiter Verkauf von
Ticket f�r diese Veranstaltung wurde mit MySQL und tcl/tk implementiert.
Mehr als 5.000 Reiseagenturen in der ganzen Welt hatten Zugriff darauf.

@item @uref{http://www.freevote.com/, FreeVote.com ist ein kostenloser
Abstimmungsservice mit Millionen Benutzern.}

@item @uref{http://f1.tauzero.se, Forza Motorsport}

@item @uref{http://www.dreamhost.com/, DreamHost Web-Hosting}

@end itemize

@cindex services
@appendixsec Einige Domain- / Internet- / Web- und verwandte Services

@itemize @bullet

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.wix.com/mysql-hosting, Registrar von Webprovidern
die MySQL unterst�tzen}

@item @uref{http://www.yi.org/, dynamische DNS-Services}

@item @uref{http://www.dynodns.net/, dynamischer Domain-Name-Service}

@item @uref{http://www.ods.org/, Open DNS Project; kostenloser dynamischer DNS-Service}

@c @item @uref{http://dynodns.net, kostenlose dynamische DNS-Implementation}
@c EMAIL: A Moore <amoore@mooreSysteme.com>

@item @uref{http://www.hn.org/, Hammernode; �ffentliche DNS-Server}

@item @uref{http://www.fdns.net/, kostenlose 3rd-Level-Domains}

@item @uref{http://worldcommunity.com/, Online-Datenbank}

@item @uref{http://www.bigbiz.com, BigBiz Internet-Services}

@item @uref{http://virt.circle.net, The Virt Gazette}

@item @uref{http://www.california.com, Global InfoNet Inc}

@item @uref{http://www.webhosters.com, WebHosters - ein F�hrer f�r WWW-Provider}

@item @uref{http://online.dn.ru, Internet-Informations-Server}

@item @uref{http://www.stopbit.com, eine Technologie-News-Site}

@item @uref{http://www.worldnetla.net, WorldNet Communications - ein Internet Service Provider}

@item @uref{http://www.netizen.com.au/, Netizen: Web-Beratung in Australien}

@item @uref{http://www.trainingpages.co.uk, Suchseite f�r Trainingskurse in Gro�britannien}

@item @uref{http://chat.nitco.com, Gannon Chat (GPL). Geschrieben in Perl und JavaScript}

@item @uref{http://www.addurls.com/, ein allgemeines Links-Verzeichnis}

@item @uref{http://www.bookmarktracker.com, ein Web-basierender Bookmark-Verwaltungs-Service}

@item @uref{http://www.cdrom.com,Walnut Creek CDROM}

@item @uref{http://www.wwwThread.org/, WWWThread; interaktive Diskussionsforen}

@item @uref{http://pvmon.portici.enea.it/Meteo, auf italienisch; Datenspeicherung von meteo station}

@item @uref{http://www.buysell.net/, Online-"Person To Person"-Auktion}

@item @uref{http://tips.pair.com, Tipps zur Web-Entwicklung}

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.mailfriends.com, Mailfriends.com ist ein kostenloser Service f�r jeden der �ber das Internet einen Freund finden will.}

@item @uref{http://www.uninova.com/cgi-bin/wctelnets?list, Website Telnet BBS List}

@item @uref{http://www.uninova.com/cnc.html, UniNova Digitale Postkarten}

@c @item @uref{http://cabinboy.powersurfr.com, eine Internet-RFC-Suchmaschine}

@item @uref{http://www.dslreports.com, DSL-Provider-Suche mit Testberichten}.
Mit MySQL und Modperl hergestellt. Alle Seiten werden dynamisch aus einer
MySQL-Datenbank erzeugt.
@end itemize

@cindex PHP, Websites
@appendixsec Websites, die @code{PHP} und MySQL benutzen

@itemize @bullet
@c @item @uref{http://www.wh200th.com, Site zum 200. Jahrestag des Wei�en Hauses}

@item @uref{http://support.jgaa.com/, Jgaa's Internet - Offizielle Support-Site}

@item @uref{http://io.incluso.com, Ionline - online publication:} MySQL, PHP, Java, Web-Programmierung, DB-Entwicklung

@item @uref{http://www.baboo.com, BaBoo(Browse und bookmark). Kostenloser Web-basierender Bookmarkmanager und Kalender}

@item @uref{http://www.courses.pjc.cc.fl.us/Schedule/index.php, Kursplanungssystem am Pensacola Junior College}

@item @uref{http://www.fccj.org, Florida Community College in Jacksonville}

@item @uref{http://www.32bit.com/, 32bit.com; Ein umfangreiches Shareware- / Freeware-Archiv}

@item @uref{http://www.jokes2000.com/, Jokes 2000}
@c Added 990604; EMAIL: ah@dybdahl.dk


@item @uref{http://www.burken.nu/ , Burken.NU} Burken ist ein Webhotel, das Skripte unter anderem f�r entfernte Benutzer zur Verf�gung stellt, beispielsweise Counter, G�steb�cher usw.
@c Added 990608; EMAIL: spacedmp@SpaceDump.Burken.NU (Anders Olausson)

@item @uref{http://tips.pair.com, tips.pair.com} Enth�lt Tipps zu HTML, JavaScript, 2D-/3D-Grafiken und PHP3/MySQL. Alle Seiten werden aus einer Datenbank erzeugt.
@c Added 990614; EMAIL: downey@image.dk (Rune Madsen)

@item @uref{http://www.Softwarezrus.com/, Softwarezrus.com} E-Commerce-Site, die Computer verkauft.
@end itemize

@cindex Berater, Auflistung
@appendixsec Einige MySQL-Berater

@itemize @bullet

@item @uref{http://iConnect.de, iConnect GmbH Berlin}

@item @uref{http://www.ayni.com, Ayni AG}

@item @uref{http://worldcommunity.com/, Online-Datenbank}

@item @uref{http://www2.dataguard.no/,DataGuard (mit MySQL und PHP)}

@item @uref{http://wwits.net/programs/mysql.phtml, WWITS (mit MySQL und PHP)}

@item @uref{http://www.worldcommunity.com/, WCN - The World Community Network}

@item @uref{http://www.chipcastle.com, Chip Castle Dot Com Inc}
@c Added 990603 EMAIL: chip@chipcastle.com (Chip Castle)

@item @uref{http://www.cyber.com.au/, Cybersource Pty. Ltd}

@item @uref{http://www.spring.de, Spring infotainment GmbH & Co. KG}
@c added 990905 "Oliver Pischke" <opischke@spring.de>

@item @uref{http://www.wamdesign.com/, Entwickelt Websites mit MySQL}
@c Added 990905; max@wamdesign.com

@item @uref{http://www.berkeleyconsultants.com, Berkeley-Berater-Gruppe}

@item @uref{http://www.jammconsulting.com/, JAMM Consulting Inc.}

@end itemize

@appendixsec Programmierung

@cindex Websites, verschiedene
@appendixsec Nicht kategorisierte Seiten

@itemize @bullet

@item @uref{http://www.feature-showcase.com/htmls/demo_mysql.sql, AZC.COM's Feature Showcase}

@item @uref{http://www.teach.org.uk/subjects/trainingcourse/g.html, Kurssuche}

@item @uref{http://www.northerbys.com, Northerbys Online-Auktionen}

@item @uref{http://www.schiphol.nl/flights/home.htm, Amsterdamer Flughafen Schiphol}

@item @uref{http://TheMatrix.com/seventhsin/query.phtml, CD-Datenbank}

@item @uref{http://TheMatrix.com/~flmm/GEAR.html, Datenbank gebrauchter Audio-Ger�te}

@item @uref{http://www.kiss.de/musik-mueller, Notenbl�tter}

@item @uref{http://www.bagism.com, Bagism - Eine John-Lennon-Fanseite}

@item @uref{http://www.selftaught.com/, US-Folkart-Broker}

@item @uref{http://organizer.net/, Mail lesen auf dem Web}

@item @uref{http://www.mypage.org/, Kostenlose Homepages auf www.somecoolname.mypage.org}

@item @uref{http://www.schulweb.de/, Der Server f�r Schulen im Web (auf deutsch)}

@item @uref{http://www.ald.net/, Auldhaefen Online-Services}

@item @uref{http://www.cary.net/, CaryNET Information Center}

@item @uref{http://www.Dataden.com/, Dataden Computer Systems}

@item @uref{http://undree.grm.se/ undr@'emuseet (auf schwedisch)}

@item @uref{http://www.him.net/, HOMESITE Internet Marketing}

@item @uref{http://www.jade-v.com/techinfo.html, Jade-V Network Services }

@item @uref{http://ww2010.atmos.uiuc.edu/(Gl)/abt/aknw/tech.rxml, Weather World 2010 Technical Credits} @*

@item @uref{http://gimp.foebud.org/registry/doc/, �ber die Gimp-Plugin-Registrierung}

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.fast-inc.com/produkte/Archiver/database.html, Java-Werkzeug Archiver technical detail (leicht optimistisch was die MySQL-ANSI-92-Kompatibilit�t betrifft)}

@item @uref{http://www.gamesdomain.com/cheats/usrcheat.phtml, Games Domain Cheats Datenbank}

@item @uref{http://www.kcilink.com/poweredby/, The "Powered By" Page (Kcilink)}

@item @uref{http://www.netcasting.net/index.whtml, Netcasting}

@item @uref{http://homepages.tig.com.au/~mjj/nblTipps, NBL (Australian National Basketball League) tipping}

@item @uref{http://www.cgishop.com/, CGI-Shop}

@item @uref{http://www.whirlycott.com/, Whirlycott: Website-Design}

@item @uref{http://www.mtp.dk, Museum Tusculanum Press}

@item @uref{http://csdgi.historie.ku.dk/biblio, Centro Siciliano di Documentazione}

@item @uref{http://caribou.dyn.ml.org:8000, Quake-Statistik-Datenbank}

@item @uref{http://www.astroforum.ch, Astroforum: Astrologie und verwandte Dinge (auf deutsch)}

@item @uref{http://www.opendebate.com, OpenDebate - Interaktive Umfragen & Offene Diskussionen}

@item @uref{http://vermeer.organik.uni-erlangen.de/dissertationen/, Online-Server f�r Dissertationen im Bereich Chemie}

@item @uref{http://www.freschinfo.com, FreSch! The Free Scholarship Search Service}

@item @uref{http://www.nada.kth.se/~staffanu/pinball, Stockholmer Flipper-Finder}

@item @uref{http://www.hek.com, HEK - eine Baufirma}

@item @uref{http://www.nbi.nl, Elsevier Business Information}

@item @uref{http://vaccination.medicallink.se/, Medizinische Links (mit ColdFusion und MySQL)}

@item @uref{http://www.joblink-usa.com, Suche nach Jobs & Leuten auf JobLink-USA}

@item @uref{http://www.skydive.net/competfs, Competition Formation Skydiving}

@item @uref{http://www.galaxy-net.net/Galaxy-NET Telecommunikation, E-Commerce und interne Buchhaltung}

@item @uref{http://www.borsen.dk/, D�nemarks f�hrende Wirtschaftszeitung B@o{}rsen}

@item @uref{http://tmmm.simplenet.com/indb/, Die Internet-NES-Datenbank}

@item @uref{http://www.russia.cz, Reiseb�ro in Prag in 3 Sprachen}

@item @uref{http://www.linkstation.de, Linkstation}

@item @uref{http://www.peoplestaff.com, Durchsuchbare Online-Datenbank bei Peoplestaff}

@item @uref{http://www.dreamhorse.com, Durchsuchbares Datenbank-System f�r Pferde-bezogene Werbung}

@item @uref{http://pootpoot.com/,The Poot site}

@item @uref{http://grateful.net/hw_html/,"Playin' in the LAN"; Netzwerk-Monitoring-Suite}

@c Update von Christopher Milton <cmilton@bwn.net> 1999-12-21
@item @uref{http://www.usapa.army.mil,U.S. Army Publishing Agency}

@item @uref{http://www.nekretnine.co.yu/,Makler in Jugoslawien}

@item @uref{http://demo.cpsoft.com/pims/devFAQ.html, PIMS; Patienten-Informations-Management-System}

@item @uref{http://cpsoft.com,Pilkington Software Inc}

@item @uref{http://www.no-quarter.org/, Memorial f�r Vietnam-Veteranen (The Wall) - Datenbank}

@item @uref{http://www.gamers-union.com/,Gamer's Union ist auf Auktionen f�r gebrauchtes und nicht mehr gedrucktes Spiele-Material spezialisiert}

@item @uref{http://www.montereyhigh.com/office/dbul.php3, Ein t�gliches Bulletin an der Monterey-Highschool}

@item @uref{http://www.myEastside.com,Website der Gemeinde Lake
Washington's Eastside f�r Einwohner und Unternehmen}

@item @uref{http://bowling-france.net/, Franz�sische Bowling-Site}
@end itemize

Schicken Sie Erg�nzungen dieser Liste an @email{webmaster@@mysql.com}.

@page




@node MySQL-Benutzung durch Kunden, Contrib, Benutzer, Top
@c German node <no English equivalent>
@appendix MySQL-Benutzung durch Kunden

@cindex MySQL-Benutzung

Der Abschnitt 'Einige MySQL-Benutzer' enth�lt viele verschiedene Links zu
MySQL-Benutzern, aber wenig Informationen dar�ber, wie diese MySQL
benutzen. @xref{Benutzer}. Dieser Handbuch-Abschnitt soll Ihnen Anregungen
geben, wie MySQL f�r Probleml�sungen eingesetzt wird.

Dieser Abschnitt ist neu und wir planen, hier in B�lde weitere Geschichten
unterzubringen. Wenn Sie Interesse haben, teilzunehmen, und erz�hlen
wollen, wie Sie MySQL in einer einzigartigen Umgebung nutzen, oder
Erfolgsgeschichten zu Ihrer Benutzung von MySQL haben, schreiben Sie an
@code{docs@@mysql.com} mit Betreff @code{Success:}. Beachten Sie, dass es
einige Zeit bis zur Beantwortung dauern kann, da wir sehr besch�ftigt sind.

@itemize @bullet
@item 
@strong{Peter Zaitsev von Spylog.ru} schreibt:
Ich denke, die Gr��e meiner Datenbank k�nnte f�r Euch interessant sein.
Die gesamte Datenbank liegt momentan auf 15 Servern und enth�lt etwa 60.000
Tabellen, die etwa 5.000.000.000 Zeilen enthalten. Mein unter der h�chsten
Last stehender Server hat momentan etwa 10.000 Tabellen mit 1.000.000.000
Zeilen. Die gr��ten Tabellen enthalten etwa 50.000.000 Zeilen, und dieser
Wert wird sich noch steigern, wenn ich auf den 2.4-Kernel mit gro�en
Dateien umstelle. Momentan muss ich viele Logs f�r gro�e Sites l�schen, um
Tabellengr��e unter 2 GB zu halten.

@item
@strong{Texas Instruments} benutzt MySQL f�r die Handhabung von Tabellen,
die bis zu 2 Milliarden Zeilen in einer Validations-Regressions-Datenbank
enthalten.
@end itemize

@page




@node Contrib, Credits, MySQL-Benutzung durch Kunden, Top
@c German node Contrib
@appendix Beigesteuerte Programme

@cindex Beigesteuerte Programme
@cindex Programme, beigesteuerte

Viele Benutzer von MySQL haben @emph{sehr} n�tzliche Support-Werkzeuge und
Add-ons beigesteuert.

@ifclear web
Eine Auflistung, was unter @uref{http://www.mysql.com/Downloads/Contrib/}
(oder einem Mirror) verf�gbar ist, steht unten. Wenn Sie
MySQL-Unterst�tzung f�r die Perl-@code{DBI}/@code{DBD}-Schnittstelle bauen
wollen, sollten Sie sich @code{Data-Dumper}, @code{DBI} und die
@code{Msql-Mysql-modules}-Dateien holen und installieren.
@xref{Perl}.
@end ifclear

@appendix sec-APIs

@cindex Perl, Module
@itemize @bullet
@item Perl-Module
@itemize @minus
@item @uref{http://www.mysql.com/Downloads/Contrib/Data-Dumper-2.101.tar.gz, Data-Dumper-2.101.tar.gz}
Perl-@code{Data-Dumper}-Module. N�tzlich f�r
@code{DBI}/@code{DBD}-Unterst�tzung f�r �ltere Perl-Installationen.

@item @uref{http://www.mysql.com/Downloads/Contrib/DBI-1.15.tar.gz, DBI-1.15.tar.gz}
Perl-@code{DBI}-Module.

@item @uref{http://www.mysql.com/Downloads/Contrib/KAMXbase1.2.tar.gz,KAMXbase1.2.tar.gz}
Konvertiert zwischen @file{.dbf}-Dateien und MySQL-Tabellen. Perl-Module
geschrieben von Pratap Pereira @email{pereira@@ee.eng.ohio-state.edu},
erweitert von Kevin A. McGrail
@email{kmcgrail@@digital1.peregrinehw.com}. Dieser Konverter kann
MEMO-Felder handhaben.

@item @uref{http://www.mysql.com/Downloads/Contrib/Msql-Mysql-modules-1.2216.tar.gz, Msql-Mysql-modules-1.2216.tar.gz}
Perl-@code{DBD}-Module, um auf mSQL- und MySQL-Datenbanken zuzugreifen.

@item @uref{http://www.mysql.com/Downloads/Contrib/Data-ShowTable-3.3.tar.gz,  Data-ShowTable-3.3.tar.gz}
Perl-@code{Data-ShowTable}-Module. N�tzlich f�r @code{DBI}/@code{DBD}-Unterst�tzung.

@item @uref{http://www.mysql.com/Downloads/Contrib/HandySQL-1.1.tar.gz, HandySQL-1.1.tar.gz}
HandySQL ist ein MySQL-Zugriffsmodul. Es bietet eine C-Schnittstelle, die
in Perl eingebettet ist und ist ungef�hr 20% schneller als regul�res DBI.

@end itemize

@cindex JDBC
@item JDBC
@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/mm.mysql.jdbc-1.2c.tar.gz, mm.mysql.jdbc-1.2c.tar.gz}
Der mm-JDBC-Treiber f�r MySQL. Das ist ein Produktions-Release und wird
aktiv weiter entwickelt. Von Mark Matthews (@email{mmatthew@@ecn.purdue.edu}).

@item @uref{http://www.mysql.com/Downloads/Contrib/mm.mysql.jdbc-2.0pre5.tar.gz, mm.mysql.jdbc-2.0pre5.tar.gz}
Der mm-JDBC-Treiber f�r MySQL. Das ist eine Pre-Release-Beta-Version und
wird aktiv weiter entwickelt. Von Mark Matthews (@email{mmatthew@@ecn.purdue.edu}).
Die beiden obigen Treibern stehen unter LGPL-Lizenz. Bitte sehen Sie unter
@uref{http://www.worldserver.com/mm.mysql/} nach den aktuellsten Treibern
nach (und wegen weiterer JDBC-Informationen), weil diese Treibern
vielleicht schon veraltet sind.

@item @uref{http://www.caucho.com/Projekte/jdbc-mysql/index.xtp}
Der kommerzielle Resin-JDBC-Treiber, der unter Open Source ver�ffentlicht
wird. Er behauptet, schneller als der mm-Treiber zu sein, aber wir haben
dar�ber bislang noch nicht viele Informationen.

@item @uref{http://www.mysql.com/Downloads/Contrib/twz1jdbcForMysql-1.0.4-GA.tar.gz, twz1jdbcForMysql-1.0.4-GA.tar.gz}
Der twz-Treiber: Ein Typ-4-JDBC-Treiber von Terrence W. Zellers
@email{zellert@@voicenet.com}. Dieser ist kommerziell, aber kostenlos f�r
privaten und Schulungsgebrauch. (Wird nicht mehr unterst�tzt.)
@c no answer von Server 990830
@c You can always find the latest Treiber at @uref{http://www.voicenet.com/~zellert/tjFM/}.
@item @uref{http://www.mysql.com/Downloads/Contrib/pmdamysql.tgz,pmdamysql.tgz}
Ein MySQL-PMDA. Stellt MySQL-Serverstatus- und Konfigurationsvariablen zur
Verf�gung.
@end itemize

@cindex OLEDB
@item OLEDB
@itemize @bullet
@item @uref{http://www.mysql.com/downloads/Win32/MyOLEDB.exe, MyOLEDB.exe}
OLEDB-Handler f�r MySQL. Von SWsoft.
@item @uref{http://www.mysql.com/downloads/Win32/MySamples.zip, MySamples.zip}
Beispiele und Dokumentation f�r MyOLEDB. Von SWsoft.
@item @uref{http://www.mysql.com/downloads/Win32/Myoledb.zip, Myoledb.zip}
Quelltext f�r MyOLEDB. Von SWsoft.
@item @uref{http://www.mysql.com/downloads/Win32/MyOLEDB.chm, MyOLEDB.chm}
Hilfedateien f�r MyOLEDB.
@item @uref{http://www.mysql.com/downloads/Win32/libmyodbc.zip, libmyodbc.zip}
Statische MyODBC-Bibliothek zum Bauen von MyOLEDB. Basiert auf MyODBC-Code.
@end itemize

@cindex C++
@item C++
@itemize @bullet

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-c++-0.02.tar.gz, mysql-c++-0.02.tar.gz}
MySQL-C++-Wrapper-Bibliothek. Von Rolund Haenel,
@email{rh@@ginster.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MyDAO.tar.gz, MyDAO}
MySQL-C++-API. Von Satish @email{spitfire@@pn3.vsnl.net.in}. Inspiriert
von Rolund Haenels C++-API und Ed Carps MyC-Bibliothek.

@item @uref{http://www.mysql.com/download_mysql++.html, mysql++}
MySQL-C++-API (mehr als nur eine Wrapper-Bibliothek). Urspr�nglich von
@email{kevina@@clark.net}. Mittlerweile gepflegt von Sinisa bei MySQL AB.

@item @uref{http://nelsonjr.homepage.com/NJrAPI,NJrAPI}
Eine in C++ geschriebene, Datenbank-unabh�ngige Bibliothek, die MySQL
unterst�tzt.
@end itemize

@cindex Delphi
@item Delphi
@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/delphi-interface.gz, delphi-interface.gz}
Delphi-Schnittstelle zu @code{libmysql.dll}, von Blestan Tabakov,
@email{root@@tdg.bis.bg}.

@item @uref{http://www.mysql.com/Downloads/Contrib/DelphiMySQL2.zip, DelphiMySQL2.zip}
Delphi-Schnittstelle zu @code{libmysql.dll}, von @email{bsilva@@umesd.k12.or.us}.

@item @uref{http://www.mysql.com/Downloads/Contrib/Udmysel.pas, Udmysql.pas}
Ein Wrapper f�r libmysql.dll f�r die Benutzung in Delphi. Von Reiner Sombrowsky.

@item @uref{http://www.fichtner.net/delphi/mysql.delphi.phtml, Eine Delphi-Schnittstelle zu MySQL.}
Mit Quelltext. Von Matthias Fichtner.

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.productivity.org/projects/tmysql/, @strong{TmySQL}
Eine Bibliothek um MySQL mit Delphi zu benutzen}.

@item @uref{http://www.geocities.com/CapeCanaveral/2064/mysql.html, Delphi TDataset-component}.
@item
@item @uref{http://www.mysql.com/Downloads/Contrib/Win32/SBMySQL50Share.exe, Delphi 5 Shareware MySQL Dataset Components}
@end itemize

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-ruby-2.2.0.tar.gz, mysql-ruby-2.2.0.tar.gz}
MySQL Ruvon module. Von TOMITA Masahiro @email{tommy@@tmtm.org}
@uref{http://www.netlab.co.jp/ruby/, Ruby} ist eine objektorientierte Interpretersprache.

@item @uref{http://www.mysql.com/Downloads/Contrib/JdmMysqlTreiber-0.1.0.tar.gz,JdmMysqlTreiber-0.1.0.tar.gz}
Ein VisualWorks 3.0 Smalltalk-Treiber f�r MySQL. Von
@email{joshmiller@@earthlink.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/Db.py, Db.py}
Python-Modul mit Caching. Von @email{gundalf@@rosmail.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MySQLmodule-1.4.tar.gz, MySQLmodule-1.4.tar.gz}
Python-Schnittstelle f�r MySQL. Von Joseph Skinner @email{joe@@earthlight.co.nz}. Ge�ndert von Joerg Senekowitsch @email{senekow@@ibm.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MySQL-python-0.3.0.tar.gz, MySQL-python-0.3.0.tar.gz}
MySQLdb-Python ist eine DB-API v2.0-kompatible Schnittstelle zu MySQL.
Transaktionen werden unterst�tzt, wenn der Server und die Tabellen sie
unterst�tzen. Sie ist Thread-sicher und enth�lt ein Kompatibilit�tsmodul
f�r �lteren Code, der f�r die nicht mehr gepflegte
MySQLmodule-Schnittstelle geschrieben wurde.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_12.tar.gz, mysql_mex_1_12.tar.gz}
Ein Schnittstellenprogramm f�r das Matlab-Programm von MathWorks. Die
Schnittstelle wurde von Kimmo Uutela und John Fisher (nicht von Mathworks)
hergestellt. Siehe
@uref{http://boojum.hut.fi/~kuutela/mysqlmex.html,mysqlmex.html} wegen
weiterer Informationen.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqltcl-1.53.tar.gz, mysqltcl-1.53.tar.gz}
Tcl-Schnittstelle f�r MySQL. Basiert auf @file{msqltcl-1.50.tar.gz}.
Aktualisiert von Tobias Ritzau, @email{tobri@@ida.liu.se}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MyC-0.1.tar.gz, MyC-0.1.tar.gz}
Eine Visual-Basic-�hnliche API von Ed Carp.

@item @uref{http://www.mysql.com/Downloads/Contrib/sqlscreens-1.0.1.tar.gz, sqlscreens-1.0.1.tar.gz}
Tcl/Tk-Code, um Datenbank-Screens zu erzeugen. Von Jean-Francois Dockes.

@item @uref{http://www.mysql.com/Downloads/Contrib/Vdb-dflts-2.1.tar.gz, Vdb-dflts-2.1.tar.gz}
Das ist eine neue Version eines Satzes von Bibliothek-Dienstprogrammen, die
eine generische Schnittstelle zu SQL-Datenbank-Maschinen zur Verf�gung
stellen, um Ihre Applikation zu einer Stufe-3-Applikation (3-Tier) zu
machen. Der Vorteil ist, dass Sie sehr einfach zwischen verschiedenen
Datenbank-Maschinen umschalten bzw. zu anderen Datenbanken wechseln k�nnen.
Sie implementieren einfach eine Datei f�r das neue Backend und brauche
keinerlei �nderungen an Ihren Applikationen vorzunehmen. Von
@email{damian@@cablenet.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/DbFramework-1.10.tar.gz, DbFramework-1.10.tar.gz}
DbFramework ist eine Sammlung von Klassen zur Manipulation von
MySQL-Datenbanken. Die Klassen basieren lose auf der CDIF Data Model
Subject Area. Von Paul Sharpe @email{paul@@miraclefish.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/pike-mysql-1.4.tar.gz, pike-mysql-1.4.tar.gz}
MySQL-Modul f�r pike. Zur Benutzung mit dem Roxen-Webserver.

@item @uref{http://www.mysql.com/Downloads/Contrib/squile.tar.gz, squile.tar.gz}
Modul f�r @code{guile}, das es @code{guile} erlaubt, mit SQL-Datenbanken zu
interagieren. Von Hal Roberts.

@item @uref{http://www.mysql.com/Downloads/Contrib/stk-mysql.tar.gz, stk-mysql.tar.gz}
Interface f�r Stk. Stk ist Tk-widgets mit Scheme darunter anstelle von Tcl.
Von Terry Stefan.

@item @uref{http://www.mysql.com/Downloads/Contrib/eiffel-wrapper-1.0.tar.gz,eiffel-wrapper-1.0.tar.gz}
Eiffel-Wrapper von Michael Ravits.

@item @uref{http://www.mysql.com/Downloads/Contrib/SQLmy0.06.tgz,SQLmy0.06.tgz}
Ersetzbarer FlagShip-Datenbank-Treiber (RDD) f�r MySQL. Von Alejundro
Fernundez Herrero.
@uref{http://www.fship.com/rdds.html, Flagship-RDD-Homepage}

@item @uref{http://www.mysql.com/Downloads/Contrib/mydsn-1.0.zip,mydsn-1.0.zip}
Bin�rdatei und Quellcode f�r @code{mydsn.dll}. mydsn sollte benutzt werden,
um die DSN-Registrierungsdatei f�r den MyODBC-Treiber in
Coldfusion-Applikationen zu bauen und zu entfernen. Von Miguel Angel
Sol�rzano.

@item @uref{http://www.mysql.com/Downloads/Contrib/MySQL-ADA95_API.zip, MySQL-ADA95_API.zip}
Eine ADA95-Schnittstelle zur MySQL-API. Von Francois Fabien.

@item @uref{http://www.mysql.com/Downloads/Contrib/MyTool-DLL_for_VB_und_MySQL.zip, MyTool-DLL_for_VB_und_MySQL.zip}
Eine DLL mit MySQL-C-API f�r Visual Basic. 
Von Ken Menzel @email{kenm@@icarz.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MYSQLX.EXE, MYSQL.EXE}
MySQL-ActiveX-Objekt f�r den direkten Zugriff auf Ihre MySQL-Server von
IIS/ASP, VB und VC++ aus, der die langsameren ODBC-Methoden �berspringt.
Voll aktualisierbar, multi-threaded mit voller Unterst�tzung f�r alle
MySQL-Feldtypen (Version 2001.1.1). Von SciBit @uref{http://www.scibit.com/}.

@item @uref{http://www.fastflow.it/mylua/, MyLUA Homepage}
Wie man die LUA-Sprache benutzt, um MySQL-@code{PROCEDURE} zu schreiben,
das zur Laufzeit geladen werden kann.

@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/lua-4.0.tar.gz, Lua 4.0}
LUA 4.0
@item @uref{http://www.mysql.com/Downloads/Contrib/mylua-3.23.32.1.tar.gz, mylua-3.23.32.1.tar.gz}
Patch f�r MySQL 3.23.32, um LUA 4.0 zu benutzen. Von Cristian Giussani.
@end itemize

@item @uref{http://www.mysql.com/Downloads/Contrib/patched_myodbc.zip, patched_myodbc.zip}
Patch (f�r Omniform-4.0-Unterst�tzung) des MyODBC-Treibers.
Von Thomas Thaele @email{tthaele@@papenmeier.de}

@end itemize

@appendixsec  Clients

@itemize @bullet
@item Grafische Clients
@itemize @minus
@item @uref{http://www.ideit.com/produkte/dbvis/, DbVisualizer}.
Freeware-JDBC-Client, der Daten und Strukturen mehrerer Datenbanken auf
einmal grafisch visualisiert. Von Innovative-IT Development AB.

@item @uref{http://www.mysql.com/downloads/gui-clients.html, MySQLGUI}
Die MySQL-GUI-Client-Homepage. Von Sinisa bei MySQL AB.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_navigator_0.9.0.tar.gz, MySQL Navigator 0.9}
MySQL Navigator ist ein MySQL-Datenbank-Server-GUI-Client-Programm. Der
Zweck von MySQL Navigator ist, eine n�tzliche Schnittstelle zu
MySQL-Datenbank-Servern zur Verf�gung zu stellen, wobei mehrere
Betriebssysteme und Sprachen unterst�tzt werden. Momentan k�nnen Sie
Datenbanken importieren / exportieren, Anfragen eingeben, Ergebnismengen
holen, Skripte editieren, Skripte laufen lassen, Benutzer hinzuf�gen,
�ndern und l�schen, und Client- und Server-Informationen abrufen. Benutzt
QT 2.2. GPL @uref{http://sql.kldp.org/mysql, Homepage f�r MySQL Navigator}.

@item @uref{http://www.mysql.com/downloads/Win32/secman.zip,  MySQL-Sicherheits-GUI}
Eine Benutzer- und Sicherheitsverwaltungs-GUI f�r MySQL unter Windows. 
Von Martin Jeremic.
@uref{http://jsoft.webjump.com/, Homepage f�r MySQL-Sicherheits-GUI}.

@item @uref{http://www.mysql.com/Downloads/Contrib/kmysqladmin-0.4.1.tar.gz, kmysqladmin-0.4.1.tar.gz}.
@item @uref{http://www.mysql.com/Downloads/Contrib/kmysqladmin-0.4.1-1.src.rpm, kmysqladmin-0.4.1-1.src.rpm}.
@item @uref{http://www.mysql.com/Downloads/Contrib/kmysqladmin-0.4.1-1.i386.rpm, kmysqladmin-0.4.1-1.i386.rpm}
Ein Verwaltungswerkzeug f�r den MySQL-Server, das QT / KDE benutzt. Nur
unter Linux getestet.

@item
@uref{http://www.mysql.com/Downloads/Contrib/mysql-admin-using-java+swing.tar.gz, Java client mit Swing} Von Fredy Fischer,
@email{se-afs@@dial.eunet.ch}. Sie finden die letzte Version immer unter
@uref{http://www.trash.net/~ffischer/admin/index.html, hier}.

@item @uref{http://www.mysql.com/downloads/Win32/MySQL-Maker-1.0.zip,MySQL-Maker 1.0}.
Shareware-MySQL-Client f�r Windows. Ein WYSIWYG-Werkzeug, mit dem Sie
Datenbanken und Tabellen erzeugen, �ndern und l�schen k�nnen. Sie k�nnen
die Feldstruktur �ndern, Felder hinzuf�gen und Daten hinzuf�gen, �ndern und
l�schen, direkt ohne ODBC-Treiber.
@uref{http://www.presult.de/presult/frames/fs_mysqlmaker.html, MySQL-Maker-Homepage}

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqlwinadmn.zip, mysqlwinadmn.zip}
Windows-GUI (nur Bin�rdatei) zur Verwaltung einer Datenbank, von David B. Mansel,
@email{david@@zhadum.org}.

@item @uref{http://home.online.no/~runeberg/myqa, MyQA}
Ein Linux-basierender Anfrage-Client f�r den MySQL-Datenbank-Server. Mit
MyQA k�nnen Sie SQL-Anfragen eingeben, diese ausf�hren und die Ergebnisse
betrachten, alles in einer grafischen Benutzerschnittstelle. Die GUI �hnelt
grob dem 'Anfrage-Analyzer'-Client, der mit dem Microsoft SQL-Server
ausgeliefert wird.

@item @uref{http://members.xoom.com/_opex_/mysqlmanager/index.html, MySQL-Manager}
Ein grafischer MySQL-Server-Manager f�r MySQL-Server. Geschrieben in Java,
f�r Windows.


@item @uref{http://www.mysql.com/downloads/Win32/netadmin.zip, netadmin.zip}
Ein Verwaltungswerkzeug f�r MySQL unter Windows 95/98 und Windows NT 4.0.
Nur getestet mit MySQL-Versions 3.23.5 bis 3.23.7. Geschrieben mit den
Tmysql-Komponenten.

Sie k�nnen Anfragen schreiben und Tabellen darstellen, Indexe,
Tabellensyntax sowie Benutzer, Host und Datenbank verwalten und vieles
mehr. Das Werkzeug ist eine Beta-Version und hat noch viele Bugs. Sie
k�nnen das Programm mit allen Features testen. Bitte schicken Sie Bugs und
Hinweise an Marco Suess @email{ms@@it-netservice.de}. Original-URL
@url{http://www.it-netservice.de/pages/Software/index.html}.

@item @uref{http://www.mysql.com/downloads/Win32/netadmin2.zip, netadmin2.zip}
Neue Version von netadmin. Siehe oben wegen Details.

@item @uref{http://www.mysql.com/downloads/Win32/ARTADMIN203.EXE,Atronic's MySQL-Client f�r Windows 2.0.3.0}.
Die Homepage hierf�r ist unter @uref{http://www.artronic.hr}.

@item @uref{http://www.mysql.com/downloads/Win32/mysqlfront.zip, mysqlfront}
Homepage: @uref{http://www.mysqlfront.de/}.
Win32-Client f�r die Verwaltung von Datenbanken, Tabellen, Tabellendaten,
Indexen und Import-/Export-Dateien. Freeware. Von Ansgar Becker.

@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.mysql.com/downloads/Win32/W9xstop.zip,Dienstprogramm
von Artronic um MySQL unter Windows 9x anzuhalten}.

@item @uref{http://bardo.hyperlink.cz/mysqlmon,ein leichtgewichtiger GUI-Client f�r Windows}.

@item @uref{http://dbtools.vila.bol.com.br/, DB-Werkzeuge}
Ein Werkzeug zur Verwaltung von MySQL-Datenbanken. Momentan nur f�r
Windows. Einige Features:
@itemize @bullet
@item Verwaltung von Servern, Datenbanken, Tabellen, Spalten, Indexen und
Benutzern.
@item Import-Assistent, um Strukturen und Daten von MS Access, MS Excel,
Dbase, FoxPro, Paradox und ODBC Datenbanken zu �bernehmen.

@item @uref{http://www.mysql.com/Downloads/Contrib/KMYENG113.zip,KMYENG113.zip}
Eine Verwaltungs-GUI f�r MySQL. Funktioniert nur unter Windows, kein
Quellcode verf�gbar. Verf�gbar in englisch und japanisch. Von Mitunobu Kaneko.
Homepage: @uref{http://sql.jnts.ne.jp/}
@end itemize

@item @uref{http://www.mysql.com/Downloads/Contrib/xmysqladmin-1.0.tar.gz, xmysqladmin-1.0.tar.gz}
Ein X-basierendes Frontend zur MySQL-Datenbank-Maschine. Erlaubt Neuladen,
Status-Pr�fungen, Prozesssteuerung, myisamchk, grant/revoke-Berechtigungen,
Erzeugung von Datenbanken, L�schen von Datenbanken, Erzeugen, �ndern,
Durchsuchen und L�schen von Tabellen. Original von Gilbert Therrien,
@email{gilbert@@ican.net}, jetzt aber Public Domain und von MySQL AB
unterst�tzt.

@item @uref{http://www.mysql.com/Downloads/Contrib/xmysql-1.9.tar.gz, xmysql-1.9.tar.gz}.
@item @uref{http://web.wt.net/~dblhack, xmysql-Homepage}
Ein Frontend zur MySQL-Datenbank-Maschine, mit der man auf einfache Weise
Anfragen und Tabellenwartung durchf�hren kann sowie Stapel-Anfrragen. Von
Rick Mehalick, @email{dblhack@@wt.net}.
Erfordert @uref{http://bragg.phys.uwm.edu/xforms,xforms 0.88}, um zu
funktionieren.
@item @uref{http://www.tamos.net/sw/dbMetrix,dbMetrix}
Ein Open-Source-Client f�r das Durchsuchen von Datenbanken und die
Ausf�hrung von SQL. Unterst�tzt MySQL, Oracle, PostgreSQL und mSQL.
@item @uref{http://www.multimania.com/bbrox/GtkSQL,GtkSQL}
Ein Anfrage-Werkzeug f�r MySQL und PostgreSQL.
@item @uref{http://dbman.linux.cz/,dbMan}
Ein Anfrage-Werkzeug, geschrieben in Perl. Benutzt DBI und Tk.
@item @uref{http://www.mysql.com/downloads/Win32/Msc201.EXE, Mascon 202}
@item @uref{http://www.mysql.com/downloads/Win32/FrMsc202.EXE, Free Mascon 202}
Mascon ist eine m�chtige Win32-GUI f�r die Verwaltung von
MySQL-Server-Datenbanken. Die Features von Mascon beinhalten visuellen
Tabellenentwurf, Verbindungen zu mehrfachen Servern, Daten- und
Blob-Editierung von Tabellen, Sicherheitseinstellungen, SQL-Farb-Coding,
Dump-Funktionalit�t und vieles mehr.
@uref{http://www.scibit.com/produkte/Software/Utils/Mascon.asp,Mascon-Homepage}.
@item @uref{http://www.virtualbeer.net/dbui/,DBUI}
DBUI ist ein grafischer Gtk-Datenbank-Editor.
@item @uref{http://www.rtlabs.com/, MacSQL}
GUI f�r MySQL-, ODBC- und JDBC-Datenbanken f�r Mac OS.
@item @uref{http://www.caleb.com.au/, JRetriever}
JRetriever ist ein generisches Datenbank-Frontend-Werkzeug f�r
JDBC-kompatible Datenbanken, geschrieben mit Java 2. JRetriever zeigt
Datenbank- und Tabellenansichten in einem Windows-Explorer-�hnlichen
Frontend an. Der Benutzer kann Daten entweder durch Klicken auf den
Tabellen-Ordner oder durch das Zusammenstellen eigener SQL-Statements mit
dem eingebauten SQL-Editor abrufen. Das Werkzeug wurde mit Oracle 8 und
MySQL als Backend-Datenbanken getestet. Es erfordert JDK 1.3 von JavaSoft.
@item @uref{http://www.jetools.com/products/databrowser/, DataBrowser}
Der DataBrowser ist ein Datenbank- und Plattform-�bergreifendes
Datenzugriffswerkzeug. Es ist benutzerfreundlicher als Werkzeuge wie SQL
Plus, psql (kommandozeilenbasierende Werkzeuge). Es ist flexibler als TOAD,
ISQL und PGAccess, die als GUIs auf eine einzige Plattform oder Datenbank
beschr�nkt sind.
@item @uref{http://www.intrex.net/amit/Software/, SQLC}
Die SQL Console ist eine eigenst�ndige Java-Applikation, mit der Sie auf
ein SQL-Datenbanksystem zugreifen und SQL-Anfragen und -Aktualisierung
absetzen k�nnen. Es hat eine leicht benutzbare grafische
Benutzerschnittstelle. Die SQL Console benutzt JDBC, um sich mit dem
Datenbanksystem zu verbinden. Daher k�nnen Sie sich mit den richtigen
JDBC-Treibern mit diesem Dienstprogramm mit den beliebtesten
Datenbanksystemen verbinden.
@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mmc.zip, MySQL MMC}
MySQL MMC ist ein GUI-Management-Werkzeug, das mit kdevelop entwickelt
wurde. Es besitzt eine sehr gute Schnittstelle, die komplett Microsoft
Enterprise Tool (f�r SQL Server) oder Sybase Central �hnelt. Damit k�nnen
Sie Server, Datenbanken, Tabellen, Indexe und Benutzer verwalten und
Tabellendaten in Gittern editieren, sowie SQL ausf�hren.
@end itemize

@cindex Web-Clients
@item Web-Clients
@itemize @minus
@item @uref{http://www.mysql.com/Downloads/Contrib/mysqladmin-atif-1.0.tar.gz, mysqladmin-atif-1.0.tar.gz}
WWW-MySQL-Verwaltungswerkzeug f�r die @code{user}-, @code{db}- und
@code{host}-Tabellen. Von Tim Sailer, ge�ndert von Atif Ghaffar
@email{aghaffar@@artemedia.ch}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-webadmin-1.0a8-rz.tar.gz, mysql-webadmin-1.0a8-rz.tar.gz}
Ein in PHP-FI geschriebenes Werkzeug zur Verwaltung von MySQL-Datenbanken,
entfernt �ber das Web mit einem Web-Browser. Von Peter Kuppelwieser,
@email{peter.kuppelwieser@@kantea.it}. Aktualisiert von Wim Bonis,
@email{bonis@@kiss.de}. Wird nicht mehr gepflegt!

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqladm.tar.gz, mysqladm.tar.gz}
MySQL-Web-Datenbankadministration, geschrieben in Perl. Von Tim Sailer.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqladm-2.tar.gz, mysqladm-2.tar.gz}
Aktualisierte Version von @file{mysqladm.tar.gz}, von High Tide.

@item @uref{http://www.mysql.com/Downloads/Contrib/billowmysql.zip, billowmysql.zip}
Akualisierte Version von @file{mysqladm.tar.gz}, von Ying Gao. Sie erhalten
die neueste Version von @uref{http://civeng.com/sqldemo/, der Homepage}.

@item @uref{http://www.mysql.com/Downloads/Contrib/myadmin-0.4.tar.gz, myadmin-0.4.tar.gz}.
@item @uref{http://myadmin.cheapnet.net/, MyAdmin-Homepage}
Ein Web-basierender MySQL-Administrator von Mike Machado.

@item @uref{http://www.mysql.com/Downloads/Contrib/phpMyAdmin_2.2.0.tar.gz,phpMyAdmin_2.2.0.tar.gz}
Ein Satz von PHP3-Skripten, um MySQL �ber das WWW zu administrieren.

@item @uref{http://www.phpwizard.net/Projekte/phpMyAdmin/, phpMyAdmin Homepage}
Ein PHP3-Werkzeug im Geiste von mysql-webadmin, von Tobias Ratschiller,
tobias@@dnet.it.

@item @uref{http://www.mysql.com/Downloads/Contrib/useradm.tar.gz, useradm.tar.gz}
MySQL-Administrator in PHP. Von Ofni Thomas @email{othomas@@vaidSysteme.com}.

@item @uref{http://gossamer-thread.com/perl/mysqlman/mysql.cgi, MySQLMan}
�hnliche Funktionalit�t wie phpmyadmin, aber geschrieben in Perl und unter
Verwenden von HTML-Vorlagen. Von Alex Krohn.
@end itemize

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-editor.tar.gz,mysql-editor.tar.gz}
Mit diesen CGI-Skripten in Perl k�nnen Sie die Inhalte von
MySQL-Datenbanken editieren. Von Tomas Zeman.
@item
@uref{http://worldcommunity.com/openquelle/futuresql, FutureSQL Web-Datenbankadministrations-Werkzeug}.
FutureSQL von Peter F. Brown ist ein Open-Source-Web-Datenbank-Werkzeug f�r
die schelle Applikationsentwicklung. Geschrieben in Perl, verwendet MySQL.
Benutzt @code{DBI:DBD} und @code{CGI.pm}.

Mit FutureSQL k�nnen Sie schnell config-Dateien einrichten, um Datens�tze
einer MySQL-Datenbank zu betrachten, zu editieren, zu l�schen und
anderweitig zu verarbeiten. Es benutzt ein Daten-W�rterbuch,
Konfigurationsdateien und Vorlagen und erlaubt "Pre-Processing" und
"Post-Processing" von Feldern, Datens�tzen und Operationen.
@end itemize

@cindex Web-Werkzeuge
@cindex Werkzeuge,, Web
@appendixsec Web-Werkzeuge

@itemize @bullet

@item @uref{http://www.mysql.com/Downloads/Contrib/mod_mysql_include_1.0.tar.gz, mod_mysql_include_1.0.tar.gz}
Apache-Modul, um HTML von MySQL-Anfragen in Ihre Seiten zu integrieren und
um Aktualisierungsanfragen auszuf�hren. Urspr�nglich geschrieben, um ein
einfaches, schnelles Banner-Rotationssystem mit geringem Overhead zu
implementieren. Von Sasha Pachev.

@item @uref{http://htcheck.sourceforge.net, htCheck} - URL-�berpr�fer mit
MySQL-Backend. Gelistete (spidered) URLs k�nnen sp�ter abgefragt werden,
wobei SQL verwendet wird, um verschiedene Sorten von Information abzurufen,
z. B. Broken Links. Geschrieben von Gabriele Bartolini.

@item @uref{http://www.odbsoft.com/cook/sources.htm}
Dieses Paket hat diverse Funktionen zum Erzeugen von HTML-Code aus einer
SQL-Tabellenstruktur und zum Erzeugen von SQL-Statements (Select, Insert,
Update, Delete) aus einem HTML-Formular. Sie k�nnen komplette
Formular-Schnittstellen zu einer SQL-Datenbank bauen (Anfrage, Hinzuf�gen,
Aktualisierung, L�schen), ohne jedes Programmieren! Von Marc Beneteau, @email{marc@@odbsoft.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/sqlhtml.tar.gz, sqlhtml.tar.gz}
SQL/HTML ist ein HTML-Datenbankmanager f�r MySQL mit @code{DBI} 1.06.

@item @uref{http://www.mysql.com/Downloads/Contrib/udmsearch-3.0.23.tar.gz, UdmSearch 3.0.23 (stabile Version)}.
@c German FIX removed comma (",") to make description work inside uref
@item @uref{http://www.mysql.com/Downloads/Contrib/mnogosearch-3.1.12.tar.gz, mnogosearch 3.1.12 (Entwicklungs- aber empfohlene Version)}.
@item @uref{http://search.mnoGo.ru, UdmSearch-Homepage}
Eine SQL-basierende Suchmaschine f�rs Internet. Von Alexander I. Barkov @email{bar@@izhcom.ru}.

@item @uref{http://www.mysql.com/Downloads/Contrib/wmtcl.doc, wmtcl.doc}.
@item @uref{http://www.mysql.com/Downloads/Contrib/wmtcl.lex, wmtcl.lex}
Hiermit k�nnen Sie HTML-Dateien mit Einf�gungen von Tcl-Code schreiben. Von @email{vvs@@scil.npi.msu.su}.

@item @uref{http://www.mysql.com/Downloads/Contrib/www-sql-0.5.7.lsm, www-sql-0.5.7.lsm}.
@item @uref{http://www.mysql.com/Downloads/Contrib/www-sql-0.5.7.tar.gz, www-sql-0.5.7.tar.gz}
Ein CGI-Programm, das eine HTML-Datei mit speziellen Tags parst, die Tags
selbst parst und Daten aus einer MySQL-Datenbank einf�gt.

@item @uref{http://www.mysql.com/Downloads/Contrib/genquery.zip, genquery.zip}
Perl-SQL-Datenbankschnittstellenpaket f�r HTML.

@item @uref{http://www.mysql.com/Downloads/Contrib/cgi++-0.8.tar.gz, cgi++-0.8.tar.gz}
Ein Makro-Prozessor, um leicht CGI/Datenbank-Programme in C++ zu schreiben. Von Sasha Pachev.

@item  @uref{http://www.mysql.com/Downloads/Contrib/webboard-1.0.zip, WebBoard 1.0}
EU-Industries Internet-Message-Board.

@item @uref{http://www.mysql.com/Downloads/Contrib/DBIx-TextIndex-0.02.tar.gz, DBIx-TextIndex-0.02.tar.gz}
Volltextsuche mit Perl auf @code{BLOB}/@code{TEXT}-Spalten. Von Daniel Koch.
@end itemize

@cindex Werkzeuge, Benchmark-
@cindex Benchmark, Werkzeuge
@appendixsec Performance-Benchmark-Werkzeuge

@itemize @bullet
@item @uref{http://www.mysql.com/downloads/super-smack/super-smack-1.0.tar.gz,
 super-smack}
Multi-Threaded Benchmark-Werkzeug f�r MySQL und @strong{PostgreSQL}.
Geschrieben in C++. Leicht zu erweitern f�r die Unterst�tzung anderer
Datenbanken, die C/C++-Client-Bibliotheken haben. Von Sasha Pachev.
@end itemize

@cindex Werkzeuge, Authentifizierung
@cindex Authentifizierungswerkzeuge
@appendixsec Authentifizierungswerkzeuge

@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/ascend-radius-mysql-0.7.2.patch.gz,ascend-radius-mysql-0.7.2.patch.gz}
Das ist ein Authentifizierungs- und Logging-Patch, der MySQL f�r Ascend-Radius benutzt. Von @email{takeshi@@SoftAgency.co.jp}.

@item @uref{http://www.mysql.com/Downloads/Contrib/icradius-0.10.tar.gz, icradius 0.10}
@uref{http://www.mysql.com/Downloads/Contrib/icradius.README, icradius readme-Datei}.

@item @uref{http://www.mysql.com/Downloads/Contrib/checkpassword-0.81-mysql-0.6.6.patch.gz,
checkpassword-0.81-mysql-0.6.6.patch.gz}
MySQL-Authentifizierungs-Patch f�r QMAIL und checkpassword. Diese sind
n�tzlich f�r die Benutzerverwaltung (mail, pop account) von MySQL.
Von @email{takeshi@@SoftAgency.co.jp}.

@item @uref{http://www.mysql.com/Downloads/Contrib/jradius-diff.gz, jradius-diff.gz}
MySQL-Unterst�tzung f�r Livingston's Radius 2.01. Authentifizierung und
Abrechnung. Von Jose de Leon, @email{jdl@@thevision.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mod_auth_mysql-2.20.tar.gz, mod_auth_mysql-2.20.tar.gz}
Apache-Authentifizierungsmodul f�r MySQL. Von Zeev Suraski,
@email{bourbon@@netvision.net.il}.

@c @strong{Bitte} registrieren Sie dieses Modul unter:
@c @url{http://bourbon.netvision.net.il/mysql/mod_auth_mysql/register.html}.
@c Die Registrierungsinformationen werden nur f�r statistische Zwecke
@c benutzt und f�rdern die Weiterentwicklung dieses Moduls!

@item @uref{http://www.mysql.com/Downloads/Contrib/mod_log_mysql-1.05.tar.gz, mod_log_mysql-1.05.tar.gz}
MySQL-Loggingmodul f�r Apache. Von Zeev Suraski,
@email{bourbon@@netvision.net.il}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mypasswd-2.0.tar.gz, mypasswd-2.0.tar.gz}
Zusatz f�r @code{mod_auth_mysql}. Das kleine Werzeug erm�glicht Ihnen,
Benutzerdatens�tze hinzuzuf�gen oder zu �ndern, wobei Gruppen- und / oder
Passwort-Eintr�ge in MySQL-Tabellen gespeichert werden. Von Harry
Brueckner, @email{brueckner@@respublica.de}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-passwd.README, mysql-passwd.README}.
@item @uref{http://www.mysql.com/Downloads/Contrib/mysql-passwd-1.2.tar.gz, mysql-passwd-1.2.tar.gz}
Zusatz f�r @code{mod_auth_mysql}. Ein System aus zwei Bestandteilen zur
Benutzung mit @code{mod_auth_mysql}.

@item @uref{http://www.mysql.com/Downloads/Contrib/pam_mysql.tar.gz, pam_mysql.tar.gz}
Dieses Modul authentifiziert Benutzer via @code{pam}, mit MySQL.

@item @uref{http://www.mysql.com/Downloads/Contrib/nsapi_auth_mysql.tar, nsapi_auth_mysql.tar}
Netscape-Webserver-API- (NSAPI) Funktionen, um (BASIC) Benutzer gegen
MySQL-Tabellen zu authentifizieren. Von Yuan John Jiang.

@item @uref{http://www.mysql.com/Downloads/Contrib/qmail-1.03-mysql-0.6.6.patch.gz,qmail-1.03-mysql-0.6.6.patch.gz}
Patch f�r qmail, um Benutzer einer MySQL-Tabelle zu authentifizieren.
Von @email{takeshi@@SoftAgency.co.jp}.

@item @uref{http://www.mysql.com/Downloads/Contrib/proftpd-1.2.0rc2-fix-mysql.patch, proftpd-1.2.0rc2-fix-mysql.patch}
Patch f�r proftpd1.2.0rc2. Von @email{takeshi@@SoftAgency.co.jp}.

@item @uref{http://www.mysql.com/Downloads/Contrib/pwcheck_mysql-0.1.tar.gz,pwcheck_mysql-0.1.tar.gz}
Ein Authentifizierungsmodul f�r den Cyrus-IMAP-Server. Von Aaron Newsome.


@end itemize

@cindex Konverter
@appendixsec Konverter

@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/mssql2mysql.txt, mssql2mysql.txt}
Konverter von MS-SQL zu MySQL. Von Michael Kofler.
@uref{http://www.kofler.cc/mysql/mssql2mysql.html, mssql2mysql Homepage}.

@item @uref{http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.14.tar.gz, dbf2mysql-1.14.tar.gz}
Konvertiert zwischen @file{.dbf}-Dateien und MySQL-Tabellen. Von Maarten
Boekhold (@email{boekhold@@cindy.et.tudelft.nl}), William Volkman und
Michael Widenius. Dieser Konverter schlie�t rudiment�re Unterst�tzung (nur
lesen) f�r MEMO-Felder ein.

@item @uref{http://www.mysql.com/Downloads/Contrib/dbf2mysql-1.13.tgz, dbf2mysql-1.13.tgz}
Konvertiert zwischen @file{.dbf}-Dateien und MySQL-Tabellen. Von Maarten
Boekhold, @email{boekhold@@cindy.et.tudelft.nl} und Michael Widenius.
Dieser Konverter kann keine MEMO-Felder handhaben.

@item @uref{http://www.mysql.com/Downloads/Contrib/dbf2mysql.zip, dbf2mysql.zip}
Konvertiert zwischen FoxPro-@file{.dbf}-Dateien und MySQL-Tabellen unter Windows.
Von Alexunder Eltsyn, @email{ae@@nica.ru} oder @email{ae@@usa.net}.

@item @uref{http://www.mysql.com/Downloads/Contrib/dbf2sql.zip, dbf2sql.zip}
Kurzes, einfaches Programm, dass Ihnen bei der �berf�hrung Ihrer Daten von
Foxpro-Tabellen in MySQL-Tabellen helfen kann. Von Danko Josic.

@item @uref{http://www.mysql.com/Downloads/Contrib/dump2h-1.20.gz, dump2h-1.20.gz}
Konvertiert von einer @code{mysqldump}-Ausgabe in eine C-Header-Datei. Von
Harry Brueckner, @email{brueckner@@mail.respublica.de}.

@item @uref{http://www.mysql.com/Downloads/Contrib/exportsql.txt, exportsql.txt}
Ein Skript, das @code{access_to_mysql.txt} �hnelt, ausser dass dieses voll
konfigurierbar ist, eine bessere Typumwandlung hat (inklusive Erkennung von
@code{TIMESTAMP}-Feldern), bei der Konvertierung Warnungen und Vorschl�ge
bereit stellt, Anf�hrungszeichen, @strong{alle} Sonderzeichen in Text und
Bin�rdaten erkennt usw. Es konvertiert ausserdem nach @code{mSQL} Version 1
und 2, und kostet nichts. Siehe @uref{http://www.cynergi.net/exportsql/}
wegen der neuesten Version. Von Pedro Freire, @email{Support@@cynergi.net}.
@strong{HINWEIS:} Funktioniert nicht mit Access 2!

@item @uref{http://www.mysql.com/Downloads/Contrib/access_to_mysql.txt, access_to_mysql.txt}
Kopieren Sie diese Funktion in ein Access-Modul einer Datenbank, die die
Tabellen enth�lt, die Sie exportieren wollen. Siehe auch @code{exportsql}.
Von Brian Andrews. @strong{HINWEIS:} Funktioniert nicht mit Access 2!

@item @uref{http://www.mysql.com/Downloads/Contrib/importsql.txt, importsql.txt}
Ein Skript, das genau das Gegenteil von @code{exportsql.txt} macht. Es
importiert Daten von MySQL in eine Access-Datenbank via ODBC. Das ist sehr
handlich, wenn es mit exportsql kombiniert wird, weil Sie damit Access f�r
das Datenbank-Design und die -Administration verwenden k�nnen und das
Getane dann mit Ihrem MySQL-Server synchronisieren k�nnen. Siehe
@uref{http://www.netdive.com/freebies/importsql/} wegen Aktualisierungen.
Geschrieben von Laurent Bossavit von NetDIVE.
@strong{HINWEIS:} Funktioniert nicht mit Access 2!

@item @uref{http://www.mysql.com/Downloads/Contrib/mdatabase2sql.bas,
mdatabase2sql.bas}
Konverter von Access97 nach MySQL von Moshe Gurvich.

@item
@uref{http://www.mysql.com/Downloads/Contrib/msql2mysqlWrapper-1.0.tgz,
msql2mysqlWrapper 1.0}
Ein C-Wrapper von @code{mSQL} nach MySQL. Von @email{alfred@@sb.net}

@item @uref{http://www.mysql.com/Downloads/Contrib/sqlconv.pl, sqlconv.pl}
Ein einfaches Skript, das zum Kopieren von Feldern von einer MySQL-Tabelle
in eine andere im Massenverfahren benutzt werden kann. Im Wesentlichen
k�nnen Sie @code{mysqldump} laufen lassen und die Ausgabe an das
@code{sqlconv.pl}-Skript �bergeben. Das Skript parst die
@code{mysqldump}-Ausgabe und ordnet die Felder neu, so dass sie in die neue
Tabelle eingef�gt werden k�nnen. Ein Beispiel hierf�r ist, dass Sie eine
neue Tabelle f�r eine andere Site, an der Sie arbeiten, erstellen wollen,
die Tabelle jedoch ein bisschen anders ist (also die Felder in anderer
Reihenfolge hat usw.). Von Steve Shreeve.
@item @uref{http://www.mysql.com/Downloads/Contrib/oracledump oderacledump}
Perl-Programm, um Oracle-Datenbanken nach MySQL zu konvertieren. Hat
dasselbe Ausgabeformat wie mysqldump. Von Johan Andersson.

@item @uref{http://www.mysql.com/Downloads/Contrib/excel2mysql.pl, excel2mysql.pl}
Perl-Programm, um Excel-Tabellen in eine MySQL-Datenbank zu importieren.
Von Stephen Hurd @email{shurd@@sk.sympatico.ca}

@item @uref{http://www.mysql.com/Downloads/Contrib/T2S_100.ZIP, T2S_100.ZIP}.
Windows-Programm zum Konvertieren von Textdateien in MySQL-Datenbanken. Von
Asaf Azulay.

@end itemize

@appendixsec MySQL mit anderen Produkten benutzen

@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/emacs-sql-mode.tar.gz, emacs-sql-mode.tar.gz}
Raw-Portierung eines SQL-Modus f�r XEmacs. Unterst�tzt Vervollst�ndigung.
Original von Peter D. Pezaris @email{pez@@atlantic2.sbi.com} und teilweise
MySQL-Portierung von David Axmark.

@item @uref{http://www.mysql.com/downloads/Win32/myaccess97_1_4.zip, MyAccess97 1.4}.
@item @uref{http://www.mysql.com/downloads/Win32/myaccess2000_1_4.zip, MyAccess2000 1.4}.

MyAccess ist ein Add-In f�r MS-Access 97/2000, mit dem MySQL-Datenbanken
innerhalb von Access verwaltet werden k�nnen. Hauptfunktionen sind:
@itemize @minus
@item Erzeugen und �ndern von Tabellen
@item Anfragen an MySQL ausf�hren
@item ''Erzeugen von Tabellen-Skripten'' von MySQL
@item Importieren / Exportieren von Tabellen aus Access nach MySQL und umgekehrt
@item �nderungen mitschreiben (Log)
@item Einen Datenbank-Definitionsbericht anzeigen
@end itemize

Geschrieben von Hubertus Hiden. @uref{http://www.accessmysql.com, MyAccess-Homepage}.

@item @uref{http://www.mysql.com/Downloads/Contrib/radius-0.3.tar.gz, radius-0.3.tar.gz}
Patches f�r @code{radiusd}, damit es MySQL unterst�tzt. Von Wim Bonis,
@email{bonis@@kiss.de}.
@end itemize

@cindex Werkzeuge, n�tzliche
@appendixsec N�tzliche Werkzeuge

@itemize @bullet
@item @uref{http://worldcommunity.com/opensource/utilities/mysql_backup.html, MySQL-Datensicherung}.

Ein Datensicherungsskript f�r MySQL. Von Peter F. Brown.

@item @uref{http://www.mysql.com/Downloads/Contrib/mytop, mytop}
@item @uref{http://public.yahoo.com/~jzawodn/mytop/, mytop Homepage}
mytop ist ein Perl-Programm, mit dem Sie MySQL-Server beobachten k�nnen,
indem Sie aktive Threads, Anfragen und Server-Performance �ber alles
betrachten. Von Jeremy D. Zawodny.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_watchdog.pl, mysql_watchdog.pl}
Den MySQL-Daemon auf m�gliche Blockierungen �berwachen. Von Yermo Lamers,
@email{yml@@yml.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqltop.tar.gz, mysqltop.tar.gz}
Sendet eine Anfrage in einem festen Zeitintervall an den Server und zeigt
die Ergebnistabelle. Von Thomas Wana.
@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tar.gz,mysql_structure_dumper.tar.gz}
Gibt die Struktur aller Tabellen in einer Datenbank aus. Von Thomas Wana.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_structure_dumper.tgz, structure_dumper.tgz}
Gibt die Struktur aller Tabellen in einer Datenbank aus. Von Thomas Wana.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysqlsync, mysqlsync-1.0-alpha.tar.gz}.
Ein Perl-Skript, um entfernte Kopien einer MySQL-Datenbank mit einer
zentralen Master-Kopie synchronisiert zu halten. Von Mark Jeftovic. @email{markjr@@easydns.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/MySQLTutor-0.2.tar.gz, MySQLTutor}.
MySQLTutor. Ein MySQL-Tutorial f�r Anf�nger.

@item @uref{http://www.mysql.com/Downloads/Contrib/MySQLDB.zip, MySQLDB.zip}
Eine COM-Bibliothek f�r MySQL von Alok Singh.
@item @uref{http://www.mysql.com/Downloads/Contrib/MySQLDB-readme.html, MySQLDB-readme.html}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_replicate.pl, mysql_replicate.pl}
Perl-Programm, das Replikation handhabt. Von @email{elble@@icculus.nsg.nwu.edu}

@item @uref{http://www.mysql.com/Downloads/Contrib/DBIx-TextIndex-0.02.tar.gz, DBIx-TextIndex-0.02.tar.gz}
Perl-Skript, das umgekehrte Indexierung f�r Textsuchen benutzt. Von Daniel
Koch.

@item @uref{http://www.mysql.com/Downloads/Contrib/dbcheck, dbcheck}
Perl-Skript, das eine Datensicherung der Tabellen macht, bevor isamchk
darauf laufen gelassen wird. Von Elizabeth.

@item @uref{http://www.mysql.com/Downloads/Contrib/mybackup}.
@item @uref{http://www.mswanson.com/mybackup, mybackup-Homepage}
Wrapper f�r mysqldump, um alle Datenbanken zu sichern. Von Marc Swanson.

@item @uref{http://www.mysql.com/Downloads/Contrib/mdu.pl.gz,mdu.pl.gz}
Gibt die Speicherbenutzung einer MySQL-Datenbank aus.
@end itemize

@cindex RPMs, f�r gebr�uchliche Werkzeuge
@cindex Werkzeuge, RPMs f�r
@appendixsec RPMs f�r gebr�uchliche Werkzeuge (die meisten sind f�r RedHat 6.1)

@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/perl-Data-ShowTable-3.3-2.i386.rpm,perl-Data-ShowTable-3.3-2.i386.rpm}
@item @uref{http://www.mysql.com/Downloads/Contrib/perl-Msql-Mysql-modules-1.2210-2.i386.rpm,perl-Msql-Mysql-modules-1.2210-2.i386.rpm}
@item @uref{http://www.mysql.com/Downloads/Contrib/php-pg-3.0.13-1.i386.rpm,php-pg-3.0.13-1.i386.rpm}
@item @uref{http://www.mysql.com/Downloads/Contrib/php-pg-manual-3.0.13-1.i386.rpm,php-pg-manual-3.0.13-1.i386.rpm}
@item @uref{http://www.mysql.com/Downloads/Contrib/php-pg-mysql-3.0.13-1.i386.rpm,php-pg-mysql-3.0.13-1.i386.rpm}
@item @uref{http://www.mysql.com/Downloads/Contrib/phpMyAdmin-2.0.5-1.noarch.rpm,phpMyAdmin-2.0.5-1.noarch.rpm}
@end itemize

@cindex Funktionen, n�tzliche
@appendixsec N�tzliche Funktionen
@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/mysnprintf.c,mysnprintf.c}
sprintf()-Funktion f�r SQL-Anfragen, die Blobs escapen kann. Von Chunhua Liu.
@end itemize

@appendixsec Windows-Programme
@itemize @bullet
@item @uref{http://www.mysql.com/Downloads/Contrib/LaunchMySQL.zip, LaunchMySQL.zip}
Das Programm startet den MySQL-Server, f�hrt ihn herunter und gibt
Status-Informationen aus. Von Bill Thompson
@end itemize

@appendixsec Nicht kategorisiert

@itemize @bullet

@item @uref{http://www.mysql.com/Downloads/Contrib/findres.pl, findres.pl}
Findet reservierte W�rter in Tabellen. Von Nem W Schlecht.

@item @uref{http://www.mysql.com/Downloads/Contrib/handicap.tar.gz, handicap.tar.gz}
Performance-Handicapping-System f�r Yachten. Benutzt PHP. Von
@email{rhill@@stobyn.ml.org}.

@item @uref{http://www.mysql.com/Downloads/Contrib/hylalog-1.0.tar.gz, hylalog-1.0.tar.gz}
Speichert ausgehende @code{hylafax}-Faxe in einer MySQL-Datenbank. Von
Sinisa Milivojevic, @email{sinisa@@mysql.com}.

@item @uref{http://www.mysql.com/Downloads/Contrib/mrtg-mysql-1.0.tar.gz, mrtg-mysql-1.0.tar.gz}
MySQL-Status-Ausgabe mit MRTG, von Luuk de Boer, @email{luuk@@wxs.nl}.

@item @uref{http://www.mysql.com/Downloads/Contrib/wuftpd-2.4.2.18-mysql_Support.2.tar.gz, wuftpd-2.4.2.18-mysql_Support.2.tar.gz}
Patches, um Loggen nach MySQL f�r WU-ftpd hinzuzuf�gen. Von Zeev Suraski,
@email{bourbon@@netvision.net.il}.

@item @uref{http://www.mysql.com/Downloads/Contrib/wu-ftpd-2.6.0-mysql.4.tar.gz,wu-ftpd-2.6.0-mysql.4.tar.gz}
Patches, um Loggen nach MySQL f�r WU-ftpd 2.6.0 hinzuzuf�gen. Von
@email{takeshi@@SoftAgency.co.jp}, basierend auf den
Zeev-Suraski-wuftpd-Patches.

@item @uref{http://www.mysql.com/Downloads/Contrib/Old-Versions, Alte Versionen}
Fr�here Versionen von Dingen in diesen Listen, an denen Sie wahrscheinlich
nicht interessiert sind.
@end itemize
@page




@node Credits, News, Contrib, Top
@c German node Danksagungen
@appendix Danksagungen

@cindex Entwickler, Auflistung

Dieser Anhang listet die Entwickler, Kontributoren und Unterst�tzer auf,
die mitgeholfen haben, dass MySQL das wird, was es heute ist.



@menu
* Developers::                  
* Contributors::                
* Supporters::                  
@end menu

@node Developers, Contributors, Credits, Credits
@c German node Entwickler
@appendixsec Entwickler bei MySQL AB

Hier sind die Entwickler, die von @code{MySQL AB} angestellt wurden, um an 
@code{MySQL} zu arbeiten, ungef�hr in der Reihenfolge ihres Eintritts. 
Neben dem Namen wird aufgelistet, f�r welche Teilaufgaben der Entwickler 
verantwortlich ist oder welche Leistungen er erbracht hat.

@table @asis
@item Michael (Monty) Widenius
Schrieb folgende Bestandteile von MySQL:
@itemize @bullet
@item
Den gesamten Haupt-Code in @code{mysqld}.
@item
Neue Funktionen f�r die Zeichenketten-Bibliothek.
@item
Das meiste der @code{mysys}-Bibliothek.
@item
Die @code{ISAM}- und @code{MyISAM}-Bibliotheken (B-Baum-Index-Datei-Handler
mit Index-Komprimierung und verschiedenen Datensatzformaten).
@item
Die @code{HEAP}-Bibliothek. Ein Speicher-Tabellensystem mit unserem
�berragenden komplett dynamischen Hashing. In Gebrauch seit 1981 und
ver�ffentlicht um 1984.
@item
Das @code{replace}-Programm (ansehen, es ist COOL!).
@item
@strong{MyODBC}, den ODBC-Treiber f�r Windows95.
@item
Behob Bugs in MIT-pThread, um sie f�r MySQL zum Laufen zu bringen, sowie
Unireg, ein curses-basierendes Applikationswerkzeug vielen Utilities.
@item
Portierung von @code{mSQL}-Werkzeugen wie @code{msqlperl},
@code{DBD}/@code{DBI} und @code{db2mysql}.
@item
Das meiste von Crash-me und die Grundlage f�r die MySQL-Benchmarks.
@end itemize

@item David Axmark
@itemize @bullet
@item
Koordinator und urspr�nglicher Haupt-Schreiber des
@strong{Referenzhandbuchs}, inklusive Verbesserungen von @code{texi2HTML}.
@item
Automatische Website-Aktualisierung des Handbuchs.
@item
Urspr�ngliche Autoconf-, Automake- und Libtool-Unterst�tzung.
@item
Den Lizensierungs-Kram.
@item
Teile all der Textdateien. (Heutzutage ist nur noch die @file{README}
�brig. Der Rest befindet sich im Handbuch.)
@item
Viel Testen neuer Features.
@item
Unser ``kostenloser'' Inhouse-Software-Anwalt.
@item
Derjenige, der die Mailing-Liste wartet (und nie die Zeit hatte, es richtig
zu machen ...)
@item
Unser Original-Portabilit�tscode (jetzt mehr als 10 Jahre alt). Heutzutage
sind nur noch Teile von @code{mysys} �brig.
@item
Jemand, den Monty mitten in der Nacht anrufen kann, wenn er gerade das neue
Feature zum Laufen gebracht hat.
@end itemize

@item Jani Tolonen
@itemize @bullet
@item
@code{mysqlimport}
@item
Etliche Erweiterungen zum @code{mysql}-Client.
@item
@code{Prozeduranalyse()}
@end itemize

@item Sinisa Milivojevic
@itemize @bullet
@item
Kompression (mit @code{zlib}) im Client-Server-Protokoll.
@item
Perfektes Hashing f�r die lexikalische Analyse-Phase.
@item
Den MySQLGUI-Client.
@item
Derjenige, der mysql++ wartet.
@end itemize

@item Tonu Samuel
@itemize @bullet
@item
Unser Sicherheitsexperte.
@item
Vio-Schnittstelle (die Grundlage f�r das verschl�sselte Client-Server-Protokoll).
@item
MySQL-Dateisystem (eine Art, MySQL-Datenbanken als Dateien und
Verzeichnisse zu benutzen).
@item
Den CASE-Ausdruck.
@item
Die MD5()- und COALESCE()-Funktionen.
@item
@code{RAID}-Unterst�tzung f�r @code{MyISAM}-Tabellen.
@end itemize

@item Sasha Pachev
@itemize @bullet
@item
Replikation.
@item
@code{SHOW CREATE TABLE}.
@item
mod_mysql_include
@item
cgi++
@item
mysql-bench
@end itemize

@item Matt Wagner
@itemize @bullet
@item
MySQL-Test-Suite.
@item
Unser Webmaster.
@end itemize

@item Miguel Solorzano
@itemize @bullet
@item
Winmysqladmin.
@end itemize

@item Timothy Smith
@itemize @bullet
@item
Dynamische Zeichen-Unterst�tzung.
@item
Verantwortlich f�r MySQL-configure.
@end itemize

@item Sergei Golubchik
@itemize @bullet
@item
Volltextsuche.
@item
F�gte Schl�ssel zur @code{MERGE}-Bibliothek hinzu.
@end itemize

@item Jeremy Cole
@itemize @bullet
@item

Korrekturlesen und Editieren dieses netten Handbuchs.
@item
@code{ALTER TABLE ... ORDER BY ...}.
@item
@code{UPDATE ... ORDER BY ...}.
@item
@code{DELETE ... ORDER BY ...}.
@end itemize

@item John Dean
@itemize @bullet
@item
Den MySQL-GUI-Client.
@end itemize

@item Indrek Siitan
@itemize @bullet
@item
Designer / Programmierer unserer Web-Schnittstelle.
@end itemize
@end table

Folgende Nicht-Entwickler arbeiten ebenfalls bei oder zusammen mit MySQL
AB:

@table @asis
@item
Hans Kierkegaard - verantwortlich f�r die MySQL-Lizenz-Handhabung.
@item
Antti Halonen - Vertriebsleiter.
@item
Jonas Norrman - Beantwortet Lizensierungsfrage, die an
@email{info@@mysql.com} geschickt werden.
@item
Erik Granberg - bedient MySQL-Partner (und eine Menge sonstiger Kram).
@item
Allan Larsson (der BOSS f�r TCX DataKonsult AB).
@end table


@node Contributors, Supporters, Developers, Credits
@c German node Kontributoren
@appendixsec Kontributoren zu MySQL

@cindex Kontributoren, Auflistung

W�hrend @code{MySQL AB} das gesammte Copyright f�r den @code{MySQL Server}
und das @code{MySQL manual} besitzt, m�chten wir hier diejenigen Menschen
nennen, die das Ein oder Andere zur @code{MySQL Distribution} beigetragen
haben. Die Kontributoren sind in eher zuf�lliger Reihenfolge aufgef�hrt:

@table @asis
@item Paul DuBois
Hilft mit, das Referenzhandbuch korrekt und verst�ndlich zu machen. Das
beinhaltet, Montys und Davids Englischversuche in das Englisch zu
�bertragen, das andere Leute kennen.
@item Gianmassimo Vigazzola @email{qwerg@@mbox.vol.it} oder @email{qwerg@@tin.it}
Die urspr�ngliche Portierung auf Win32/NT.
@item Kim Aldale
Half, Montys und Davids fr�he Englischversuche ins Englische umzuschreiben.
@item Per Eric Olsson
Mehr oder weniger konstruktive Kritik und Testen des dynamischen
Datensatzformats.
@item Irena Pancirov @email{irena@@mail.yacc.it}
Win32-Portierung mit dem Borland-Compiler. @code{mysqlshutdown.exe} und
@code{mysqlwatch.exe}
@item David J. Hughes
Er bem�hte sich, eine Shareware-SQL-Datenbank herzustellen. Wir bei TcX
fingen mit @code{mSQL} an, fanden aber, dass es unsere Bed�rfnisse nicht
befriedigen k�nne, daher schrieben wir stattdessen eine SQL-Schnittstelle
zu unserem Applikation-Builder Unireg.  @code{mysqladmin} und @code{mysql}
sind Programme, die stark von ihren @code{mSQL}-Pendants beeinflusst sind.
Wir haben uns gro�e M�he gegeben, die MySQL-Syntax zu einer Obermenge von
@code{mSQL} zu machen. Viele API-Ideen sind von @code{mSQL} entliehen,
damit es einfach ist, kostenlose @code{mSQL}-Programme nach MySQL zu
portieren. MySQL enth�lt keinen Code von @code{mSQL}. Zwei Dateien in der
Distribution (@file{client/insert_test.c} und @file{client/select_test.c})
basieren auf den entsprechenden (keinem Copyright unterliegenden) Dateien
in der @code{mSQL}-Distribution, sind aber als Beispiele abge�ndert, die
die notwendigen �nderungen aufzeigen, wenn man Code von @code{mSQL} nach
MySQL konvertiert. (@code{mSQL} unterliegt dem Copyright von David J. Hughes.)
@item Fred Fish
Seine exzellente C-Debugging- und Trace-Bibliothek. Monty hat eine Reihe
kleinerer Verbesserungen an der Bibliothek vorgenommen (Geschwindigkeit und
zus�tzliche Optionen).
@item Richard A. O'Keefe
Seine Public-Domain-Zeichenketten-Bibliothek.
@item Henry Spencer
Seine Regex-Bibliothek, benutzt bei @code{WHERE spalte REGEXP regexp}.
@item Free Software Foundation
Von ihnen haben wir einen exzellenten Compiler (@code{gcc}), die
@code{libc}-Bibliothek (aus der wir @file{strto.c} entliehen haben, damit
einiger Code unter Linux funktioniert), und die @code{readline}-Bibliothek
(f�r den @code{mysql}-Client).
@item Free Software Foundation und das XEmacs-Entwicklungsteam
Ihr gro�artiger Editor, der f�r fast jeden Artikeltext bei TcX/MySQL
AB/detron benutzt wird.
@item Patrick Lynch
F�r seine Hilfe bei @code{http://www.mysql.com/}.
@item Fred Lindberg
Er half, qmail aufzusetzen, um die MySQL Mailing-Liste zu handhaben, und
f�r seine unglaubliche Unterst�tzung bei der Verwaltung der MySQL
Mailing-Listen.
@item Igor Romanenko @email{igor@@frog.kiev.ua}
@code{mysqldump} (vormals @code{msqldump}, aber portiert und verbessert von
Monty).
@item Yuri Dario
Er unterh�lt die MySQL-OS/2-Portierung und baut sie aus.
@item Tim Bunce, Alligator Descartes
F�r die @code{DBD}-(Perl)-Schnittstelle.
@item Tim Bunce
Autor von @code{mysqlhotcopy}.
@item Andreas Koenig @email{a.koenig@@mind.de}
F�r die Perl-Schnittstelle zu MySQL.
@item Eugene Chan @email{eugene@@acenet.com.sg}
F�r den Port von PHP zu MySQL.
@item Michael J. Miller Jr. @email{mke@@terrapin.turbolift.com}
Er schrieb das erste MySQL-Handbuch, und nahm etliche Bereinigungen der
Rechtschreibung / Sprache f�r die FAQ vor (aus dieser entstand vor langer
Zeit das MySQL-Handbuch).
@item Yan Cailin
Erster �bersetzer des MySQL-Referenzhandbuch in vereinfachtes Chinesisch,
Anfang 2000, auf der die Big5- und HK-kodierten Versionen
(@uref{http://mysql.hitstar.com, mysql.hitstar.com}) basieren.
@uref{http://linuxdb.yeah.net, Private Homepage bei linuxdb.yeah.net}.
@item Giovanni Maruzzelli @email{maruzz@@matrice.it}
F�r die Portierung von iODBC (Unix ODBC).
@item Chris Provenzano
Portierbarer Benutzerebene-pThread. Aus dem Copyright: Dieses Produkt
beinhaltet Software, die von Chris Provenzano, University of California,
Berkeley und Kontributoren entwickelt wurde. Momentan benutzen wir Version
1_60_beta6, die von Monty gepatcht wurde (siehe @file{with-pThread/Changes-mysql}).
@item Xavier Leroy @email{Xavier.Leroy@@inria.fr}
Der Autor von LinuxThread (benutzt von MySQL unter Linux).
@item Zarko Mocnik @email{zarko.mocnik@@dem.si}
Sortieren f�r slowenische Sprache und die @file{cset.tar.gz}-Module, die es
vereinfachen, andere Zeichens�tze hinzuzuf�gen.
@item "TAMITO" @email{tommy@@valley.ne.jp}
Die @code{_MB}-Zeichensatz-Makros und die ujis- und sjis-Zeichens�tze.
@item Joshua Chamas @email{joshua@@chamas.com}
Grundlage f�r gleichzeitige Einf�geoperationen, erweiterte Datums-Syntax,
Debuggen unter NT und Antworten in der MySQL-Mailing-Liste.
@item Yves Carlier @email{Yves.Carlier@@rug.ac.be}
@code{mysqlaccess}, ein Programm, das die Zugriffsrechte f�r einen Benutzer
anzeigt.
@item Rhys Stefan @email{rhys@@wales.com} (und GWE Technologies Limited)
F�r JDBC, ein Modul, um Daten aus MySQL mit einem Java-Client zu
extrahieren.
@item Dr. Xiaokun Kelvin ZHU @email{X.Zhu@@brad.ac.uk}
Weiterentwicklung der JDBC-Treiber und anderer MySQL-bezogener
Java-Werkzeuge.
@item James Cooper @email{pixel@@organic.com}
Aufsetzen eines durchsuchbaren Mailing-Listen-Archivs auf seiner Site.
@item Rick Mehalick @email{Rick_Mehalick@@i-o.com}
F�r @code{xmysql}, einen grafischen X-Client f�r MySQL.
@item Doug Sisk @email{sisk@@wix.com}
Er stellt RPM-Pakete von MySQL f�r RedHat Linux bereit.
@item Diemund Alexunder V. @email{axeld@@vial.ethz.ch}
Er stelle RPM-Pakete von MySQL f�r RedHat Linux-Alpha bereit.
@item Antoni Pamies Olive @email{toni@@readysoft.es}
Er stellt RPM-Versionen vieler MySQL-Clients f�r Intel und SPARC bereit.
@item Jay Bloodworth @email{jay@@pathways.sde.state.sc.us}
Er stellte RPM-Versionen f�r MySQL-Version 3.21 bereit.
@item Jochen Wiedmann @email{wiedmann@@neckar-alb.de}
F�r die Wartung der Perl-@code{DBD::mysql}-Module.
@item Therrien Gilbert @email{gilbert@@ican.net}, Jean-Marc Pouyot @email{jmp@@scalaire.fr}
Franz�sische Fehlermeldungen.
@item Petr snajdr, @email{snajdr@@pvt.net}
Tschechische Fehlermeldungen.
@item Jaroslaw Lewundowski @email{jotel@@itnet.com.pl}
Polnische Fehlermeldungen.
@item Miguel Angel Fernundez Roiz
Spanische Fehlermeldungen.
@item Roy-Magne Mo @email{rmo@@www.hivolda.no}
Norwegische Fehlermeldungen und Testen von Version 3.21.#.
@item Timur I. Bakeyev @email{root@@timur.tatarstan.ru}
Russische Fehlermeldungen.
@item @email{brenno@@dewinter.com} && Filippo Grassilli @email{phil@@hyppo.com}
Italienische Fehlermeldungen.
@item Dirk Munzinger @email{dirk@@trinity.saar.de}
Deutsche Fehlermeldungen.
@item Billik Stefan @email{billik@@sun.uniag.sk}
Slowakische Fehlermeldungen.
@item Stefan Saroiu @email{tzoompy@@cs.washington.edu}
Rum�nische Fehlermeldungen.
@item Peter Feher
Ungarische Fehlermeldungen.
@item Roberto M. Serqueira
Portugiesische Fehlermeldungen.
@item Carsten H. Pedersen
D�nische Fehlermeldungen
@item David Sacerdote @email{davids@@secnet.com}
Knowhow f�r die Sicherheitspr�fung von DNS-Hostnamen.
@item Wei-Jou Chen @email{jou@@nematic.ieo.nctu.edu.tw}
Unterst�tzung f�r chinesisch(BIG5)-Zeichen.
@item  Wei He @email{hewei@@mail.ied.ac.cn}
Viel Funktionalit�t f�r den chinesischen (GBK-) Zeichensatz.
@item Zeev Suraski @email{bourbon@@netvision.net.il}
@code{FROM_UNIXTIME()}-Zeitformatierung, @code{ENCRYPT()}-Funktionen und
@code{bison}-Ratgeber.
Aktives Mitglied der Mailing-Liste.
@item Luuk de Boer @email{luuk@@wxs.nl}
Portierte (und erweiterte) die Benchmark-Suite f�r @code{DBI}/@code{DBD}.
War eine gro�e Hilfe bei @code{Crash-me} und beim Laufenlassen von
Benchmarks. Einige neue Datumsfunktionen. Das mysql_setpermissions-Skript.
@item Jay Flaherty @email{fty@@mediapulse.com}
Gro�e Teile des Perl-@code{DBI}/@code{DBD}-Abschnitts im Handbuch.
@item Paul Southworth @email{pauls@@etext.org}, Ray Loyzaga @email{yar@@cs.su.oz.au}
Korrekturlesen des Referenzhandbuchs.
@item Alexis Mikhailov @email{root@@medinf.chuvashia.su}
Benutzerdefinierte Funktionen (UDFs); @code{CREATE FUNCTION} und
@code{DROP FUNCTION}.
@item Andreas F. Bobak @email{bobak@@relog.ch}
Die @code{AGGREGATE}-Erweiterung f�r UDF-Funktionen.
@item Ross Wakelin @email{R.Wakelin@@march.co.uk}
Half, InstallShield f�r MySQL-Win32 aufzusetzen.
@item Jethro Wright III @email{jetman@@li.net}
Die @file{libmysql.dll}-Bibliothek.
@item James Pereria @email{jpereira@@iafrica.com}
Mysqlmanager, ein grafisches Win32-Werkzeug f�r die Administration von MySQL.
@item Curt Sampson @email{cjs@@portal.ca}
Portierung von MIT-pThread auf NetBSD/Alpha und NetBSD 1.3/i386.
@item Antony T. Curtis @email{antony.curtis@@olcs.net}
Portiierung von MySQL auf OS/2.
@item Martin Ramsch @email{m.ramsch@@computer.org}
Beispiele im MySQL-Tutorial.
@item Steve Harvey
Er machte @code{mysqlaccess} sicherer.
@item Konark IA-64 Centre of Persistent Systems Private Limited
@uref{http://www.pspl.co.in/konark/}. Hilfe bei der Win64-Portierung des
MySQL-Servers.
@item Albert Chin-A-Young.
Configure-Aktualisierungen f�r Tru64, Unterst�tzung gro�er Dateien und
verbesserte Unterst�tzung von TCP-Wrappern.
@item John Birrell
Emulation von pthread_mutex() f�r OS/2.
@item Benjamin Pflugmann
Erweiterte @code{MERGE}-Tabellen, so dass sie @code{INSERTS} handhaben.
Aktives Mitglied der MySQL-Mailing-Listen.
@end table

Andere Kontributoren, Bug-Finder und Tester: James H. Thompson, Maurizio
Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar
Haneke, @email{jehamby@@lightside}, @email{psmith@@BayNetworks.com},
@email{duane@@connect.com.au}, Ted Deppner @email{ted@@psyber.com},
Mike Simons, Jaakko Hyvatti.

Und viele Bug-Berichte und Patches von den Leuten auf der Mailing-Liste.

Gro�e Anerkennung zollen wir denjenigen, die uns halfen, Fragen auf der
@code{mysql@@lists.mysql.com}-Mailing-Liste zu beantworten:

@table @asis
@item Daniel Koch @email{dkoch@@amcity.com}
Irix-Setup.
@item Luuk de Boer @email{luuk@@wxs.nl}
Benchmark-Fragen.
@item Tim Sailer @email{tps@@Benutzer.buoy.com}
@code{DBD-mysql}-Fragen.
@item Boyd Lynn Gerber @email{gerberb@@zenez.com}
SCO-bezogene Fragen.
@item Richard Mehalick @email{RM186061@@shellus.com}
@code{xmysql}-bezogene Fragen und grunds�tzliche Installationsfragen.
@item Zeev Suraski @email{bourbon@@netvision.net.il}
Fragen zur Apache-Modul-Konfiguration (log & auth), PHP-bezogene Fragen,
SQL-Syntax-bezogene Fragen und andere allgemeine Fragen.
@item France Guasch @email{frankie@@citel.upc.es}
Allgemeine Fragen.
@item Jonathan J Smith @email{jsmith@@wtp.net}
Fragen zu Betriebssystem-spezifschen Dingen bei Linux, SQL-Syntax- und
andere Dinge, die etwas �berarbeitung bed�rfen.
@item David Sklar @email{sklar@@student.net}
MySQL von PHP und Perl aus benutzen.
@item Alistair MacDonald @email{A.MacDonald@@uel.ac.uk}
Noch nicht festgelegt, aber er ist flexibel und kann Linux und vielleicht
HP-UX handhaben. Wird versuchen, Benutzer dazu zu bringen, @code{mysqlbug}
zu benutzen.
@item John Lyon @email{jlyon@@imag.net}
Fragen zur Installation von MySQL auf Linux-Systemen, entweder mit
@file{.rpm}-Dateien oder durch Kompilieren vom Quelltext.
@item Lorvid Ltd. @email{lorvid@@WOLFENET.com}
Einfache Fragen zu Rechnung / Lizenz / Support / Copyright.
@item Patrick Sherrill @email{patrick@@coconet.com}
Fragen zur ODBC- und VisualC++-Schnittstelle.
@item Rundy Harmon @email{rjharmon@@uptimecomputers.com}
@code{DBD}, Linux, und einige SQL-Syntax-Fragen.
@end table


@node Supporters,  , Contributors, Credits
@c German node Unterst�tzer
@appendixsec Unterst�tzer von MySQL

@cindex Unterst�tzende Unternehmen, Auflistung

W�hrend @code{MySQL AB} das gesammte Copyright f�r den @code{MySQL Server}
und das @code{MySQL manual} besitzt, m�chten wir hier diejenigen Unternehmen
nennen, die die Entwicklung des @code{MySQL Servers} unterst�tzt haben.
Sie haben geholfen, indem sie uns f�r die Entwicklung eines neuen
Features bezahlten, indem sie MySQL-Features selbst entwickelten oder indem
sie uns Hardware f�r die MySQL-Entwicklung gaben.

@table @asis
@item VA Linux / Andover.net 
Stiftete Replikation.
@item NuSphere
Editieren des MySQL-Referenzhandbuchs.
@item Stork Design studio
Die MySQL-Website zwischen 1998 und 2000.
@item Intel
Trugen zur Entwicklung auf Windows- und Linux-Plattformen bei.
@item Compaq
Trugen zur Entwicklung auf Linux/Alpha bei.
@item SWSoft
Entwicklung der eingebetteten @code{mysqld}-Version.
@item FutureQuest
@code{--skip-show-variables}
@end table




@node News, Porting, Credits, Top
@c German node Neuigkeiten
@appendix MySQL-�nderungsverlauf (Change History)

@cindex ChangeLog
@cindex �nderungen, Log
@cindex Log, �nderungen

Dieser Anhang listet die �nderungen von Version zu Version im
MySQL-Quellcode auf.

Beachten Sie, dass wir versuchen, das Handbuch zeitgleich mit den
�nderungen an MySQL zu aktualisieren. Wenn Sie unten eine Version
aufgelistet sehen, die Sie auf der
@uref{http://www.mysql.com/downloads/,MySQL-Download-Seite} nicht finden
k�nnen, hei�t das, dass die Version noch nicht ver�ffentlicht wurde!



@menu
* News-4.0.x::                  
* News-3.23.x::                 
@end menu

@node News-4.0.x, News-3.23.x, News, News
@c German node Neuigkeiten-4.0.x
@appendixsec �nderungen in Release 4.0.x (Entwicklung; Alpha)

Wir arbeiten mittlerweile aktiv an MySQL 4.0 und werden nur noch kritische
Bug-Bereinigungen f�r MySQL 3.23 herausgeben. Wir aktualisieren diesen
Abschnitt, wenn wir neue Features hinzuf�gen, so dass andere unserer
Entwicklung folgen k�nnen.

Unser TODO-Abschnitt enth�lt, was wir f�r 4.0 planen. @xref{TODO}.

@cindex �nderungen, Version 4.0


@menu
* News-4.0.2::                  
* News-4.0.1::                  
* News-4.0.0::                  
@end menu

@node News-4.0.2, News-4.0.1, News-4.0.x, News-4.0.x
@c German node Neuigkeiten-4.0.2
@appendixsubsec �nderungen in Release 4.0.2

@itemize @bullet
@item
Bug in @code{FLUSH QUERY CACHE} behoben.
@item
@code{CAST()}- und @code{CONVERT()}-Funktionen hinzugef�gt.
@item
Reihenfolge ge�ndert, wie Schl�ssel in Tabellen erzeugt werden.
@item
Neue Spalten @code{Null} und @code{Index_type} zu @code{SHOW INDEX}
hinzugef�gt.
@end itemize

@node News-4.0.1, News-4.0.0, News-4.0.2, News-4.0.x
@c German node Neuigkeiten-4.0.1
@appendixsubsec �nderungen in Release 4.0.1

@itemize @bullet
@item
Bug behoben, wenn @code{HANDLER} mit einem nicht unterst�tzten Tabellentyp
verwendet wurde.
@item
@code{mysqldump} schreibt jetzt @code{ALTER TABLE tabelle DISABLE KEYS} und
@code{ALTER TABLE tabelle DISABLE KEYS} in den SQL-Dump.
@item
@code{mysql_fix_extensions}-Skript hinzugef�gt.
@item
Stack-�berlaufproblem @code{LOAD DATA FROM MASTER} auf OSF1 behoben.
@item
Herunterfahr-Problem auf HPUX behoben.
@item
Funktionen @code{des_encrypt()} und @code{des_decrypt()} hinzugef�gt.
@item
Statement FLUSH DES_KEY_FILE hinzugef�gt.
@item
mysqld-Option @code{--des-key-file} hinzugef�gt.
@item
@code{HEX(string)} gibt jetzt die Buchstaben in der Zeichenkette
konvertiert in hexadezimal zur�ck.
@item
Problem mit @code{GRANT} bei der Benutzung von @code{lower_case_tables ==
1} behoben.
@item
@code{SELECT ... IN SHARE MODE} in @code{SELECT .. LOCK IN SHARE MODE} (wie
in MySQL 3.23) ge�ndert.
@item
Ein neuer Anfragen-Cache, der Ergebnisse identischer @code{SELECT}-Anfragen
zwischenspeichert.
@item
Coredump-Bug auf 64-Bit-Maschinen beim Erhalt eines falschen
Kommunikationspakets behoben.
@item
@code{MATCH ... AGAINST(... IN BOOLEAN MODE)} funktioniert jetzt auch ohne
@code{FULLTEXT}-Index.
@item
Slave, der vom 3.23-Master repliziert, in Ordnung gebracht.
@item
Diverse Replikationsprobleme behoben / bereinigt.
@item
Herunterfahren funktioniert jetzt auf Mac OS X.
@item
@file{myisam/ft_dump}-Werkzeug zur Low-Level-Inspektion von
@code{FULLTEXT}-Indexen hinzugef�gt.
@item
Bug in @code{DELETE ... WHERE ... MATCH ...} behoben.
@item
Unterst�tzung f�r @code{MATCH ... AGAINST(... IN BOOLEAN MODE)}
hinzugef�gt. @strong{Hinweis: Sie m�ssen Ihre Tabellen mit
@code{ALTER TABLE tabelle TYPE=MyISAM} neu aufbauen, um Boole'sche
Volltextsuche benutzen zu k�nnen.}
@item
@code{LOCATE()} und @code{INSTR()} sind abh�ngig von der verwendeten
Gro�-/Kleinschreibung, wenn keins der Argumente eine bin�re Zeichenkette
ist.
@item
@code{RND()}-Initialisierung ge�ndert, so dass @code{RND(N)} und
@code{RND(N+1)} verschiedener sind.
@item
Coredump-Bug in @code{UPDATE ... ORDER BY} behoben.
@item
@code{INSERT INTO .. SELECT} ge�ndert, damit es bei Fehlern vorgabem��ig
anh�lt.
@item
@code{DATA DIRECTORY}- und @code{INDEX DIRECTORY}-Anweisungen werden unter
Windows ignoriert.
@item
Boole'sche Volltextsuche hinzugef�gt. Diese sollte als fr�he Alphaversion
betrachtet werden.
@item
@code{MODIFY} und @code{CHANGE} in @code{ALTER TABLE} erweitert, damit sie
das @code{AFTER}-Schl�sselwort akzeptieren.
@item
Index wird jetzt in @code{ORDER BY} von einer ganzen InnoDB-Tabelle
verwendet.
@end itemize

@node News-4.0.0,  , News-4.0.1, News-4.0.x
@c German node Neuigkeiten-4.0.0
@appendixsubsec �nderungen in Release 4.0.0

@itemize @bullet
@item
Variablen @code{ft_min_word_len}, @code{ft_max_word_len} und
@code{ft_max_word_len_for_sort} hinzugef�gt.
@c German FIX removed extra @itemize @bullet from right here
@item
Dokumentation f�r @code{libmysqld}, die eingebettete
MySQL-Server-Bibliothek, hinzugef�gt. Beispielprogramme (ein
@code{mysql}-Client und @code{mysqltest}-Testprogramm) hinzugef�gt, die
@code{libmysqld} benutzen.
@item
@code{my_thread_init()} und @code{my_thread_end()} aus mysql_com.h entfernt
und @code{mysql_thread_init()} und @code{mysql_thread_end()} zu mysql.h
hinzugef�gt.
@item
Vorzeichenlose @code{BIGINT}-Konstanten funktionieren jetzt. @code{MIN()}
und @code{MAX()} handhabt vorzeichenbehaftete und vorzeichenlose
@code{BIGINT}-Zahlen korrekt.
@item
Neuer Zeichensatz @code{latin_de}, der korrektes deutsches Sortieren
erm�glicht.
@item
@code{TRUNCATE TABLE} und @code{DELETE FROM tabelle} sind jetzt separate
Funktionen. Ein Vorteil davon ist, dass @code{DELETE FROM tabelle} jetzt
die Anzahl gel�schter Zeilen zur�ckgibt.
@item
@code{DROP DATABASE} f�hrt jetzt ein @code{DROP TABLE} auf alle Tabellen in
der Datenbank aus, was ein Problem mit InnoDB-Tabellen behebt.
@item
Unterst�tzung f�r @code{UNION} hinzugef�gt.
@item
Eine neue @code{HANDLER}-Schnittstelle zu @code{MyISAM}-Tabellen.
@item
Unterst�tzung f�r @code{INSERT} auf @code{MERGE}-Tabellen hinzugef�gt.
Patch von Benjamin Pflugmann.
@item
@code{WEEK(#,0)} dem Kalender in den USA angepasst.
@item
@code{COUNT(DISTINCT)} ist etwa 30% schneller.
@item
Alle internen Listen-Handlings in der Geschwindigkeit verbessert.
@item
Das Erzeugen von Volltext-Indexen ist jetzt viel schneller.
@item
Baum-�hnlicher Cache, um Massen-Einf�gevorg�nge und die
@code{myisam_bulk_insert_tree_size}-Variable zu beschleunigen.
@item
Suchen auf komprimierten (@code{CHAR}/@code{VARCHAR})-Schl�sseln ist jetzt
viel schneller.
@item
Anfragen folgenden Typs optimiert:
@code{SELECT DISTINCT * from tabelle ORDER by schluessel_teil1 LIMIT #}
@item
@code{SHOW CREATE TABLE} zeigt jetzt alle Tabellenattribute.
@item
@code{ORDER BY ... DESC} kann jetzt Schl�ssel benutzen.
@item
@code{LOAD DATA FROM MASTER} setzt jetzt "auto-magisch" einen Slave auf.
@item
@code{safe_mysqld} in @code{mysqld_safe} umbenannt.
@item
Unterst�tzung f�r symbolische Links auf @code{MyISAM}-Tabellen hinzugef�gt.
Symlink-Handhabung ist jetzt vorgabem��ig f�r Windows aktiviert.
@item
@code{LOAD DATA FROM MASTER} setzt "auto-magisch" einen Slave auf.
@item
@code{SQL_CALC_FOUND_ROWS} und @code{FOUND_ROWS()} hinzugef�gt. Das
erm�glicht es herauszufinden, wie viele Zeilen eine Anfrage ohne eine
@code{LIMIT}-Klausel zur�ckgegeben h�tte.
@item
Ausgabeformat von @code{SHOW OPEN TABLES} ge�ndert.
@item
@code{SELECT ausdruck LIMIT ...} wird zugelassen.
@item
@code{IDENTITY} als Synonym f�r @code{AUTO_INCREMENT} hinzugef�gt (wie
Sybase).
@item
@code{ORDER BY}-Syntax zu @code{UPDATE} und @code{DELETE} hinzugef�gt.
@item
@code{SHOW INDEXES} ist jetzt ein Synonym f�r @code{SHOW INDEX}.
@item
@code{ALTER TABLE tabelle DISABLE KEYS}- und @code{ALTER TABLE tabelle
ENABLE KEYS}-Befehle hinzugef�gt.
@item
@code{IN} kann anstelle von @code{FROM} in @code{SHOW}-Befehlen benutzt
werden.
@item
ANSI-SQL-Syntax @code{X'Hexadezimalzahl'} wird zugelassen.
@item
Globale Sperr-Handhabung f�r @code{FLUSH TABLES with READ LOCK} aufger�umt.
@item
Problem mit @code{DATETIME = constant} in @code{WHERE}-Optimierungen
behoben.
@end itemize


@node News-3.23.x,  , News-4.0.x, News
@c German node Neuigkeiten-3.23.x
@appendixsec �nderungen in Release 3.23.x  (Stabil)

@cindex changes, version 3.23

Das 3.23-Release hat etliche wichtige Features, die in fr�heren Versionen
nicht vorhanden sind. Es wurden drei neue Tabellentypen hinzugef�gt:

@table @asis
@item @strong{MyISAM}
Eine neue ISAM-Bibliothek, die auf SQL und Unterst�tzung gro�er Dateien
abgestimmt ist. 
@item @strong{BerkeleyDB} oder @strong{BDB}
Benutzt die Berkeley-DB-Bibliothek von Sleepycat Software, um
transaktionssichere Tabellen zu implementieren.
@item @strong{InnoDB}
Ein transaktionssicherer Tabellen-Handler, der Sperren auf Zeilenebene und
viele Oracle-�hnliche Features unterst�tzt.
@end table

Beachten Sie, dass nur MyISAM in der Standard-Bin�rdistribution verf�gbar
ist.

Das 3.23-Release beinhaltet ausserdem Unterst�tzung f�r
Datenbank-Replikation zwischen einem Master und vielen Slaves,
Volltext-Indexierung und vieles mehr.

Alle neuen Features werden in der 4.0-Version weiter entwickelt. Nur
Bug-Behebungen und kleinere Verbesserungen bestehender Features werden zu
3.23 hinzugef�gt.

Der Replikationscode und der BerkeleyDB-Code sind noch nicht so gut
getestet wie der Rest des Codes, daher wird es wahrscheinlich zuk�nftig
noch einige Releases von 3.23 mit kleineren Behebungen f�r diesen Teil des
Codes geben. Solange Sie diese Features nicht benutzen, sollten Sie mit
MySQL 3.23 auf der sicheren Seite liegen!

Beachten Sie, dass das Gesagte nicht hei�t, dass Replikation oder Berkeley
DB nicht funktionieren. Wir haben den gesamten Code ausgiebig getestet,
inklusive Replikation und BDB, ohne irgend welche Probleme zu finden. Es
hei�t nur, dass nicht so viele Benutzer diesen Code verwenden wie den Rest
des Codes, weshalb wir noch nicht 100% auf diesen Teil des Codes vertrauen.


@menu
* News-3.23.43::                
* News-3.23.42::                
* News-3.23.41::                
* News-3.23.40::                
* News-3.23.39::                
* News-3.23.38::                
* News-3.23.37::                
* News-3.23.36::                
* News-3.23.35::                
* News-3.23.34a::               
* News-3.23.34::                
* News-3.23.33::                
* News-3.23.32::                
* News-3.23.31::                
* News-3.23.30::                
* News-3.23.29::                
* News-3.23.28::                
* News-3.23.27::                
* News-3.23.26::                
* News-3.23.25::                
* News-3.23.24::                
* News-3.23.23::                
* News-3.23.22::                
* News-3.23.21::                
* News-3.23.20::                
* News-3.23.19::                
* News-3.23.18::                
* News-3.23.17::                
* News-3.23.16::                
* News-3.23.15::                
* News-3.23.14::                
* News-3.23.13::                
* News-3.23.12::                
* News-3.23.11::                
* News-3.23.10::                
* News-3.23.9::                 
* News-3.23.8::                 
* News-3.23.7::                 
* News-3.23.6::                 
* News-3.23.5::                 
* News-3.23.4::                 
* News-3.23.3::                 
* News-3.23.2::                 
* News-3.23.1::                 
* News-3.23.0::                 
@end menu

@node News-3.23.43, News-3.23.42, News-3.23.x, News-3.23.x
@c German node Neuigkeiten-3.23.43
@appendixsubsec �nderungen in Release 3.23.43
@itemize @bullet
@item
Bug behoben, der mit sehr geringer Wahrscheinlichkeit auftritt, der keine
�bereinstimmenden Zeilen zur�ckgab bei SELECT mit vielen Tabellen,
mehrspaltigen Indexen und 'Bereichs-'-Typen.
@item
Coredump-Bug behoben, der mit sehr geringer Wahrscheinlichkeit auftritt,
wenn man @code{EXPLAIN SELECT} mit vielen Tabellen und @code{ORDER BY}
ausf�hrt.
@item
Bug in @code{LOAD DATA FROM MASTER} bei der Benutzung einer Tabelle mit
@code{CHECKSUM=1} behoben.
@item
Eindeutige Fehlermeldung hinzugef�gt, die man bei einer Blockierung
(Deadlock) w�hrend einer Transaktion mit BDB-Tabellen erh�lt.
@item
Problem mit @code{BDB}-Tabellen und @code{UNIQUE}-Spalten, die als
@code{NULL} definiert wurden, behoben.
@item
Problem mit @code{myisampack} bei der Benutzung von CHAR-Spalten, die
Leerzeichen aufgef�llt wurden, behoben.
@item
Patch von Yuri Dario f�r OS2 angewandt.
@item
Bug in @code{--safe-user-create} behoben.
@end itemize

@node News-3.23.42, News-3.23.41, News-3.23.43, News-3.23.x
@c German node Neuigkeiten-3.23.42
@appendixsubsec �nderungen in Release 3.23.42
@itemize @bullet
@item
Problem bei der Benutzung von @code{LOCK TABLES} und @code{BDB}-Tabellen
behoben.
@item
Problem mit @code{REPAIR TABLE} auf MyISAM-Tabellen mit Zeilenl�ngen
zwischen 65517 und 65520 Bytes behoben.
@item
Seltenen H�nger bei @code{mysqladmin shutdown} behoben, wenn es viel
Aktivit�t auf einem anderen Thread gab.
@item
Problem mit @code{INSERT DELAYED} behoben, bei dem ein verz�gerter Thread
auf @code{Upgrade locks} ohne ersichtlichen Grund h�ngen konnte.
@item
Problem mit @code{myisampack} und @code{BLOB} behoben.
@item
Problem beim Editieren von @code{.MRG}-Tabellen von Hand behoben.
(Patch von Benjamin Pflugmann).
@item
Es wird erzwungen, dass alle Tabellen in einer @code{MERGE}-Tabelle von
derselben Datenbank kommen.
@item
Bug mit @code{LOAD DATA INFILE} und transaktionalen Tabellen behoben.
@item
Bug bei der Benutzung von @code{INSERT DELAYED} mit falschen
Spaltendefinitionen behoben.
@item
Coredump w�hrend @code{REPAIR} besonders besch�digter Tabellen behoben.
@item
Bug in @code{InnoDB}- und @code{AUTO_INCREMENT}-Spalten behoben.
@item
Bug in @code{InnoDB} und @code{RENAME TABLE}-Spalten behoben.
@item
Kritischer Bug in @code{InnoDB}- und @code{BLOB}-Spalten behoben. Wenn man
@code{BLOB}-Spalten gr��er als 8000 Bytes in einer @code{InnoDB}-Tabelle
benutzte, musste man die Tabelle mit @code{mysqldump} sichern, l�schen und
aus dem Dump neu aufbauen.
@item
Gro�en Patch f�r OS/2 von Yuri Dario angewandt.
@item
Problem mit @code{InnoDB} behoben, bei dem man den Fehler @code{Can't
execute the given command...} bekommen konnte, selbst wenn man keine aktive
Transaktion hatte.
@item
Einige kleine Probleme behoben, die Gemini betrafen.
@item
Echte arithmetische Operationen werden selbst dann in einem
Ganzzahl-Zusammenhang benutzt, wenn nicht alle Argumente Ganzzahlen sind.
(Behebt einen wenig h�ufigen Bug in einigen Ganzzahl-Kontexten.)
@item
Unter Windows wird nicht alles in Kleinschreibung erzwungen (um ein Problem
mit Windows und @code{ALTER TABLE} zu beheben). @code{--lower_case_names}
funktioniert jetzt auch unter Unix.
@item
Automatisches Rollback behoben, das ausgef�hrt wurde, wenn das Beenden
eines Threads keinen anderen Thread blockiert.
@end itemize

@node News-3.23.41, News-3.23.40, News-3.23.42, News-3.23.x
@c German node Neuigkeiten-3.23.41
@appendixsubsec �nderungen in Release 3.23.41

@itemize @bullet
@item
Option @code{--sql-mode=option[,option[,option]]} hinzugef�gt.
@xref{Command-line options}.
@item
M�gliches Problem mit @code{shutdown} auf Solaris behoben, wobei die
@file{.pid}-Datei nicht gel�scht wurde.
@item
InnoDB unterst�tzt jetzt Zeilen < 4 GB. Die vorherige Beschr�nkung war
8.000 Bytes.
@item
Die @code{doublewrite}-Datei-Flush-Methode wird in InnoDB benutzt. Sie
reduziert die Notwendigkeit von Unix-fsync-Aufrufen auf einen Bruchteil und
verbessert die Performance auf den meisten Unix-Varianten.
@item
Sie k�nnen jetzt den InnoDB-Monitor benutzen, um etliche Informationen �ber
den InnoDB-Status auf die Standardausgabe auszugeben, inklusive Sperren.
N�tzlich zum Tunen der Performance.
@item
Mehrere Bugs, die in InnoDB H�nger verursachen konnten, behoben.
@item
@code{record_buffer} in @code{record_buffer} und @code{record_rnd_buffer}
aufgeteilt. Um zu vorherigen MySQL-Versionen kompatibel zu bleiben, wird
@code{record_rnd_buffer} auf den Wert von @code{record_buffer} gesetzt,
wenn es nicht explizit gesetzt wird.
@item
Optimierungs-Bug in @code{ORDER BY} behoben, bei dem einige @code{ORDER
BY}-Teile f�lschlicherweise entfernt wurden.
@item
Overflow-Bug bei @code{ALTER TABLE} und @code{MERGE}-Tabellen behoben.
@item
Prototypen f�r @code{my_thread_init()} und @code{my_thread_end()} zu
@file{mysql_com.h} hinzugef�gt.
@item
Option @code{--safe-user-create} to @code{mysqld} hinzugef�gt.
@item
Bug in @code{SELECT DISTINCT ... HAVING} behoben, der die Fehlermeldung
@code{Can't find record in '#...} verursachte.
@end itemize


@node News-3.23.40, News-3.23.39, News-3.23.41, News-3.23.x
@c German node Neuigkeiten-3.23.40
@appendixsubsec �nderungen in Release 3.23.40

@itemize @bullet
@item
Problem mit @code{--low-priority-updates} und @code{INSERT}'s behoben.
@item
Bug im Slave-Thread beseitigt, bei dem dieser in seltenen F�llen um 22 Byte
vor den Offset im Master kommen konnte.
@item
@code{slave_wait_timeout} f�r Replikation hinzugef�gt.
@item
Problem mit @code{UPDATE} und @code{BDB}-Tabellen behoben.
@item
Problematischen Bug in @code{BDB}-Tabellen behoben, der bei der Benutzung
von Schl�sselteilen auftrat.
@item
Problem bei der Benutzung von @code{GRANT FILE ON datenbank.* ...} behoben.
Vorher wurde die @code{DROP}-Berechtigung f�r die Datenbank hinzugef�gt.
@item
Bug bei @code{DELETE FROM tabelle ... LIMIT 0} und @code{UPDATE FROM
tabelle ... LIMIT 0} behoben, die sich vorher so verhielten, als g�be es
keine @code{LIMIT}-Klausel (sie l�schten oder aktualisierten alle
ausgew�hlten Zeilen).
@item
@code{CHECK TABLE} pr�ft jetzt, ob eine @code{AUTO_INCREMENT}-Spalte den
Wert 0 enth�lt.
@item
Wenn man @code{SIGHUP} an @code{mysqld} schickt, werden jetzt nur die Logs
auf Platte zur�ckgeschrieben (flush), nicht die Replikation zur�ckgesetzt.
@item
Parser in Ordnung gebracht, so dass er jetzt Flie�kommazahlen des Typs
@code{1.0e1} (kein Vorzeichen nach @code{e}) zul��t.
@item
Option @code{--force} f�r @code{myisamchk} aktualisiert jetzt auch Zust�nde
(Status).
@item
Option @code{--warnings} f�r @code{mysqld} hinzugef�gt. @code{mysqld} gibt
jetzt nur den Fehler @code{Aborted connection} aus, wenn diese Option
benutzt wird.
@item
Problem mit @code{SHOW CREATE TABLE} behoben, wenn man keinen @code{PRIMARY
KEY} hatte.
@item
Saubere Behebung der Umbenennung von @code{innodb_unix_file_flush_method}
in @code{innodb_flush_method}.
@item
Bug beim Umwandeln von @code{UNSIGNED BIGINT} in @code{DOUBLE} behoben.
Dieser verursachte bei Vergleichen mit @code{BIGINT}-Werten ausserhalb des
vorzeichenbehafteten Bereichs ein Problem.
@item
Bug in @code{BDB}-Tabellen behoben, wenn man leere Tabellen abfragte.
@item
Bug bei der Benutzung von @code{COUNT(DISTINCT)} mit @code{LEFT JOIN}
behoben, wenn es keine �bereinstimmenden Zeilen gab.
@item
Alle Dokumentation bez�glich @code{GEMINI}-Tabellen entfernt. @code{GEMINI}
wird nicht unter einer Open-Source-Lizenz herausgegeben.
@end itemize


@node News-3.23.39, News-3.23.38, News-3.23.40, News-3.23.x
@c German node Neuigkeiten-3.23.39
@appendixsubsec �nderungen in Release 3.23.39

@itemize @bullet
@item
Die @code{AUTO_INCREMENT}-Zahlenfolge wurde beim L�schen und Hinzuf�gen
einer @code{AUTO_INCREMENT}-Spalte nicht zur�ckgesetzt.
@item
@code{CREATE ... SELECT} erzeugt jetzt nicht eindeutige Indexe verz�gert.
@item
Problem behoben, bei dem @code{LOCK TABLES tabelle READ} gefolgt von
@code{FLUSH TABLES} eine exklusive Sperre auf die Tabelle setzte.
@item
@code{REAL}-@@Variablen wurden mit 2 Ziffern dargestellt, wenn sie in
Zeichenketten umgewandelt wurden.
@item
Problem mit h�ngendem Client behoben, wenn @code{LOAD TABLE FROM MASTER}
fehlschlug.
@item
@code{myisamchk --fast --force} repariert jetzt keine Tabellen mehr, bei
denen nur der �ffnen-Z�hler falsch ist.
@item
Funktionen zur Handhabung von symbolischen Links hinzugef�gt, um sich das
Leben in Version 4.0 zu erleichtern.
@item
Wir benutzen jetzt die @code{-lcma}-Thread-Bibliothek unter HP-UX 10.20, so
dass MySQL auf HP-UX stabiler l�uft.
@item
Problem mit @code{IF()} und Anzahl von Dezimalstellen im Ergebnis behoben.
@item
Funktionen zum Extrahieren von Datumsanteilen in Ordnung gebracht, so dass
sie jetzt mit Datumsangaben funktionieren, bei denen Tag und / oder Monat 0
sind.
@item
Argumentl�nge in Optionsdateien von 256 auf 512 Zeichen erweitert.
@item
Problem bei Herunterfahren, wenn @code{INSERT DELAYED} auf ein @code{LOCK
TABLE} wartete, behoben.
@item
Coredump-Bug in InnoDB behoben, wenn der Tabellenplatz (Tablespace) voll
war.
@item
Problem mit @code{MERGE}-Tabellen und gro�en Tabellen (> 4 GB) und der
Benutzung von @code{ORDER BY} behoben.
@end itemize


@node News-3.23.38, News-3.23.37, News-3.23.39, News-3.23.x
@c German node Neuigkeiten-3.23.38
@appendixsubsec �nderungen in Release 3.23.38

@itemize @bullet
@item
Bug behoben, bei dem @code{SELECT} von @code{MERGE}-Tabellen manchmal zu
falsch sortierten Zeilen f�hrte.
@item
Bug in @code{REPLACE()} bei der Benutzung des ujis-Zeichensatzes behoben.
@item
Sleepycat-BDB-Patches 3.2.9.1 und 3.2.9.2 angewandt.
@item
Option @code{--skip-stack-trace} zu @code{mysqld} hinzugef�gt.
@item
@code{CREATE TEMPORARY} funktioniert jetzt mit @code{InnoDB}-Tabellen.
@item
@code{InnoDB} zieht jetzt Teile von Schl�sseln (Sub-Keys) ganzen Schl�sseln
vor.
@item
Option @code{CONCURRENT} f�r @code{LOAD DATA} hinzugef�gt.
@item
Bessere Fehlermeldung, wenn die Slave-@code{max_allowed_packet}-Variable zu
niedrig ist, um ein sehr langes Log-Ereignis vom Master zu lesen.
@item
Bug behoben, wenn zu viele Zeilen bei der Benutzung von @code{SELECT
DISTINCT ... HAVING} entfernt wurden.
@item
@code{SHOW CREATE TABLE} gibt jetzt @code{TEMPORARY} f�r tempor�re Tabellen
zur�ck.
@item
@code{Rows_examined} f�r Langsame-Anfragen-Log-Datei hinzugef�gt.
@item
Probleme mit Funktion behoben, die eine leere Zeichenkette zur�ckgab, wenn
sie zusammen mit einer Gruppenfunktion und einem @code{WHERE} benutzt
wurde, das keine Zeilen�bereinstimmung ergab.
@item
Neues Programm @code{mysqlcheck}.
@item
Datenbankname zur Ausgabe f�r administrative Befehle wie @code{CHECK},
@code{REPAIR}, @code{OPTIMIZE} hinzugef�gt.
@item
Viele Portabilit�tsbehebungen f�r InnoDB.
@item
Optimierer ge�ndert, so dass Anfragen wie @code{SELECT * FROM
tabelle,tabelle2 ... ORDER BY schluessel_teil1 LIMIT #} den Index auf
@code{schluessel_teil1} anstelle von @code{filesort} benutzen.
@item
Bug bei der Ausf�hrung von @code{LOCK TABLE to_table WRITE,...; INSERT INTO
to_table... SELECT ...} behoben, wenn @code{to_table} leer war.
@item
Bug mit @code{LOCK TABLE} und BDB-Tabellen behoben.
@end itemize


@node News-3.23.37, News-3.23.36, News-3.23.38, News-3.23.x
@c German node Neuigkeiten-3.23.37
@appendixsubsec �nderungen in Release 3.23.37

@itemize @bullet
@item
Bug bei der Benutzung von @code{MATCH} in @code{HAVING}-Klausel.
@item
Bug bei der Benutzung von @code{HEAP}-Tabellen mit @code{LIKE} behoben.
@item
@code{--mysql-version} f�r @code{safe_mysqld} hinzugef�gt.
@item
@code{INNOBASE} in @code{InnoDB} ge�ndert (weil der @code{INNOBASE}-Name
bereits benutzt wurde). Alle @code{configure}-Optionen und
@code{mysqld}-Startoptionen benutzen jetzt @code{innodb} anstelle von
@code{innobase}. Das hei�t, dass Sie jegliche Konfigurationsdateien, in
denen Sie @code{innobase}-Optionen benutzt haben, �ndern m�ssen, bevor Sie
auf diese Version aktualisieren!
@item
Bug bei der Benutzung von Indexen auf @code{CHAR(255) NULL}-Spalten
behoben.
@item
Slave-Thread wird jetzt auch dann gestartet, wenn @code{master-host} nicht
gesetzt ist, so lange @code{server-id} gesetzt wird und es eine g�ltige
@code{master.info} gibt.
@item
Teilweise Aktualisierungen (beendet mit kill) werden jetzt mit einem
speziellen Fehler-Code in die Bin�r-Log-Datei geschrieben. Der Slave
weigert sich, sie auszuf�hren, wenn der Fehler-Code anzeigt, dass die
Aktualisierung abnorm beendet wurde, und muss mit @code{SET
SQL_SLAVE_SKIP_COUNTER=1; SLAVE START} wieder dazu veranlasst werden,
nachdem eine manuelle �berpr�fung / Korrektur der Datenintegrit�t
durchgef�hrt wurde.
@item
Bug behoben, der das L�schen einer internen tempor�ren Tabelle beim Beenden
des Threads irrt�mlicherweise in die Bin�r-Log-Datei schrieb. Dieser Bug
betraf Replikation.
@item
Bug in @code{REGEXP()} auf 64-Bit-Maschinen.
@item
@code{UPDATE} und @code{DELETE} mit @code{WHERE eindeutiger_schluessel_teil
IS NULL} aktualisierte / l�schte nicht alle Zeilen.
@item
@code{INSERT DELAYED} f�r Tabellen abgeschaltet, die Transaktionen
unterst�tzen.
@item
Bug bei der Benutzung von DATE-Funktionen auf
@code{TEXT}/@code{BLOB}-Spalten mit falschem Datumsformat behoben.
@item
UDFs (benutzerdefinierte Funktionen) funktionieren jetzt auch unter
Windows (Patch von Ralph Masona).
@item
Bug in @code{ALTER TABLE} und @code{LOAD DATA INFILE} behoben, der das
Sortieren von Schl�sseln deaktivierte. Diese Befehle sollten jetzt in den
meisten F�llen schneller sein.
@item
Performance-Bug beim erneuten �ffnen von Tabellen behoben (Tabellen, die
auf ein @code{FLUSH} oder @code{REPAIR} warteten), die f�r die n�chste
Anfrage keine Indexe benutzten.
@item
Problem mit @code{ALTER TABLE} f�r Innobase-Tabellen auf FreeBSD behoben.
@item
@code{mysqld}-Variablen @code{myisam_max_sort_file_size} und
@code{myisam_max_extra_sort_file_size} hinzugef�gt.
@item
Signale werden fr�hzeitig initialisiert, um Problem mit Signalen in
Innobase zu vermeiden.
@item
Patch f�r den @code{tis620}-Zeichensatz hinzugef�gt, um Vergleiche
unabh�ngig von der verwendeten Gro�-/Kleinschreibung zu machen und einen
Bug in @code{LIKE} f�r diesen Zeichensatz zu beheben. @strong{HINWEIS}:
Alle Tabellen, die den @code{tis620}-Zeichensatz benutzen, m�ssen mit
@code{myisamchk -r} oder @code{REPAIR TABLE} in Ordnung gebracht werden!
@item
@code{--skip-safemalloc}-Option zu @code{mysqld} hinzugef�gt.
@end itemize


@node News-3.23.36, News-3.23.35, News-3.23.37, News-3.23.x
@c German node Neuigkeiten-3.23.36
@appendixsubsec �nderungen in Release 3.23.36

@itemize @bullet
@item
Bug behoben, der Datenbanknamen mit einem @samp{.}-Zeichen zulie�. Das
behebt ein schwerwiegendes Sicherheitsproblem, wenn man @code{mysqld} unter
dem Benutzer root laufen l��t.
@item
Bug behoben, wenn die Erzeugung eines Threads fehlschl�gt (das konnte bei
der Herstellung SEHR vieler Verbindungen in kurzer Zeit passieren).
@item
Einige Probleme mit @code{FLUSH TABLES} und @code{TEMPORARY}-Tabellen
behoben. (Problem mit dem Freisetzen des Schl�ssel-Cache und Fehler
@code{Can't reopen table...}).
@item
Problem in Innobase mit anderen Zeichens�tze als @code{latin1} und ein
anderes Problem bei der Benutzung von vielen Spalten behoben.
@item
Bug behoben, der einen Coredump bei der Benutzung einer sehr komplexen
Anfrage mit @code{DISTINCT} und Summenfunktionen verursachte.
@item
@code{SET TRANSACTION ISOLATION LEVEL ...} hinzugef�gt.
@item
@code{SELECT ... FOR UPDATE} hinzugef�gt.
@item
Bug behoben, bei dem die Anzahl von betroffenen Zeilen nicht zur�ckgegeben
wurde, wenn @code{MySQL} ohne Transaktionsunterst�tzung kompiliert wurde.
@item
Bug in @code{UPDATE} behoben, bei dem nicht immer Schl�ssel benutzt wurden,
um die zu aktualisierenden Zeilen zu finden.
@item
Bug in @code{CONCAT_WS()} behoben, bei dem diese Funktion falsche
Ergebnisse zur�ckgab.
@item
@code{CREATE ... INSERT} und @code{INSERT ... SELECT} ge�ndert, so dass
diese noch kleine gleichzeitigen Einf�gevorg�nge zulassen, weil das dazu
f�hren k�nnte, dass die Bin�r-Log-Datei schwer zu wiederholen ist.
(Gleichzeitige Einf�gevorg�nge sind aktiviert, wenn Sie nicht die Bin�r-
oder Update-Log-Datei verwenden.)
@item
Einige Makros ge�ndert, so dass schnelles mutex mit glibc 2.2 verwendet
werden kann.
@end itemize


@node News-3.23.35, News-3.23.34a, News-3.23.36, News-3.23.x
@c German node Neuigkeiten-3.23.35
@appendixsubsec �nderungen in Release 3.23.35

@itemize @bullet
@item
Neu eingef�hrter Bug in @code{ORDER BY} behoben.
@item
Falsches Definieren von @code{CLIENT_TRANSACTIONS} behoben.
@item
Bug in @code{SHOW VARIABLES} bei der Benutzung von @code{INNOBASE}-Tabellen
behoben.
@item
Das Setzen und Benutzen von Benutzer-Variablen in @code{SELECT DISTINCT}
funktionierte nicht.
@item
@code{SHOW ANALYZE} f�r kleine Tabellen verbessert.
@item
Handhabung von Argumenten im Benchmark-Skript @file{run-all-tests} behoben.
@end itemize


@node News-3.23.34a, News-3.23.34, News-3.23.35, News-3.23.x
@c German node Neuigkeiten-3.23.34a
@appendixsubsec �nderungen in Release 3.23.34a

@itemize @bullet
@item
Zus�tzliche Dateien zur Distribution hinzugef�gt, die es erm�glichen, mit
@code{INNOBASE}-Unterst�tzung zu kompilieren.
@end itemize


@node News-3.23.34, News-3.23.33, News-3.23.34a, News-3.23.x
@c German node Neuigkeiten-3.23.34
@appendixsubsec �nderungen in Release 3.23.34

@itemize @bullet
@item
@code{INNOBASE}-Tabellen-Handler und @code{BDB}-Tabellen-Handler zur
MySQL-Quelldistribution hinzugef�gt.
@item
Die Dokumentation zu @code{GEMINI}-Tabellen aktualisiert.
@item
Bug in @code{INSERT DELAYED} behoben, der den Thread zum H�ngen brachte,
wenn @code{NULL} in eine @code{AUTO_INCREMENT}-Spalte eingef�gt wurde.
@item
Bug in @code{CHECK TABLE} / @code{REPAIR TABLE} behoben, der einen Thread
zum H�ngen bringen konnte.
@item
@code{REPLACE} ersetzt keine Zeile mehr, die mit einem durch
@code{auto_increment} erzeugten Schl�ssel in Konflikt steht.
@item
@code{mysqld} setzt jetzt nur @code{CLIENT_TRANSACTIONS} in
@code{mysql->server_capabilities}, wenn der Server einen
transaktionssicheren Handler unterst�tzt.
@item
@code{LOAD DATA INFILE} l��t jetzt das Einf�gen numerischer Werte in
@code{ENUM}- und @code{SET}-Spalten zu.
@item
Fehlerdiagnose beim Slave-Thread-Exit verbessert.
@item
Bug in @code{ALTER TABLE ... ORDER BY} behoben.
@item
Option @code{max_user_connections} f�r @code{mysqld} hinzugef�gt.
@item
Anfragel�nge f�r Replikation auf @code{max_allowed_packet} begrenzt, nicht
auf die willk�rliche L�nge von 4 MB.
@item
Leerzeichen um @code{=} herum im Argument zu @code{--set-variable} werden
zugelassen.
@item
Problem beim automatischen Reparieren behoben, der einen Thread im Zustand
@code{Waiting for table} lassen konnte.
@item
@code{SHOW CREATE TABLE} gibt jetzt das @code{UNION()} f�r
@code{MERGE}-Tabellen aus.
@item
@code{ALTER TABLE} merkt sich jetzt die alte @code{UNION()}-Definition.
@item
Bug beim Replizieren von Timestamps behoben.
@item
Bug bei der bidirektionalen Replikation behoben.
@item
Bug im @code{BDB}-Tabellen-Handler behoben, der bei der Benutzung eines
Indexes auf mehrteilige Schl�ssel vorkam, wenn ein Schl�sselteil
@code{NULL} sein konnte.
@item
@code{MAX()}-Optimierung f�r Schl�sselteile (Sub-Keys) f�r
@code{BDB}-Tabellen verbessert.
@item
Problem behoben, bei dem 'M�ll'-Ergebnisse bei der Benutzung von
@code{BDB}-Tabellen und @code{BLOB}- oder @code{TEXT}-Feldern beim
Verkn�pfen (Join) vieler Tabellen auftraten.
@item
Problem mit @code{BDB}-Tabellen und @code{TEXT}-Spalten behoben.
@item
Bug bei der Benutzung eines @code{BLOB}-Schl�ssels behoben, wenn eine
Konstanten-Zeile nicht gefunden wurde.
@item
Problem behoben, dass @code{mysqlbinlog} den Timestamp-Wert f�r jede
Anfrage schreibt. Das stellt sicher, dass man dieselben Werte bei
Datumsfunktionen wie @code{NOW()} bei der Benutzung von @code{mysqlbinlog}
erh�lt, um die Anfragen zu einem anderen Server durchzureichen (pipe).
@item
Es wird zugelassen, dass @code{--skip-gemini}, @code{--skip-bdb} und
@code{--skip-innobase} f�r @code{mysqld} angegeben werden, selbst wenn
diese Datenbanken nicht in @code{mysqld} einkompiliert sind.
@item
Man kann jetzt @code{GROUP BY ... DESC} ausf�hren.
@item
Blockierung im @code{SET}-Code behoben, wenn man @code{SET @@foo=bar}
ausf�hrte, wobei @code{bar} ein Spaltenverweis ist. Hier wurde die
Fehlermeldung nicht korrekt erzeugt.
@end itemize


@node News-3.23.33, News-3.23.32, News-3.23.34, News-3.23.x
@c German node Neuigkeiten-3.23.33
@appendixsubsec �nderungen in Release 3.23.33

@itemize @bullet
@item
DNS-Lookups benutzen jetzt nicht mehr denselben mutex wie der
Hostnamen-Cache. Das gestattet, dass bekannte Hosts schnell aufgel�st
werden k�nnen, selbst wenn ein DNS-Lookup lange Zeit braucht.
@item
@code{--character-sets-dir} f�r @code{myisampack} hinzugef�gt.
@item
Warnungen beim Laufenlassen von @code{REPAIR TABLE ... EXTENDED} entfernt.
@item
Bug, der einen Coredump bei der Benutzung von @code{GROUP BY} auf ein Alias
verursachte, wobei der Alias dasselbe wie ein existierender Spaltenname
war, entfernt.
@item
@code{SEQUENCE()} als Beispiel-UDF-Funktion hinzugef�gt.
@item
@code{mysql_install_db} ge�ndert, so dass es @code{BINARY} f�r
@code{CHAR}-Spalten in den Berechtigungstabellen benutzt.
@item
@code{TRUNCATE tabelle} zu @code{TRUNCATE TABLE tabelle} ge�ndert, um
dieselbe Syntax wie Oracle zu verwenden. Bis Version 4.0 lassen wir
weiterhin @code{TRUNCATE tabelle} zu, um alten Code nicht zum Absturz zu
bringen.
@item
'no found rows'-Bug in @code{MyISAM}-Tabellen behoben, wenn ein @code{BLOB}
erster Teil eines mehrteiligen Schl�ssels war.
@item
Bug behoben, bei dem @code{CASE} mit @code{GROUP BY} nicht funktionierte.
@item
Option @code{--sort-recover} f�r @code{myisamchk} hinzugef�gt.
@item
@code{myisamchk -S} und @code{OPTIMIZE TABLE} funktionieren jetzt unter
Windows.
@item
Bug bei der Benutzung von @code{DISTINCT} auf Ergebnisse von Funktionen
behoben, die sich auf eine Gruppenfunktion bezogen, wie:
@example
SELECT a, DISTINCT SEC_TO_TIME(sum(a)) from tabelle GROUP BY a, b;
@end example
@item
Puffer-�berlauf in @code{libmysqlclient}-Bibliothek behoben. Bug bei der
Handhabung des @code{STOP}-Ereignisses nach @code{ROTATE}-Ereignis bei
Replikation.
@item
Einen weiteren Puffer-�berlauf in @code{DROP DATABASE} behoben.
@item
@code{Table_locks_immediate}- und
@code{Table_locks_waited}-Status-Variablen hinzugef�gt.
@item
Bug in Replikation behoben, der den Slave-Server-Start bei existierendem
@code{master.info} unterbrach. Das behebt einen Bug, der in Version 3.23.32
eingef�hrt wurde.
@item
@code{SET SQL_SLAVE_SKIP_COUNTER=n}-Befehl hinzugef�gt, um nach
Replikationsst�rungen ohne volle Datenbankkopie wiederherzustellen.
@item
@code{max_binlog_size}-Variable hinzugef�gt; die Bin�r-Log-Datei wird
automatisch rotiert, wenn die Gr��e die Grenze �berschreitet.
@item
@code{Last_error}, @code{Last_errno} und @code{Slave_skip_counter} f�r
@code{SHOW SLAVE STATUS} hinzugef�gt.
@item
Bug in @code{MASTER_POS_WAIT()}-Funktion behoben.
@item
Coredump-Handler auf @code{SIGILL} und @code{SIGBUS} zus�tzlich zu
@code{SIGSEGV}.
@item
Auf x86-Linux wird im Coredump-Handler die aktuelle Anfrage und die Thread-
(Verbindungs-) Kennung, falls verf�gbar, angegeben.
@item
Mehrere Timing-Bugs in der Test-Suite behoben.
@item
@code{mysqltest} erweitert, so dass es sich um Probleme mit dem Timing in
der Test-Suite k�mmert.
@item
@code{ALTER TABLE} kann jetzt auch benutzt werden, um die Definition einer
@code{MERGE}-Tabelle zu �ndern.
@item
Erzeugung von @code{MERGE}-Tabellen unter Windows in Ordnung gebracht.
@item
Portabilit�tsbehebungen f�r OpenBSD und OS/2.
@item
@code{--temp-pool}-Option zu @code{mysqld} hinzugef�gt. Das Benutzen dieser
Option f�hrt dazu, dass tempor�re Dateien nur einen kleinen Satz von Namen
benutzen, statt eines eindeutigen Namens f�r jede neue Datei. Das ist ein
Workaround um ein Problem im Linux-Kernel beim Erzeugen einer gro�en Menge
neuer Dateien mit unterschiedlichen Namen. Beim alten Verhalten scheint es
so, als ein Linux ein Speicher-'Loch' h�tte, weil zum
Verzeichniseintrags-Cache statt zum Festplatten-Cache zugewiesen
(alloziert) wird.
@end itemize


@node News-3.23.32, News-3.23.31, News-3.23.33, News-3.23.x
@c German node Neuigkeiten-3.23.32
@appendixsubsec �nderungen in Release 3.23.32

@itemize @bullet
@item
Code ge�ndert, um um einen Compiler-Bug in Compaq C++ auf OSF1
herumzuarbeiten, der @code{BACKUP}, @code{RESTORE}, @code{CHECK},
@code{REPAIR} und @code{ANALYZE TABLE} besch�digte.
@item
Option @code{FULL} f�r @code{SHOW COLUMNS} hinzugef�gt. Jetzt wird die
Berechtigungsliste f�r die Spalten nur angezeigt, wenn diese Option
angegeben wird.
@item
Bug in @code{SHOW LOGS} behoben, wenn es keine BDB-Logs gab.
@item
Timing-Problem in Replikation behoben, dass das Abschicken einer
Aktualisierung an den Client verz�gern konnte, bis eine weitere
Aktualisierung durchgef�hrt wurde.
@item
Feldnamen bei der Benutzung von @code{mysql_list_fields()} nicht umwandeln.
Damit bleibt dieser Code kompatibel mit @code{SHOW FIELDS}.
@item
@code{MERGE}-Tabellen funktionierten nicht unter Windows.
@item
Problem mit @code{SET PASSWORD=...} unter Windows.
@item
Fehlende @file{my_config.h} f�r RPM-Distribution hinzugef�gt.
@item
@code{TRIM("foo" von "foo")} gab keine leere Zeichenkette zur�ck.
@item
@code{--with-version-suffix} f�r @code{configure} hinzugef�gt.
@item
Coredump behoben, wenn der Client eine Verbindung ohne @code{mysql_close()}
abbrach.
@item
Bug in @code{RESTORE TABLE} behoben, wenn man versuchte, aus einem nicht
vorhandenen Verzeichnis wiederherzustellen.
@item
Bug behoben, der einen Coredump auf dem Slave bei der Replikation von
@code{SET PASSWORD} verursachte.
@item
@code{MASTER_POS_WAIT()} hinzugef�gt.
@end itemize


@node News-3.23.31, News-3.23.30, News-3.23.32, News-3.23.x
@c German node Neuigkeiten-3.23.31
@appendixsubsec �nderungen in Release 3.23.31

@itemize @bullet
@item
Die Test-Suite testet jetzt jeden erreichbaren BDB-Schnittstellen-Code.
W�hrend der Tests fanden und behoben wir viele Fehler im
Schnittstelle-Code.
@item
Die Benutzung von @code{HAVING} auf eine leere Tabelle konnte eine
Ergebniszeile ergeben, ohne dass es das sollte.
@item
Problem behoben, so dass das MySQL-RPM nicht mehr von Perl5 abh�ngt.
@item
Einige Probleme mit @code{HEAP}-Tabellen unter Windows behoben.
@item
@code{SHOW TABLE STATUS} zeigte nicht die korrekte durchschnittliche
Zeilenl�nge bei Tabellen gr��er als 4 GB.
@item
@code{CHECK TABLE ... EXTENDED} pr�ften keine Zeilen-Links f�r Tabellen
fester Gr��e.
@item
Option @code{MEDIUM} f�r @code{CHECK TABLE} hinzugef�gt.
@item
Problem bei der Benutzung von @code{DECIMAL()}-Schl�sseln auf negative
Zahlen behoben.
@item
@code{HOUR()} (und einige andere @code{TIME}-Funktionen) auf einer
@code{CHAR}-Spalte gaben immer @code{NULL} zur�ck.
@item
Sicherheits-Bug in etwas behoben (bitte aktualisieren Sie, wenn Sie eine
fr�here MySQL-3.23-Version benutzen).
@item
Bug mit Puffer-�berlauf behoben, wenn eine bestimmte Fehlermeldung
ausgegeben wurde.
@item
Benutzung von @code{setrlimit()} unter Linux hinzugef�gt, damit
@code{-O --open-files-limit=#} unter Linux l�uft.
@item
Neue @code{mysqld}-Variable @code{bdb_version} hinzugef�gt.
@item
Bug bei der Benutzung von Ausdr�cken folgenden Typs behoben:
@example
SELECT ... FROM t1 LEFT JOIN t2 ON (t1.a=t2.a) WHERE t1.a=t2.a
@end example
In diesem Fall wurde der Test in der @code{WHERE}-Klausel f�lschlicherweise
weg optimiert.
@item
Bug in @code{MyISAM} beim L�schen von Schl�sseln mit m�glichen
@code{NULL}-Werten behoben, wenn die erste Schl�sselspalte keine
Pr�fix-komprimierte Text-Spalte war.
@item
@code{mysql.server} repariert, so dass es den
@code{mysql.server}-Optionsabschnitt anstelle von @code{mysql_server}
liest.
@item
@code{safe_mysqld} und @code{mysql.server} repariert, so dass sie den
@code{server}-Optionsabschnitt lesen.
@item
@code{thread_created}-Status-Variable zu @code{mysqld} hinzugef�gt.
@end itemize


@node News-3.23.30, News-3.23.29, News-3.23.31, News-3.23.x
@c German node Neuigkeiten-3.23.30
@appendixsubsec �nderungen in Release 3.23.30

@itemize @bullet
@item
@code{SHOW OPEN TABLES}-Befehl hinzugef�gt.
@item
@code{myisamdump} funktioniert jetzt mit alten @code{mysqld}-Servern.
@item
@code{myisamchk -k#} funktioniert jetzt wieder.
@item
Problem mit Replikation behoben, wenn die Bin�r-Log-Datei-Datei auf
32-Bit-Systemen gr��er als 2 GB wurde.
@item
@code{LOCK TABLES} startet jetzt automatisch eine neue Transaktion.
@item
@code{BDB}-Tabellen so ge�ndert, dass sie interne Sub-Transaktionen
benutzen und offene Dateien wiederholt benutzen, um mehr Geschwindigkeit zu
erzielen.
@item
Option @code{--mysqld=#} f�r @code{safe_mysqld} hinzugef�gt.
@item
Hexadezimale Konstanten in @code{--fields-*-by}- und
@code{--lines-terminated-by}-Optionen f�r @code{mysqldump} und
@code{mysqlimport} werden jetzt zugelassen. Von Paul DuBois.
@item
Option @code{--safe-show-Datenbank} f�r @code{mysqld} hinzugef�gt.
@item
@code{have_bdb}, @code{have_gemini}, @code{have_innobase},
@code{have_raid} und @code{have_openssl} f�r @code{SHOW VARIABLES}
hinzugef�gt, um das Testen auf unterst�tzte Erweiterungen zu erleichtern.
@item
Option @code{--open-files-limit} f�r @code{mysqld} hinzugef�gt.
@item
Option @code{--open-files} zu @code{--open-files-limit} in
@code{safe_mysqld} ge�ndert.
@item
Bug behoben, bei dem einige Zeilen nicht gefunden wurden, wenn
@code{HEAP}-Tabellen viele Schl�ssel hatten.
@item
@code{--bdb-no-sync} funktioniert jetzt.
@item
@code{--bdb-recover} in @code{--bdb-no-recover} ge�ndert, weil recover
vorgabem��ig angeschaltet sein sollte.
@item
Die vorgabem��ige Anzahl von BDB-Sperren auf 10.000 ge�ndert.
@item
Bug aus Version 3.23.29 behoben, beim Zuweisen der gemeinsam genutzten
Struktur, die f�r BDB-Tabellen ben�tigt wird.
@item
@file{mysqld_multi.sh} f�r benutzerkonfigurierbare Variablen ge�ndert.
Patch von Christopher McCrory.
@item
Include-Dateien f�r Solaris 2.8 in Ordnung gebracht.
@item
Bug mit @code{--skip-networking} auf Debian Linux behoben.
@item
Problem behoben, dass einige tempor�re Dateien den Namen @code{UNOPENED} in
Fehlermeldungen hatten.
@item
Bug beim Laufenlassen von zwei gleichzeitigen @code{SHOW LOGS}-Anfragen
behoben.
@end itemize


@node News-3.23.29, News-3.23.28, News-3.23.30, News-3.23.x
@c German node Neuigkeiten-3.23.29
@appendixsubsec �nderungen in Release 3.23.29

@itemize @bullet
@item
Configure-Aktualisierungen f�r Tru64, Unterst�tzung gro�er Dateien und
besser TCP-Wrapper-Unterst�tzung. Von Albert Chin-A-Young.
@item
Bug in @code{<=>}-Operator behoben.
@item
Bug in @code{REPLACE} mit BDB-Tabellen behoben.
@item
@code{LPAD()} und @code{RPAD()} k�rzen jetzt die Ergebnis-Zeichenkette,
wenn sie l�nger als das L�ngenargument ist.
@item
@code{SHOW LOGS}-Befehl hinzugef�gt.
@item
Unbenutzte BDB-Logs werden beim Herunterfahren entfernt.
@item
Beim Erzeugen einer Tabelle werden @code{PRIMARY}-Schl�sseln zuerst
gesetzt, gefolgt von @code{UNIQUE}-Schl�sseln.
@item
Bug in @code{UPDATE} behoben, wenn mehrteilige Schl�ssel benutzt wurden,
bei denen alle Schl�sselteile sowohl in der Aktualisierung als auch im
@code{WHERE}-Teil angegeben wurden. In diesem Fall k�nnte MySQL versuchen,
einen Datensatz zu aktualisieren, der nicht dem gesamten @code{WHERE}-Teil
entspricht.
@item
L�schen von Tabellen so ge�ndert, dass zun�chst die Tabelle und dann die
@file{.frm}-Datei gel�scht wird.
@item
Bug im Hostnamen-Cache behoben, der dazu f�hrte, dass @code{mysqld} den
Hostnamen als @code{''} in manchen Fehlermeldungen berichtete.
@item
Bug mit @code{HEAP}-Tabellen behoben; die Variable
@code{max_heap_table_size} wurde nicht benutzt. Jetzt kann entweder
@code{MAX_ROWS} oder @code{max_heap_table_size} benutzt werden, um die
Gr��e einer @code{HEAP}-Tabelle zu beschr�nken.
@item
Die vorgabem��ige Server-Kennung auf 1 f�r Master-Server und 2 f�r Slaves
ge�ndert, um die Benutzung der Bin�r-Log-Datei zu erleichtern.
@item
Variable @code{bdb_lock_max} in @code{bdb_max_lock} umbenannt.
@item
Unterst�tzung f�r @code{auto_increment} auf Unter-Felder (Sub-Fields) f�r
BDB-Tabellen hinzugef�gt.
@item
@code{ANALYZE} von BDB-Tabellen hinzugef�gt.
@item
In BDB-Tabellen wird jetzt die Anzahl von Zeilen gespeichert. Das hilft,
Anfragen zu optimieren, wenn daf�r die ungef�hre Anzahl von Zeilen ben�tigt
wird.
@item
Wenn es einen Fehler in einem mehrzeiligen Statement gibt, wird jetzt nur
das letzte Statement zur�ckgerollt, nicht die gesamte Transaktion.
@item
Wenn man @code{ROLLBACK} nach der Aktualisierung einer nicht
transaktionalen Tabelle ausf�hrt, erh�lt man als Warnung einen Fehler.
@item
Option @code{--bdb-shared-data} f�r @code{mysqld} hinzugef�gt.
@item
Status-Variable @code{Slave_open_temp_tables} hinzugef�gt.
@item
Variablen @code{binlog_cache_size} und @code{max_binlog_cache_size} f�r
@code{mysqld} hinzugef�gt.
@item
@code{DROP TABLE}, @code{RENAME TABLE}, @code{CREATE INDEX} und
@code{DROP INDEX} sind jetzt Transaktions-Endpunkte.
@item
Wenn Sie ein @code{DROP DATABASE} auf eine symbolisch verkn�pfte Datenbank
ausf�hren, werden sowohl der Link als auch die Original-Datenbank gel�scht.
@item
@code{DROP DATABASE} funktioniert jetzt auf OS/2.
@item
Bug bei der Ausf�hrung von @code{SELECT DISTINCT ... tabelle1 LEFT JOIN
tabelle2 ...} behoben, wenn tabelle2 leer war.
@item
@code{--abort-slave-event-count}- und
@code{--disconnect-slave-event-count}-Optionen f�r @code{mysqld} zum
Debuggen und Testen der Replikation hinzugef�gt.
@item
Replikation tempor�rer Tabellen in Ordnung gebracht. Handhabt alles ausser
dem Neustart von Slaves.
@item
@code{SHOW KEYS} zeigt jetzt, ob ein Schl�ssel @code{FULLTEXT} ist oder
nicht.
@item
Neues Skript @file{mysqld_multi}. @xref{mysqld_multi, , @code{mysqld_multi}}.
@item
Neues Skript @file{mysql-multi.server.sh} hinzugef�gt. Vielen Dank an Tim
Bunce @email{Tim.Bunce@@ig.co.uk} f�r die Modifizierung von
@file{mysql.server}, um auf einfache Weise Hosts zu handhaben, die viele
@code{mysqld}-Prozesse laufen lassen.
@item
@file{safe_mysqld}, @file{mysql.server} und @file{mysql_install_db} wurden
so abge�ndert, dass sie @code{mysql_print_defaults} anstelle verschiedener
Hacks benutzen, um @file{my.cnf}-Dateien zu lesen. Zus�tzlich wurde die
Handhabung verschiedener Pfade konsistenter gemacht, in Bezug auf wie
@code{mysqld} vorgabem��ig handhabt.
@item
Berkeley-DB-Transaktions-Logs, die nicht mehr in Benutzung sind, werden
automatisch entfernt.
@item
Bug bei mehreren @code{FULLTEXT}-Indexen in einer Tabelle behoben.
@item
Warnung hinzugef�gt, wenn sich die von Zeilen bei
@code{REPAIR}/@code{OPTIMIZE} �ndert.
@item
Patches f�r OS/2 von @code{Yuri Dario} angewandt.
@item
@code{FLUSH TABLES tabelle} schrieb den Index-Baum nicht immer korrekt auf
die Festplatte zur�ck.
@item
@code{--bootstrap} l�uft jetzt in einem separaten Thread. Das behebt ein
Problem, das bei @code{mysql_install_db} einen Coredump auf einigen
Linux-Maschinen verursachte.
@item
@code{mi_create()} abge�ndert, so dass es weniger Stack-Platz ben�tigt.
@item
Bug beim Optimierer, wenn er versucht, @code{MATCH}, mit
@code{UNIQUE}-Schl�sseln benutzt, zu �beroptimieren.
@item
@code{Crash-me} und die MySQL-Benchmarks funktionieren jetzt auch mit
FrontBase.
@item
@code{RESTRICT} und @code{CASCADE} werden nach einem @code{DROP TABLE}
zugelassen, um die Portierung einfacher zu machen.
@item
Status-Variable zur�ckgesetzt, die Probleme hervorrufen konnte, wenn man
@code{--slow-log} benutzte.
@item
Variable @code{connect_timeout} f�r @code{mysql} und @code{mysqladmin}
hinzugef�gt.
@item
@code{connect_timeout} als Alias f�r @code{timeout} f�r Optionsdateien, die
von @code{mysql_options()} gelesen werden, hinzugef�gt.
@end itemize


@node News-3.23.28, News-3.23.27, News-3.23.29, News-3.23.x
@c German node Neuigkeiten-3.23.28
@appendixsubsec �nderungen in Release 3.23.28

@itemize @bullet
@item
Neue Optionen @code{--pager[=...]}, @code{--no-pager}, @code{--tee=...} und
@code{--no-tee} f�r den @code{mysql}-Client hinzugef�gt. Die entsprechenden
neuen interaktiven Befehle hei�en @code{pager}, @code{nopager}, @code{tee}
und @code{notee}. Siehe @xref{mysql, , @code{mysql}}, @code{mysql --help}
und die interaktive Hilfe wegen weiterer Informationen.
@item
Absturz behoben, der beim Fehlschlagen der Reparatur von
@code{MyISAM}-Tabellen auftrat.
@item
Gr��erer Performance-Bug im Tabellensperren-Code behoben, wenn man
permanent VIELE @code{SELECT}-, @code{UPDATE}- und @code{INSERT}-Statements
laufen hatte. Das Symptom zeigte sich darin, dass die @code{UPDATE}- und
@code{INSERT}-Anfragen lange gesperrt waren, w�hrend neue
@code{SELECT}-Statements vor den Aktualisierungen ausgef�hrt wurden.
@item
Beim Lesen von @code{options_files} mit @code{mysql_options()} wurde die
@code{return-found-rows}-Option ignoriert.
@item
Man kann jetzt @code{interactive-timeout} in der Optionsdatei angeben, die
von @code{mysql_options()} gelesen wird. Das erm�glicht es, Programme, die
lange laufen (wie @code{mysqlhotcopy}), zu zwingen,
@code{interactive_timeout} anstelle von @code{wait_timeout} zu benutzen.
@item
Zur Langsame-Anfragen-Log-Datei Zeit und Benutzernamen f�r jede geloggte
Anfrage hinzugef�gt. Wenn Sie @code{--log-long-format} benutzen, werden
auch Anfragen, die keinen Index benutzen, geloggt, selbst wenn die Anfrage
weniger als @code{long_query_time} Sekunden ben�tigt.
@item
Problem in @code{LEFT JOIN} behoben, was dazu f�hrte, dass alle Spalten in
einer Verweistabelle @code{NULL} waren.
@item
Problem bei der Benutzung von @code{NATURAL JOIN} ohne Schl�ssel behoben.
@item
Bug bei der Benutzung eines mehrteiligen Schl�ssels behoben, bei dem der
erste Teil vom Typ @code{TEXT} oder @code{BLOB} war.
@item
@code{DROP} von tempor�ren Tabellen wurde nicht in der
Update-/Bin�r-Log-Datei gespeichert.
@item
Bug behoben, der bei @code{SELECT DISTINCT * ... LIMIT #} nur eine Zeile
zur�ckgab.
@item
Bug im Assembler-Code in @code{strstr()} f�r sparc behoben und
@file{global.h}-Header-Datei aufger�umt, um ein Problem mit schlechtem
Aliasing des Compilers zu vermeiden, der bei RedHat 7.0 beiliegt (berichtet
von Trond Eivind Glomsr�d).
@item
Die Option @code{--skip-networking} funktioniert jetzt sauber unter Windows
NT.
@item
Lang ausstehender Bug in den @code{ISAM}-Tabellen behoben, wenn eine Zeile
mit einer L�nge von mehr als 65 KB um ein einzelnes Byte gek�rzt wurde.
@item
Bug in @code{MyISAM} beim Laufenlassen mehrfacher Aktualisierungsprozesse
auf dieselbe Tabelle behoben.
@item
Es wird zugelassen, dass @code{FLUSH TABLE tabelle} benutzt wird.
@item
@code{--replicate-ignore-table}, @code{--replicate-do-table},
@code{--replicate-wild-ignore-table} und @code{--replicate-wild-do-table}
hinzugef�gt.
@item
Alle Log-Dateien so ge�ndert, dass sie unseren eigenen
@code{IO_CACHE}-Mechanismus anstelle von @code{FILE} benutzen, um
Betriebssystemprobleme zu vermeiden, wenn zu viele Dateien offen sind.
@item
Optionen @code{--open-files} und @code{--timezone} f�r @code{safe_mysqld}
hinzugef�gt.
@item
Schweren Bug in @code{CREATE TEMPORARY TABLE ... SELECT ...} behoben.
@item
Problem mit @code{CREATE TABLE ... SELECT NULL} behoben.
@item
Variablen @code{large_file_support}, @code{net_read_timeout},
@code{net_write_timeout} und @code{query_buffer_size} f�r @code{SHOW
VARIABLES} hinzugef�gt.
@item
Status-Variablen @code{created_tmp_files} und @code{sort_merge_passes} f�r
@code{SHOW STATUS} hinzugef�gt.
@item
Bug behoben, bei dem kein Index-Name nach der @code{FOREIGN KEY}-Definition
zugelassen wurde.
@item
@code{TRUNCATE tabelle} als ein Synonym f�r @code{DELETE FROM tabelle}
hinzugef�gt.
@item
Bug in einer BDB-Schl�sselvergleichsfunktion beim Vergleich von
Schl�sselteilen behoben.
@item
Variable @code{bdb_lock_max} f�r @code{mysqld} hinzugef�gt.
@item
Weitere Tests zur Benchmark-Suite hinzugef�gt.
@item
�berlauf-Bug im Client-Code bei der Benutzung von �berlangen Datenbanknamen
behoben.
@item
@code{mysql_connect()} bricht jetzt unter Linux ab, wenn der Server nicht
in @code{timeout} Sekunden antwortet.
@item
@code{SLAVE START} funktionierte nicht, wenn Sie mit
@code{--skip-slave-start} starteten und vorher nicht explizit @code{CHANGE
MASTER TO} laufen lie�en.
@item
Die Ausgabe von @code{SHOW MASTER STATUS} in Ordnung gebracht, damit sie
konsistent mit @code{SHOW SLAVE STATUS} ist. (Sie hat jetzt kein
Verzeichnis im Log-Namen.)
@item
@code{PURGE MASTER LOGS TO} hinzugef�gt.
@item
@code{SHOW MASTER LOGS} hinzugef�gt.
@item
@code{--safemalloc-mem-limit}-Option f�r @code{mysqld} hinzugef�gt, um
Speichermangel zu simulieren, wenn mit @code{--with-debug=full} kompiliert
wurde.
@item
Mehrere Coredumps unter Bedingungen, in denen Arbeitsspeicher fehlt,
behoben.
@item
@code{SHOW SLAVE STATUS} benutzte einen nicht initialisierten mutex, wenn
der Slave noch nicht gestartet wurde.
@item
Bug in @code{ELT()} und @code{MAKE_SET()} behoben, wenn die Anfrage eine
tempor�re Tabelle benutzte.
@item
@code{CHANGE MASTER TO} ohne Angabe von @code{MASTER_LOG_POS} setzte es auf
0 statt auf 4 und erreichte die magische Zahl im bin�ren Master-Log.
@item
@code{ALTER TABLE ... ORDER BY ...}-Syntax hinzugef�gt. Das erzeugt die
Tabelle mit Zeilen in einer festgelegten Reihenfolge.
@end itemize


@node News-3.23.27, News-3.23.26, News-3.23.28, News-3.23.x
@c German node Neuigkeiten-3.23.27
@appendixsubsec �nderungen in Release 3.23.27

@itemize @bullet
@item
Bug behoben, bei dem das automatische Reparieren von MyISAM-Tabellen
manchmal fehlschlug, wenn die Daten-Datei besch�digt war.
@item
Bug in @code{SHOW CREATE} bei der Benutzung von
@code{AUTO_INCREMENT}-Spalten behoben.
@item
BDB-Tabellen so ge�ndert, dass sie die neue Vergleichsfunktion in Berkeley
DB 3.2.3 benutzen.
@item
Sie k�nnen jetzt Unix-Sockets bei @code{mit-pThread} benutzen.
@item
Neuer latin5- (t�rkischer) Zeichensatz.
@item
Kleinere Portabilit�tsbehebungen.
@end itemize


@node News-3.23.26, News-3.23.25, News-3.23.27, News-3.23.x
@c German node Neuigkeiten-3.23.26
@appendixsubsec �nderungen in Release 3.23.26

@itemize @bullet
@item
@code{<>} funktioniert jetzt sauber mit @code{NULL}.
@item
Problem mit @code{SUBSTRING_INDEX()} und @code{REPLACE()} behoben (Patch
von Alexunder Igonitchev).
@item
@code{CREATE TEMPORARY TABLE IF NOT EXISTS} gab keinen Fehler, wenn die
Tabelle existierte.
@item
Wenn Sie keinen @code{PRIMARY KEY} in einer BDB-Tabelle erzeugen, wird ein
versteckter @code{PRIMARY KEY} erzeugt.
@item
Nur-Lese-Schl�ssel-Optimierung to BDB-Tabellen hinzugef�gt.
@item
@code{LEFT JOIN} bevorzugte in manchen F�llen einen vollen Tabellen-Scan,
wenn es keine @code{WHERE}-Klausel gab.
@item
Bei der Benutzung von @code{--log-slow-query} die Wartezeit auf eine Sperre
nicht z�hlen.
@item
Bug im Sperr-Code unter Windows behoben, der dazu f�hrte, dass der
Schl�ssel-Cache berichtete, dass die Schl�ssel-Datei besch�digt sei, obwohl
sie in Ordnung war.
@item
Automatische Reparatur von @code{MyISAM}-Tabellen, wenn Sie @code{mysqld}
mit @code{--myisam-recover} starten, hinzugef�gt.
@item
Das @code{TYPE=}-Schl�sselwort wurde von @code{CHECK} und @code{REPAIR}
entfernt. Es wird zugelassen, dass @code{CHECK}-Optionen kombiniert werden.
(Sie k�nnen immer noch @code{TYPE=} benutzen, aber die Benutzung wird nicht
empfohlen.)
@item
Mutex-Bug im bin�ren Replikations-Log behoben - lange
Aktualisierungsanfragen konnten vom Slave nur teilweise gelesen werden,
wenn er das zur falschen Zeit machte, was nicht schwerwiegend ist, aber zu
einem Performance-verschlechternden erneuten Verbinden f�hrte, sowie zu
einer beunruhigenden Nachricht in der Fehler-Log-Datei.
@item
Das Format der Bin�r-Log-Datei wurde ge�ndert - hinzugef�gt wurden magische
Zahl, Serverversion, Binlog-Version, Server-Kennung und Anfragen-Fehlercode
f�r jedes Anfrage-Ereignis.
@item
Replikations-Thread vom Slave killt jetzt alle darnieder liegenden Threads
vom selben Server.
@item
Lange Replikations-Benutzernamen wurden bislang nicht korrekt gehandhabt.
@item
@code{--replicate-rewrite-db}-Option zu @code{mysqld} hinzugef�gt.
@item
@code{--skip-slave-start}-Option to @code{mysqld} hinzugef�gt.
@item
Aktualisierungen, die einen Fehlercode erzeugten (wie @code{INSERT INTO
foo(schluessel) values (1),(1)}) beendeten bislang irrt�mlich den
Slave-Thread.
@item
Optimierung von Anfragen, bei denen @code{DISTINCT} nur auf Spalten aus
denselben Tabellen benutzt wird, hinzugef�gt.
@item
Flie�kommazahlen ohne Vorzeichen nach dem Exponent (wie 1e1) werden
zugelassen.
@item
@code{SHOW GRANTS} zeigte nicht immer alle Spaltenberechtigungen.
@item
@code{--default-extra-file=#} f�r alle MySQL-Clients hinzugef�gt.
@item
Spalten, auf die in @code{INSERT}-Statements verwiesen wird, werden nun
sauber initialisiert.
@item
@code{UPDATE} funktioniert nicht immer, wenn es mit einem Bereich auf einem
Timestamp benutzt wurde, der Teil des Schl�ssels war, der benutzt wurde, um
Zeilen zu finden.
@item
Bug in @code{FULLTEXT}-Index beim Einf�gen einer @code{NULL}-Spalte
behoben.
@item
@code{mkstemp()} wird jetzt anstelle von @code{tempnam()} benutzt. Basiert
auf einem Patch von John Jones.
@end itemize


@node News-3.23.25, News-3.23.24, News-3.23.26, News-3.23.x
@c German node Neuigkeiten-3.23.25
@appendixsubsec �nderungen in Release 3.23.25

@itemize @bullet
@item
@code{database} funktioniert als zweites Argument f�r @code{mysqlhotcopy}.
@item
@code{UMASK} und @code{UMASK_DIR} k�nnen jetzt oktal angegeben werden.
@item
@code{RIGHT JOIN}. Hierdurch wird @code{RIGHT} zu einem reservierten Wort.
@item
@code{@@@@IDENTITY} als ein Synonym f�r @code{LAST_INSERT_ID()}
hinzugef�gt, aus Gr�nden der Visual-Basic-Kompatibilit�t.)
@item
Bug in @code{myisamchk} und @code{REPAIR} bei der Benutzung von
@code{FULLTEXT}-Indexen behoben.
@item
@code{LOAD DATA INFILE} funktioniert jetzt mit FIFOs (Patch von Toni L.
Harbaugh-Blackford).
@item
@code{FLUSH LOGS} brach die Replikation ab, wenn Sie einen Log-Namen mit
einer expliziten Erweiterung als Wert der @code{log-bin}-Option angaben.
@item
Bug in @code{MyISAM} mit komprimierten mehrteiligen Schl�sseln behoben.
@item
Absturz bei der Benutzung von @code{CHECK TABLE} unter Windows behoben.
@item
Bug, bei dem @code{FULLTEXT}-Index immer den koi8_ukr-Zeichensatz
benutzten, behoben.
@item
Berechtigungs�berpr�fung f�r @code{CHECK TABLE} in Ordnung gebracht.
@item
Der @code{MyISAM}-Reparatur-/Reindexierungs-Code benutzte nicht die
@code{--tempdir}-Option f�r seine tempor�ren Dateien.
@item
@code{BACKUP TABLE/RESTORE TABLE} hinzugef�gt.
@item
Coredump auf @code{CHANGE MASTER TO} behoben, wenn der Slave keinen Master
hatte, mit dem er startet.
@item
Falsche @code{time} in der Prozessliste f�r @code{Connect} des
Slave-Threads in Ordnung gebracht.
@item
Der Slave loggt jetzt, wann er sich mit dem Master verbindet.
@item
Coredump-Bug beim Ausf�hren von @code{FLUSH MASTER} behoben, wenn man kein
Dateinamens-Argument f�r @code{--log-bin} angab.
@item
Fehlende @file{ha_berkeley.x}-Dateien zu MySQL unter Windows hinzugef�gt.
@item
Einige mutex-Bugs im Log-Code behoben, die zu Thread-Blockierungen f�hren
konnten, wenn neue Log-Dateien nicht erzeugt werden konnten.
@item
Sperrzeit und Anzahl von ausgew�hlten bearbeiteten Zeilen zur
Langsame-Anfragen-Log-Datei hinzugef�gt.
@item
@code{--memlock}-Option f�r @code{mysqld}, um @code{mysqld} im
Arbeitsspeicher auf Systemen mit dem @code{mlockall()}-Aufruf (wie in
Solaris) zu sperren, hinzugef�gt.
@item
@code{HEAP}-Tabellen benutzten Schl�ssel nicht korrekt (Bug aus Version
3.23.23).
@item
Bessere Unterst�tzung f�r @code{MERGE}-Tabellen (Schl�ssel, Mapping,
Erzeugung, Dokumentation und mehr) hinzugef�gt. @xref{MERGE}.
@item
Bug in @code{mysqldump} aus Version 3.23 behoben, der dazu f�hrte, dass
einige @code{CHAR}-Spalten nicht in Anf�hrungsstrichen standen.
@item
@code{analyze}, @code{check}, @code{optimize} und Reparatur-Code
zusammengefasst.
@item
@code{OPTIMIZE TABLE} wird jetzt auf @code{REPAIR} mit Statistiken und
Sortieren des Index-Baums gemappt. Das hei�t, das es momentan nur auf
@code{MyISAM}-Tabellen funktioniert.
@item
Einen pre-alloced Block zu root_malloc hinzugef�gt, um weniger mallocs zu
erhalten.
@item
Viele neue Statistik-Variablen hinzugef�gt.
@item
@code{ORDER BY}-Bug bei BDB-Tabellen behoben.
@item
Warnungen entfernt, dass @code{mysqld} die @file{.pid}-Datei unter Windows
nicht entfernen konnte.
@item
@code{--log-isam} zum Loggen von @strong{MyISAM}-Tabellen anstelle von
isam-Tabellen abge�ndert.
@item
@code{CHECK TABLE} funktioniert jetzt auch unter Windows.
@item
Datei-mutexes hinzugef�gt, um @code{pwrite()} unter Windows sicher zu
machen.
@end itemize


@node News-3.23.24, News-3.23.23, News-3.23.25, News-3.23.x
@c German node Neuigkeiten-3.23.24
@appendixsubsec �nderungen in Release 3.23.24

@itemize @bullet
@item
@code{mysqld}-Variable @code{created_tmp_disk_tables} hinzugef�gt.
@item
Um das verl�ssliche Dumpen und Wiederherstellen von Tabellen mit
@code{TIMESTAMP(X)}-Spalten zu erm�glichen, berichtet MySQL jetzt Spalten
mit @code{X} anders als 14 oder 8 als Zeichenketten.
@item
Sortierreihenfolge f�r latin1 abge�ndert im Vergleich zu MySQL-Version vor
3.23.23. Jede Tabelle mit @code{CHAR}-Spalten, die Zeichen mit ASCII-Werten
gr��er als 128 enthalten darf, die vor Version 3.23.22 erzeugt oder
ge�ndert wurde, muss repariert werden!
@item
Kleines Speicherleck behoben, das in Version 3.23.22 beim Einf�gen einer
tempor�ren Tabelle eingef�hrt wurde.
@item
Problem mit BDB-Tabellen und Lesen auf einem eindeutigen (nicht prim�ren)
Schl�ssel behoben.
@item
Der win1251-Zeichensatz wurde wiederhergestellt (er ist jetzt nur als nicht
empfohlen gekennzeichnet).
@end itemize


@node News-3.23.23, News-3.23.22, News-3.23.24, News-3.23.x
@c German node Neuigkeiten-3.23.23
@appendixsubsec �nderungen in Release 3.23.23

@itemize @bullet
@item
Ge�nderte Sortierreihenfolge f�r 'deutsch'; Alle Tabellen mit 'deutscher'
Sortierreihenfolge m�ssen mit @code{REPAIR TABLE} oder @code{myisamchk}
repariert werden, bevor sie benutzt werden k�nnen!
@item
Option @code{--core-file} f�r @code{mysqld} hinzugef�gt, um eine Core-Datei
unter Linux zu erhalten, wenn @code{mysqld} durch das SIGSEGV-Signal
stirbt.
@item
MySQL-Client @code{mysql} startet jetzt vorgabem��ig mit
@code{--no-named-commands} (@code{-g}). Diese Option kann mit
@code{--enable-named-commands} (@code{-G}) abgeschaltet werden. Das kann in
manchen F�llen Inkompatibilit�tsprobleme hervorrufen, zum Beispiel in
SQL-Skripten, die benannte Befehle ohne Semikolon benutzen!
Langformat-Befehle funktionieren immer noch von der ersten Zeile.
@item
Problem bei der Benutzung vieler anh�ngiger @code{DROP TABLE}-Statements
zugleich behoben.
@item
Der Optimierer verwendete Schl�ssel nicht korrekt bei der Benutzung von
@code{LEFT JOIN} auf eine leere Tabelle.
@item
K�rzerer Hilfetext beim Aufruf von @code{mysqld} mit falschen Optionen.
@item
Nicht schwerwiegender @code{free()}-Bug in @code{mysqlimport} behoben.
@item
Bug in der @code{MyISAM}-Index-Handhabung von
@code{DECIMAL}-/@code{NUMERIC}-Schl�sseln behoben.
@item
Bug beim gleichzeitigen Einf�gen in @code{MyISAM}-Tabellen behoben; in
manchen Zusammenh�ngen gab die Benutzung von @code{MIN(schluessel_teil)}
oder @code{MAX(schluessel_teil)} eine leere Ergebnismenge zur�ck.
@item
@code{mysqlhotcopy} f�r die Benutzung der neuen @code{FLUSH TABLES
tabellen_liste}-Syntax aktualisiert. Nur Tabellen, die gesichert werden,
werden jetzt auf Platte zur�ckgeschrieben (flush).
@item
Verhalten von @code{--enable-thread-safe-client} so ge�ndert, dass sowohl
nicht gethreadete (@code{-lmysqlclient}) als auch gethreadete
(@code{-lmysqlclient_r}) Bibliotheken eingebaut werden. Benutzer, die gegen
ein gethreadetes @code{-lmysqlclient} linkten, m�ssen jetzt gegen
@code{libmysqlclient_r} linken.
@item
Atomischer @code{RENAME}-Befehl hinzugef�gt.
@item
Eintr�ge mit @code{NULL} werden in @code{COUNT(DISTINCT ...)} nicht
gez�hlt.
@item
@code{ALTER TABLE}, @code{LOAD DATA INFILE} auf leere Tabellen und
@code{INSERT ... SELECT ...} auf leere Tabellen so ge�ndert, dass nicht
eindeutige Indexe in einem separaten Stapellauf mit Sortieren erzeugt
werden. Das macht die genannten Aufrufe viel schneller, wenn Sie viele
Indexe haben.
@item
@code{ALTER TABLE} loggt jetzt die zuerst benutzte insert_id korrekt.
@item
Absturz beim Hinzuf�gen eines Vorgabewerts zu einer @code{BLOB}-Spalte
behoben.
@item
Bug bei @code{DATE_ADD/DATE_SUB} behoben, der eine DATETIME anstelle eines
DATE zur�ckgab.
@item
Problem mit dem Thread-Cache behoben, der dazu f�hrte, dass einige Threads
als @code{***DEAD***} in @code{SHOW PROCESSLIST} erschienen.
@item
Eine Sperre in unserem thr_rwlock-Code beseitigt, die dazu f�hren konnte,
dass SELECTs, die zur selben Zeit laufen wie gleichzeitige Einf�gevorg�nge,
abst�rzen. Das betrifft nur Systeme, die nicht den
@code{pthread_rwlock_rdlock}-Code haben.
@item
Beim L�schen von Zeilen mit einem nicht eindeutigen Schl�ssel in einer
HEAP-Tabelle wurden nicht immer alle Zeilen gel�scht.
@item
Bug im Bereichsoptimierer f�r HEAP-Tabellen bei Suchen auf einem Teil-Index
behoben.
@item
@code{SELECT} auf Teilschl�sseln funktioniert jetzt bei BDB-Tabellen.
@item
@code{INSERT INTO bdb_tabelle ... SELECT} funktioniert jetzt bei
BDB-Tabellen.
@item
@code{CHECK TABLE} aktualisiert jetzt Schl�sselstatistiken f�r die Tabelle.
@item
@code{ANALYZE TABLE} aktualisiert jetzt nur Tabellen, die seit dem letzten
@code{ANALYZE} ge�ndert wurden. Beachten Sie, dass das ein neues Feature
ist, und dass Tabellen nicht als analysiert gekennzeichnet werden, bis sie
auf irgend eine Weise mit Version 3.23.23 oder neuer aktualisiert wurden.
Bei �lteren Tabellen m�ssen Sie @code{CHECK TABLE} ausf�hren, um die
Schl�sselverteilung zu aktualisieren.
@item
Einige kleinere Berechtigungsprobleme bei @code{CHECK}, @code{ANALYZE},
@code{REPAIR} und @code{SHOW CREATE} behoben.
@item
@code{CHANGE MASTER TO}-Befehl hinzugef�gt.
@item
@code{FAST}-, @code{QUICK}- @code{EXTENDED}-�berpr�fungsarten zu
@code{CHECK TABLES} hinzugef�gt.
@item
@code{myisamchk} abge�ndert, so dass @code{--fast} und
@code{--check-changed-tables} auch bei @code{--sort-index} und
@code{--analyze} ber�cksichtigt werden.
@item
Schwerwiegenden Bug in @code{LOAD TABLE FROM MASTER} behoben, bei dem die
Tabelle w�hrend des Neuaufbaus des Indexes nicht gesperrt wurde.
@item
@code{LOAD DATA INFILE} brach die Replikation ab, wenn die Datenbank aus
der Replikation ausgeschlossen war.
@item
Mehr Variablen zu @code{SHOW SLAVE STATUS} und @code{SHOW MASTER STATUS}
hinzugef�gt.
@item
@code{SLAVE STOP} gibt jetzt solange nichts zur�ck, bis der Thread
tats�chlich beendet ist.
@item
Volltextsuche mit der @code{MATCH}-Funktion und @code{FULLTEXT}-Indextyp
hinzugef�gt (f�r MyISAM-Dateien). Das macht @code{FULLTEXT} zu einem
reservierten Wort.
@end itemize


@node News-3.23.22, News-3.23.21, News-3.23.23, News-3.23.x
@c German node Neuigkeiten-3.23.22
@appendixsubsec �nderungen in Release 3.23.22

@itemize @bullet
@item
@code{lex_hash.h} wird jetzt f�r jede MySQL-Distribution korrekt erzeugt.
@item
@code{MASTER} und @code{COLLECTION} sind jetzt reservierte W�rter.
@item
Die Log-Datei, die von @code{--slow-query-log} erzeugt wird, enthielt nicht
die gesamten Anfragen.
@item
Offene Transaktionen in BDB-Tabellen werden jetzt nicht mehr zur�ckgerollt,
wenn die Verbindung unerwartet geschlossen wird.
@item
Workaround f�r einen Bug in @code{gcc} 2.96 (intel) und @code{gcc} 2.9
(Ia64) in @code{gen_lex_hash.c} hinzugef�gt.
@item
Speicherleck in der Client-Bibliothek bei der Benutzung von @code{host=} in
der @code{my.cnf}-Datei behoben.
@item
Funktionen optimiert, die Stunden/Minuten/Sekunden bearbeiten.
@item
Bug beim Vergleich des Ergebnisses von @code{DATE_ADD()}/@code{DATE_SUB()}
mit einer Zahl behoben.
@item
Bedeutung von @code{-F, --fast} f�r @code{myisamchk} ge�ndert. Option
@code{-C, --check-only-changed} f�r @code{myisamchk} hinzugef�gt.
@item
@code{ANALYZE tabelle} zum Aktualisieren von Schl�sselstatistiken f�r
Tabellen hinzugef�gt.
@item
Bin�reinheiten @code{0x...} abge�ndert, so dass sie vorgabem��ig als
Ganzzahlen betrachtet werden.
@item
Fehlerbehebung f�r SCO und @code{SHOW PROCESSLIST}.
@item
@code{auto-rehash} beim erneuten Verbinden f�r den @code{mysql}-Client
hinzugef�gt.
@item
Neu eingef�hrten Bug in @code{MyISAM} behoben, bei dem die Index-Datei
nicht gr��er als 64 MB werden durfte.
@item
@code{SHOW MASTER STATUS} und @code{SHOW SLAVE STATUS} hinzugef�gt.
@end itemize


@node News-3.23.21, News-3.23.20, News-3.23.22, News-3.23.x
@c German node Neuigkeiten-3.23.21
@appendixsubsec �nderungen in Release 3.23.21

@itemize @bullet
@item
@code{mysql_character_set_name(MYSQL *mysql)}-Funktion zur MySQL-C-API
hinzugef�gt.
@item
Update-Log-Datei @code{ASCII 0}-sicher gemacht.
@item
@code{mysql_config}-Skript hinzugef�gt.
@item
Problem bei der Benutzung von @code{<} oder @code{>} mit einer CHAR-Spalte,
die nur teilweise indexiert war, behoben.
@item
Man erhielt einen Coredump, wenn die Log-Datei nicht vom MySQL-Benutzer
lesbar war.
@item
@code{mysqladmin} so ge�ndert, dass es die @code{CREATE
DATABASE}/@code{DROP DATABASE}-Befehle anstelle der alten, nicht
empfohlenen API-Aufrufe benutzt.
@item
@code{chown}-Warnung in @code{safe_mysqld} in Ordnung gebracht.
@item
Bug in @code{ORDER BY} behoben, der in Version 3.23.19 eingef�hrt wurde.
@item
@code{DELETE FROM tabelle} wird nur dann optimiert, ein L�schen und
Neuerzeugen der Tabelle auszuf�hren, wenn man sich im
@code{AUTOCOMMIT}-Modus befindet (ben�tigt f�r BDB-Tabellen).
@item
Zus�tzliche Pr�fungen hinzugef�gt, um Index-Besch�digung zu vermeiden, wenn
die @code{ISAM}/@code{MyISAM}-Index-Dateien w�hrend eines
@code{INSERT}/@code{UPDATE} voll werden.
@item
@code{myisamchk} aktualisierte die Zeilenpr�fsumme nicht korrekt, wenn es
mit @code{-ro} benutzt wurde (sondern gab nur bei nachfolgenden L�ufen eine
Warnung aus).
@item
Bug in @code{REPAIR TABLE} behoben, so dass es bei Tabellen ohne Indexe
funktioniert.
@item
Puffer-�berlauf in @code{DROP DATABASE} behoben.
@item
@code{LOAD TABLE FROM MASTER} ist ausreichend ohne Bugs, um es als Feature
vorstellen zu k�nnen.
@item
@code{MATCH} und @code{AGAINST} sind jetzt reservierte W�rter.
@end itemize


@node News-3.23.20, News-3.23.19, News-3.23.21, News-3.23.x
@c German node Neuigkeiten-3.23.20
@appendixsubsec �nderungen in Release 3.23.20

@itemize @bullet
@item
Bug in Version 3.23.19 behoben; @code{DELETE FROM tabelle} entfernte die
.frm-Datei.
@item
@code{SHOW CREATE TABLE}.
@end itemize


@node News-3.23.19, News-3.23.18, News-3.23.20, News-3.23.x
@c German node Neuigkeiten-3.23.19
@appendixsubsec �nderungen in Release 3.23.19

@itemize @bullet
@item
Copyright f�r alle Dateien zu GPL f�r den Server-Code und die
Dienstprogramme und LGPL f�r die Client-Bibliotheken ge�ndert.
@item
Bug behoben, bei dem nicht alle �bereinstimmenden Zeilen bei einer
@code{MyISAM}-Tabelle aktualisiert wurden, wenn man eine Aktualisierung
basierend auf einem Schl�ssel auf eine Tabelle mit vielen Schl�sseln
durchf�hrte, und sich einige Schl�sselwerte �nderten.
@item
Die Linux-MySQL-RPMs und -Bin�rdateien werden jetzt bei einer
Linux-Thread-Version statisch gelinkt, die schnellere mutex-Handhabung bei
der Benutzung mit MySQL hat.
@item
@code{ORDER BY} kann jetzt @code{REF}-Schl�ssel benutzen, um eine
Untermenge von Zeilen zu finden, die sortiert werden m�ssen.
@item
Der Name von @code{print_defaults} wurde in @code{my_print_defaults}
ge�ndert, um Namenskonflikte zu vermeiden.
@item
@code{NULLIF()} funktioniert jetzt gem�� ANSI-SQL99.
@item
@code{net_read_timeout} und @code{net_write_timeout} als Startparameter f�r
@code{mysqld} hinzugef�gt.
@item
Bug behoben, der den Index bei der Ausf�hrung von @code{myisamchk
--sort-records} auf eine Tabelle mit Pr�fix-komprimiertem Index zerst�rte.
@item
pack_isam und myisampack zur Standard-MySQL-Distribution hinzugef�gt.
@item
Die Syntax @code{BEGIN WORK} hinzugef�gt (dasselbe wie @code{BEGIN}).
@item
Coredump-Bug bei der Benutzung von @code{ORDER BY} auf
@code{CONV()}-Ausdruck behoben.
@item @code{LOAD TABLE FROM MASTER} hinzugef�gt.
@item @code{FLUSH MASTER} und @code{FLUSH SLAVE} hinzugef�gt.
@item Gro�es/kleines 'endian'-Problem in der Replikation behoben.
@end itemize


@node News-3.23.18, News-3.23.17, News-3.23.19, News-3.23.x
@c German node Neuigkeiten-3.23.18
@appendixsubsec �nderungen in Release 3.23.18

@itemize @bullet
@item
Problem aus Version 3.23.17 bei der Auswahl eines Zeichensatzes auf der
Client-Seite behoben.
@item
@code{FLUSH TABLES with READ LOCK} ge�ndert, so dass es eine globale Sperre
macht, die f�r das Herstellen einer Kopie der MySQL-Daten-Dateien geeignet
ist.
@item
@code{CREATE TABLE ... SELECT ... PROCEDURE} funktioniert jetzt.
@item
Interne tempor�re Tabellen benutzen jetzt einen komprimierten Index bei der
Benutzung von @code{GROUP BY} auf @code{VARCHAR/CHAR}-Spalten.
@item
Problem behoben beim Sperren derselbe Tabelle mit einer @code{READ}- und
einer @code{WRITE}-Sperre.
@item
Problem mit myisamchk und @code{RAID}-Tabellen behoben.
@end itemize


@node News-3.23.17, News-3.23.16, News-3.23.18, News-3.23.x
@c German node Neuigkeiten-3.23.17
@appendixsubsec �nderungen in Release 3.23.17

@itemize @bullet
@item
Bug in @code{find_in_set()} behoben, wenn das erste Argument @code{NULL}
war.
@item
Tabellensperren f�r Berkeley-DB hinzugef�gt.
@item
Bug bei @code{LEFT JOIN} und @code{ORDER BY} behoben, bei dem die erste
Tabelle nur eine �bereinstimmende Zeile hatte.
@item
4 @code{my.cnf}-Beispiel-Dateien im @file{Support-files}-Verzeichnis
hinzugef�gt.
@item
@code{duplicated key}-Problem bei der Ausf�hrung gro�er @code{GROUP BY}s
behoben. (Dieser Bug wurde wahrscheinlich in Version 3.23.15 eingef�hrt).
@item
Syntax f�r @code{INNER JOIN} ge�ndert, um ANSI-SQL zu entsprechen.
@item
@code{NATURAL JOIN}-Syntax hinzugef�gt.
@item
Viele Korrekturen in der @code{BDB}-Schnittstelle.
@item
Handhabung von @code{--no-defaults} und @code{--defaults-file} f�r
@code{safe_mysqld.sh} und @code{mysql_install_db.sh} hinzugef�gt.
@item
Bug beim Lesen komprimierter Tabellen mit vielen Threads behoben.
@item
@code{USE INDEX} funktioniert jetzt mit @code{PRIMARY}-Schl�sseln.
@item
@code{BEGIN}-Statement ge�ndert, so dass es eine Transaktion im
@code{AUTOCOMMIT}-Modus startet.
@item
Symbolische-Links-Unterst�tzung f�r Windows.
@item
Protokoll ge�ndert, so dass der Client wei�, ob der Server im AUTOCOMMIT-
Modus ist und ob es eine anh�ngige Transaktion gibt. Wenn das der Fall ist,
gibt die Client-Bibliothek einen Fehler aus, bevor sie sich wieder mit dem
Server verbindet, damit der Client wei�, dass der Server ein Rollback
durchgef�hrt hat. Das Protokoll ist noch abw�rtskompatibel mit den alten
Clients.
@item
@code{KILL} funktioniert jetzt auf einem Thread, der durch ein 'Schreiben'
auf einen toten Client gesperrt ist.
@item
Speicherleck im Replikations-Slave-Thread behoben.
@item
Neue Option @code{log-slave-updates} hinzugef�gt, die das
Hintereinanderh�ngen im Kreis (Daisy-Chaining, 'Ringelrei') von Slaves
erlaubt.
@item
Compile-Fehler auf FreeBSD und anderen Systemen behoben, auf denen
@code{pthread_t} nicht dasselbe wie @code{int} ist.
@item
Herunterfahren des Masters bricht den Slave-Thread nicht mehr ab.
@item
Race-Bedingung im @code{INSERT DELAYED}-Code beim Ausf�hren von @code{ALTER
TABLE} behoben.
@item
Blockierungs�berpr�fung f�r @code{INSERT DELAYED} hinzugef�gt.
@end itemize


@node News-3.23.16, News-3.23.15, News-3.23.17, News-3.23.x
@c German node Neuigkeiten-3.23.16
@appendixsubsec �nderungen in Release 3.23.16

@itemize @bullet
@item
Option @code{TYPE=QUICK} f�r @code{CHECK} und @code{REPAIR} hinzugef�gt.
@item
Bug in @code{REPAIR TABLE} behoben, wenn die Tabelle durch einen anderen
Thread in Benutzung war.
@item
Einen Thread-Cache hinzugef�gt, um zu erm�glichen, MySQL mit @code{gdb} zu
debuggen, wenn man viele erneute Verbindungen durchf�hrt. Das verbessert
auch Systeme, auf denen man keine persistenten Verbindungen benutzen kann.
@item
Viele Korrekturen in der Berkeley-DB-Schnittstelle.
@item
@code{UPDATE IGNORE} bricht jetzt nicht mehr ab, wenn eine Aktualisierung
zu einem @code{DUPLICATE_KEY}-Fehler f�hrt.
@item
@code{CREATE TEMPORARY TABLE}-Befehle werden in die Update-Log-Datei
geschrieben.
@item
Bug bei der Handhabung von maskierten IP-Nummern in den
Berechtigungstabellen behoben.
@item
Bug mit @code{delayed_key_writes}-Tabellen und @code{CHECK TABLE} behoben.
@item
@code{replicate-do-db} und @code{replicate-ignore-db}-Optionen hinzugef�gt,
um auf Datenbanken zu beschr�nken, die repliziert werden.
@item
@code{SQL_LOG_BIN}-Option hinzugef�gt.
@end itemize


@node News-3.23.15, News-3.23.14, News-3.23.16, News-3.23.x
@c German node Neuigkeiten-3.23.15
@appendixsubsec �nderungen in Release 3.23.15

@itemize @bullet
@item
Um @code{mysqld} als @code{root} zu starten, m�ssen Sie jetzt die @code{--
user=root}-Option benutzen.
@item
Schnittstelle zu Berkeley-DB hinzugef�gt. (Diese funktioniert noch nicht
richtig. Spielen Sie mit ihr auf eigenes Risiko herum!)
@item
Replikation zwischen Master und Slaves hinzugef�gt.
@item
Bug behoben, bei dem ein anderer Thread eine Sperre stehlen konnte, wenn
ein Thread eine Sperre auf eine Tabelle hatte und einen @code{FLUSH
TABLES}-Befehl ausf�hrte.
@item
Die @code{slow_launch_time}-Variable und die
@code{slow_launch_thread}-Status-Variable zu @code{mysqld} hinzugef�gt.
Diese k�nnen mit @code{mysqladmin variables} und @code{mysqladmin
extended-status} betrachtet werden.
@item
Funktionen @code{INET_NTOA()} und @code{INET_ATON()} hinzugef�gt.
@item
Der vorgabem��ige Typ von @code{IF()} h�ngt jetzt vom zweiten und dritten
Argument ab und nicht nur vom zweiten.
@item
Fall behoben, bei dem @code{myisamchk} beim Versuch, eine Tabelle zu
reparieren, in eine Schleife geraten konnte.
@item
@code{INSERT DELAYED} nicht in die Update-Log-Datei schreiben, wenn
@code{SQL_LOG_UPDATE=0}.
@item
Problem mit @code{REPLACE} auf @code{HEAP}-Tabellen behoben.
@item
M�gliche Zeichens�tze und Zeitzone zu @code{SHOW VARIABLES} hinzugef�gt.
@item
Bug im Sperr-Code behoben, der zu Sperrproblemen bei gleichzeitigen
Einf�gevorg�ngen unter hoher Last f�hren konnte.
@item
Problem bei @code{DELETE} vieler Zeilen auf eine Tabelle mit komprimierten
Schl�sseln behoben, bei dem MySQL den Index scannte, um Zeilen zu finden.
@item
Problem mit @code{CHECK} auf Tabelle mit gel�schten Schl�sselbl�cken
behoben.
@item
Bug beim Neuverbinden (auf der Client-Seite) behoben, bei dem in manchen
Situationen Speicher nicht freigegeben wurde.
@item
Probleme in der Update-Log-Datei bei der Benutzung von
@code{LAST_INSERT_ID()} zum Aktualisieren einer Tabelle mit einem
auto_increment-Schl�ssel behoben.
@item
Funktion @code{NULLIF()} hinzugef�gt.
@item
Bug bei der Benutzung von @code{LOAD DATA INFILE} auf eine Tabelle mit
@code{BLOB/TEXT}-Spalten behoben.
@item
MyISAM optimiert, um es beim Einf�gen von Schl�sseln in sortierter
Reihenfolge schneller zu machen.
@item
@code{EXPLAIN SELECT ...} gibt jetzt auch aus, ob MySQL eine tempor�re
Tabelle oder Dateisortieren verwendet, wenn das @code{SELECT} aufgel�st
wird.
@item
Optimierung hinzugef�gt, um @code{ORDER BY}-Teile zu �berspringen, bei
denen der Teil ein konstanter Ausdruck im @code{WHERE}-Teil ist. Indexe
k�nnen jetzt benutzt werden, selbst wenn das @code{ORDER BY} nicht genau
mit dem Index �bereinstimmt, solange alle nicht benutzten Index-Teile und
alle zus�tzlichen @code{ORDER BY}-Spalten Konstanten in der
@code{WHERE}-Klausel sind. @xref{MySQL indexes}.
@item
@code{UPDATE} und @code{DELETE} auf einen gesamten eindeutigen Schl�ssel im
@code{WHERE}-Teil ist jetzt schneller als vorher.
@item
@code{RAID_CHUNKSIZE} so ge�ndert, dass es in 1024 Bytes inkrementiert.
@item
Coredump in LOAD_FILE(NULL) behoben.
@end itemize


@node News-3.23.14, News-3.23.13, News-3.23.15, News-3.23.x
@c German node Neuigkeiten-3.23.14
@appendixsubsec �nderungen in Release 3.23.14

@itemize @bullet
@item
Bug in @code{CONCAT()} behoben, bei dem eins der Argumente eine Funktion
war, die ein ver�ndertes Argument zur�ckgab.
@item
Kritischen Bug in @code{myisamchk} behoben, wobei es den Header in der
Index-Datei aktualisierte, wenn man die Tabelle nur pr�fte. Das brachte den
@code{mysqld}-Daemon durcheinander, wenn er dieselbe Tabelle zur gleichen
Zeit aktualisierte. Jetzt wird der Status in der Index-Datei nur dann
aktualisiert, wenn man @code{--update-state} benutzt. Bei �lteren
@code{myisamchk}-Versionen sollten Sie @code{--read-only} benutzen, wenn
Sie Tabellen nur pr�fen, wenn es auch nur die geringste Chance gibt, dass
der @code{mysqld}-Server zur gleichen Zeit auf der Tabelle arbeitet!
@item
@code{DROP TABLE} wird nicht mehr in der Update-Log-Datei geloggt.
@item
Problem beim Suchen auf @code{DECIMAL()}-Schl�sselfeld behoben, wenn die
Spalte Daten mit f�hrenden Nullen enthielt.
@item
Bug in @code{myisamchk} behoben, wenn auto_increment nicht der erste
Schl�ssel ist.
@item
@code{DATETIME} wird im ISO-8601-Format zugelassen: 2000-03-12T12:00:00
@item
Dynamische Zeichens�tze hinzugef�gt. Eine @code{mysqld}-Bin�rdatei kann
jetzt viele unterschiedliche Zeichens�tze handhaben (welche, k�nnen Sie
beim Start von @code{mysqld} angeben).
@item
Befehl @code{REPAIR TABLE} hinzugef�gt.
@item
C-API-Funktion @code{mysql_thread_safe()} hinzugef�gt.
@item
@code{UMASK_DIR}-Umgebungsvariable hinzugef�gt.
@item
Funktion @code{CONNECTION_ID()} hinzugef�gt.
@item
Bei der Benutzung von @code{=} auf @code{BLOB}- oder @code{VARCHAR
BINARY}-Schl�sseln, bei denen nur ein Teil der Spalte indexiert war, wurde
nicht die gesamte Spalte der Ergebniszeile verglichen.
@item
Problembehebung f�r sjis-Zeichensatz und @code{ORDER BY}.
@item
Beim Laufenlassen im ANSI-Modus wird nicht mehr zugelassen, dass Spalten
benutzt werden, die nicht im @code{GROUP BY}-Teil angegeben wurden.
@end itemize


@node News-3.23.13, News-3.23.12, News-3.23.14, News-3.23.x
@c German node Neuigkeiten-3.23.13
@appendixsubsec �nderungen in Release 3.23.13

@itemize @bullet
@item
Problem behoben bei der Ausf�hrung von Sperren auf dieselbe Tabelle mehr
als zweimal im selben @code{LOCK TABLE}-Befehl. Dadurch wurde das Problem
behoben, das man bekam, wenn man test-ATIS test mit @code{--fast} oder
@code{--check-only-changed} laufen lie�.
@item
Option @code{SQL_Puffer_RESULT} f�r @code{SELECT} hinzugef�gt.
@item
Leerzeichen am Ende von Double-/Float-Zahlen in Ergebnissen aus tempor�ren
Tabellen entfernt.
@code{CHECK TABLE}-Befehl hinzugef�gt.
@item
�nderungen f�r MyISAM in Version 3.23.12 hinzugef�gt, die wegen
CVS-Problemen nicht in die Quelldistribution gelangten.
@item
Bug behoben, so dass @code{mysqladmin shutdown} darauf wartet, dass der
lokale Server herunter f�hrt.
@item
M�gliche Endlosschleife bei der Zeitstempel-Berechnung repariert.
@item
@code{print_defaults} f�r die @file{.rpm}-Dateien hinzugef�gt.
@code{mysqlbug} aus der Client-@file{.rpm}-Datei entfernt.
@end itemize


@node News-3.23.12, News-3.23.11, News-3.23.13, News-3.23.x
@c German node Neuigkeiten-3.23.12
@appendixsubsec �nderungen in Release 3.23.12

@itemize @bullet
@item
Bug in @code{MyISAM} behoben, bei dem @code{REPLACE ... SELECT ...} eine
besch�digte Tabelle ergeben konnte.
@item
Bug in @code{myisamchk} behoben, bei dem der auto_increment-Wert falsch
zur�ckgesetzt wurde.
@item
VIELE Patches f�r Linux Alpha. MySQL scheint mittlerweile auf Linux Alpha
relativ stabil zu laufen.
@item
@code{DISTINCT} auf @code{HEAP} tempor�re Tabellen so ge�ndert, dass
gehashte Schl�ssel verwendet werden, um doppelte Zeilen (Duplikate) schnell
zu finden. Das betrifft meistens Anfragen des Typs @code{SELECT DISTINCT
... GROUP BY ...}. Das behebt ein Problem, bei dem nicht alle Duplikate in
Anfragen des genannten Typs entfernt wurden. Zus�tzlich ist der neue Code
VIEL schneller.
@item
Patches hinzugef�gt, damit MySQL auf Mac OS X kompiliert.
@item
Option @code{IF NOT EXISTS} f�r @code{CREATE DATABASE} hinzugef�gt.
@item
Optionen @code{--all-databases} und @code{--databases} f�r @code{mysqldump}
hinzugef�gt, um das Dumpen vieler Datenbanken zugleich zu erm�glichen.
@item
Bug im komprimierten @code{DECIMAL()}-Index in @code{MyISAM}-Tabellen
behoben.
@item
Bug beim Speichern von 0 in ein Timestamp-Feld behoben.
@item
Beim Ausf�hren von @code{mysqladmin shutdown} auf eine lokale Verbindung
wartet @code{mysqladmin} jetzt, bis die PID-Datei entfernt ist, bevor es
sich beendet.
@item
Coredump bei einigen @code{COUNT(DISTINCT ...)}-Anfragen behoben.
@item
@code{myisamchk} funktioniert jetzt sauber bei RAID-Tabellen.
@item
Problem bei @code{LEFT JOIN} und @code{schluessel_feld IS NULL} behoben.
@item
Bug in @code{net_clear()} behoben, der den Fehler @code{Aborted connection}
in MySQL-Clients ausgeben konnte.
@item
Optionen @code{USE INDEX (schluessel_liste)} und @code{IGNORE INDEX
(schluessel_liste)} als Join-Parameter in @code{SELECT} hinzugef�gt.
@item
@code{DELETE} und @code{RENAME} sollten jetzt auf @code{RAID}-Tabellen
funktionieren.
@end itemize


@node News-3.23.11, News-3.23.10, News-3.23.12, News-3.23.x
@c German node Neuigkeiten-3.23.11
@appendixsubsec �nderungen in Release 3.23.11

@itemize @bullet
@item
@code{ALTER TABLE tabelle ADD (feld_liste)}-Syntax wird zugelassen.
@item
Problem mit dem Optimierer behoben, der manchmal falsche Schl�ssel
benutzte.
@item
@code{GRANT/REVOKE ALL PRIVILEGES} betrifft jetzt nicht mehr @code{GRANT
OPTION}.
@item
Zus�tzliche Klammer (@code{)}) aus der Ausgabe von @code{SHOW GRANTS}
entfernt.
@item
Problem beim Speichern von Zahlen in Timestamps behoben.
@item
Problem mit Zeitzonen behoben, die einen Halbstunden-Offset haben.
@item
Syntax @code{UNIQUE INDEX} in @code{CREATE}-Statements wird jetzt
zugelassen.
@item
@code{mysqlhotcopy} hinzugef�gt. Das ist ein schnelles
Online-Datensicherungsdienstprogramm f�r lokale MySQL-Datenbanken. Von Tim
Bunce.
@item
Neues, sichereres @code{mysqlaccess} hinzugef�gt. Dank an Steve Harvey
hierf�r.
@item
Optionen @code{--i-am-a-dummy} und @code{--safe-updates} f�r @code{mysql}
hinzugef�gt.
@item
Variablen @code{select_limit} und @code{max_join_size} f�r @code{mysql}
hinzugef�gt.
@item
SQL-Variablen @code{SQL_MAX_JOIN_SIZE} und @code{SQL_SAFE_UPDATES}
hinzugef�gt.
@item
@code{READ LOCAL}-Sperre hinzugef�gt, die die Tabelle nicht f�r
gleichzeitige Einf�gevorg�nge sperrt (das wird von @code{mysqldump}
benutzt).
@item
@code{LOCK TABLES ... READ} l��t keine gleichzeitigen Einf�gevorg�nge mehr
zu.
@item
Option @code{--skip-delay-key-write} f�r @code{mysqld} hinzugef�gt.
@item
Sicherheitsproblem im Protokoll betreffend Passwort�berpr�fung behoben.
@item
@code{_rowid} kann jetzt als Alias f�r eine eindeutig indexierte Spalte vom
Typ Ganzzahl benutzt werden.
@item
Zur�ck-Blockieren (Back Blocking) f�r @code{SIGPIPE} beim Kompilieren mit
@code{--thread-safe-clients} hinzugef�gt, um Dinge f�r alte Clients sicher
zu machen.
@end itemize


@node News-3.23.10, News-3.23.9, News-3.23.11, News-3.23.x
@c German node Neuigkeiten-3.23.10
@appendixsubsec �nderungen in Release 3.23.10

@itemize @bullet
@item
Bug in Version 3.23.9 behoben, bei dem Speicher nicht korrekt freigegeben
wurde, wenn man @code{LOCK TABLES} ausf�hrte.
@end itemize


@node News-3.23.9, News-3.23.8, News-3.23.10, News-3.23.x
@c German node Neuigkeiten-3.23.9
@appendixsubsec �nderungen in Release 3.23.9

@itemize @bullet
@item
Problem behoben, dass betroffene Anfragen Berechnungen auf
Gruppenfunktionen durchf�hrten.
@item
Problem mit timestamps und @code{INSERT DELAYED} behoben.
@item
@code{datum_spalte BETWEEN konstanten_datum AND konstanten_datum}
funktioniert.
@item
Problem behoben, wenn man nur eine 0 zu @code{NULL} in einer Tabelle mit
@code{BLOB/TEXT}-Spalten �nderte.
@item
Bug im Bereichsoptimierer bei der Benutzung von vielen Schl�sselteilen und
/ oder den mittleren Schl�sselteilen behoben: @code{WHERE K1=1 and K3=2 and
(K2=2 and K4=4 or K2=3 and K4=5)}
@item
Befehl @code{source} f�r @code{mysql} hinzugef�gt, um Lesen von
Stapeldateien innerhalb des @code{mysql}-Clients zu erm�glichen.
Original-Patch von Matthew Vanecek.
@item
Kritisches Problem mit der @code{WITH GRANT OPTION}-Option behoben.
@item
Keinen unn�tigen @code{GRANT}-Fehler bei der Benutzung von Tabellen von
vielen Datenbanken in derselben Anfrage ausgeben.
@item
VIO-Wrapper (ben�tigt f�r SSL-Unterst�tzung) hinzugef�gt. Von Andrei
Errapart und T�nu Samuel).
@item
Optimiererproblem bei @code{SELECT} bei der Benutzung von vielen
�berlappenden Indexen behoben. MySQL sollte jetzt in der Lage sein,
Schl�ssel noch besser auszusuchen, wenn es viele Schl�ssel zur Auswahl
gibt.
@item
Optimierer so ge�ndert, dass er einen Bereichsschl�ssel anstelle eines
Verweisschl�ssels bevorzugt, wenn der Bereichsschl�ssel mehr Spalten als
der Verweisschl�ssel benutzen kann (der nur Spalten mit = verwenden
kann). Folgender Anfragentyp beispielsweise sollte jetzt schneller sein:
@code{SELECT * from schluessel_teil_1=konstante und schluessel_teil_2 >
konstante2}
@item
Bug behoben, bei dem eine �nderung aller @code{VARCHAR}-Spalten in
@code{CHAR}-Spalten den Spaltentyp nicht von dynamisch auf fest �nderte.
@item
Flie�komma-Ausnahmefehler f�r FreeBSD abgeschaltet, um Coredump beim
Ausf�hren von @code{SELECT floor(pow(2,63))} zu vermeiden.
@item
@code{mysqld}-Startoption @code{--delay-key-write} in
@code{--delay-key-write-for-all-tables} ge�ndert.
@item
@code{read-next-on-key} f�r @code{HEAP}-Tabellen hinzugef�gt. Das sollte
alle Probleme mit @code{HEAP}-Tabellen bei der Benutzung von
Nicht-@code{UNIQUE}-Schl�sseln beheben.
@item
Optionen f�r die Ausgabe vorgabem��iger Argumente f�r alle Clients
hinzugef�gt.
@item
@code{--log-slow-queries} f�r @code{mysqld} hinzugef�gt, um alle Anfragen
in einer separate Log-Datei zu loggen, die lange dauerten, mit einer
Zeitangabe, wie lange die Anfrage ben�tigte.
@item
Coredump bei der Ausf�hrung von @code{WHERE schluessel_spalte=RAND(...)}
behoben.
@item
Optimierungs-Bug in @code{SELECT ... LEFT JOIN ... schluessel_spalte IS
NULL} behoben, wenn @code{schluessel_spalte} @code{NULL}-Werte enthalten
konnte.
@item
Problem mit 8-Bit-Zeichen als Trennzeichen in @code{LOAD DATA INFILE}
behoben.
@end itemize


@node News-3.23.8, News-3.23.7, News-3.23.9, News-3.23.x
@c German node Neuigkeiten-3.23.8
@appendixsubsec �nderungen in Release 3.23.8

@itemize @bullet
@item
Problem bei der Handhabung von Index-Dateien gr��er als 8 GB behoben.
@item
neueste Patches f�r mit-pThread f�r NetBSD angewandt.
@item
Probleme mit Zeitzonen < GMT - 11 behoben.
@item
Bug beim L�schen komprimierter Schl�ssel in @code{MyISAM} behoben.
@item
Problem mit @code{ISAM} bei der Ausf�hrung einiger @code{ORDER BY ...
DESC}-Anfragen behoben.
@item
Bug bei der Ausf�hrung eines Joins auf einen Text-Schl�ssel behoben, der
nicht den gesamten Schl�ssel abdeckte.
@item
Option @code{--delay-key-write} schaltete verz�gertes Schl�ssel-Schreiben
nicht an.
@item
Aktualisierung von @code{TEXT}-Spalten, die nur �nderungen der
Gro�-/Kleinschreibung beinhalteten, in Ordnung gebracht.
@item
@code{INSERT DELAYED} aktualisiert jetzt Timestamps, die angegeben sind.
@item
Funktion @code{YEARWEEK()} und Optionen @code{x}, @code{X}, @code{v} und
@code{V} f�r @code{DATE_FORMAT()} hinzugef�gt.
@item
Problem mit @code{MAX(indexierte_spalte)} und HEAP-Tabellen behoben.
@item
Problem mit @code{BLOB NULL}-Schl�sseln und @code{LIKE} "praefix%"
behoben.
@item
Problem mit @code{MyISAM} und Zeilen fester L�nge < 5 Bytes behoben.
@item
Problem behoben, bei dem es vorkommen konnte, dass MySQL auf freigegebenen
Speicher zugriff, wenn er sehr komplizierte @code{GROUP BY}-Anfragen
ausf�hrte.
@item
Coredump behoben, wenn man eine besch�digte Tabelle erhielt, in der ein
@code{ENUM}-Feldwert zu Gro� war.
@end itemize


@node News-3.23.7, News-3.23.6, News-3.23.8, News-3.23.x
@c German node Neuigkeiten-3.23.7
@appendixsubsec �nderungen in Release 3.23.7

@itemize @bullet
@item
Workaround unter Linux in Ordnung gebracht, um Probleme mit
@code{pthread_mutex_timedwait}, was bei @code{INSERT DELAYED} benutzt wird,
zu vermeiden. @xref{Linux}.
@item
Man erh�lt jetzt einen 'disk full'-Fehler, wenn die Festplatten beim
Sortieren voll wird (statt darauf zu warten, bis mehr Plattenplatz
verf�gbar ist).
@item
Bug in @code{MyISAM} mit Schl�sseln > 250 Zeichen behoben.
@item
In @code{MyISAM} kann man jetzt ein @code{INSERT} zur selben Zeit
durchf�hren, in der andere Threads aus der Tabelle lesen.
@item
Variable @code{max_write_lock_count} f�r @code{mysqld} hinzugef�gt, um eine
@code{READ}-Sperre nach einer bestimmten Anzahl von @code{WRITE}-Sperren zu
erzwingen.
@item
Flag @code{delayed_key_write} bei @code{show variables} invertiert.
@item
Variable @code{concurrency} in @code{thread_concurrency} umbenannt.
@item
Folgende Funktionen sind jetzt Multi-Byte-sicher:
@code{LOCATE(teilzeichenfolge,zeichenkette)},
@code{POSITION(teilzeichenfolge IN zeichenkette)},
@code{LOCATE(teilzeichenfolge,zeichenkette,position)},
@code{INSTR(zeichenkette,teilzeichenfolge)},
@code{LEFT(zeichenkette,laenge)}, @code{RIGHT(zeichenkette,laenge)},
@code{SUBSTRING(zeichenkette,pos,laenge)}, @code{SUBSTRING(zeichenkette
FROM position FOR laenge)}, @code{MID(zeichenkette,position,laenge)},
@code{SUBSTRING(zeichenkette,position)}, @code{SUBSTRING(zeichenkette FROM
pos)}, @code{SUBSTRING_INDEX(zeichenkette,begrenzer,zaehler)},
@code{RTRIM(zeichenkette)}, @code{TRIM([[BOTH | TRAILING]
[entfernzeichenkette] FROM] zeichenkette)},
@code{REPLACE(zeichenkette,from_zeichenkette,to_zeichenkette)},
@code{REVERSE(zeichenkette)},
@code{INSERT(zeichenkette,pos,laenge,newstr)}, @code{LCASE(zeichenkette)},
@code{LOWER(zeichenkette)}, @code{UCASE(zeichenkette)} und
@code{UPPER(zeichenkette)}. Patch von Wei He.
@item
Coredump beim Aufheben einer Sperre von einer nicht existierenden Tabelle
behoben.
@item
Sperren auf Tabellen werden jetzt entfernt, bevor Duplikate entfernt
werden.
@item
Option @code{FULL} f�r @code{SHOW PROCESSLIST} hinzugef�gt.
@item
Option @code{--verbose} f�r @code{mysqladmin} hinzugef�gt.
@item
Problem beim automatischen Umwandeln von HEAP in MyISAM behoben.
@item
Bug in HEAP-Tabellen behoben, wenn man INSERT + DELETE + INSERT + Scannen
der Tabelle ausf�hrt.
@item
Bugs auf Alpha mit @code{REPLACE()} und @code{LOAD DATA INFILE} behoben.
@item
@code{mysqld}-Variable @code{interactive_timeout} hinzugef�gt.
@item
Argument f�r @code{mysql_data_seek()} von @code{ulong} zu @code{ulonglong}
ge�ndert.
@end itemize


@node News-3.23.6, News-3.23.5, News-3.23.7, News-3.23.x
@c German node Neuigkeiten-3.23.6
@appendixsubsec �nderungen in Release 3.23.6

@itemize @bullet
@item
@code{mysqld}-Option @code{-O lower_case_tables=@{0|1@}} hinzugef�gt, damit
Benutzer Tabellennamen to Kleinschreibung erzwingen k�nnen.
@item
@code{SELECT ... INTO DUMPFILE} hinzugef�gt.
@item
@code{mysqld}-Option @code{--ansi} hinzugef�gt, um einige Funktionen
@code{ANSI-SQL}-kompatibler zu machen.
@item
Tempor�re Tabellen fangen jetzt mit @code{#sql} an.
@item
Quoten von Bezeichnern mit @code{`} (@code{"} im @code{--ansi}-Modus).
@item
Jetzt wird snprintf() bei der Ausgabe von Flie�kommazahlen benutzt, um
einige Puffer-�berl�ufe unter FreeBSD zu vermeiden.
@item
@code{[floor()} �berlaufsicher unter FreeBSD gemacht.
@item
Option @code{--quote-names} f�r @code{mysqldump} hinzugef�gt.
@item
Bug behoben, dass man einen Teil eines @code{PRIMARY KEY NOT NULL} machen
konnte.
@item
@code{encrypt()} in Ordnung gebracht, um Thread-sicher zu sein und Puffer
nicht erneut zu benutzen.
@item
@code{mysql_odbc_escape_string()}-Funktion zur Unterst�tzung von
big5-Zeichen in MyODBC hinzugef�gt.
@item
Die Tabellen-Handler wurden umgeschrieben und benutzen jetzt Klassen.
Hierdurch wird viel neuer Code eingef�hrt, aber die Tabellenhandhabung wird
schneller und besser.
@item
Patch von Sasha f�r benutzerdefinierte Variablen angewandt.
@item
@code{FLOAT} und @code{DOUBLE} (ohne jeden L�ngen-Modifikator) sind jetzt
keine festen Dezimalpunkt-Zahlen mehr.
@item
Die Bedeutung von @code{FLOAT(X)} wurde ge�ndert: Jetzt ist das dasselbe
wie @code{FLOAT}, wenn X <= 24, und @code{DOUBLE}, wenn 24 < X <= 53.
@item
@code{DECIMAL(X)} ist jetzt ein Alias f�r @code{DECIMAL(X,0)}, und
@code{DECIMAL} ist jetzt ein Alias f�r @code{DECIMAL(10,0)}. Dasselbe gilt
f�r @code{NUMERIC}.
@item
Option @code{ROW_FORMAT=@{default | dynamic | static | compressed@}} f�r
@code{CREATE_TABLE} hinzugef�gt.
@item
@code{DELETE FROM tabelle} funktionierte nicht auf tempor�ren Tabellen.
@item
Funktion @code{CHAR_LENGTH()} ge�ndert, so dass sie
Multi-Byte-Zeichen-sicher ist.
@item
Funktion @code{ORD(zeichenkette)} hinzugef�gt.
@end itemize


@node News-3.23.5, News-3.23.4, News-3.23.6, News-3.23.x
@c German node Neuigkeiten-3.23.5
@appendixsubsec �nderungen in Release 3.23.5

@itemize @bullet
@item
Einige Jahr-2000-Probleme in der neuen Daten-Handhabung in Version 3.23
behoben.
@item
Problem mit @code{SELECT DISTINCT ... ORDER BY RAND()} behoben.
@item
Patches von Sergei A. Golubchik f�r Textsuche auf MyISAM-Ebene angewandt.
@item
Cache-�berlaufproblem bei der Benutzung von Full Joins ohne Schl�ssel
behoben.
@item
Einige configure-Probleme bereinigt.
@item
Einige kleine �nderungen, um das Parsen schneller zu machen.
@item
@code{ALTER TABLE} + Hinzuf�gen einer Spalte nach dem letzten Feld
funktionierte nicht.
@item
Problem bei der Benutzung einer auto_increment-Spalte in zwei Schl�sseln
behoben.
@item
Bei MyISAM kann man jetzt den auto_increment-Teil als Untermenge haben:
@code{CREATE TABLE foo (a int not null auto_increment, b char(5), primary
key (b,a))}
@item
Bug in MyISAM mit komprimierten CHAR-Schl�sseln, die @code{NULL} sein
konnten, behoben.
@item
@code{AS} auf Feldname mit @code{CREATE TABLE tabelle SELECT ...}
funktionierte nicht.
@item
Benutzung von @code{NATIONAL} und @code{NCHAR} bei der Definition von
Zeichenspalten wird zugelassen. Das ist dasselbe, als wenn man
@code{BINARY} nicht benutzt.
@item
Keine @code{NULL}-Spalten in einem @code{PRIMARY KEY} zulassen (nur in
@code{UNIQUE}-Schl�sseln).
@item
@code{LAST_INSERT_ID} wird gel�scht (clear), wenn man diese in ODBC
benutzt: @code{WHERE auto_increment_spalte IS NULL}. Das scheint einige
Probleme mit Access zu beheben.
@item
@code{SET SQL_AUTO_IS_NULL=0|1} schaltet jetzt die Handhabung von Suchen
nach der letzten eingef�gten Zeile bei @code{WHERE auto_increment_spalte IS
NULL} aus / an.
@item
Neue @code{mysqld}-Variable @code{concurrency} f�r Solaris hinzugef�gt.
@item
Option @code{--relative} f�r @code{mysqladmin} hinzugef�gt, um mit
@code{extended-status} eine bessere Beobachtung von �nderungen zu erzielen.
@item
Bug bei der Benutzung von @code{COUNT(DISTINCT ...)} auf eine leere Tabelle
behoben.
@item
Unterst�tzung f�r den chinesischen Zeichensatz GBK hinzugef�gt.
@item
Problem mit @code{LOAD DATA INFILE} und @code{BLOB}-Spalten behoben.
@item
Bit-Operator @code{~} (Negation) hinzugef�gt.
@item
Problem mit @code{UDF}-Funktionen behoben.
@end itemize


@node News-3.23.4, News-3.23.3, News-3.23.5, News-3.23.x
@c German node Neuigkeiten-3.23.4
@appendixsubsec �nderungen in Release 3.23.4

@itemize @bullet
@item
Einf�gen eines @code{DATETIME}-Werts in eine @code{TIME}-Spalte versucht
jetzt nicht mehr, darin 'Tage' zu speichern.
@item
Problem mit der Speicherung von Float / Double auf kleinen Endian-Maschinen
behoben (das betraf @code{SUM()}).
@item
Verbindungs-Zeit�berschreitung (Timeout) auf TCP/IP-Verbindungen
hinzugef�gt.
@item
Problem mit @code{LIKE} "%" auf einem Index, der @code{NULL}-Werte
enthalten darf, behoben.
@item
@code{REVOKE ALL PRIVILEGES} widerrief nicht alle Berechtigungen.
@item
Erzeugung tempor�rer Tabellen mit demselben Namen wie die Original-Tabelle
wird zugelassen.
@item
Wenn man einem Benutzer eine Berechtigungsoption (Grant Option) f�r eine
Datenbank gew�hrte, konnte er die Berechtigungen nicht an andere Benutzer
weitergeben.
@item
Neuer Befehl @code{SHOW GRANTS FOR benutzer} hinzugef�gt (von Sinisa).
@item
Neue @code{date_add}-Syntax @code{date/datetime + INTERVAL # intervall_typ}
hinzugef�gt. Von Joshua Chamas.
@item
Berechtigungs�berpr�fung f�r @code{LOAD DATA REPLACE} in Ordnung gebracht.
@item
Automatische Reparatur besch�digter Include-Dateien auf Solaris 2.7
hinzugef�gt.
@item
Einige configure-Probleme behoben, um Probleme bei der Erkennung gro�er
Dateisysteme zu beheben.
@item
@code{REGEXP} ist jetzt unabh�ngig von der verwendeten
Gro�-/Kleinschreibung, wenn Sie nicht bin�re Zeichenketten verwenden.
@end itemize


@node News-3.23.3, News-3.23.2, News-3.23.4, News-3.23.x
@c German node Neuigkeiten-3.23.3
@appendixsubsec �nderungen in Release 3.23.3

@itemize @bullet
@item
Patches f�r MIT-pThread auf NetBSD angewandt.
@item
Bereichs-Bug in MyISAM behoben.
@item
@code{ASC} ist jetzt wieder Vorgabe f�r @code{ORDER BY}.
@item
@code{LIMIT} f�r @code{UPDATE} hinzugef�gt.
@item
Neue Client-Funktion @code{mysql_change_user()} hinzugef�gt.
@item
Zeichensatz zu @code{SHOW VARIABLES} hinzugef�gt.
@item
Unterst�tzung von @code{--[leerraum]}-Kommentaren hinzugef�gt.
@item
@code{INSERT into tabelle VALUES ()} wird zugelassen. Das hei�t, Sie
k�nnen jetzt eine leere Wertliste angeben, die in eine Zeile eingef�gt
wird, und in der jede Spalte auf ihren Vorgabewert gesetzt wird.
@item
@code{SUBSTRING(text FROM position)} ge�ndert, um ANSI-SQL-kompatibel zu
sein. (Vorher gab dieses Konstrukt das rechteste 'position'-Zeichen
zur�ck.)
@item
@code{SUM()} mit @code{GROUP BY} gab auf manchen Systemen 0 zur�ck.
@item
Ausgabe bei @code{SHOW TABLE STATUS} ge�ndert.
@item
@code{DELAY_KEY_WRITE}-Option f�r @code{CREATE TABLE} hinzugef�gt.
@item
@code{AUTO_INCREMENT} wird f�r jeden beliebigen Schl�sselteil zugelassen.
@item
Problem mit @code{YEAR(NOW())} und @code{YEAR(CURDATE())} behoben.
@item
@code{CASE}-Konstrukt hinzugef�gt.
@item
Neue Funktion @code{COALESCE()} hinzugef�gt.
@end itemize


@node News-3.23.2, News-3.23.1, News-3.23.3, News-3.23.x
@c German node Neuigkeiten-3.23.2
@appendixsubsec �nderungen in Release 3.23.2

@itemize @bullet
@item
Bereichsoptimierer-Bug behoben: @code{SELECT * FROM tabelle WHERE
schluessel_teil1 >= konstante AND (schluessel_teil2 = konstante OR
schluessel_teil2 = konstante)}. Der Bug bestand darin, dass manche Zeilen
im Ergebnis doppelt auftauchen konnten.
@item
Das Laufenlassen von @code{myisamchk} ohne @code{-a} aktualisierte die
Index-Verteilung falsch.
@item
@code{SET SQL_LOW_PRIORITY_UPDATES=1} gab vorher einen Parser-Fehler.
@item
Sie k�nnen jetzt Spalten indexieren, die in der @code{WHERE}-Klausel
benutzt werden. @code{UPDATE tabelle SET KEY=KEY+1 WHERE KEY > 100}
@item
Datums-Handhabung sollte jetzt etwas schneller sein.
@item
Handhabung von 'fuzzy' Datumsangaben m�glich (Datumsangaben, bei denen der
Tag oder der Monat 0 sind, wie 1999-01-00).
@item
Optimierung von @code{SELECT ... WHERE schluessel_teil1=konstante1 AND
schluessel_teil_2=konstante2 AND schluessel_teil1=konstante4 AND
schluessel_teil2=konstante4} in Ordnung gebracht. Indextyp sollte
@code{range} anstelle von @code{ref} sein.
@item
@code{egcs}-1.1.2-Optimierer-Bug behoben (bei der Benutzung von
@code{BLOB}s) auf Linux Alpha.
@item
Problem mit @code{LOCK TABLES} in Kombination mit @code{DELETE FROM
tabelle} behoben.
@item
MyISAM-Tabellen lassen jetzt Schl�ssel auf @code{NULL} und
@code{BLOB/TEXT}-Spalten zu.
@item
Folgender Join ist jetzt viel schneller: @code{SELECT ... FROM t1 LEFT JOIN
t2 ON ... WHERE t2.nicht_null_spalte IS NULL}.
@item
@code{ORDER BY} und @code{GROUP BY} k�nnen jetzt auf Funktionen angewendet
werden.
@item
Handhabung von 'konstante' ge�ndert, um Handhabung von @code{ORDER BY
RAND()} zu gestatten.
@item
Indexe werden jetzt f�r @code{WHERE schluessel_spalte = funktion} benutzt.
@item
Indexe werden jetzt f�r @code{WHERE schluessel_spalte = spalten_name}
benutzt, selbst wenn die Spalten nicht identisch komprimiert sind.
@item
Indexe werden jetzt f�r @code{WHERE spalten_name IS NULL} benutzt.
@item
HEAP-Tabellen so ge�ndert, dass in der Reihenfolge niedriges Byte zuerst
gespeichert wird (um es zu erleichtern, MyISAM-Tabellen zu konvertieren).
@item
Automatische �nderung tempor�rer HEAP-Tabellen in MyISAM-Tabellen im Falle
von 'table is full'-Fehlern.
@item
Option @code{--init-file=datei} f�r @code{mysqld} hinzugef�gt.
@item
@code{COUNT(DISTINCT wert, [wert, ...])} hinzugef�gt.
@item
@code{CREATE TEMPORARY TABLE} erzeugt jetzt eine tempor�re Tabelle in ihrem
eigenen Namensraum, die automatisch gel�scht wird, wenn die Verbindung
beendet wird.
@item
Neue reservierte W�rter (erforderlich f�r @code{CASE}): @code{CASE, THEN,
WHEN, ELSE und END}.
@item
Neue Funktionen @code{EXPORT_SET()} und @code{MD5()} hinzugef�gt.
@item
Unterst�tzung f�r den GB2312 chinesischen Zeichensatz hinzugef�gt.
@end itemize


@node News-3.23.1, News-3.23.0, News-3.23.2, News-3.23.x
@c German node Neuigkeiten-3.23.1
@appendixsubsec �nderungen in Release 3.23.1

@itemize @bullet
@item
Einige Kompilierungsprobleme behoben.
@end itemize


@node News-3.23.0,  , News-3.23.1, News-3.23.x
@c German node Neuigkeiten-3.23.0
@appendixsubsec �nderungen in Release 3.23.0

@itemize @bullet
@item
Eine neue Tabellen-Handler-Bibliothek (@code{MyISAM}) mit vielen neuen
Features hinzugef�gt. @xref{MyISAM}.
@item
Sie k�nnen @code{HEAP}-Tabellen im Hauptspeicher erzeugen, die zum
Nachschlagen extrem schnell sind.
@item
Unterst�tzung f�r gro�e Dateien (63-Bit) auf Systemen, die gro�e Dateien
unterst�tzen, hinzugef�gt.
@item
Neue Funktion @code{LOAD_FILE(datei)} hinzugef�gt, um die Inhalte einer
Datei als Zeichenkettenwert zu erhalten.
@item
Neuer Operator @code{<=>} hinzugef�gt, der wie @code{=} funktioniert, aber
WAHR (true) zur�ckgibt, wenn beide Argumente @code{NULL} sind. Das ist
n�tzlich, um �nderungen zwischen Tabellen zu vergleichen.
@item
ODBC-3.0-@code{EXTRACT(intervall FROM datetime)}-Funktion hinzugef�gt.
@item
Spalten, die als @code{FLOAT(X)} definiert sind, werden beim Speichern
nicht gerundet und d�rfen beim Abruf in wissenschaftlicher Notation sein
(1.0 E+10).
@item
@code{REPLACE} ist jetzt schneller als vorher.
@item
@code{LIKE}-Zeichenvergleiche ge�ndert, so dass sie sich wie @code{=}
verhalten. Das hei�t, dass @code{'e' LIKE '@'�'} jetzt WAHR (true) ist
(falls hier etwas nicht richtig angezeigt wird: Das letztgenannte 'e' ist
das franz�sische 'e' mit Akzent).
@item
@code{SHOW TABLE STATUS} gibt eine Menge an Informationen �ber die Tabellen
zur�ck.
@item
@code{LIKE} f�r den @code{SHOW STATUS}-Befehl hinzugef�gt.
@item
Berechtigungsspalte zu @code{SHOW COLUMNS} hinzugef�gt.
@item
Spalten @code{packed} und @code{comment} f�r @code{SHOW INDEX} hinzugef�gt.
@item
Kommentare zu Tabellen (mit @code{CREATE TABLE ... COMMENT "kommentar"})
hinzugef�gt.
@item
@code{UNIQUE}, wie bei @code{CREATE TABLE tabelle (spalte int not null
UNIQUE)}, hinzugef�gt.
@item
Neue CREATE-Syntax: @code{CREATE TABLE tabelle SELECT ...}
@item
Neue CREATE-Syntax: @code{CREATE TABLE IF NOT EXISTS ...}
@item
Die Erzeugung von @code{CHAR(0)}-Spalten wird zugelassen.
@item
@code{DATE_FORMAT()} erfordert jetzt @samp{%} vor jeglichem
Formatierungszeichen.
@item
@code{DELAYED} ist jetzt ein reserviertes Wort (tut uns leid :( ).
@item
Eine Beispiel-Prozedur wurde hinzugef�gt: @code{analyse}, Datei:
@file{sql_analyse.c}. Diese beschreibt die Daten in Ihrer Anfrage.
Probieren Sie folgendes:
@example
SELECT ... FROM ... WHERE ... prozeduranalyse([max elemente,[max speicher]])
@end example

Diese Prozedur ist extrem n�tzlich, wenn Sie die Daten in Ihrer Tabelle
pr�fen wollen!
@item
@code{BINARY}-Cast, um zu erzwingen, dass eine Zeichenkette abh�ngig von
der verwendeten Gro�-/Kleinschreibung verglichen wird.
@item
Option @code{--skip-show-database} f�r @code{mysqld} hinzugef�gt.
@item
Das Pr�fen, ob sich eine Zeile bei einem @code{UPDATE} ge�ndert hat,
funktioniert jetzt auch bei @code{BLOB}-/@code{TEXT}-Spalten.
@item
Die @code{INNER}-Join-Syntax wurde hinzugef�gt. @strong{HINWEIS}: Hierdurch
wurde @code{INNER} zu einem reservierten Wort!
@item
Unterst�tzung f�r Netmasks zum Hostname in den MySQL-Tabellen hinzugef�gt.
Sie k�nnen eine Netmask mit der @code{IP/NETMASK}-Syntax angeben.
@item
Wenn Sie eine @code{NOT NULL DATE/DATETIME}-Spalte mit @code{IS NULL}
vergleichen, wird das zu einem Vergleich auf @code{0} ge�ndert, um einige
ODBC-Applikationen zufrieden zu stellen (von @email{shreeve@@uci.edu}).
@item
@code{NULL IN (...)} gibt jetzt @code{NULL} anstelle von @code{0} zur�ck.
Das stellt sicher, dass @code{null_spalte NOT IN (...)} nicht mit
@code{NULL}-Werten �bereinstimmt.
@item
Speicherung von Flie�kommawerten in @code{TIME}-Spalten in Ordnung
gebracht.
@item
Das Parsen von @code{TIME}-Zeichenketten ge�ndert, so dass es strenger ist.
Jetzt wird der Bruchteil-Sekunden-Teil erkannt (und momentan noch
�bergangen). Folgende Formate werden unterst�tzt:
@table @code
@item [[DAYS] [H]H:]MM:]SS[.bruchteil]
@item [[[[[H]H]H]H]MM]SS[.bruchteil]
@end table
@item
Erkennen (und Ignorieren) des zweiten Bruchteil-Anteils von @code{DATETIME}
hinzugef�gt.
@item
@code{LOW_PRIORITY}-Attribut f�r @code{LOAD DATA INFILE} hinzugef�gt.
@item
Der vorgabem��ige Index-Name benutzt jetzt dieselbe Gro�-/Kleinschreibung
wie der benutzte Spaltenname.
@item
Vorgabem��ige Anzahl von Verbindungen auf 100 ge�ndert.
@item
Bei der Benutzung von @code{LOAD DATA INFILE} werden gr��ere Puffer
verwendet.
@item
@code{DECIMAL(x,y)} funktioniert jetzt gem�� ANSI-SQL.
@item
Aggregat-UDF-Funktionen. Dank an Andreas F. Bobak @email{bobak@@relog.ch}
hierf�r!
@item
@code{LAST_INSERT_ID()} wird jetzt bei @code{INSERT INTO ... SELECT}
aktualisiert.
@item
Einige kleinere �nderungen am Join-Tabellenoptimierer, um einige Joins
schneller zu machen.
@item
@code{SELECT DISTINCT} ist viel schneller. Es benutzt die neue
@code{UNIQUE}-Funktionalit�t in @code{MyISAM}. Ein Unterschied im Vergleich
zur MySQL-Version 3.22 besteht darin, dass die Ausgabe von @code{DISTINCT}
nicht mehr sortiert wird.
@item
Alle C-Client-API-Makros sind jetzt Funktionen, um die gemeinsam genutzten
(shared) Bibliotheken verl�sslicher zu machen. Deswegen k�nnen Sie nicht
mehr @code{mysql_num_fields()} auf ein @code{MYSQL}-Objekt aufrufen,
sondern m�ssen statt dessen @code{mysql_field_count()} benutzen.
@item
Benutzung von @code{LIBEWRAP}; Patch von Henning P. Schmiedehausen.
@item
@code{AUTO_INCREMENT} wird nur noch f�r numerische Spalten zugelassen.
@item
Durch die Verwendung von @code{AUTO_INCREMENT} wird die Spalte automatisch
@code{NOT NULL}.
@item
@code{NULL} wird als Vorgabewert f�r AUTO_INCREMENT-Spalten angezeigt.
@item
@code{SQL_BIG_RESULT}; @code{SQL_SMALL_RESULT} ist jetzt Vorgabe.
@item
Ein gemeinsam genutztes (shared) Bibliothek-RPM hinzugef�gt. Diese
Verbesserung wurde von David Fox (dsfox@@cogsci.ucsd.edu) beigesteuert.
@item
Ein @code{--enable-large-files/--disable-large-files}-Schalter zu
@code{configure} hinzugef�gt. Siehe @file{configure.in} wegen mancher
Systeme, auf denen dies wegen nicht funktionierender Implementation
automatisch abgeschaltet ist.
@item
@code{readline} f�r Version 4.0 aktualisiert.
@item
Neue @code{CREATE TABLE}-Optionen: @code{PACK_KEYS} und @code{CHECKSUM}.
@item
@code{mysqld}-Option @code{--default-table-type} hinzugef�gt.
@end itemize


@node Porting, Environment variables, News, Top
@c German node Portierung
@appendix Anmerkungen zur Portierung auf andere Systeme

@cindex Portierung, auf andere Systeme

F�r den Server wird eine funktionierende Posix-Thread-Bibliothek ben�tigt.
Auf Solaris 2.5 benutzen wir Sun PThread (die native Thread-Unterst�tzung
in Version 2.4 und fr�her ist nicht gut genug). Auf Linux benutzen wir
LinuxThread von Xavier Leroy, @email{Xavier.Leroy@@inria.fr}.

Der schwierige Teil der Portierung auf eine neue Unix-Variante ohne gute
native Thread-Unterst�tzung ist wahrscheinlich, MIT-pThread zu portieren.
Siehe @file{with-pThread/README} und
@uref{http://www.humanfactor.com/pThread/, POSIX-Thread programmieren}.

Die MySQL-Distribution enth�lt eine gepatchte Version von Provenzanos
PThread von MIT (siehe
@uref{http://www.mit.edu:8001/people/proven/pThread.html,
MIT-PThread-Website}). Diese kann f�r einige Betriebssysteme benutzt
werden, die kein POSIX-Thread haben.

Es ist ebenfalls m�glich, ein anderes Thread-Paket auf Benutzerebene namens
FSU-PThread zu benutzen (siehe
@uref{http://www.informatik.hu-berlin.de/~mueller/pThread.html,
FSU-PThread-Homepage}). Diese Implementation wird f�r die SCO-Portierung
benutzt.

In den @file{thr_lock.c}- und @file{thr_alarm.c}-Programmen im
@file{mysys}-Verzeichnis finden Sie einige Tests / Beispiele dieser
Probleme.

Sowohl Server als auch Client ben�tigen einen funktionierenden C++-Kompiler
(wir benutzen @code{gcc} und haben SparcWorks ausprobiert). Ein anderer
bekannterma�en funktionierender Compiler ist Irix @code{cc}.

Um nur den Client zu kompilieren, benutzen Sie @code{./configure
--without-server}.

Es gibt momentan keine Unterst�tzung, um nur den Server zu kompilieren,
noch ist es wahrscheinlich, dass eine solche hinzugef�gt wird, falls nicht
jemand einen guten Grund daf�r findet.

Wenn Sie irgend welche @file{Makefile} oder das configure-Skript �ndern
wollen / m�ssen, m�ssen Sie sich Automake und Autoconf holen. Wir haben die
@code{automake-1.2}- und @code{autoconf-2.12}-Distributionen benutzt.

Alle Schritte, die notwendig sind, um alles aus den grundlegendsten Dateien
neu zu machen (make):

@example
/bin/rm */.deps/*.P
/bin/rm -f config.cache
aclocal
autoheader
aclocal
automake
autoconf
./configure --with-debug=full --prefix='ihr_installationsverzeichnis'

# Die oben erzeugten makefiles ben�tigen GNU-make 3.75 oder neuer.
# (unten gmake genannt)
gmake clean all install init-db
@end example

Wenn Sie bei einer neuen Portierung Probleme bekommen, kann es sein, dass
Sie MySQL etwas debuggen m�ssen! @xref{Debugging server}.

@strong{HINWEIS:} Bevor Sie mit dem Debuggen von @code{mysqld} anfangen,
bringen Sie sich zuerst die Testprogramme @code{mysys/thr_alarm} und
@code{mysys/thr_lock} zum Laufen. Das stellt sicher, dass Ihre
Thread-Installation zumindest �berhaupt eine Chance hat, zu funktionieren!



@menu
* Debugging server::            
* Debugging client::            
* The DBUG package::            
* Locking methods::             
* RTS-threads::                 
* Thread packages::             
@end menu

@node Debugging server, Debugging client, Porting, Porting
@c German node Server debuggen
@appendixsec Einen MySQL-Server debuggen

@cindex Server, debuggen
@cindex debuggen, Server
@cindex Absturz

Wenn Sie Funktionalit�t benutzen, die in MySQL sehr neu ist, k�nnen Sie
versuchen, @code{mysqld} mit der @code{--skip-new}-Option laufen zu lassen
(die alle sehr neue, potenziell unsichere Funktionalit�t abschaltet) oder
mit @code{--safe-mode}, was viel an Optimierung abschaltet, die
m�glicherweise Probleme verursacht. @xref{Crashing}.

Wenn @code{mysqld} nicht starten will, sollten Sie pr�fen, ob Sie irgend
welche @code{my.cnf}-Dateien haben, die mit Ihrer Konfiguration in Konflikt
kommen! Sie k�nnen Ihre @code{my.cnf}-Argumente mit @code{mysqld
--print-defaults} pr�fen und sie vermeiden, indem Sie mit @code{mysqld
--no-defaults ...} starten.

Wenn @code{mysqld} anf�ngt, Prozessorleistung oder Speicher zu fressen,
oder wenn er ``h�ngt'', k�nnen Sie @code{mysqladmin processlist status}
benutzen, um herauszufinden, ob irgend etwas eine Anfrage ausf�hrt, die
sehr lange dauert. Es ist eine gute Idee, @code{mysqladmin -i10 processlist
status} in irgend einem Fenster laufen zu haben, wenn Sie
Performance-Probleme oder Probleme damit haben, dass sich neue Clients
nicht verbinden k�nnen.

Der Befehl @code{mysqladmin debug} dumpt Informationen �ber Sperren, die in
Gebrauch sind, den benutzten Speicher und den Anfragengebrauch in die
mysql-Log-Datei aus. Das kann helfen, einige Probleme zu l�sen. Dieser
Befehl stellt auch n�tzliche Informationen zur Verf�gung, selbst wenn Sie
MySQL nicht zum Debuggen kompiliert haben!

Wenn das Problem darin besteht, dass einige Tabellen langsamer und
langsamer werden, sollten Sie versuchen, die Tabelle mit @code{OPTIMIZE
TABLE} der @code{myisamchk} zu optimieren.
@xref{MySQL Database Administration}. Sie sollten langsame Anfragen
dar�ber hinaus mit @code{EXPLAIN} �berpr�fen.

Ebenfalls sollten Sie den Abschnitt �ber betriebssystemspezifische Dinge in
diesem Handbuch lesen, weil Sie Probleme haben k�nnten, die einzigartig f�r
Ihre Umgebung sind. @xref{Operating System Specific Notes}.



@menu
* Compiling for debugging::     
* Making trace files::          
* Using gdb on mysqld::         
* Using stack trace::           
* Using log files::             
* Reproduceable test case::     
@end menu

@node Compiling for debugging, Making trace files, Debugging server, Debugging server
@c German node Zum Debuggen kompilieren
@appendixsubsec MySQL zum Debuggen kompilieren

Wenn Sie sehr spezielle Probleme haben, k�nnen Sie immer versuchen, MySQL
zu debuggen. Daf�r m�ssen Sie MySQL mit der @code{--with-debug}- oder der
@code{--with-debug=full}-Option kompilieren. Sie k�nnen pr�fen, ob MySQL
mit Debuggen kompiliert wurde oder nicht, wenn Sie @code{mysqld --help}
ausf�hren. Wenn das @code{--debug}-Flag in den Optionen aufgef�hrt ist,
haben Sie Debuggen eingeschaltet. @code{mysqladmin ver} gibt die
@code{mysqld}-Version in diesem Fall ebenfalls als @code{mysql ... --debug}
aus.

Wenn Sie gcc oder egcs benutzen, ist die empfohlene configure-Zeile:

@example
CC=gcc CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-debug --with-extra-charsets=complex
@end example

Das vermeidet Probleme mit der @code{libstdc++}-Bibliothek und mit
C++-Ausnahmen (viele Compiler haben Probleme mit C++-Ausnahmen in threaded
Code) und kompiliert eine MySQL-Version mit Unterst�tzung f�r alle
Zeichens�tze.

Wenn Sie einen Speicher�berlauffehler vermuten, k�nnen Sie MySQL mit
@code{--with-debug=full} kompilieren, was zus�tzlich einen
(@code{SAFEMALLOC})-Pr�fer f�r die Speicherzuweisung installiert. Das
Laufenlassen mit @code{SAFEMALLOC} ist jedoch recht langsam. Wenn Sie daher
Performance-Probleme bekommen, sollten Sie @code{mysqld} mit der
@code{--skip-safemalloc}-Option starten. Das schaltet die
Speicher�berlaufpr�fung f�r jeden Aufruf von @code{malloc} und @code{free}
ab.

Wenn @code{mysqld} nicht mehr abst�rzt, wenn Sie ihn mit
@code{--with-debug} kompilieren, haben Sie wahrscheinlich einen
Compiler-Bug oder einen Timing-Bug innerhalb von MySQL gefunden. In diesem
Fall k�nnen Sie versuchen, @code{-g} f�r die @code{CFLAGS}- und
@code{CXXFLAGS}-Variablen oben hinzuzuf�gen und nicht mehr
@code{--with-debug} zu benutzen. Wenn @code{mysqld} jetzt stirbt, k�nnen
Sie wenigstens mit @code{gdb} mit ihm verbinden oder @code{gdb} auf die
Core-Datei benutzen, um herauszufinden, was passiert ist.

Wenn Sie MySQL zum Debuggen konfigurieren, k�nnen Sie viele zus�tzliche
Sicherheitpr�ffunktionen hinzuf�gen, die die Gesundheit von @code{mysqld}
beobachten. Wenn Sie etwas ``Unerwartetes'' finden, wird ein Eintrag nach
@code{stderr} geschrieben, den @code{safe_mysqld} in die Fehler-Log-Datei
leitet! Das hei�t auch, dass Sie bei unerwarteten Problemen mit MySQL und
der Benutzung einer Quelldistribution als erstes MySQL zum Debuggen
konfigurieren sollten! (Die zweite Sache w�re nat�rlich, eine E-Mail an
@email{mysql@@lists.mysql.com} zu schicken und um Hilfe zu bitten. Bitte
benutzen Sie das @code{mysqlbug}-Skript f�r alle Bug-Berichte oder Fragen
hinsichtlich der MySQL-Version, die Sie benutzen!

In der Windows-MySQL-Distribution wird @code{mysqld.exe} vorgabem��ig mit
Unterst�tzung f�r Trace-Dateien kompiliert.


@node Making trace files, Using gdb on mysqld, Compiling for debugging, Debugging server
@c German node Trace-Dateien
@appendixsubsec Trace-Dateien erzeugen

Wenn der @code{mysqld}-Server nicht startet oder wenn Sie den
@code{mysqld}-Server schnell zum Absturz bringen k�nnen, k�nnen Sie
versuchen, eine Trace-Datei zu erzeugen, um das Problem zu finden.

Hierf�r brauchen Sie einen @code{mysqld}, der zum Debuggen kompiliert ist.
Sie k�nnen das mit @code{mysqld -V} pr�fen. Wenn die Versionsnummer mit
@code{-debug} endet, ist Unterst�tzung f�r Trace-Dateien einkompiliert.

Starten Sie den @code{mysqld}-Server mit einem Trace-Log in
@file{/tmp/mysqld.trace} (oder @file{C:\mysqld.trace} unter Windows):

@code{mysqld --debug}

Unter Windows sollten Sie auch den @code{--standalone}-Flag benutzen, um
@code{mysqld} nicht als Systemdienst zu starten.

Machen Sie folgendes in einem DOS-Fenster:

@example
mysqld --debug --standalone
@end example

Danach k�nnen Sie das @code{mysql.exe}-Kommandozeilenwerkzeug in einem
zweiten DOS-Fenster benutzen, um das Problem zu reproduzieren. Sie k�nnen
den obigen @code{mysqld}-Server mit @code{mysqladmin shutdown} herunter
fahren.

Beachten Sie, dass die Trace-Datei sehr @emph{Gro�} wird! Wenn Sie eine
kleinere Trace-Datei haben wollen, k�nnen Sie etwa folgendes tun:

@code{mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace}

Das gibt nur Informationen f�r die interessantesten Dinge in
@file{/tmp/mysqld.trace} aus.

Wenn Sie hier�ber einen Bug-Bericht erstellen, schicken Sie bitte nur die
Zeilen aus der Trace-Datei an die entsprechende Mailing-Liste, in denen
etwas schief zu gehen scheint! Wenn Sie diese Stelle nicht finden k�nnen,
k�nnen Sie die Trace-Datei per FTP einschicken, zusammen mit einem
kompletten Bug-Bericht, an @uref{ftp://Support.mysql.com/pub/mysql/secret},
so dass ein MySQL-Entwickler sich das ansehen kann.

Die Trace-Datei wird mit dem @strong{DBUG}-Paket von Fred Fish hergestellt.
@xref{The DBUG package}.


@node Using gdb on mysqld, Using stack trace, Making trace files, Debugging server
@c German node gdb auf mysqld benutzen
@appendixsubsec mysqld unter gdb debuggen

@cindex gdb, using

Auf den meisten Systemen k�nnen Sie @code{mysqld} von @code{gdb} starten,
um mehr Informationen zu erhalten, wenn @code{mysqld} abst�rzt.

Bei einigen �lteren @code{gdb}-Versionen unter Linux m�ssen Sie @code{run
--one-thread} benutzen, um den @code{mysqld}-Thread debuggen zu k�nnen. In
diesem Fall k�nnen Sie zur gleichen Zeit nur einen Thread aktiv haben.

Wenn Sie @code{mysqld} unter gdb laufen lassen, sollten Sie den Stack-Trace
mit @code{--skip-stack-trace} abschalten, um Segmentation-Fehler innerhalb
gdb abfangen zu k�nnen.

Es ist sehr schwierig, MySQL unter @code{gdb} zu debuggen, wenn Sie
permanent viele neue Verbindungen aufbauen, weil @code{gdb} den Speicher
f�r den alten Thread nicht freigibt. Sie k�nnen dieses Problem vermeiden,
indem Sie @code{mysqld} mit @code{-O thread_cache_size=
'maximale_verbindungen +1'} starten. In den meisten F�llen hilft bereits
schon die Benutzung von @code{-O thread_cache_size=5'} recht viel!

Wenn Sie einen Coredump unter Linux erhalten wollen, wenn @code{mysqld} mit
einem SIGSEGV-Signal stirbt, k�nnen Sie @code{mysqld} mit der
@code{--core-file}-Option starten. Diese Core-Datei kann benutzt werden, um
eine Zur�ckverfolgung (Backtrace) zu machen, die Ihnen helfen kann
herauszufinden, warum @code{mysqld} starb:

@example
shell> gdb mysqld core
gdb>   backtrace full
gdb>   exit
@end example

@xref{Crashing}.

Wenn Sie gdb 4.17.x oder h�her unter Linux benutzen, sollten Sie eine
@file{.gdb}-Datei mit folgenden Informationen in Ihrem aktuellen
Verzeichnis installieren:

@example
set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint
@end example

Wenn Sie Probleme haben, den Thread mit gdb zu debuggen, sollten Sie gdb
5.x herunter laden und diesen statt dessen benutzen. Die neue gdb-Version
hat eine stark verbesserte Thread-Handhabung!

Hier ist ein Beispiel, wie man mysqld debuggt:

@example
shell> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Tun Sie das, wenn mysqld abst�rzt
@end example

Schlie�en Sie die obige Ausgabe in eine Mail ein, die mit @code{mysqlbug}
erzeugt wurde und schicken Sie sie an @code{mysql@@lists.mysql.com}.

Wenn @code{mysqld} h�ngen bleibt, k�nnen Sie versuchen, einige
Systemwerkzeuge wie @code{strace} oder @code{/usr/proc/bin/pstack} zu
benutzen, um herauszufinden, was @code{mysqld} zum H�ngen brachte.

@example
strace /tmp/log libexec/mysqld
@end example

@findex DBI->trace
@findex Trace-DBI-Methode
@tindex DBI_TRACE-Umgebungsvariable
@tindex Umgebungsvariable, DBI_TRACE
Wenn Sie die Perl-@code{DBI}-Schnittstelle benutzen, k�nnen Sie
Debug-Informationen anschalten, indem Sie die @code{trace}-Methode benutzen
oder die @code{DBI_TRACE}-Umgebungsvariable setzen.
@xref{Perl DBI Class, , Perl @code{DBI} Class}.


@node Using stack trace, Using log files, Using gdb on mysqld, Debugging server
@c German node Stack-Trace benutzen
@appendixsubsec Einen Stack-Trace benutzen

Auf manchen Betriebssystemen enth�lt die Fehler-Log-Datei einen
Stack-Trace, wenn @code{mysqld} unerwartet stirbt. Diese k�nnen Sie
benutzen, um herauszufinden, wo (und vielleicht warum) @code{mysqld} starb.
@xref{Error log}. Um einen Stack-Trace zu erhalten, sollten Sie
@code{mysqld} NICHT mit der @code{-fomit-frame-pointer}-Option f�r gcc
kompilieren. @xref{Compiling for debugging}.

Wenn die Fehlerdatei etwas wie folgendes enth�lt:

@example
mysqld got signal 11;
The manual section 'debugging a MySQL server' tells you how to use a
stack trace and/or the core file to produce a readable backtrace that may
help in finding out why mysqld died
Attemping backtrace. You can use the following information to find out
where mysqld died.  Wenn you see no messages after this, something went
terribly wrong
stack range sanity check, ok, backtrace follows
0x40077552
0x81281a0
0x8128f47
0x8127be0
0x8127995
0x8104947
0x80ff28f
0x810131b
0x80ee4bc
0x80c3c91
0x80c6b43
0x80c1fd9
0x80c1686
@end example

K�nnen Sie herausfinden, wo @code{mysqld} starb, indem Sie folgendes tun:

@enumerate
@item
Kopieren Sie die obigen Zahlen in eine Datei, zum Beispiel
@file{mysqld.stack}.

@item
Machen Sie eine symbolische Datei f�r den @code{mysqld}-Server:
@example
nm -n libexec/mysqld > /tmp/mysqld.sym
@end example

Beachten Sie, dass viele MySQL-Bin�rdistributionen die obige Datei namens
@code{mysqld.sym.gz} enthalten. In diesem Fall m�ssen Sie sie wie folgt
entpacken:
@example
gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
@end example

@item
F�hren Sie @code{resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack}
aus.

Das gibt aus, wo @code{mysqld} starb. Wenn Ihnen das nicht hilft,
herauszufinden, warum @code{mysqld} starb, sollten Sie einen Bug-Bericht
machen und die Ausgabe des obigen Befehls in diesen Bericht einschlie�en.

Beachten Sie aber, dass es uns in den meisten F�llen nicht weiterhilft, nur
einen Stack-Trace zu haben, um die Ursache des Problems herauszufinden. Um
den Bug feststellen oder einen Workaround zur Verf�gung stellen zu k�nnen,
m�ssen wir in den meisten F�llen die Anfrage kennen, die @code{mysqld}
t�tete, und am besten einen Testfall, so dass wir das Problem wiederholen
k�nnen! @xref{Bug reports}.
@end enumerate


@node Using log files, Reproduceable test case, Using stack trace, Debugging server
@c German node Log-Dateien benutzen
@appendixsubsec Log-Dateien benutzen, um Gr�nde f�r Fehler in mysqld zu finden

Beachten Sie, dass Sie vor dem Start von @code{mysqld} mit @code{--log}
alle Ihre Tabellen mit @code{myisamchk} pr�fen sollten.
@xref{MySQL Database Administration}.

Wenn @code{mysqld} stirbt oder h�ngenbleibt, sollten Sie ihn mit
@code{--log} starten. Wenn @code{mysqld} wieder stirbt, k�nnen Sie das Ende
der Log-Datei nach der Anfrage durchsuchen, die @code{mysqld} t�tete.

Wenn Sie @code{--log} ohne einen Dateinamen verwenden, wird das Log im
Datenbank-Verzeichnis als 'hostname'.log gespeichert. In den meisten F�llen
ist es die letzte Anfrage in der Log-Datei, die @code{mysqld} t�tete, aber
das sollten Sie falls m�glich sicherstellen, indem Sie @code{mysqld} neu
starten und dieselbe Anfrage mit dem @code{mysql}-Kommandozeilenwerkzeug
wiederholen. Wenn das funktioniert, sollten Sie ebenfalls alle
komplizierten Anfragen testen, die nicht beendet wurden.

Sie k�nnen auch den Befehl @code{EXPLAIN} auf alle @code{SELECT}-Statements
ausprobieren, die lange Zeit ben�tigen, um sicherzustellen, dass
@code{mysqld} Indexe korrekt benutzt. @xref{EXPLAIN, , @code{EXPLAIN}}.

Sie finden Anfragen, die zur Ausf�hrung lange Zeit ben�tigen, indem Sie
@code{mysqld} mit @code{--log-slow-queries} starten.
@xref{Slow query log}.

Wenn Sie den Text @code{mysqld restarted} in der Fehler-Log-Datei-Datei
(normalerweise namens @file{hostname.err}) finden, haben Sie wahrscheinlich
eine Anfrage gefunden, die @code{mysqld} zum Absturz brachte. Wenn das
passiert, sollten Sie alle Ihre Tabellen mit @code{myisamchk} pr�fen
(@pxref{MySQL Database Administration}) und die Anfragen in den
MySQL-Log-Dateien untersuchen, um herauszufinden, ob eine nicht
funktioniert. Wenn Sie eine solche Anfrage finden, versuchen Sie zun�chst,
auf die neueste MySQL-Version zu aktualisieren. Wenn das nicht hilft und Sie
nichts im @code{mysql}-Mailarchiv finden k�nnen, sollten Sie den Bug an
@email{mysql@@lists.mysql.com} berichten. Links zu Mailarchiven finden Sie
online auf der @uref{http://www.mysql.com/documentation/,
MySQL-Dokumentationsseite}.

Wenn Sie @code{mysqld} mit @code{--with-myisam-recover} gestartet haben,
pr�ft MySQL automatisch @code{MyISAM}-Tabellen und versucht sie zu
reparieren, wenn sie als 'nicht korrekt geschlossen' oder 'besch�digt'
gekennzeichnet sind. Wenn das passiert, schreibt MySQL einen Eintrag in die
@code{hostname.err}-Datei @code{'Warning: Checking table ...'}, der von
@code{Warning: Repairing table} gefolgt wird, wenn die Tabelle repariert
werden muss. Wenn Sie viele solcher Fehler erhalten, ohne dass
@code{mysqld} direkt davor unerwartet gestorben ist, stimmt etwas nicht und
muss weiter untersucht werden. @xref{Command-line options}.

Nat�rlich ist es kein gutes Zeichen, wenn @code{mysqld} unerwartet stirbt,
doch in diesem Fall sollte man nicht die @code{Checking table...}-Meldungen
untersuchen, sondern statt dessen versuchen herauszufinden, warum
@code{mysqld} starb.


@node Reproduceable test case,  , Using log files, Debugging server
@c German node Reproduzierbarer Testfall
@appendixsubsec Einen Testfall herstellen, wenn Sie Tabellenbesch�digung feststellen

Wenn Sie besch�digte Tabellen erhalten oder wenn @code{mysqld} immer nach
irgend einem Aktualisierungsbefehl fehlschl�gt, k�nnen Sie mit folgendem
�berpr�fen, ob der Bug reproduzierbar ist:

@itemize @bullet
@item
Fahren Sie den MySQL-Daemon herunter (mit @code{mysqladmin shutdown}).
@item
Machen Sie eine Datensicherung der Tabellen (um dem sehr unwahrscheinlichen
Fall vorzubeugen, dass die Reparatur etwas Schlechtes macht).
@item
Pr�fen Sie alle Tabellen mit @code{myisamchk -s Datenbank/*.MYI}.
Reparieren Sie jegliche besch�digten Tabellen mit @code{myisamchk -r
datenbank/tabelle.MYI}.
@item
Machen Sie eine Datensicherung der Tabellen.
@item
Entfernen (oder verschieben) Sie jegliche alten Log-Dateien aus dem
MySQL-Daten-Verzeichnis, wenn Sie mehr Platz brauchen.
@item
Starten Sie @code{mysqld} mit @code{--log-binary}. @xref{Binary log}.
Wenn Sie eine Anfrage finden wollen, die @code{mysqld} zum Absturz brachte,
sollten Sie @code{--log --log-binary} benutzen.
@item
Wenn Sie eine besch�digte Tabelle erhalten, halten Sie @code{mysqld} an.
@item
Stellen Sie die Datensicherung wieder her.
@item
Starten Sie den @code{mysqld}-Server neu, @strong{ohne}
@code{--log-binary}.
@item
F�hren Sie die Befehle mit @code{mysqlbinlog update-log-file | mysql}
erneut aus. Die Update-Log-Datei wird im MySQL-Datenbank-Verzeichnis unter
dem Namen @code{hostname-bin.#} gespeichert.
@item
Wenn die Tabellen wieder besch�digt werden oder Sie @code{mysqld} wieder
dazu bringen k�nnen zu sterben, haben Sie einen reproduzierbaren Bug
gefunden, der sich leicht beheben lassen sollte! Schicken Sie die Tabellen
und die Bin�r-Log-Datei an @uref{ftp://support.mysql.com/pub/mysql/secret}
und schicken Sie eine E-Mail an @email{bugs@@lists.mysql.com} oder (wenn
Sie ein Support-Kunde sind) an @email{Support@@mysql.com}, und das
MySQL-Team wird den Bug so schnell wie m�glich beheben.
@end itemize

Sie k�nnen auch das Skript @code{mysql_find_rows} benutzen, um einfach
einige der Aktualisierungs-Statements auszuf�hren, wenn Sie das Problem
eingrenzen wollen.


@node Debugging client, The DBUG package, Debugging server, Porting
@c German node Clients debuggen
@appendixsec Einen MySQL-Client debuggen

@cindex debuggen, Client
@cindex Clients, debuggen

Um einen MySQL-Client mit dem integrierten Debug-Paket debuggen zu k�nnen,
sollten Sie MySQL mit @code{--with-debug} oder @code{--with-debug=full}
kompilieren. @xref{configure options}.

@tindex MYSQL_DEBUG-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_DEBUG
Bevor Sie einen Client laufen lassen, sollten Sie die
@code{MYSQL_DEBUG}-Umgebungsvariable setzen:

@example
shell> MYSQL_DEBUG=d:t:O,/tmp/client.trace
shell> export MYSQL_DEBUG
@end example

Das bringt Clients dazu, eine Trace-Datei in @file{/tmp/client.trace} zu
erzeugen.

Wenn Sie Probleme mit Ihrem eigenen Client-Code haben, sollten Sie
versuchen, sich mit dem Server zu verbinden und Ihre Anfragen mit einem
Client laufen zu lassen, der bekannterma�en funktioniert. Lassen Sie dabei
@code{mysql} im Debug-Modus laufen (unter der Annahme, dass Sie MySQL mit
angeschaltetem Debuggen kompiliert haben):

@example
shell> mysql --debug=d:t:O,/tmp/client.trace
@end example

Das stellt n�tzliche Informationen f�r den Fall bereit, dass Sie einen
Bug-Bericht schicken. @xref{Bug reports}.

Wenn Ihr Client bei irgend einem 'zul�ssigen' Sperr-Code abst�rzt, sollten
Sie sicherstellen, dass Ihre @file{mysql.h}-Include-Datei mit Ihrer
MySQL-Bibliotheksdatei zusammenpasst. Es ist ein h�ufiger Fehler, eine alte
@file{mysql.h}-Datei aus einer alten MySQL-Installation mit einer neuen
MySQL-Bibliothek zu benutzen.


@node The DBUG package, Locking methods, Debugging client, Porting
@c German node Das DBUG-Paket
@appendixsec Das DBUG-Paket

@cindex DBUG-Paket

Der MySQL-Server und die meisten MySQL-Clients werden mit dem DBUG-Paket
kompiliert, das urspr�nglich von Fred Fish stammt. Wenn man MySQL zum
Debuggen kompiliert hat, erm�glicht es dieses Paket, eine Trace-Datei davon
zu erhalten, was das Programm debuggt. @xref{Making trace files}.

Man benutzt das Debug-Paket durch Aufruf des Programms mit der
@code{--debug="..."}- oder der @code{-#...}-Option.

Die meisten MySQL-Programme haben eine vorgabem��ige Debug-Zeichenkette,
die benutzt wird, wenn Sie keine Option f�r @code{--debug} angeben. Die
vorgabem��ige Trace-Datei ist �blicherweise
@code{/tmp/programm_name.trace} unter Unix und @code{\programm_name.trace}
unter Windows.

Die Debug-Steuerungs-Zeichenkette ist eine Folge durch Doppelpunkte
getrennter Felder, wie folgt:

@example
<feld_1>:<feld_2>:...:<feld_N>
@end example

Jedes Feld besteht aus einem zwingend erforderlichen Flag-Zeichen, gefolgt
durch ein optionales Komma (",") und eine durch Kommas getrennte Auflistung
von Modifikatoren:

@example
flag[,modifikator,modifikator,...,modifikator]
@end example

Aktuell werden folgende Flag-Zeichen erkannt:

@multitable @columnfractions .1 .9
@item d
 @tab Ausgabe von DBUG_<N>-Makros des aktuellen Status erm�glichen.
Gegebenenfalls gefolgt von einer Auflistung von Schl�sselw�rtern, die
Ausgaben nur f�r die DBUG-Makros mit diesem Schl�sselwort ausw�hlt. Eine
leere  Auflistung von Schl�sselw�rtern bedeutet Ausgabe f�r alle Makros.
@item D
 @tab Nach jeder Debugger-Ausgabezeile verz�gern. Das Argument ist die
Anzahl von Zehntelsekunden der Verz�gerung, abh�ngig von den F�higkeiten
der Maschine. @code{-#D,20} bedeutet als eine Verz�gerung von 2 Sekunden.
@item f	
 @tab Debuggen und / oder Tracen und Profilen auf die in der Auflistung
genannten Funktionen beschr�nken. Beachten Sie, dass eine leere Liste alle
Funktionen abschaltet. Die entsprechenden "d"- oder "t"-Flags m�ssen immer
noch angegeben werden; dieser Flag beschr�nkt nur ihre Aktionen, wenn Sie
angeschaltet sind.
@item F	
 @tab Den Quell-Dateinamen f�r jede Zeile der Debug- oder Trace-Ausgabe
festlegen.
@item i	
 @tab Den Prozess mit der PID- oder Thread-Kennung f�r jede Ziele der
Debug- oder Trace-Ausgabe festlegen.
@item g	@tab Profiling anschalten. Es wird eine Datei namens 'dbugmon.out'
erzeugt, die Informationen enth�lt, die benutzt werden k�nnen, um das
Programm zu profilen. Wir gegebenenfalls von einer Auflistung von
Schl�sselw�rter gefolgt, die Profiling nur f�r die Funktionen in dieser
Liste ausw�hlen. Eine leere Liste bedeutet, dass alle Funktionen in
Betracht gezogen werden.
@item L	
 @tab Die Quell-Datei-Zeilennummer f�r jede Zeile der Debug- oder
Trace-Ausgabe festlegen.
@item n	
 @tab Die aktuelle Funktionsverschachtelungstiefe f�r jede Zeile der Debug-
oder Trace-Ausgabe ausgeben.
@item N 
 @tab Jede Zeile der dbug-Ausgabe nummerieren.
@item o 
 @tab Die Debugger-Ausgabe in die angegebene Datei umlenken. Die
vorgabem��ige Ausgabe ist stderr.
@item O 
 @tab Wie @code{O}, aber die Datei wird nach jedem Schreiben auf die Platte
zur�ckgeschrieben (flush). Wenn n�tig, wird die Datei geschlossen und
wieder ge�ffnet.
@item p 
 @tab Debugger-Aktionen auf die angegebenen Prozesse beschr�nken. Ein
Prozess muss mit dem DBUG_PROCESS-Makro gekennzeichnet sein und mit einer
der Aktionen in der Liste �bereinstimmen, damit Debugger-Aktionen
durchgef�hrt werden.
@item P 
 @tab Den aktuellen Prozessnamen f�r jede Zeile der Debug- oder
Trace-Ausgabe ausgeben.
@item r 
 @tab Wenn ein neuer Zustand gepusht wird, nicht die
Funktionsverschachtelungsebene des alten Zustands �bernehmen (erben).
N�tzlich, wenn die Ausgabe am linken Rand anfangen soll.
@item S 
 @tab Funktion _sanity(_datei_,_zeile_) bei jeder debuggten Funktion
ausf�hren, bis _sanity() etwas anderes als 0 zur�ckgibt. (Wird meist
zusammen mit safemalloc benutzt, um Speicherlecks zu finden.)
@item t 
 @tab Trace-Zeile f�r Funktionsaufrufen / Funktionsende anschalten. Wird
gegebenenfalls gefolgt von einer Liste (die nur einen Modifikator enth�lt), in
der numerisch eine maximale Trace-Ebene angegeben wird, nach der keine
Ausgaben mehr erfolgen, weder f�r Debuggen noch f�r das Tracen von Makros. Die
Vorgabe ist eine Kompilierzeit-Option.
@end multitable

Einige Beispiele von Debug-Steuerungs-Zeichenketten, die auf einer
Shell-Kommandozeile erscheinen k�nnen (das "-#" wird typischerweise
benutzt, um eine Steuerungs-Zeichenkette f�r ein Applikationsprogramm
einzuf�hren):

@example
-#d:t
-#d:f,main,subr1:F:L:t,20
-#d,input,output,files:n
-#d:t:i:O,\\mysqld.trace
@end example

In MySQL werden gebr�uchlicherweise (mit der @code{d}-Option) folgende Tags
ausgegeben: @code{enter}, @code{exit}, @code{error}, @code{warning},
@code{info} und @code{loop}.


@node Locking methods, RTS-threads, The DBUG package, Porting
@c German node Sperrmethoden
@appendixsec Sperrmethoden

@cindex Sperrmethoden
@cindex Methoden, Sperr-

Momentan unterst�tzt MySQL Tabellensperren nur f�r @code{ISAM}- /
@code{MyISAM}- und @code{HEAP}-Tabellen und Sperren auf Seitenebene nur f�r
@code{BDB}-Tabellen. @xref{Internal locking}. Bei @code{MyISAM}-Tabellen
k�nnen Sie @code{INSERT} und @code{SELECT} ohne Sperren frei vermischen.
(@code{Versionierung}).

Ab Version 3.23.33 k�nnen Sie die Tabellensperr-Konkurrenz auf Ihrem System
durch Pr�fen der @code{Table_locks_waited}- und
@code{Table_locks_immediate}-Umgebungsvariablen analysieren.

Einige Datenbankbenutzer behaupten, dass MySQL keine gro�e Anzahl
gleichzeitiger Benutzer unterst�tzen kann, weil es kein Sperren auf
Zeilenebene hat. Das mag bei einigen speziellen Applikationen zutreffen,
aber nicht allgemein. Wie immer h�ngt das v�llig davon ab, was Ihre
Applikation macht, und davon, wie das Zugriffs-/Aktualisierungs-Muster der
Daten aussieht.

Vorteile f�r Zeilensperren:

@itemize @bullet
@item
Weniger Sperrkonflikte beim Zugriff auf unterschiedliche Zeilen in vielen
Threads.
@item
Weniger �nderungen bei Rollbacks.
@item
Macht es m�glich, eine einzelne Zeile lange zu sperren.
@end itemize

Nachteile:

@itemize @bullet
@item
Ben�tigt mehr Speicher als Sperren auf Seiten- oder Tabellenebene.
@item
Ist langsamer als Sperren auf Seiten- oder Tabellenebene, wenn es einen
gro�en Teil der Tabelle betrifft, weil man viel mehr Sperren durchf�hren
muss.
@item
Ist definitiv viel schlechter als andere Sperren, wenn Sie oft @code{GROUP
BY} auf einen gro�en Teil der Daten ausf�hren oder wenn man die gesamte
Tabelle oft scannen muss.
@item
Bei Sperren auf h�herer Ebene kann man einfacher Sperren unterschiedlichen
Typs unterst�tzen, um die Applikation zu optimieren, weil der
Sperr-Overhead sich weniger als bei Sperren auf Zeilenebene bemerkbar
macht.
@end itemize

Tabellensperren sind Seiten- oder Zeilensperren in folgenden F�llen
�berlegen:

@itemize @bullet
@item
Wenn man meist liest.
@item
Wenn Lese- und Aktualisierungsoperationen auf strengen Schl�sseln erfolgen.
Das ist dann der Fall, wenn man eine Zeile aktualisiert oder l�scht, die
mit einem Schl�ssel-Lesen geholt werden kann:
@example
UPDATE tabelle SET spalte=wert WHERE eindeutige_schluessel_nummer
DELETE FROM tabelle WHERE eindeutiger_schluessel=#
@end example
@item
@code{SELECT} in Kombination mit @code{INSERT} (und sehr wenigen
@code{UPDATE}'s und @code{DELETE}'s).
@item
Viele Scans / @code{GROUP BY} auf die gesamte Tabelle ohne irgend welche
Schreibvorg�nge.
@end itemize

Andere Optionen als Sperren auf Zeilen- / Seiten-Ebene:

Versionierung (wie die, die wir bei MySQL f�r gleichzeitige Einf�gevorg�nge
nutzen), bei der man gleichzeitig einen Schreibvorgang haben kann, w�hrend
viele Lesevorg�nge stattfinden. Das hei�t, dass die Datenbank / Tabelle
verschiedene Sichten der Daten unterst�tzt, abh�ngig davon, wann man
anfing, darauf zuzugreifen. Andere Namen hierf�r sind Zeitreisen, Kopieren
beim Schreiben (Copy on Write) oder Kopieren bei Bedarf (Copy on Demand).

Kopieren bei Bedarf ist in vielen F�llen viel besser als Sperren auf
Seiten- oder Zeilenebene. Im schlimmsten Fall wird jedoch viel mehr
Speicher verbraucht als bei der Benutzung normaler Sperren.

Anstelle von Zeilen-Sperren kann man Sperren auf Applikationsebene
benutzen (wie get_lock/release_lock in MySQL). Das funktioniert nat�rlich
nur bei 'wohl erzogenen' Applikationen.

In vielen F�llen kann man auf fortgeschrittene Art raten, welcher Sperrtyp
der beste f�r die Applikation ist, aber allgemein ist es sehr schwer zu
sagen, dass ein bestimmter Sperrtyp besser ist als ein anderer. Alles h�ngt
von der Applikation ab, und verschiedene Teile der Applikation k�nnen nach
unterschiedlichen Sperrtypen verlangen.

Hier sind einige Tipps zu Sperren in MySQL:

Bei Web-Applikation f�hren die meisten Applikationen viele SELECTs aus,
sehr wenige DELETEs, UPDATEs haupts�chlich auf Schl�ssel und INSERTs in
einigen bestimmten Tabellen. Die grundlegende Einrichtung von MySQL ist
hierf�r BESTENS optimiert.

Gleichzeitige Benutzer sind kein Problem, solange man UPDATEs und SELECTs
nicht vermischt, die beide gleichzeitig viele Zeilen in derselben Tabelle
untersuchen m�ssen.

Wenn man INSERTs und DELETEs auf dieselbe Tabelle mischt, kann @code{INSERT
DELAYED} eine gro�e Hilfe sein.

Man kann auch @code{LOCK TABLES} benutzen, um Dinge zu beschleunigen (viele
UPDATEs innerhalb einer einzelnen Sperre sind viel schneller als UPDATEs
ohne Sperren). Daten in unterschiedliche Tabellen aufteilen hilft hierbei
auch.

Wenn Sie Geschwindigkeitsprobleme mit den Tabellensperren in MySQL
bekommen, k�nnen Sie diese eventuell dadurch l�sen, dass Sie Ihre Tabellen
in @code{BDB}-Tabellen umwandeln.
@xref{BDB}.

Der Optimierungsabschnitt dieses Handbuchs behandelt viele verschiedene
Aspekte dessen, wie man seine Applikationen optimieren kann. @xref{Tips}.


@node RTS-threads, Thread packages, Locking methods, Porting
@c German node RTS-Thread
@appendixsec Anmerkungen zu RTS-Thread

@cindex RTS-Thread
@cindex Thread, RTS

Ich habe versucht, die RTS-Thread-Pakete bei MySQL zu benutzen, bin aber
�ber folgende Probleme gestolpert:

Sie benutzen die alte Version vieler POSIX-Aufrufe und es ist sehr m�hsam,
Wrapper f�r alle Funktionen zu schreiben. Ich neige dazu zu denken, dass es
leichter ist, die Thread-Bibliotheken auf die neueste POSIX-Spezifikation
zu �ndern.

Einige Wrapper sind bereits geschrieben. Siehe @file{mysys/my_pThread.c}
wegen weiterer Informationen.

Zumindest folgendes sollte ge�ndert werden:

@code{pthread_get_specific} sollte ein Argument benutzen.
@code{sigwait} sollte zwei Argumente entgegennehmen.
Viele Funktionen (zumindest @code{pthread_cond_wait} und
@code{pthread_cond_timedwait}) sollten bei einem Fehler den Fehler-Code
zur�ckgeben. Momentan geben sie -1 zur�ck und setzen @code{errno}.

Ein weiteres Problem ist, dass Threads auf Benutzerebene das
@code{ALRM}-Signal benutzen und dass dieses viele Funktionen abbricht
(@code{read}, @code{write}, @code{open}, ...). MySQL sollte versuchen, nach
der Unterbrechung all dieser Funktionen weiterzumachen, aber das ist nicht
einfach zu verifizieren.

Das gr��te ungel�ste Problem ist folgendes:

Um Alarme auf Thread-Ebene zu erhalten, �nderte ich
@file{mysys/thr_alarm.c} in der Art, dass es zwischen Alarmen wartet, mit
@code{pthread_cond_timedwait()}, aber das bricht mit Fehler @code{EINTR}
ab. Ich versuchte, die Thread-Bibliothek zu debuggen, um den Grund
herauszufinden, konnte aber keine einfache L�sung finden.

Wenn jemand MySQL mit RTS-Thread ausprobieren m�chte, schlage ich folgendes
vor:

@itemize @bullet
@item
Funktionen, die MySQL benutzt, von der Thread-Bibliothek zu POSIX �ndern.
Das sollte nicht lange dauern.
@item
Alle Bibliotheken mit @code{-DHAVE_rts_thread} kompilieren.
@item
@code{thr_alarm} kompilieren.
@item
Wenn es kleine Unterschiede in der Implementation gibt, k�nnen diese
behoben werden, indem man @file{my_pThread.h} und @file{my_pThread.c}
�ndert.
@item
@code{thr_alarm} laufen lassen. Wenn es ohne irgend welche ``warning''-,
``error''- oder ``aborted''-Meldungen l�uft, sind Sie auf dem richtigen
Weg. Hier ist ein erfolgreiches Laufenlassen unter Solaris:
@example
Main Thread: 1
Thread 0 (5) started
Thread: 5  Waiting
process_alarm
Thread 1 (6) started
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 1 (1) sec
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 2 (2) sec
Thread: 6  Simulation of no alarm needed
Thread: 6  Slept for 0 (3) sec
Thread: 6  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 4 (4) sec
Thread: 6  Waiting
process_alarm
thread_alarm
Thread: 5  Slept for 10 (10) sec
Thread: 5  Waiting
process_alarm
process_alarm
thread_alarm
Thread: 6  Slept for 5 (5) sec
Thread: 6  Waiting
process_alarm
process_alarm

...
thread_alarm
Thread: 5  Slept for 0 (1) sec
end
@end example
@end itemize


@node Thread packages,  , RTS-threads, Porting
@c German node Thread-Pakete
@appendixsec Unterschiede zwischen verschiedenen Thread-Paketen

@cindex Thread-Pakete, Unterschiede

MySQL ist sehr abh�ngig vom verwendeten Thread-Paket. Wenn Sie daher eine
gute Plattform f�r MySQL ausw�hlen, ist das Thread-Paket sehr wichtig.

Es gibt mindestens drei Typen von Thread-Paketen:

@itemize @bullet
@item
Benutzer-Thread in einem einzelnen Prozess. Das Thread-Umschalten wird mit
Alarmen gemacht und die Thread-Bibliothek verwaltet alle nicht
Thread-sicheren Funktionen mit Sperren. Lese-, Schreib- und
Auswahl-Operationen werden �blicherweise mit einer Thread-spezifischen
Auswahl verwaltet, die auf einen anderen Thread umschaltet, wenn der
laufende Thread auf Daten warten muss. 
Wenn die Benutzer-Thread-Pakete in die Standard-Bibliotheken integriert
sind (FreeBSD- und BSDI-Thread), erfordert das Thread-Paket weniger
Overhead als Thread-Pakete, die alle unsicheren Aufrufen mappen m�ssen
(MIT-pThread, FSU-PThread und RTS-Thread). In einigen Umgebungen
(beispielsweise SCO) sind alle Systemaufrufe Thread-sicher, weshalb das
Mapping sehr leicht durchgef�hrt werden kann (FSU-PThread unter SCO).
Nachteil: Alle gemappten Aufrufe ben�tigen etwas Zeit und es ist sehr
verzwickt, alle Situationen handhaben zu k�nnen. �blicherweise gibt es auch
einige Systemaufrufe, die vom Thread-Paket nicht gehandhabt werden (wie
MIT-pThread und Sockets). Thread-Scheduling ist nicht immer optimal.
@item
Benutzer-Thread in separaten Prozessen. Das Thread-Umschalten wird vom
Kernel durchgef�hrt und alle Daten werden zwischen den Threads geteilt. Das
Thread-Paket verwaltet die Standard-Thread-Aufrufe, so dass diese Daten
zwischen Threads teilen k�nnen. LinuxThread benutzt diese Methode.
Nachteil: viele Prozesse. Die Erzeugung von Threads ist langsam. Wenn ein
Thread stirbt, bleiben die �brigen �blicherweise h�ngen, und Sie m�ssen
alle t�ten, bevor Sie neu starten k�nnen. Man kann sagen, dass die
Thread-Umschaltung ziemlich viel kostet.
@item
Kernel-Thread. Das Thread-Umschalten wird von der Thread-Bibliothek oder
dem Kernel durchgef�hrt und ist sehr schnell. Alles wird in einem Prozess
gemacht, aber auch manchen Systemen zeigt @code{ps} die verschiedenen
Threads. Wenn ein Thread abbricht, bricht der gesamte Prozess ab. Die
meisten Systemaufrufe sind Thread-sicher und sollten sehr wenig Overhead
beanspruchen. Solaris, HP-UX, AIX und OSF1 haben Kernel-Thread.
@end itemize

Auf manchen Systemen wird Kernel-Thread gehandhabt, indem
Benutzerebenen-Thread in die Systembibliotheken integriert wird. In solchen
F�llen kann das Umschalten nur von der Thread-Bibliothek durchgef�hrt
werden und der Kernel ist sich nicht wirklich ``der Threads bewusst''.




@node Environment variables, Regexp, Porting, Top
@c German node Umgebungsvariablen
@appendix Umgebungsvariablen

@cindex Umgebungsvariablen, Auflistung

Hier ist eine Auflistung aller Umgebungsvariablen, die direkt oder indirekt
von MySQL benutzt werden. Die meisten von ihnen finden sich auch an anderen
Stellen dieses Handbuchs.

Beachten Sie, dass jegliche Optionen auf der Kommandozeile vorrangig vor
Werten, die in Konfigurationsdateien und Umgebungsvariablen angegeben sind,
und Werte in Konfigurationsdateien vorrangig vor Werten in
Umgebungsvariablen sind.

In vielen F�llen ist es vorzuziehen, eine configure-Datei anstelle von
Umgebungsvariablen zu verwenden, um das Verhalten von MySQL zu
beeinflussen. @xref{Option files}.

@tindex CCX-Umgebungsvariable
@tindex Umgebungsvariable, CCX
@tindex CC-Umgebungsvariable
@tindex Umgebungsvariable, CC
@tindex CFLAGS-Umgebungsvariable
@tindex Umgebungsvariable, CFLAGS
@tindex CXXFLAGS-Umgebungsvariable
@tindex Umgebungsvariable, CXXFLAGS
@tindex DBI_USER-Umgebungsvariable
@tindex Umgebungsvariable, DBI_USER
@tindex DBI_TRACE-Umgebungsvariable
@tindex Umgebungsvariable, DBI_TRACE
@tindex HOME-Umgebungsvariable
@tindex Umgebungsvariable, HOME
@tindex LD_RUN_PATH-Umgebungsvariable
@tindex Umgebungsvariable, LD_RUN_PATH
@tindex MYSQL_DEBUG-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_DEBUG
@tindex MYSQL_HISTFILE-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_HISTFILE
@tindex MYSQL_HOST-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_HOST
@tindex MYSQL_PWD-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_PWD
@tindex MYSQL_TCP_PORT-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_TCP_PORT
@tindex MYSQL_UNIX_PORT-Umgebungsvariable
@tindex Umgebungsvariable, MYSQL_UNIX_PORT
@tindex PATH-Umgebungsvariable
@tindex Umgebungsvariable, PATH
@tindex TMPDIR-Umgebungsvariable
@tindex Umgebungsvariable, TMPDIR
@tindex TZ-Umgebungsvariable
@tindex Umgebungsvariable, TZ
@tindex UMASK_DIR-Umgebungsvariable
@tindex Umgebungsvariable, UMASK_DIR
@tindex UMASK-Umgebungsvariable
@tindex Umgebungsvariable, UMASK
@tindex USER-Umgebungsvariable
@tindex Umgebungsvariable, USER

@multitable @columnfractions .2 .8
@item @code{CCX} @tab Setzen Sie diese f�r Ihren C++-Kompiler, wenn Sie
configure laufen lassen.
@item @code{CC}  @tab Setzen Sie diese f�r Ihren C-Kompiler, wenn Sie
configure laufen lassen.
@item @code{CFLAGS} @tab Flags f�r Ihren C-Kompiler, wenn Sie
configure laufen lassen.
@item @code{CXXFLAGS} @tab Flags f�r Ihren C++-Kompiler wenn Sie
configure laufen lassen.
@item @code{DBI_USER} @tab Der vorgabem��ige Benutzername f�r Perl-DBI.
@item @code{DBI_TRACE} @tab Beim Tracen in Perl-DBI benutzt.
@item @code{HOME} @tab Der vorgabem��ige Pfad f�r die
@code{mysql}-History-Datei ist @file{$HOME/.mysql_history}.
@item @code{LD_RUN_PATH} @tab Wird benutzt um anzugeben, wo Ihr
@code{libmysqlclient.so} ist.
@item @code{MYSQL_DEBUG} @tab Debug-Trace-Optionen beim Debuggen.
@item @code{MYSQL_HISTFILE} @tab Der Pfad zur @code{mysql}-History-Datei.
@item @code{MYSQL_HOST} @tab Vorgabem��iger Hostname, der von der
@code{mysql}-Befehlszeilenaufforderung benutzt wird.
@item @code{MYSQL_PWD} @tab Das vorgabem��ige Passwort bei der Verbindung
mit @code{mysqld}. Beachten Sie, dass die Benutzung dieser
Umgebungsvariablen unsicher ist!
@item @code{MYSQL_TCP_PORT} @tab Der vorgabem��ige TCP/IP-Port.
@item @code{MYSQL_UNIX_PORT} @tab Der vorgabem��ige Socket; benutzt f�r
Verbindungen nach @code{localhost}.
@item @code{PATH} @tab Wird von der Shell benutzt, um die MySQL-Programme
zu finden.
@item @code{TMPDIR} @tab Das Verzeichnis, in dem tempor�re Tabellen /
Dateien erzeugt werden.
@item @code{TZ} @tab Diese Variable sollte auf Ihre lokale Zeitzone gesetzt
sein. @xref{Timezone problems}.
@item @code{UMASK_DIR} @tab Die Erzeugungsmaske (Creation Mask) des
Benutzer-Verzeichnisses, wenn Verzeichnisse angelegt werden. Beachten Sie,
dass diese mit @code{UMASK} mit einem logischen UND verkn�pft wird!
@item @code{UMASK} @tab Die Erzeugungsmaske (Creation Mask) bei der
Erzeugung von Dateien.
@item @code{USER} @tab Der vorgabem��ige Benutzer unter Windows, der beim
Verbinden mit @code{mysqld} benutzt wird.
@end multitable




@node Regexp, GPL license, Environment variables, Top
@c German node Regul�re Ausdr�cke
@appendix Beschreibung der MySQL-Syntax f�r regul�re Ausdr�cke

@cindex regex
@cindex Syntax regul�rer Ausdr�cke, Beschreibung
@cindex Syntax, regul�re Ausdr�cke

Ein regul�rer Ausdruck (regex) ist eine m�chtige M�glichkeit, eine komplexe
Suche zu formulieren.

MySQL benutzt Henry Spencers Implementation regul�rer Ausdr�cke, die
anstrebt, POSIX-1003.2-konform zu sein. MySQL benutzt die erweiterte
Version.

Die vorliegende vereinfachte Referenz �berspringt die Details. Um genauere
Informationen zu erhalten, sehen Sie sich Henry Spencers
@code{regex(7)}-Handbuchseite an, die in der Quelldistribution enthalten
ist. @xref{Credits}.

Ein regul�rer Ausdruck beschreibt einen Satz von Zeichenketten. Der
einfachste regexp ist einer, der keine Sonderzeichen enth�lt. Der regexp
@code{hello} beispielsweise stimmt mit @code{hello} und sonst nichts
�berein.

Nicht triviale regul�re Ausdr�cke benutzen bestimmte spezielle Konstrukte,
so dass sie mit mehr als einer Zeichenkette �bereinstimmen k�nnen. Der
regexp @code{hallo|stefan} beispielsweise stimmt entweder mit der
Zeichenkette @code{hallo} oder der Zeichenkette @code{stefan} �berein.

Um ein komplexeres Beispiel zu geben, stimmt der regexp @code{B[an]*s} mit
jeder der Zeichenketten @code{Bananas}, @code{Baaaaas}, @code{Bs} und jeder
anderen Zeichenkette �berein, die mit einem @code{B} anf�ngt, mit einem
@code{s} aufh�rt und jede beliebige Anzahl von @code{a}- oder
@code{n}-Zeichen dazwischen enth�lt.

Ein regul�rer Ausdruck kann jedes der folgenden Sonderzeichen bzw.
Konstrukte benutzen (0 = keine �bereinstimmung):
@table @code
@item ^
Stimmt mit dem Anfang einer Zeichenkette �berein.
@example
mysql> select "fo\nfo" REGEXP "^fo$";           -> 0
mysql> select "fofo" REGEXP "^fo";              -> 1
@end example
@item $
Stimmt mit dem Ende einer Zeichenkette �berein.
@example
mysql> select "fo\no" REGEXP "^fo\no$";         -> 1
mysql> select "fo\no" REGEXP "^fo$";            -> 0
@end example
@item .
Stimmt mit jedem Zeichen �berein (inklusive neue Zeile).
@example
mysql> select "fofo" REGEXP "^f.*";             -> 1
mysql> select "fo\nfo" REGEXP "^f.*";           -> 1
@end example
@item a*
Stimmt mit jeder Folge von 0 oder mehr @code{a}-Zeichen �berein.
@example
mysql> select "Ban" REGEXP "^Ba*n";             -> 1
mysql> select "Baaan" REGEXP "^Ba*n";           -> 1
mysql> select "Bn" REGEXP "^Ba*n";              -> 1
@end example
@item a+
Stimmt mit jeder Folge von einem oder mehr @code{a}-Zeichen �berein.
@example
mysql> select "Ban" REGEXP "^Ba+n";             -> 1
mysql> select "Bn" REGEXP "^Ba+n";              -> 0
@end example
@item a?
Stimmt mit 0 oder einem @code{a}-Zeichen �berein.
@example
mysql> select "Bn" REGEXP "^Ba?n";              -> 1
mysql> select "Ban" REGEXP "^Ba?n";             -> 1
mysql> select "Baan" REGEXP "^Ba?n";            -> 0
@end example
@item de|abc
Stimmt mit den Zeichenfolgen @code{de} oder @code{abc} �berein.
@example
mysql> select "pi" REGEXP "pi|apa";             -> 1
mysql> select "axe" REGEXP "pi|apa";            -> 0
mysql> select "apa" REGEXP "pi|apa";            -> 1
mysql> select "apa" REGEXP "^(pi|apa)$";        -> 1
mysql> select "pi" REGEXP "^(pi|apa)$";         -> 1
mysql> select "pix" REGEXP "^(pi|apa)$";        -> 0
@end example
@item (abc)*
Stimmt mit 0 oder mehr Instanzen der Folge @code{abc} �berein.
@example
mysql> select "pi" REGEXP "^(pi)*$";            -> 1
mysql> select "pip" REGEXP "^(pi)*$";           -> 0
mysql> select "pipi" REGEXP "^(pi)*$";          -> 1
@end example
@item @{1@}
@itemx @{2,3@}
Es gibt eine allgemeinere Schreibweise f�r regexps, die mit vielen
Vorkommen des vorherigen Atoms �bereinstimmen.
@table @code
@item a*
Kann als @code{a@{0,@}} geschrieben werden.
@item a+
Kann als @code{a@{1,@}} geschrieben werden.
@item a?
Kann als @code{a@{0,1@}} geschrieben werden.
@end table

Um genauer zu sein, stimmt ein Atom, gefolgt von einer Begrenzung, die eine
Ganzzahl @code{i} und keine Kommas enth�lt, mit einer Folge von genau
@code{i} �bereinstimmungen des Atoms �berein. Ein Atom gefolgt von einer
Begrenzung, die eine Ganzzahl @code{i} und ein Komma enth�lt, stimmt mit
einer Folge von @code{i} oder mehr �bereinstimmungen des Atoms �berein. Ein
Atom, gefolgt von einer Begrenzung, die zwei Ganzzahlen @code{i} und
@code{j} �bereinstimmungen enth�lt, stimmt mit einer Folge von @code{i} bis
@code{j} (inklusive) �bereinstimmungen des Atoms �berein.

Beide Argumente m�ssen im Bereich von @code{0} bis @code{RE_DUP_MAX}
(Vorgabe 255) inklusive sein. Wenn es zwei Argumente gibt, muss das zweite
gr��er oder gleich dem ersten sein.
@item [a-dX]
@itemx [^a-dX]
Stimmt mit jedem Zeichen �berein, was entweder @code{a}, @code{b},
@code{c}, @code{d} oder @code{X} ist (oder nicht ist, wenn ^ benutzt wird).
Um ein literales @code{]}-Zeichen einzuschlie�en, muss es unmittelbar der
�ffnenden Klammer @code{[} folgen. Um ein literales @code{-}-Zeichen
einzuschlie�en, muss es zuerst oder zuletzt geschrieben werden. Daher
stimmt @code{[0-9]} mit jeder Dezimalziffer �berein. Alle Zeichen, die
innerhalb eines @code{[]}-Paars keine definierte Bedeutung haben, haben
keine spezielle Bedeutung und stimmen nur mit sich selbst �berein.
@example
mysql> select "aXbc" REGEXP "[a-dXYZ]";         -> 1
mysql> select "aXbc" REGEXP "^[a-dXYZ]$";       -> 0
mysql> select "aXbc" REGEXP "^[a-dXYZ]+$";      -> 1
mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$";     -> 0
mysql> select "gheis" REGEXP "^[^a-dXYZ]+$";    -> 1
mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$";   -> 0
@end example
@item [[.zeichen.]]
Die Zeichenfolge des vereinigten Elements. Die Folge ist ein einzelnes
Element der Ausdrucksliste in der Klammer. Ein Klammerausdruck, der ein
Mehrzeichen-Vereinigungselement enth�lt, kann daher mit mehr als einem
Zeichen �bereinstimmen. Wenn die Vereinigungsfolge zum Beispiel ein
@code{ch}-Vereinigungselement enth�lt, stimmt der regul�re Ausdruck
@code{[[.ch.]]*c} mit den ersten f�nf Zeichen von @code{chchcc} �berein.

@item [=zeichen_klasse=]
Eine �quivalenzklasse, die f�r Zeichenfolgen aller Vereinigungselemente
dieser steht, inklusive sich selbst.

Wenn zum Beispiel @code{o} und @code{(+)} die Mitglieder einer
�quivalenzklasse sind, sind @code{[[=o=]]}, @code{[[=(+)=]]} und
@code{[o(+)]} allesamt Synonyme. Eine �quivalenzklasse darf kein Endpunkt
eines Bereichs sein.

@item [:zeichen_klasse:]
Innerhalb eines Klammerausdrucks steht der Name einer Zeichenklasse, die in
@code{[:} und @code{:]} eingeschlossen ist, f�r die Auflistung aller
Zeichen, die zu dieser Klasse geh�ren. Standard-Zeichenklassennamen sind:

@multitable @columnfractions .33 .33 .33
@item alnum @tab digit @tab punct
@item alpha @tab graph @tab space
@item empty @tab lower @tab upper
@item cntrl @tab print @tab xdigit
@end multitable

Diese stehen f�r die Zeichenklassen, die auf der
@code{ctype(3)}-Handbuchseite definiert sind. Ein Locale darf andere zur
Verf�gung stellen. Eine Zeichenklasse darf nicht als Endpunkt eines
Bereichs benutzt werden.
@example
mysql> select "justalnums" REGEXP "[[:alnum:]]+";       -> 1
mysql> select "!!" REGEXP "[[:alnum:]]+";               -> 0
@end example

@item [[:<:]]
@itemx [[:>:]]
Diese stimmen mit der Null-Zeichenkette am Anfang bzw. am Ende eines Worts
�berein. Ein Wort ist definiert als Folge von Wort-Zeichen, dem weder
Wortzeichen vorangestellt sind noch darauf folgen. Ein Wortzeichen ist ein
alnum-Zeichen (wie in @code{ctype(3)} definiert) oder ein Unterstrich
(@code{_}).
@example
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]";      -> 1
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]";     -> 0
@end example
@end table

@example
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1
@end example


@page
@c This node name ist special



@node GPL license, LGPL license, Regexp, Top
@c German node GPL-Lizenz
@appendix GNU GENERAL PUBLIC LICENSE

@cindex GPL, General Public License
@cindex GPL, GNU General Public License

@center Version 2, Juni 1991

@display
Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Jeder hat das Recht, diese Lizenzurkunde zu vervielf�ltigen und
unver�nderte Kopien zu verbreiten; �nderungen sind jedoch nicht gestattet.
@end display

@appendixsec Vorwort

Die meisten Softwarelizenzen sind daraufhin entworfen worden, Ihnen die 
Freiheit zu nehmen, die Software weiterzugeben und zu ver�ndern. 
Im Gegensatz dazu soll Ihnen die GNU General Public License, die 
allgemeine �ffentliche GNU-Lizenz, ebendiese Freiheit garantieren. 
Sie soll sicherstellen, dass die Software f�r alle Benutzer frei ist. 
Diese Lizenz gilt f�r den Gro�teil der von der Free Software Foundation 
herausgegebenen Software und f�r alle anderen Programme, deren Autoren 
ihr Werk dieser Lizenz unterstellt haben. Auch Sie k�nnen diese 
M�glichkeit der Lizenzierung f�r Ihre Programme anwenden. 
(Ein anderer Teil der Software der Free Software Foundation unterliegt 
stattdessen der GNU Library General Public License, der allgemeinen 
�ffentlichen GNU-Lizenz f�r Bibliotheken.)

Die Bezeichnung "freie" Software bezieht sich auf Freiheit, nicht auf 
den Preis. Unsere Lizenzen sollen Ihnen die Freiheit garantieren, 
Kopien freier Software zu verbreiten (und etwas f�r diesen Service zu 
berechnen, wenn Sie m�chten), die M�glichkeit, die Software im Quelltext
zu erhalten oder den Quelltext auf Wunsch zu bekommen. Die Lizenzen 
sollen garantieren, dass Sie die Software �ndern oder Teile davon in 
neuen freien Programmen verwenden d�rfen - und dass Sie wissen, dass 
Sie dies alles tun d�rfen.

Um Ihre Rechte zu sch�tzen, m�ssen wir Einschr�nkungen machen, die es 
jedem verbieten, Ihnen diese Rechte zu verweigern oder Sie aufzufordern, 
auf diese Rechte zu verzichten. Aus diesen Einschr�nkungen folgen 
bestimmte Verantwortlichkeiten f�r Sie, wenn Sie Kopien der Software 
verbreiten oder sie ver�ndern.

Beispielsweise m�ssen Sie den Empf�ngern alle Rechte gew�hren, die 
Sie selbst haben, wenn Sie - kostenlos oder gegen Bezahlung - Kopien 
eines solchen Programms verbreiten. Sie m�ssen sicherstellen, dass auch 
sie den Quelltext erhalten bzw. erhalten k�nnen. Und Sie m�ssen ihnen 
diese Bedingungen zeigen, damit sie Ihre Rechte kennen.

Wir sch�tzen Ihre Rechte in zwei Schritten: (1) Wir stellen die Software 
unter ein Urheberrecht (Copyright), und (2) wir bieten Ihnen diese Lizenz 
an, die Ihnen das Recht gibt, die Software zu vervielf�ltigen, zu 
verbreiten und/oder zu ver�ndern.

Um die Autoren und uns zu sch�tzen, wollen wir dar�berhinaus sicherstellen, 
dass jeder erf�hrt, dass f�r diese freie Software keinerlei Garantie besteht. 
Wenn die Software von jemand anderem modifiziert und weitergegeben wird, 
m�chten wir, dass die Empf�nger wissen, dass sie nicht das Original erhalten 
haben, damit von anderen verursachte Probleme nicht den Ruf des 
urspr�nglichen Autors sch�digen.

Schlie�lich und endlich ist jedes freie Programm permanent durch 
Software-Patente bedroht. Wir m�chten die Gefahr ausschlie�en, dass 
Distributoren eines freien Programms individuell Patente lizensieren
 - mit dem Ergebnis, dass das Programm propriet�r w�rde. Um dies zu 
 verhindern, haben wir klargestellt, dass jedes Patent entweder f�r freie 
Benutzung durch jedermann lizenziert werden muss oder �berhaupt nicht 
lizenziert werden darf.

Es folgen die genauen Bedingungen f�r die Vervielf�ltigung, 
Verbreitung und Bearbeitung:

@iftex
@appendixsec Bedingungen f�r die Vervielf�ltigung, 
Verbreitung und Bearbeitung
@end iftex
@ifinfo
@center GNU GENERAL PUBLIC LICENSE
@center Bedingungen f�r die Vervielf�ltigung, Verbreitung 
und Bearbeitung
@end ifinfo

@enumerate 0
@item
Diese Lizenz gilt f�r jedes Programm und jedes andere Werk, in dem 
ein entsprechender Vermerk des Copyright-Inhabers darauf hinweist, 
dass das Werk unter den Bestimmungen dieser General Public License 
verbreitet werden darf. Im folgenden wird jedes derartige Programm 
oder Werk als "das Programm" bezeichnet; die Formulierung "auf dem 
Programm basierendes Werk" bezeichnet das Programm sowie jegliche 
Bearbeitung des Programms im urheberrechtlichen Sinne, also ein Werk, 
welches das Programm, auch auszugsweise, sei es unver�ndert oder 
ver�ndert und/oder in eine andere Sprache �bersetzt, enth�lt. 
(Im folgenden wird die �bersetzung ohne Einschr�nkung als 
"Bearbeitung" eingestuft.) Jeder Lizenznehmer wird im folgenden 
als "Sie" angesprochen.

Andere Handlungen als Vervielf�ltigung, Verbreitung und Bearbeitung 
werden von dieser Lizenz nicht ber�hrt; sie fallen nicht in Ihren 
Anwendungsbereich. Der Vorgang der Ausf�hrung des Programms wird 
nicht eingeschr�nkt, und die Ausgaben des Programms unterliegen 
dieser Lizenz nur, wenn der Inhalt ein auf dem Programm basierendes 
Werk darstellt (unabh�ngig davon, dass die Ausgabe durch die 
Ausf�hrung des Programmes erfolgte). Ob dies zutrifft, h�ngt von den 
Funktionen des Programms ab.

@item
Sie d�rfen auf beliebigen Medien unver�nderte Kopien des Quelltextes 
des Programms, wie sie ihn erhalten haben, anfertigen und verbreiten. 
Voraussetzung hierf�r ist, dass Sie mit jeder Kopie einen entsprechenden 
Copyright-Vermerk sowie einen Haftungsausschluss ver�ffentlichen, alle 
Vermerke, die sich auf diese Lizenz und das Fehlen einer Garantie 
beziehen, unver�ndert lassen und desweiteren allen anderen Empf�ngern 
des Programms zusammen mit dem Programm eine Kopie dieser Lizenz 
zukommen lassen.

Sie d�rfen f�r den eigentlichen Kopiervorgang eine Geb�hr verlangen. 
Wenn Sie es w�nschen, d�rfen Sie auch gegen Entgelt eine Garantie 
f�r das Programm anbieten.

@item
Sie d�rfen Ihre Kopie(n) des Programms oder eines Teils davon 
ver�ndern, wodurch ein auf dem Programm basierendes Werk entsteht; 
Sie d�rfen derartige Bearbeitungen unter den Bestimmungen von 
Paragraph 1 vervielf�ltigen und verbreiten, vorausgesetzt, dass 
zus�tzlich alle folgenden Bedingungen erf�llt werden:

@enumerate a
@item
Sie m�ssen die ver�nderten Dateien mit einem auff�lligen Vermerk 
versehen, der auf die von Ihnen vorgenommene Modifizierung und 
das Datum jeder �nderung hinweist.

@item
Sie m�ssen daf�r sorgen, dass jede von Ihnen verbreitete oder 
ver�ffentlichte Arbeit, die ganz oder teilweise von dem Programm 
oder Teilen davon abgeleitet ist, Dritten gegen�ber als Ganzes 
unter den Bedingungen dieser Lizenz ohne Lizenzgeb�hren zur 
Verf�gung gestellt wird.

@item
Wenn das ver�nderte Programm normalerweise bei der Ausf�hrung 
interaktiv Kommandos einliest, m�ssen Sie daf�r sorgen, dass es, 
wenn es auf dem �blichsten Wege f�r solche interaktive Nutzung 
gestartet wird, eine Meldung ausgibt oder ausdruckt, die einen 
geeigneten Copyright-Vermerk enth�lt sowie einen Hinweis, dass es 
keine Gew�hrleistung gibt (oder anderenfalls, dass Sie Garantie 
leisten), und dass die Benutzer das Programm unter diesen 
Bedingungen weiter verbreiten d�rfen. Auch muss der Benutzer darauf
hingewiesen werden, wie er eine Kopie dieser Lizenz ansehen kann.
(Ausnahme: Wenn das Programm selbst interaktiv arbeitet, aber 
normalerweise keine derartige Meldung ausgibt, muss Ihr auf dem 
Programm basierendes Werk auch keine solche Meldung ausgeben).
@end enumerate

Diese Anforderungen betreffen das ver�nderte Werk als Ganzes. 
Wenn identifizierbare Abschnitte des Werkes nicht von dem 
Programm abgeleitet sind und vern�nftigerweise selbst als 
unabh�ngige und eigenst�ndige Werke betrachtet werden k�nnen, dann 
erstrecken sich diese Lizenz und Ihre Bedingungen nicht auf 
diese Abschnitte, wenn sie als eigenst�ndige Werke verbreitet 
werden. Wenn Sie jedoch dieselben Abschnitte als Teil eines 
Ganzen verbreiten, dass ein auf dem Programm basierendes Werk 
darstellt, dann muss die Verbreitung des Ganzen nach den 
Bedingungen dieser Lizenz erfolgen, deren Bedingungen f�r 
weitere Lizenznehmer somit auf die Gesamtheit ausgedehnt werden 
- und damit auf jeden einzelnen Teil, unabh�ngig vom jeweiligen Autor.

Somit ist es nicht die Absicht dieses Abschnittes, Rechte f�r 
Werke in Anspruch zu nehmen oder zu beschneiden, die komplett 
von Ihnen geschrieben wurden; vielmehr ist es die Absicht, 
die Rechte zur Kontrolle der Verbreitung von Werken, die auf 
dem Programm basieren oder unter seiner auszugsweisen 
Verwendung zusammengestellt worden sind, auszu�ben.

Ferner bringt ein einfaches Zusammenstellen eines anderen Werkes, 
das nicht auf dem Programm basiert, zusammen mit dem Programm 
oder einem auf dem Programm basierenden Werk auf ein- und 
demselben Speicher- oder Vertriebsmedium das andere Werk nicht in 
den Anwendungsbereich dieser Lizenz.

@item
Sie d�rfen das Programm (oder ein darauf basierendes Werk gem�� 
Paragraph 2) als Objectcode oder in ausf�hrbarer Form unter den 
Bedingungen von Paragraph 1 und 2 vervielf�ltigen und verbreiten 
- vorausgesetzt, dass Sie au�erdem eine der folgenden Leistungen 
erbringen:

@enumerate a
@item
Liefern Sie das Programm zusammen mit dem vollst�ndigen 
zugeh�rigen maschinenlesbaren Quelltext auf einem f�r den 
Datenaustausch �blichen Medium aus, wobei die Verteilung unter den 
Bedingungen der Paragraphen 1 und 2 erfolgen mu�. Oder:

@item
Liefern Sie das Programm zusammen mit einem mindestens drei 
Jahre lang g�ltigen schriftlichen Angebot aus, jedem Dritten 
eine vollst�ndige maschinenlesbare Kopie des Quelltextes zur 
Verf�gung zu stellen - zu nicht h�heren Kosten als denen, die 
durch den physikalischen Kopiervorgang anfallen -, wobei der 
Quelltext unter den Bedingungen der Paragraphen 1 und 2 auf 
einem f�r den Datenaustausch �blichen Medium weitergegeben 
wird. Oder:

@item
Liefern Sie das Programm zusammen mit dem schriftlichen An-
gebot der Zurverf�gungstellung des Quelltextes aus, das Sie 
selbst erhalten haben. (Diese Alternative ist nur f�r 
nicht-kommerzielle Verbreitung zul�ssig und nur, wenn Sie 
das Programm als Objectcode oder in ausf�hrbarer Form mit 
einem entsprechenden Angebot gem�� Absatz b erhalten haben.)
@end enumerate

Unter dem Quelltext eines Werkes wird diejenige Form des Werkes 
verstanden, die f�r Bearbeitungen vorzugsweise verwendet wird. 
F�r ein ausf�hrbares Programm bedeutet "der komplette Quell-
text": Der Quelltext aller im Programm enthaltenen Module ein-
schlie�lich aller zugeh�rigen Modulschnittstellen-Definitions-
dateien sowie der zur Compilation und Installation verwendeten 
Skripte. Als besondere Ausnahme jedoch braucht der verteilte 
Quelltext nichts von dem zu enthalten, was �blicherweise 
(entweder als Quelltext oder in bin�rer Form) zusammen mit den 
Hauptkomponenten des Betriebssystems (Kernel, Compiler usw.) 
geliefert wird, unter dem das Programm l�uft - es sei denn, 
diese Komponente selbst geh�rt zum ausf�hrbaren Programm.

Wenn die Verbreitung eines ausf�hrbaren Programms oder des 
Objectcodes dadurch erfolgt, dass der Kopierzugriff auf eine 
daf�r vorgesehene Stelle gew�hrt wird, so gilt die Gew�hrung 
eines gleichwertigen Zugriffs auf den Quelltext als Verbreitung 
des Quelltextes, auch wenn Dritte nicht dazu gezwungen sind, 
den Quelltext zusammen mit dem Objectcode zu kopieren.

@item
Sie d�rfen das Programm nicht vervielf�ltigen, ver�ndern, weiter 
lizenzieren oder verbreiten, sofern es nicht durch diese Lizenz 
ausdr�cklich gestattet ist. Jeder anderweitige Versuch der 
Vervielf�ltigung, Modifizierung, Weiterlizenzierung und Verbreitung
ist nichtig und beendet automatisch Ihre Rechte unter dieser 
Lizenz. Jedoch werden die Lizenzen Dritter, die von Ihnen Kopien
oder Rechte unter dieser Lizenz erhalten haben, nicht beendet, 
solange diese die Lizenz voll anerkennen und befolgen.

@item
Sie sind nicht verpflichtet, diese Lizenz anzunehmen, da Sie sie 
nicht unterzeichnet haben. Jedoch gibt Ihnen nichts anderes die 
Erlaubnis, das Programm oder von ihm abgeleitete Werke zu 
ver�ndern oder zu verbreiten. Diese Handlungen sind gesetzlich 
verboten, wenn Sie diese Lizenz nicht anerkennen. Indem Sie das 
Programm (oder ein darauf basierendes Werk) ver�ndern oder 
verbreiten, erkl�ren Sie Ihr Einverst�ndnis mit dieser Lizenz und 
mit allen Ihren Bedingungen bez�glich der Vervielf�ltigung, 
Verbreitung und Ver�nderung des Programms oder eines darauf 
basierenden Werkes.

@item
Jedesmal, wenn Sie das Programm (oder ein auf dem Programm 
basierendes Werk) weitergeben, erh�lt der Empf�nger automatisch 
vom urspr�nglichen Lizenzgeber die Lizenz, das Programm 
entsprechend den hier festgelegten Bestimmungen zu vervielf�ltigen, 
zu verbreiten und zu ver�ndern. Sie d�rfen keine weiteren 
Einschr�nkungen der Durchsetzung der hierin zugestandenen Rechte 
des Empf�ngers vornehmen. Sie sind nicht daf�r verantwortlich, 
die Einhaltung dieser Lizenz durch Dritte durchzusetzen.

@item
Sollten Ihnen infolge eines Gerichtsurteils, des Vorwurfs einer 
Patentverletzung oder aus einem anderen Grunde (nicht auf Patent
fragen begrenzt) Bedingungen (durch Gerichtsbeschlu�, Vergleich 
oder anderweitig) auferlegt werden, die den Bedingungen dieser 
Lizenz widersprechen, so befreien Sie diese Umst�nde nicht von 
den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht m�glich ist, 
das Programm unter gleichzeitiger Beachtung der Bedingungen in 
dieser Lizenz und Ihrer anderweitigen Verpflichtungen zu ver-
breiten, dann d�rfen Sie als Folge das Programm �berhaupt nicht 
verbreiten. Wenn zum Beispiel ein Patent nicht die geb�hrenfreie 
Weiterverbreitung des Programms durch diejenigen erlaubt, die das
Programm direkt oder indirekt von Ihnen erhalten haben, dann 
besteht der einzige Weg, sowohl das Patentrecht als auch diese 
Lizenz zu befolgen, darin, ganz auf die Verbreitung des Programms
zu verzichten.

Sollte sich ein Teil dieses Paragraphen als ung�ltig oder unter 
bestimmten Umst�nden nicht durchsetzbar erweisen, so soll dieser 
Paragraph seinem Sinne nach angewandt werden; im �brigen soll 
dieser Paragraph als Ganzes gelten.

Zweck dieses Paragraphen ist nicht, Sie dazu zu bringen, 
irgendwelche Patente oder andere Eigentumsanspr�che zu verletzen oder 
die G�ltigkeit solcher Anspr�che zu bestreiten; dieser Paragraph 
hat einzig den Zweck, die Integrit�t des Verbreitungssystems der 
freien Software zu sch�tzen, das durch die Praxis �ffentlicher 
Lizenzen verwirklicht wird. Viele Leute haben gro�z�gige Beitr�ge
zu dem gro�en Angebot der mit diesem System verbreiteten Software
im Vertrauen auf die konsistente Anwendung dieses Systems 
geleistet; es liegt am Autor/Geber, zu entscheiden, ob er die 
Software mittels irgendeines anderen Systems verbreiten will; ein 
Lizenznehmer hat auf diese Entscheidung keinen Einfluss.

Dieser Paragraph ist dazu gedacht, deutlich klarzustellen, was als 
Konsequenz aus dem Rest dieser Lizenz betrachtet wird.

@item
Wenn die Verbreitung und/oder die Benutzung des Programms in be-
stimmten Staaten entweder durch Patente oder durch urheberrechtlich 
gesch�tzte Schnittstellen eingeschr�nkt ist, kann der Urheberrechts-
inhaber, der das Programm unter diese Lizenz gestellt hat, eine 
explizite geographische Beschr�nkung der Verbreitung angeben, in der 
diese Staaten ausgeschlossen werden, so dass die Verbreitung nur 
innerhalb und zwischen den Staaten erlaubt ist, die nicht ausge-
schlossen sind. In einem solchen Fall beinhaltet diese Lizenz die 
Beschr�nkung, als w�re sie in diesem Text niedergeschrieben.

@item
Die Free Software Foundation kann von Zeit zu Zeit �berarbeitete 
und/oder neue Versionen der General Public License ver�ffentlichen. 
Solche neuen Versionen werden vom Grundprinzip her der gegenw�rtigen 
entsprechen, k�nnen aber im Detail abweichen, um neuen Problemen und 
Anforderungen gerecht zu werden.

Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. 
Wenn in einem Programm angegeben wird, dass es dieser Lizenz in einer 
bestimmten Versionsnummer oder "jeder sp�teren Version" ("any later 
version") unterliegt, so haben Sie die Wahl, entweder den Bestimmungen 
der genannten Version zu folgen oder denen jeder beliebigen sp�teren 
Version, die von der Free Software Foundation ver�ffentlicht wurde. 
Wenn das Programm keine Versionsnummer angibt, k�nnen Sie eine beliebige 
Version w�hlen, die je von der Free Software Foundation ver�ffentlicht 
wurde.

@item
Wenn Sie den Wunsch haben, Teile des Programms in anderen freien Programmen 
zu verwenden, deren Bedingungen f�r die Verbreitung anders sind, schreiben 
Sie an den Autor, um ihn um die Erlaubnis zu bitten. F�r Software, die unter 
dem Copyright der Free Software Foundation steht, schreiben Sie an die Free 
Software Foundation; wir machen zu diesem Zweck gelegentlich Ausnahmen. 
Unsere Entscheidung wird von den beiden Zielen geleitet werden, zum einen 
den freien Status aller von unserer freien Software abgeleiteten Werke zu 
erhalten und zum anderen das gemeinschaftliche Nutzen und Wiederverwenden 
von Software im allgemeinen zu f�rdern

@iftex
@heading Keine Gew�hrleistung
@end iftex
@ifinfo
@center Keine Gew�hrleistung
@end ifinfo

@item
Da das Programm ohne jegliche Kosten lizenziert wird, besteht keinerlei 
Gew�hrleistung f�r das Programm, soweit dies gesetzlich zul�ssig ist. 
Sofern nicht anderweitig schriftlich best�tigt, stellen die Copyright-Inhaber 
und/oder Dritte das Programm so zur Verf�gung, "wie es ist", ohne irgendeine 
Gew�hrleistung, weder ausdr�cklich noch implizit, einschlie�lich - aber nicht 
begrenzt auf - Marktreife oder Verwendbarkeit f�r einen bestimmten Zweck. 
Das volle Risiko bez�glich Qualit�t und Leistungsf�higkeit des Programms 
liegt bei Ihnen. Sollte sich das Programm als fehlerhaft herausstellen, 
liegen die Kosten f�r notwendigen Service, Reparatur oder Korrektur bei Ihnen.

@item
In keinem Fall, au�er wenn durch geltendes Recht gefordert oder schriftlich 
zugesichert, ist irgendein Copyright-Inhaber oder irgendein Dritter, der das 
Programm wie oben erlaubt modifiziert oder verbreitet hat, Ihnen gegen�ber 
f�r irgendwelche Sch�den haftbar, einschlie�lich jeglicher allgemeiner oder 
spezieller Sch�den, Sch�den durch Seiteneffekte (Nebenwirkungen) oder 
Folgesch�den, die aus der Benutzung des Programms oder der Unbenutzbarkeit des 
Programms folgen (einschlie�lich - aber nicht beschr�nkt auf - Datenverluste, 
fehlerhafte Verarbeitung von Daten, Verluste, die von Ihnen oder anderen 
getragen werden m�ssen oder dem Unverm�gen des Programms, mit irgendeinem 
anderen Programm zusammenzuarbeiten), selbst wenn ein Copyright-Inhaber 
oder Dritter �ber die M�glichkeit solcher Sch�den unterrichtet worden war.
@end enumerate

@iftex
@heading Ende der Bedingungen
@end iftex
@ifinfo
@center Ende der Bedingungen
@end ifinfo

@page
@appendixsec Anhang: Wie Sie diese Bedingungen auf Ihre neuen Programme anwendbar machen

Wenn Sie ein neues Programm entwickeln und wollen, dass es von gr��tm�glichem 
Nutzen f�r die Allgemeinheit ist, dann erreichen Sie das am besten, indem 
Sie es zu freier Software machen, die jeder unter diesen Bestimmungen 
weiterverbreiten und ver�ndern kann.

Um dies zu erreichen, f�gen Sie die folgenden Anmerkungen zu Ihrem Programm 
hinzu. Am sichersten ist es, sie an den Anfang einer jeden Quelldatei zu 
stellen, um den Gew�hrleistungsausschlu� m�glichst deutlich darzustellen; 
au�erdem sollte jede Datei mindestens eine "Copyright"-Zeile besitzen sowie 
einen kurzen Hinweis darauf, wo die vollst�ndige Lizenz gefunden werden kann.

@smallexample
@var{eine Zeile mit dem Programmnamen und einer kurzen Beschreibung}
Copyright (C) @var{yyyy}  @var{Name des Autors}

This Programm ist free Software; you can redistribute it und / oder modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License oder
(at your option) any later version.

This Programm ist distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; ohne even the implied warranty of
MERCHANTABILITY oder FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License f�r mehr details.

You should have received a copy of the GNU General Public License
along mit this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
@end smallexample

Also add information on how to contact you von electronic und paper mail.

@smallexample auf deutsch
@var{eine Zeile mit dem Programmnamen und einer kurzen Beschreibung}
Copyright (C) @var{yyyy}  @var{Name des Autors}

    Dieses Programm ist freie Software. Sie k�nnen es unter
    den Bedingungen der GNU General Public License, wie von der
    Free Software Foundation herausgegeben, weitergeben und/oder
    modifizieren, entweder unter Version 2 der Lizenz oder (wenn
    Sie es w�nschen) jeder sp�teren Version.

    Die Ver�ffentlichung dieses Programms erfolgt in der
    Hoffnung, dass es Ihnen von Nutzen sein wird, aber OHNE JEDE
    GEW�HRLEISTUNG - sogar ohne die implizite Gew�hrleistung
    der MARKTREIFE oder der EIGNUNG F�R EINEN BESTIMMTEN ZWECK.
    Details finden Sie in der GNU General Public License.

    Sie sollten eine Kopie der GNU General Public License zusammen
    mit diesem Programm erhalten haben. Falls nicht, schreiben Sie
    an die Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
    MA 02139, USA.
@end smallexample


Wenn Ihr Programm interaktiv ist, sorgen Sie daf�r, dass es nach dem 
Start einen kurzen Vermerk ausgibt:

@smallexample
Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
Gnomovision comes mit ABSOLUTELY NO WARRANTY; f�r details type `show w'.
Das ist free Software und you are welcome to redistribute it
under certain conditions; type `show c' f�r details.
@end smallexample

@smallexample auf deutsch
    Gnomovision Version 69, Copyright (C) 19[jj]  [Name des Autors]
    F�r Gnomovision besteht KEINERLEI GARANTIE; geben Sie `show w'
    f�r Details ein. Gnomovision ist freie Software, die Sie unter
    bestimmten Bedingungen weitergeben d�rfen; geben Sie `show c'
    f�r Details ein.
@end smallexample

Die hypothetischen Kommandos `show w' und `show c' sollten die 
entsprechenden Teile der GNU-GPL anzeigen. Nat�rlich k�nnen die von 
Ihnen verwendeten Kommandos anders hei�en als `show w' und `show c'; 
es k�nnten auch Mausklicks oder Men�punkte sein - was immer am besten 
in Ihr Programm passt.

Soweit vorhanden, sollten Sie auch Ihren Arbeitgeber (wenn Sie als 
Programmierer arbeiten) oder Ihre Schule einen Copyright-Verzicht 
f�r das Programm unterschreiben lassen. Hier ein Beispiel; 
�ndern Sie bitte die Namen:

@example
Yoyodyne, Inc., herefrom disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.

@var{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
@end example

@example auf deutsch
Die Yoyodyne GmbH erhebt keinerlei urheberrechtlichen Anspruch auf das 
Programm "Gnomovision" (einem Schrittmacher f�r Compiler), 
geschrieben von James Hacker.

@var{Unterschrift von Ty Coon}, 1 April 1989
Ty Coon, Vizepr�sident
@end example

Diese General Public License gestattet nicht die Einbindung des Programms 
in propriet�re Programme. Ist Ihr Programm eine Funktionsbibliothek, so 
kann es sinnvoller sein, das Linken propriet�rer Programme mit dieser 
Bibliothek zu gestatten. Wenn Sie dies tun wollen, sollten Sie die 
GNU Library General Public License anstelle dieser Lizenz verwenden.

@display
@c German FIX added @@ in e-mail addresses
Erstellt im Auftrag der S.u.S.E. GmbH [suse@@suse.de]
von Katja Lachmann �bersetzungen [na194@@fim.uni-erlangen.de],
�berarbeitet von Peter Gerwinski [peter.gerwinski@@uni-essen.de] (31. Oktober 1996) 

Diese �bersetzung wird mit der Absicht angeboten, das Verst�ndnis der 
GNU General Public License (GNU-GPL) zu erleichtern. Es handelt sich jedoch 
nicht um eine offizielle oder im rechtlichen Sinne anerkannte �bersetzung.

Die Free Software Foundation (FSF) ist nicht der Herausgeber dieser �bersetzung, 
und sie hat diese �bersetzung auch nicht als rechtskr�ftigen Ersatz f�r die 
Original-GNU-GPL anerkannt. Da die �bersetzung nicht sorgf�ltig von Anw�lten 
�berpr�ft wurde, k�nnen die �bersetzer nicht garantieren, dass die �bersetzung 
die rechtlichen Aussagen der GNU-GPL exakt wiedergibt. Wenn Sie sichergehen 
wollen, dass von Ihnen geplante Aktivit�ten im Sinne der GNU-GPL gestattet sind, 
halten Sie sich bitte an die englischsprachige Originalversion.

Die Free Software Foundation m�chte Sie darum bitten, diese �bersetzung 
nicht als offizielle Lizenzbedingungen f�r von Ihnen geschriebene Programme 
zu verwenden. Bitte benutzen Sie hierf�r stattdessen die von der 
Free Software Foundation herausgegebene englischsprachige Originalversion.
@end display

@page




@node LGPL license, Function Index, GPL license, Top
@c German node LGPL-Lizenz
@appendix GNU LESSER GENERAL PUBLIC LICENSE

@cindex LGPL, Lesser General Public License
@cindex LGPL, GNU Library General Public License

@center Version 2.1, Februar 1999

@display
Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc.
59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA

Es ist jedermann gestattet, diese Lizenzurkunde zu vervielf�ltigen 
und unver�nderte Kopien zu verbreiten. �nderungen sind jedoch nicht erlaubt. 

[Dies ist die erste freigegebene Version der Lesser GPL. 
Sie ist als Nachfolgerin der GNU Library Public License zu betrachten und 
erhielt daher die Versionsnummer 2.1.]
@end display

Diese �bersetzung ist kein rechtskr�ftiger Ersatz f�r die 
englischsprachige Originalversion! 

@appendixsec Vorwort

Die meisten Softwarelizenzen sind daraufhin entworfen worden, Ihnen die 
Freiheit zu nehmen, die Software weiterzugeben und zu ver�ndern. 
Im Gegensatz dazu sollen Ihnen die GNU General Public Licenses, 
die Allgemeinen �ffentlichen GNU-Lizenzen, ebendiese Freiheit des 
Weitergebens und Ver�nderns garantieren und somit sicherstellen, dass diese 
Software f�r alle Benutzer frei ist. 

Diese Lizenz, die Kleine Allgemeine �ffentliche Lizenz 
(Lesser General Public License), gilt f�r einige besonders bezeichnete 
Software-Pakete - typischerweise Programmbibliotheken - von der 
Free Software Foundation und anderen Autoren, die beschlie�en, 
diese Lizenz zu verwenden. Auch Sie k�nnen sie verwenden; wir empfehlen 
aber, vorher gr�ndlich dar�ber nachzudenken, ob diese Lizenz (LGPL) 
oder aber die gew�hnliche Allgemeine �ffentliche Lizenz (GPL) die 
bessere Strategie zur Anwendung im jeweiligen speziellen Fall ist. 
Dabei bieten Ihnen die untenstehenden Erl�uterungen eine Grundlage 
f�r Ihre Entscheidung. 

Die Bezeichnung ,,freie`` Software bezieht sich auf Freiheit der Nutzung, 
nicht auf den Preis. Unsere Allgemeinen �ffentlichen Lizenzen sollen 
sicherstellen, dass Sie die Freiheit haben, Kopien freier Software zu 
verbreiten (und etwas f�r diesen Service zu berechnen, wenn Sie m�chten), 
dass Sie die Software im Quelltext erhalten oder den Quelltext auf Wunsch 
bekommen k�nnen, dass Sie die Software �ndern oder Teile davon in neuen 
freien Programmen verwenden d�rfen, und dass Sie dar�ber informiert sind, 
dass Sie dies alles tun d�rfen. 

Um Ihre Rechte zu sch�tzen, m�ssen wir Einschr�nkungen machen, die es jedem, 
der die Software weitergibt, verbieten, Ihnen diese Rechte zu verweigern 
oder Sie zum Verzicht auf diese Rechte aufzufordern. Aus diesen 
Einschr�nkungen ergeben sich bestimmte Verantwortlichkeiten f�r Sie, wenn Sie 
Kopien der Bibliothek verbreiten oder sie ver�ndern. 

Beispielsweise m�ssen Sie den Empf�ngern alle Rechte gew�hren, die wir Ihnen 
einger�umt haben, wenn Sie - kostenlos oder gegen Bezahlung - Kopien der 
Bibliothek verbreiten. Sie m�ssen sicherstellen, dass auch die Empf�nger 
den Quelltext erhalten bzw. erhalten k�nnen. Wenn Sie einen anderen Code 
mit der Bibliothek linken, m�ssen Sie den Empf�ngern die vollst�ndigen 
Objekt-Dateien zukommen lassen, so dass sie selbst diesen Code mit der 
Bibliothek neu linken k�nnen, auch nachdem sie Ver�nderungen an der 
Bibliothek vorgenommen und sie neu compiliert haben. Und Sie m�ssen ihnen 
diese Bedingungen zeigen, damit sie Ihre Rechte kennen. 

Wir sch�tzen Ihre Rechte in zwei Schritten: (1) Wir stellen die Bibliothek 
unter ein Urheberrecht (Copyright), und (2) wir bieten Ihnen diese Lizenz 
an, die Ihnen das Recht gibt, die Bibliothek zu vervielf�ltigen, zu 
verbreiten und/oder zu ver�ndern. 

Um jeden, der die Software weitergibt, zu sch�tzen, wollen wir dar�ber 
hinaus vollkommen klarstellen, dass f�r diese freie Bibliothek keinerlei 
Garantie besteht. Auch sollten, falls die Software von jemand anderem 
modifiziert und weitergegeben wird, die Empf�nger wissen, dass sie nicht 
das Original erhalten haben, damit irgendwelche von anderen verursachte 
Probleme nicht den Ruf des urspr�nglichen Autors sch�digen. 

Schlie�lich und endlich stellen Software-Patente f�r die Existenz jedes 
freien Programms eine st�ndige Bedrohung dar. Wir m�chten sicherstellen, 
dass keine Firma den Benutzern eines freien Programms Einschr�nkungen 
auferlegen kann, indem sie von einem Patentinhaber eine die freie Nutzung 
einschr�nkende Lizenz erwirbt. Deshalb bestehen wir darauf, dass jegliche 
f�r eine Version der Bibliothek erworbene Patentlizenz mit der in dieser 
Lizenz (also der LGPL) im einzelnen angegebenen Nutzungsfreiheit voll 
vereinbar sein mu�. 

Die meiste GNU-Software einschlie�lich einiger Bibliotheken f�llt unter 
die gew�hnliche Allgemeine �ffentliche GNU-Lizenz (GNU-GPL). 
Die vorliegende Lizenz, also die GNU-LGPL, gilt f�r gewisse n�her 
bezeichnete Bibliotheken. Sie unterscheidet sich wesentlich von der 
gew�hnlichen Allgemeinen �ffentlichen Lizenz (GNU-GPL). Wir benutzen 
diese Lizenz f�r gewisse Bibliotheken, um das Linken (d.h. die Verkn�pfung 
von Bibliotheken und anderen Programmteilen zu einem lauff�higen 
Programm - Anmerkung der �bersetzer) von Programmen, die nicht frei 
sind, mit diesen Bibliotheken zu gestatten. 

Wenn ein Programm mit einer Bibliothek gelinkt wurde, sei es nun statisch 
oder dynamisch, so ist die Kombination der beiden, rechtlich gesehen, 
ein ,,kombiniertes Datenwerk``, also eine abgeleitete Version der 
Orginal-Bibliothek. Die gew�hnliche GPL erlaubt ein solches Linken nur 
dann, wenn die ganze Kombination die Kriterien f�r freie Software erf�llt. 
Die LGPL erlaubt dagegen weniger strenge Kriterien f�r das Linken von 
irgendeiner anderen Software mit der Bibliothek. 

Wir nennen diese Lizenz die "Kleine" Allgemeine �ffentliche Lizenz 
@dfn{Lesser} General Public License weil sie weniger  @emph{Less} dazu beitr�gt, 
die Freiheit des Benutzers zu sch�tzen, als die gew�hnliche Allgemeine 
�ffentliche Lizenz (GPL). Sie verschafft auch anderen Entwicklern freier 
Software ein "Weniger" an Vorteil gegen�ber konkurrierenden nichtfreien Programmen. 
Diese Nachteile sind ein Grund daf�r, dass wir die gew�hnliche GPL f�r viele 
Bibliotheken benutzen. Die "kleine" Lizenz (LGPL) bietet aber unter bestimmten 
besonderen Umst�nden doch Vorteile. 

So kann, wenn auch nur bei seltenen Gelegenheiten, eine besondere Notwendigkeit 
bestehen, einen Anreiz zur m�glichst weitgehenden Benutzung einer bestimmten 
Bibliothek zu schaffen, so dass diese dann ein De-facto-Standard wird. Um dies 
zu erreichen, m�ssen nichtfreie Programme die Bibliothek benutzen d�rfen. 
Ein h�ufigerer Fall ist der, dass eine freie Bibliothek dasselbe leistet wie 
weithin benutzte nichtfreie Bibliotheken. In diesem Falle bringt es wenig 
Nutzen, die freie Bibliothek allein auf freie Software zu beschr�nken, und 
dann benutzen wir eben die LGPL. 

In anderen F�llen erm�glicht die Erlaubnis zur Benutzung einer speziellen 
Bibliothek in nichtfreien Programmen viel mehr Leuten, eine umfangreiche 
Sammlung freier Software zu nutzen. So erm�glicht z.B. die Erlaubnis zur 
Benutzung der GNU-C-Bibliothek in nichtfreien Programmen einer viel gr��eren 
Zahl von Leuten, das ganze GNU-Betriebssystem ebenso wie seine Variante, das 
Betriebssystem GNU/Linux, zu benutzen. 

Obwohl die LGPL die Freiheit des Benutzers weniger sch�tzt, stellt sie doch 
sicher, dass der Benutzer eines Programms, das mit der Bibliothek gelinkt wurde, 
die Freiheit und die erforderlichen Mittel hat, das Programm unter Benutzung 
einer abge�nderten Version der Bibliothek zu betreiben. 

Die genauen Bedingungen f�r das Kopieren, Weitergeben und Ab�ndern finden Sie 
im nachstehenden Kapitel. Achten Sie genau auf den Unterschied zwischen 
"work Basiert auf the library", d.h. "Datenwerk, das auf der Bibliothek basiert"
und "work that uses the library" d.h. "Datenwerk, das die Bibliothek benutzt".
Ersteres enth�lt Code, der von der Bibliothek abgeleitet ist, w�hrend letzteres 
lediglich mit der Bibliothek kombiniert werden mu�, um betriebsf�hig zu sein. 

@iftex
@appendixsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@end iftex
@ifinfo
@center GNU LESSER GENERAL PUBLIC LICENSE
@center Bedingungen f�r die Vervielf�ltigung, Verbreitung und Bearbeitung 

@end ifinfo

@enumerate 0
@item
Diese Lizenz gilt f�r jedes Programm und jedes andere Datenwerk, in dem 
ein entsprechender Vermerk des Copyright-Inhabers oder eines anderen dazu 
Befugten darauf hinweist, dass das Datenwerk unter den Bestimmungen dieser 
Lesser General Public License (im weiteren auch als "diese Lizenz" 
bezeichnet) verbreitet werden darf. Jeder Lizenznehmer wird hierin 
einfach als "Sie" angesprochen. 

Eine "Bibliothek" bedeutet eine Zusammenstellung von Software-Funktionen 
und/oder Daten, die so vorbereitet ist, dass sie sich bequem mit 
Anwendungsprogrammen (welche einige dieser Funktionen und Daten benutzen) zum Bilden 
von ausf�hrbaren Programmen linken (d.h. verbinden, kombinieren) l��t. 

Der Begriff "Bibliothek" bezieht sich im weiteren immer nur auf solche 
Software-Bibliotheken und solche Datenwerke, die unter diesen Bedingungen 
der Lesser-GPL-Lizenz verbreitet worden sind. Ein "auf der Bibliothek 
basierendes Datenwerk" bezeichnet die betreffende Bibliothek selbst 
sowie jegliche davon abgeleitete Bearbeitung im urheberrechtlichen Sinne, 
also ein Datenwerk, welches die Bibliothek oder einen Teil davon, sei 
es unver�ndert oder ver�ndert und/oder direkt in eine andere Sprache 
�bersetzt, enth�lt. (Im folgenden wird die �bersetzung ohne 
Einschr�nkung als "Bearbeitung" eingestuft.) 

Unter dem "Quelltext" eines Datenwerks ist seine f�r das Vornehmen 
von Ver�nderungen bevorzugte Form zu verstehen. F�r eine Bibliothek 
bedeutet "vollst�ndiger Quelltext" den gesamten Quelltext f�r alle in 
ihr enthaltenen Bestandteile, f�r jegliche zu ihr geh�renden Dateien 
zur Definition von Schnittstellen und schlie�lich auch f�r die Skripte, 
die zur Steuerung der Compilation und Installation der Bibliothek 
benutzt werden. 

Andere Handlungen als Vervielf�ltigung, Verbreitung und Bearbeitung 
werden von dieser Lizenz nicht ber�hrt; sie fallen nicht in Ihren 
Anwendungsbereich. Das Ausf�hren eines Programms unter Benutzung der 
Bibliothek wird nicht eingeschr�nkt, und die Ausgaben des Programms 
unterliegen dieser Lizenz nur dann, wenn der Inhalt ein auf der 
Bibliothek basierendes Datenwerk darstellt (unabh�ngig davon, dass die 
Bibliothek in einem Werkzeug zum Schreiben dieses Programms benutzt 
wurde). Ob dies zutrifft, h�ngt davon ab, was die Bibliothek bewirkt 
und was das Programm, das die Bibliothek nutzt, bewirkt. 

@item
Sie d�rfen auf beliebigen Medien unver�nderte Kopien des vollst�ndigen 
Quelltextes des Programms so, wie sie ihn erhalten haben, anfertigen 
und verbreiten. Voraussetzung hierf�r ist, dass Sie mit jeder Kopie 
deutlich erkennbar und in angemessener Form einen entsprechenden 
Copyright-Vermerk sowie einen Haftungsausschluss ver�ffentlichen, alle 
Vermerke, die sich auf diese Lizenz und das Fehlen einer Garantie 
beziehen, unver�ndert lassen und zusammen mit der Bibliothek jeweils 
eine Kopie dieser Lizenz weitergeben. 

Sie d�rfen f�r den eigentlichen Kopier- und Versandvorgang eine Geb�hr 
verlangen. Wenn Sie es w�nschen, d�rfen Sie auch gegen Entgelt eine 
Garantie anbieten. 

@item
Sie d�rfen Ihre Kopie(n) der Bibliothek oder irgendeines Teils davon 
ver�ndern, wodurch ein auf der Bibliothek basierendes Datenwerk 
entsteht, und Sie d�rfen derartige Bearbeitungen unter den Bestimmungen
von Paragraph 1 vervielf�ltigen und verbreiten, vorausgesetzt, dass 
zus�tzlich alle im folgenden genannten Bedingungen erf�llt werden: 

@enumerate a
@item
Das Bearbeitungsergebnis muss selbst wieder eine Software-Bibliothek sein. 

@item
Sie m�ssen die ver�nderten Dateien mit einem auff�lligen Vermerk 
versehen, der auf die von Ihnen vorgenommene Modifizierung der 
Dateien hinweist und das Datum jeder �nderung angibt. 

@item
Sie m�ssen daf�r sorgen, dass das Datenwerk als Ganzes Dritten unter 
den Bedingungen dieser Lizenz ohne Lizenzgeb�hren zur Verf�gung 
gestellt wird. 

@item
Wenn sich eine Funktionseinheit der bearbeiteten Bibliothek auf eine 
Funktion oder Datentabelle st�tzt, die von einem die Funktionseinheit 
nutzenden Anwendungsprogramm bereitgestellt werden mu�, ohne dass sie 
als Argument �bergeben werden mu�, wenn die Funktionseinheit angesprochen 
wird, dann m�ssen Sie sich nach bestem Wissen und Gewissen bem�hen, 
sicherzustellen, dass die betreffende Funktionseinheit auch dann noch 
funktioniert, wenn die Anwendung eine solche Funktion oder Datentabelle 
nicht bietet, und dass sie den sinnvoll bleibenden Teil Ihres 
Bestimmungszwecks noch ausf�hrt. 

(So hat z.B. eine Funktion zum Berechnen von Quadratwurzeln einen von 
der Anwendung unabh�ngigen genau definierten Zweck. Deshalb verlangt 
�2 Absatz d, dass jede von der Anwendung bereitgestellte Funktion oder 
von dieser Funktion benutzte Tabelle optional sein mu�: Auch wenn die 
Anwendung sie nicht bereitstellt, muss die Quadratwurzelfunktion trotzdem 
noch Quadratwurzeln berechnen). 
@end enumerate

Diese Anforderungen gelten f�r das bearbeitete Datenwerk als Ganzes. 
Wenn identifizierbare Teile davon nicht von der Bibliothek stammen und 
vern�nftigerweise als unabh�ngige und gesonderte Datenwerke f�r sich selbst 
zu betrachten sind, dann gelten diese Lizenz und Ihre Bedingungen nicht 
f�r die betreffenden Teile, wenn Sie diese als gesonderte Datenwerke 
weitergeben. Wenn Sie jedoch dieselben Teile als Teil eines Ganzen 
weitergeben, dass ein auf der Bibliothek basierendes Datenwerk darstellt, 
dann muss die Weitergabe dieses Ganzen nach den Bedingungen dieser Lizenz 
erfolgen, deren Bedingungen f�r weitere Lizenznehmer somit auf das 
gesamte Ganze ausgedehnt werden - und somit auf jeden einzelnen Teil, 
unabh�ngig vom jeweiligen Autor. 

Somit ist es nicht die Absicht dieses Abschnittes, Rechte f�r Datenwerke
in Anspruch zu nehmen oder Ihnen Rechte f�r Datenwerke streitig zu 
machen, die komplett von Ihnen geschrieben wurden; vielmehr ist es die 
Absicht, die Rechte zur Kontrolle der Verbreitung von Datenwerken, die 
auf der Bibliothek basieren oder unter Ihrer auszugsweisen Verwendung 
zusammengestellt worden sind, auszu�ben. 

Ferner bringt auch dass einfache Zusammenlegen eines anderen Datenwerkes,
das nicht auf der Bibliothek basiert, mit der Bibliothek oder mit 
einem auf der Bibliothek basierenden Datenwerk auf ein- und demselben 
Speicher- oder Vertriebsmedium dieses andere Datenwerk nicht in den 
Anwendungsbereich dieser Lizenz. 

@item
Sie k�nnen sich f�r die Anwendung der Bedingungen der gew�hnlichen 
Allgemeinen �ffentlichen GNU-Lizenz (GNU-GPL) statt dieser Lizenz 
auf eine gegebene Kopie der Bibliothek entscheiden. Um dies zu tun, 
m�ssen Sie alle Eintragungen, die sich auf diese Lizenz beziehen, 
�ndern, so dass sie nun f�r die gew�hnliche GNU-GPL, Version 2, 
statt f�r diese Lizenz (LGPL) gelten. (Wenn eine neuere Version 
als Version 2 der gew�hnlichen GNU-GPL erschienen ist, k�nnen Sie 
diese angeben, wenn Sie das w�nschen.) Nehmen Sie keine anderen 
Ver�nderungen in diesen Eintragungen vor. 

Wenn diese Ver�nderung in einer gegebenen Kopie einmal vorgenommen 
ist, dann ist sie f�r diese Kopie nicht mehr zur�cknehmbar, und 
somit gilt dann die gew�hnliche GNU-GPL f�r alle nachfolgenden Kopien 
und abgeleiteten Datenwerke, die von dieser Kopie gemacht worden sind. 

Diese Option ist n�tzlich, wenn Sie einen Teil des Codes der Bibliothek 
in ein Programm kopieren wollen, das keine Bibliothek ist. 

@item
Sie k�nnen die Bibliothek (oder einen Teil oder eine Ableitung von ihr, 
gem�� Paragraph 2) in Objektcode-Form oder in ausf�hrbarer Form unter 
den Bedingungen der obigen Paragraphen 1 und 2 kopieren und weitergeben, 
sofern Sie den vollst�ndigen entsprechenden maschinenlesbaren Quelltext 
beif�gen, der unter den Bedingungen der obigen Paragraphen 1 und 2 
auf einem Medium weitergegeben werden mu�, das �blicherweise zum 
Austausch von Software benutzt wird.

Wenn die Weitergabe von Objektcode durch das Angebot eines Zugangs zum 
Kopienabruf von einem angegebenen Ort erfolgt, dann erf�llt das Angebot 
eines gleichwertigen Zugangs zum Kopieren des Quelltextes von demselben 
Ort die Anforderung, auch den Quelltext weiterzugeben, obwohl Dritte 
nicht verplichtet sind, den Quelltext zusammen mit dem Objektcode zu 
kopieren. 

@item
Ein Programm, das nichts von irgendeinem Teil der Bibliothek 
Abgeleitetes enth�lt, aber darauf ausgelegt ist, mit der Bibliothek 
zusammenzuarbeiten, indem es mit ihr compiliert oder gelinkt wird, 
nennt man ein "Datenwerk, das die Bibliothek nutzt". Solch ein 
Datenwerk, f�r sich allein genommen, ist kein von der Bibliothek abgelei
tetes Datenwerk und f�llt daher nicht unter diese Lizenz. 

Wird jedoch ein "Datenwerk, das die Bibliothek nutzt", mit der 
Bibliothek gelinkt, so entsteht ein ausf�hrbares Programm, dass ein 
von der Bibliothek abgeleitetes Datenwerk (weil es Teile der Bibliothek 
enth�lt) und kein "Datenwerk, das die Bibliothek nutzt" ist. 
Das ausf�hrbare Programm f�llt daher unter diese Lizenz. 
Paragraph 6 gibt die Bedingungen f�r die Weitergabe solcher 
ausf�hrbarer Programme an. 

Wenn ein "Datenwerk, das die Bibliothek nutzt", Material aus einer 
Header-Datei verwendet, die Teil der Bibliothek ist, dann kann der 
Objektcode f�r das Datenwerk ein von der Bibliothek abgeleitetes 
Datenwerk sein, selbst wenn der Quelltext dies nicht ist. Ob dies 
jeweils zutrifft, ist besonders dann von Bedeutung, wenn das Datenwerk 
ohne die Bibliothek gelinkt werden kann oder wenn das Datenwerk selbst 
eine Bibliothek ist. Die genaue Grenze, von der an dies zutrifft, 
ist rechtlich nicht genau definiert. 

Wenn solch eine Objektdatei nur numerische Parameter, Daten-
struktur-Layouts und Zugriffsfunktionen sowie kleine Makros und kleine 
Inlinefunktionen (zehn Zeilen lang oder k�rzer) benutzt, dann 
unterliegt die Benutzung der Objektdatei keinen Beschr�nkungen, ohne 
R�cksicht darauf, ob es rechtlich gesehen ein abgeleitetes Datenwerk ist. 
(Ausf�hrbare Programme, welche diesen Objektcode plus Teile der 
Bibliothek enthalten, fallen jedoch weiterhin unter die Bestimmungen 
von Paragraph 6). 

Ansonsten k�nnen Sie, wenn das Datenwerk ein von der Bibliothek 
abgeleitetes ist, den Objektcode f�r das Datenwerk unter den Bedingungen 
von Paragraph 6 weitergeben. Alle ausf�hrbaren Programme, welche 
dieses Datenwerk enthalten, fallen ebenfalls unter Paragraph 6, 
gleichg�ltig, ob sie direkt mit der Bibliothek selbst gelinkt sind 
oder nicht. 

@item
Als Ausnahme von den Bestimmungen der vorstehenden f�nf Paragraphen 
d�rfen Sie auch ein "Datenwerk, das die Bibliothek nutzt", mit der 
Bibliothek kombinieren oder linken, um ein Datenwerk zu erzeugen, 
das Teile der Bibliothek enth�lt, und dieses unter Bedingungen Ihrer 
eigenen Wahl weitergeben, sofern diese Bedingungen Bearbeitungen 
f�r den eigenen Gebrauch des Empf�ngers und ein R�ckbilden 
("reverse engineering") zum Beheben von M�ngeln solcher Bearbeitungen 
gestatten. 

Sie m�ssen bei jeder Kopie des Datenwerks deutlich erkennbar angeben, 
dass die Bibliothek darin genutzt wird und dass die Bibliothek und Ihre 
Benutzung durch die Lizenz abgedeckt sind. Sie m�ssen eine Kopie 
dieser Lizenz mitgeben. Wenn das Datenwerk bei seiner Ausf�hrung 
Copyright-Vermerke anzeigt, m�ssen Sie den Copyright-Vermerk f�r 
die Bibliothek mit anzeigen lassen und dem Benutzer einen Hinweis 
geben, der ihn zu einer Kopie dieser Lizenz f�hrt. Ferner m�ssen Sie 
eines der nachfolgend genannten f�nf Dinge tun: 

@enumerate a
@item
Liefern Sie das Datenwerk zusammen mit dem vollst�ndigen zugeh�rigen 
maschinenlesbaren Quelltext der Bibliothek aus, und zwar 
einschlie�lich jeglicher in dem Datenwerk angewandter �nderungen (wobei 
dessen Weitergabe gem�� den Bedingungen der Paragraphen 1 und 2 
erfolgen mu�); und wenn das Datenwerk ein ausf�hrbares, mit der 
Bibliothek gelinktes Programm ist, dann liefern Sie es zusammen 
mit dem vollst�ndigen maschinenlesbaren "Datenwerk, das die 
Bibliothek nutzt, in Form von Objektcode und/oder Quelltext, so dass 
der Benutzer die Bibliothek ver�ndern und dann erneut linken kann, 
um ein ver�ndertes ausf�hrbares Programm zu erzeugen, das die 
ver�nderte Bibliothek enth�lt. (Es versteht sich, dass der Benutzer, 
der die Inhalte von Definitionsdateien in der ver�nderten Bibliothek 
ver�ndert, nicht notwendigerweise in der Lage sein wird, die Anwendung 
neu zu compilieren, um die ver�nderten Definitionen zu benutzen.) 

@item
Benutzen Sie einen geeigneten ,,shared-library-Mechanismus`` zum 
Linken mit der Bibliothek. Geeignet ist ein solcher Mechanismus, 
der erstens w�hrend der Laufzeit eine im Computersystem des Benutzers 
bereits vorhandene Kopie der Bibliothek benutzt, anstatt 
Bibliotheksfunktionen in das ausf�hrbare Programm zu kopieren, und der zweitens 
auch mit einer ver�nderten Version der Bibliothek, wenn der Benutzer 
eine solche installiert, richtig funktioniert, solange die ver�nderte 
Version schnittstellenkompatibel mit der Version ist, mit der das 
Datenwerk erstellt wurde. 

@item
Liefern Sie das Datenwerk zusammen mit einem mindestens drei Jahre 
lang g�ltigen schriftlichen Angebot, demselben Benutzer die oben in 
Paragraph 6, Absatz (a) genannten Materialien zu Kosten, welche die 
reinen Weitergabekosten nicht �bersteigen, zur Verf�gung zu stellen. 

@item
Wenn die Weitergabe des Datenwerks dadurch erfolgt, dass die 
M�glichkeit des Abrufens einer Kopie von einem bestimmten Ort 
angeboten wird, bieten Sie gleichwertigen Zugang zum Kopieren der 
oben angegebenen Materialien von dem gleichen Ort an. 

@item
Sie vergewissern sich, dass der Benutzer bereits eine Kopie dieser 
Materialien erhalten hat oder dass Sie diesem Benutzer bereits eine 
Kopie geschickt haben. 
@end enumerate

F�r ein ausf�hrbares Programm muss die verlangte Form des 
"Datenwerks, das die Bibliothek nutzt" alle Daten und Hilfsprogramme 
mit einschlie�en, die man braucht, um daraus das ausf�hrbare Programm 
zu reproduzieren. Doch gilt eine spezielle Ausnahme: Die 
weiterzugebenden Materialien brauchen nicht alles das zu enthalten, was 
normalerweise (in Quelltext-Form oder in bin�rer Form) mit den 
Hauptbestandteilen (Compiler, Kern usw.) des Betriebssystems, 
auf denen das ausf�hrbare Programm l�uft, weitergegeben wird, es 
sei denn, das ausf�hrbare Programm geh�rt selbst zu diesem 
Hauptbestandteil. 

Es kann vorkommen, dass diese Anforderung im Widerspruch zu 
Lizenzbeschr�nkungen anderer, propriet�rer Bibliotheken steht, die 
normalerweise nicht zum Betriebssystem geh�ren. Ein solcher 
Widerspruch bedeutet, dass Sie nicht gleichzeitig jene propriet�ren 
Bibliotheken und die vorliegende Bibliothek zusammen in einem 
ausf�hrbaren Programm, das Sie weitergeben, verwenden d�rfen. 

@item
Sie d�rfen Bibliotheks-Funktionseinheiten, die ein auf der Bibliothek 
basierendes Datenwerk darstellen, zusammen mit anderen, nicht unter 
diese Lizenz fallenden Funktionseinheiten in eine einzelne Bibliothek 
einbauen und eine solche kombinierte Bibliothek weitergeben, 
vorausgesetzt, dass die gesonderte Weitergabe des auf der Bibliothek 
basierenden Datenwerks einerseits und der anderen Funktionseinheiten 
andererseits ansonsten gestattet ist, und vorausgesetzt, dass Sie 
folgende zwei Dinge tun: 

@enumerate a
@item
Geben Sie zusammen mit der kombinierten Bibliothek auch eine Kopie 
desselben auf der Bibliothek basierenden Datenwerks mit, die nicht 
mit irgendwelchen anderen Funktionseinheiten kombiniert ist. 
Dieses Datenwerk muss unter den Bedingungen der obigen Paragraphen 
weitergegeben werden. 

@item
Weisen Sie bei der kombinierten Bibliothek an prominenter Stelle 
auf die Tatsache hin, dass ein Teil davon ein auf der Bibliothek 
basierendes Datenwerk ist, und erkl�ren Sie, wo man die mitgegebene 
unkombinierte Form desselben Datenwerks finden kann. 
@end enumerate

@item
Sie d�rfen die Bibliothek nicht vervielf�ltigen, ver�ndern, weiter 
lizenzieren oder verbreiten oder mit ihr linken, sofern es nicht durch 
diese Lizenz ausdr�cklich gestattet ist. Jeder anderweitige Versuch 
der Vervielf�ltigung, Modifizierung, Weiterlizenzierung und 
Verbreitung sowie des Linkens mit der Bibliothek ist unzul�ssig und 
beendet automatisch Ihre Rechte unter dieser Lizenz. Doch werden 
die Lizenzen Dritter, die von Ihnen Kopien oder Rechte unter dieser 
Lizenz erhalten haben, nicht beendet, solange diese Dritten die Lizenz 
voll anerkennen und befolgen. 

@item
Sie sind nicht verpflichtet, diese Lizenz anzunehmen, da Sie diese 
nicht unterzeichnet haben. Doch gibt Ihnen sonst nichts die Erlaubnis, 
die Bibliothek oder von ihr abgeleitete Datenwerke zu ver�ndern oder 
zu verbreiten. Diese Handlungen sind gesetzlich verboten, wenn Sie 
diese Lizenz nicht annehmen. Indem Sie die Bibliothek (oder ein darauf 
basierendes Datenwerk) ver�ndern oder verbreiten, erkl�ren Sie Ihr 
Einverst�ndnis mit dieser Lizenz, die Ihnen das erlaubt, mit allen 
Ihren Bedingungen bez�glich der Vervielf�ltigung, Verbreitung und 
Ver�nderung der Bibliothek oder eines darauf basierenden Datenwerks. 

@item
Jedesmal, wenn Sie die Bibliothek (oder irgendein auf der Bibliothek 
basierendes Datenwerk) weitergeben, erh�lt der Empf�nger automatisch 
vom urspr�nglichen Lizenzgeber die Lizenz, die Bibliothek entsprechend 
den hier festgelegten Bestimmungen zu vervielf�ltigen, zu verbreiten 
und zu ver�ndern und mit ihr zu linken. Sie d�rfen keine weiteren 
Einschr�nkungen der Aus�bung der hierin zugestandenen Rechte des 
Empf�ngers vornehmen. Sie sind nicht daf�r verantwortlich, die 
Einhaltung dieser Lizenz durch Dritte durchzusetzen. 

@item
Sollten Ihnen infolge eines Gerichtsurteils, des Vorwurfs einer 
Patentverletzung oder aus einem anderen Grunde (nicht auf 
Patentfragen begrenzt) Bedingungen (durch Gerichtsbeschluss, 
Vergleich oder anderweitig) auferlegt werden, die den Bedingungen 
dieser Lizenz widersprechen, so befreien diese Umst�nde Sie nicht 
von den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht m�glich ist, 
die Bibliothek unter gleichzeitiger Beachtung der Bedingungen in 
dieser Lizenz und Ihrer anderweitigen Verpflichtungen zu verbreiten, 
dann d�rfen Sie als Folge davon die Bibliothek �berhaupt nicht 
verbreiten. Wenn zum Beispiel ein Patent nicht die geb�hrenfreie 
Weiterverbreitung der Bibliothek durch diejenigen erlaubt, welche 
die Bibliothek direkt oder indirekt von Ihnen erhalten haben, dann 
besteht der einzige Weg, sowohl dem Patentrecht als auch dieser 
Lizenz zu gen�gen, darin, ganz auf die Verbreitung der Bibliothek 
zu verzichten. 

Sollte sich ein Teil dieses Paragraphen als ung�ltig oder unter 
bestimmten Umst�nden nicht durchsetzbar erweisen, so soll dieser 
Paragraph seinem Sinne nach angewandt werden; im �brigen soll 
dieser Paragraph als Ganzes gelten. 

Zweck dieses Paragraphen ist nicht, Sie dazu zu bringen, irgendwelche 
Patente oder andere Eigentumsanspr�che zu verletzen oder die G�ltigkeit 
solcher Anspr�che zu bestreiten; dieser Paragraph hat vielmehr einzig 
den Zweck, die Integrit�t des Verbreitungssystems der freien Software 
zu sch�tzen, das durch die Praxis �ffentlicher Lizenzen verwirklicht 
wird. Viele Leute haben gro�z�gige Beitr�ge zu dem weitreichenden 
Angebot der durch dieses System verbreiteten Software im Vertrauen 
auf die konsistente Anwendung dieses Systems geleistet; es obliegt 
dem Autor bzw. Geber, zu entscheiden, ob er die Software mittels 
irgendeines anderen Systems verbreiten will; ein Lizenznehmer jedoch 
darf dar�ber nicht entscheiden. 

Dieser Paragraph ist dazu gedacht, deutlich klarzustellen, was als 
Konsequenz aus den �brigen Bestimmungen dieser Lizenz zu betrachten 
ist. 

@item
Wenn die Verbreitung und/oder die Benutzung der Bibliothek in 
bestimmten Staaten entweder durch Patente oder durch urheberrechtlich 
gesch�tzte Schnittstellen eingeschr�nkt ist, kann der 
Urheberrechtsinhaber, der die Bibliothek unter diese Lizenz gestellt 
hat, eine explizite geographische Beschr�nkung der Verbreitung angeben, 
in der diese Staaten ausgeschlossen werden, so dass die Verbreitung nur 
innerhalb und zwischen den Staaten erlaubt ist, die nicht demgem�� 
ausgeschlossen sind. In einem solchen Fall beinhaltet diese Lizenz 
die Beschr�nkung, als w�re sie in diesem Text niedergeschrieben. 

@item
Die Free Software Foundation kann von Zeit zu Zeit �berarbeitete 
und/oder neue Versionen der Lesser General Public License 
ver�ffentlichen. Solche neuen Versionen werden vom Grundprinzip her 
der gegenw�rtigen entsprechen, k�nnen aber im Detail abweichen, um 
neuen Problemen und Anforderungen gerecht zu werden. 

Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. 
Wenn in einem Programm angegeben wird, dass es dieser Lizenz in einer 
bestimmten Versionsnummer oder "jeder sp�teren Version" ("any later 
version") unterliegt, so haben Sie die Wahl, entweder den Bestimmungen 
der genannten Version zu folgen oder denen jeder beliebigen sp�teren 
Version, die von der Free Software Foundation ver�ffentlicht wurde. 
Wenn die Bibliothek keine Lizenz-Versionsnummer angibt, k�nnen Sie 
eine beliebige Version w�hlen, die jemals von der Free Software 
Foundation ver�ffentlicht wurde. 

@item
Wenn Sie den Wunsch haben, Teile der Bibliothek in anderen 
freien Programmen zu verwenden, deren Bedingungen f�r die Verbreitung 
anders sind, schreiben Sie an den Autor der Bibliothek, um ihn um die 
Erlaubnis zu bitten. F�r Software, die unter dem Copyright der Free 
Software Foundation steht, schreiben Sie an die Free Software 
Foundation; wir machen zu diesem Zweck gelegentlich Ausnahmen. 
Unsere Entscheidung wird von den beiden Zielen geleitet werden, 
zum einen den freien Status aller von unserer freien Software 
abgeleiteten Datenwerke zu erhalten und zum anderen das 
gemeinschaftliche Nutzen und Wiederverwenden von Software im 
allgemeinen zu f�rdern. 

@iftex
@heading Keine Gew�hrleistung 
@end iftex
@ifinfo
@center Keine Gew�hrleistung 
@end ifinfo

@item
Da die Bibliothek ohne jegliche Geb�hren lizenziert wird, besteht 
keinerlei Gew�hrleistung f�r die Bibliothek, soweit dies gesetzlich 
zul�ssig ist. Sofern nicht anderweitig schriftlich best�tigt, stellen 
die Copyright-Inhaber und/oder Dritte die Bibliothek "so, wie sie ist"
zur Verf�gung, ohne Gew�hrleistung irgendeiner Art, weder ausdr�cklich 
noch implizit. Dieser Garantieausschluss gilt auch - ohne darauf 
beschr�nkt zu sein - f�r Marktreife oder Verwendbarkeit f�r einen 
bestimmten Zweck. Das volle Risiko bez�glich Qualit�t und Leistungs-
f�higkeit der Bibliothek liegt bei Ihnen. Sollte sich die Bibliothek 
als fehlerhaft herausstellen, liegen die Kosten f�r notwendigen 
Service, Reparatur oder Korrektur s�mtlich bei Ihnen. 

@item
In keinem Fall, au�er wenn dies durch geltendes Recht gefordert 
wird oder schriftlich zugesichert wurde, ist irgendein 
Copyright-Inhaber oder irgendein Dritter, der die Bibliothek wie oben 
erlaubt modifiziert oder verbreitet hat, Ihnen gegen�ber f�r 
irgendwelche Sch�den haftbar. Dies gilt auch f�r jegliche allgemeine 
oder spezielle Sch�den, f�r Sch�den durch Nebenwirkungen oder 
Folgesch�den, die sich aus der Benutzung oder der Unbenutzbarkeit 
der Bibliothek ergeben (das gilt insbesondere - ohne darauf 
beschr�nkt zu sein - f�r Datenverluste, das Hineinbringen von 
Ungenauigkeiten in irgendwelche Daten, f�r Verluste, die Sie oder 
Dritte erlitten haben oder f�r ein Unverm�gen der Bibliothek, 
mit irgendeiner anderen Software zusammenzuarbeiten), und zwar 
auch dann, wenn ein Copyright-Inhaber oder ein Dritter �ber die 
M�glichkeit solcher Sch�den informiert worden ist. 

@end enumerate

@iftex
@heading Ende der Bedingungen 
@end iftex
@ifinfo
@center Ende der Bedingungen 
@end ifinfo

@appendixsec Anhang: Wie Sie diese Bedingungen auf Ihre eigenen, neuen Bibliotheken anwenden k�nnen 

Wenn Sie eine neue Bibliothek entwickeln und w�nschen, dass sie 
von gr��tm�glichem Nutzen f�r die Allgemeinheit ist, dann empfehlen 
wir Ihnen, sie zu einer freien Software zu machen, die jedermann 
weiterverteilen und ver�ndern kann. Dies k�nnen sie tun, indem Sie 
eine Weiterverteilung unter den Bedingungen dieser Lizenz, also 
der Lesser GPL erlauben (oder - als Alternative - unter den Bedingungen 
der gew�hnlichen Allgemeinen �ffentlichen GNU-Lizenz, der GPL). 

Zur Anwendung dieser Bedingungen f�gen Sie zu der Bibliothek die 
unten angegebenen Vermerke hinzu. Es ist am sichersten, sie an 
den Start jeder Quelldatei anzuf�gen, um so am wirksamsten den 
Garantieausschlu� bekannt zu machen; zumindest aber sollte jede 
Datei die Copyright-Zeile und eine Angabe enthalten, wo die 
vollst�ndigen Vermerke zu finden sind. 



@smallexample
@var{eine Zeile mit dem Namen der Bibliothek und einer kurzen 
Beschreibung Ihres Zwecks}
Copyright (C) @var{yyyy}  @var{Name des Autors}

This library is free software; you can redistribute it and/or 
modify it under the terms of the GNU Lesser General Public License 
as published by the Free Software Foundation; either version 2.1 
of the License oder (at your option) any later version. 

This library is distributed in the hope that it will be useful, 
but ohne ANY WARRANTY; ohne even the implied warranty of 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
See the GNU Lesser General Public License for more details. 

You should have received a copy of the GNU Lesser General 
Public License along with this library; if not, write to the 

Free Software Foundation, Inc., 
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

Auf Deutsch: 

Bibliothek ist freie Software; Sie d�rfen sie unter den Bedingungen 
der GNU Lesser General Public License, wie von der Free Software 
Foundation ver�ffentlicht, weiterverteilen und/oder modifizieren; 
entweder gem�� Version 2.1 der Lizenz oder (nach Ihrer Option) 
jeder sp�teren Version. 

Diese Bibliothek wird in der Hoffnung weiterverbreitet, dass sie 
n�tzlich sein wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne 
die implizierte Garantie der MARKTREIFE oder der VERWENDBARKEIT 
F�R EINEN BESTIMMTEN ZWECK. Mehr Details finden Sie in der 
GNU Lesser General Public License. 

Sie sollten eine Kopie der GNU Lesser General Public License 
zusammen mit dieser Bibliothek erhalten haben; falls nicht, 
schreiben Sie an die 
Free Software Foundation, Inc., 
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 
@end smallexample

F�gen Sie auch einen kurzen Hinweis hinzu, wie Sie elektronisch 
und per Brief erreichbar sind. 

@smallexample
Soweit vorhanden, sollten Sie auch Ihren Arbeitgeber 
(wenn Sie als Programmierer arbeiten) oder Ihre Schule einen 
Copyright-Verzicht f�r die Bibliothek unterschreiben lassen. 
Hier ein Beispiel. Die Namen m�ssen Sie nat�rlich �ndern. 

Yoyodyne, Inc., hereby disclaims all copyright interest 
in the library "Frob" (a library for tweaking knobs) 
written by James Random Hacker. 


Unterschrift von Ty Coon , 1 April 1990 
Ty Coon, President of Vice 

Auf Deutsch: 

DIe Yoyodyne GmbH erhebt keinen urheberechtlichen Anspruch 
auf die von James Random Hacker geschriebene Bibliothek "Frob" 
(eine Bibliothek f�r das Zwicken von Kn�pfen). 


Unterschrift von Ty Coon, 1. April 1990 
Ty Coon, Vizepr�sident 
@end smallexample

Das war schon alles! 



@c German FIX this node entry and section header were missing!
@c I made a guess as to what the German section title should be like ;-)
@node Function Index, Concept Index, LGPL license, Top
@c German node Function Index
@unnumbered SQL Command, Typ und Funktion Index

@printindex fn

@page


@node Concept Index,  , Function Index, Top
@c German node Concept Index
@unnumbered Concept Index

@printindex cp





@bye