diff options
author | unknown <arjen@george.bitbike.com> | 2003-02-12 14:15:04 +1000 |
---|---|---|
committer | unknown <arjen@george.bitbike.com> | 2003-02-12 14:15:04 +1000 |
commit | af751714e5de47244a19c10474a6ad5000808f9e (patch) | |
tree | 4bca07f2d1582f365937722961bbc2022f57b719 /Docs | |
parent | b16e8d58f1e751400ecc2888796514355d791cfd (diff) | |
download | mariadb-git-af751714e5de47244a19c10474a6ad5000808f9e.tar.gz |
Moved mysql.de.texi from mysql-4.0 tree to mysqldoc tree.
Replaced mysql.de.texi in mysql-4.0 tree with dummy placeholder.
Moved world.sql sample database to mysqldoc tree.
BitKeeper/deleted/.del-world.sql~6603b5c62c5bac53:
Delete: Docs/world.sql
Docs/manual.de.texi:
Moved mysql.de.texi from mysql-4.0 tree to mysqldoc tree.
Replaced mysql.de.texi in mysql-4.0 tree with dummy placeholder.
Diffstat (limited to 'Docs')
-rw-r--r-- | Docs/manual.de.texi | 56134 | ||||
-rw-r--r-- | Docs/world.sql | 5386 |
2 files changed, 38 insertions, 61482 deletions
diff --git a/Docs/manual.de.texi b/Docs/manual.de.texi index 01d1b008ebe..902a9496bbb 100644 --- a/Docs/manual.de.texi +++ b/Docs/manual.de.texi @@ -1,18 +1,28 @@ \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 This is a dummy placeholder file for manual.de.texi in the +@c MySQL source trees. +@c +@c Note, that the manual has been moved into a separate +@c BitKeeper source tree named "mysqldoc" - do not attempt +@c to add NEWS entries or documentation to this file! All +@c changes to the manual should be done in the mysqldoc tree. +@c +@c See http://www.mysql.com/doc/en/Installing_source_tree.html +@c for information about how to work with BitKeeper source trees. +@c +@c This dummy file is being replaced with the real manual from the +@c mysqldoc tree when building the official source distribution. +@c +@c Please e-mail docs@mysql.com for more information or if +@c you are interested in doing a translation. +@c @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 @@ -26,32 +36,22 @@ @finalout @end ifclear -@c Set background f�r HTML +@c Set background for 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 Set some style elements for 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 lime, maroon, navy, olive, purple, red, silver, teal, white, and @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} +@settitle Dummy MySQL Reference Manual for 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 @@ -64,56102 +64,44 @@ END-INFO-DIR-ENTRY @titlepage @sp 10 -@center @titlefont{MySQL-Referenzhandbuch} +@center @titlefont{Empty placeholder for the MySQL Reference Manual} @sp 10 -@center Copyright @copyright{} 1997-2002 MySQL AB +@center Copyright @copyright{} 1995-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. +@c number somewhere. @iftex -@c change this to double if you want formatting f�r double-sided +@c change this to double if you want formatting for 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:: -* User resources:: -* 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, User resources, 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 User resources, Passwords, Adding users, User Account Management -@c New section added by arjen 2002-05-17 to keep en/de in sync -@subsection Limiting user resources - -@c FIX Original section text - to be translated. -@c FIX Also check manual.texi for other mentions of MAX_..._PER_HOUR - -Starting from MySQL 4.0.2 one can limit certain resources per user. - -So far, the only available method of limiting user usage of MySQL -server resources has been setting the @code{max_user_connections} -startup variable to a non-zero value. But this method is strictly -global and does not allow for management of individual users, which -could be of paricular interest to Internet Service Providers. - -Therefore, management of three resources is introduced on the -individual user level: - -@itemize @bullet -@item Number of all queries per hour: -All commands that could be run by a user. -@item Number of all updates per hour: -Any command that changes any table or database. -@item Number of connections made per hour: -New connections opened per hour. -@end itemize - -A user in the aforementioned context is a single entry in the -@code{user} table, which is uniquely identified by its @code{user} -and @code{host} columns. - -All users are by default not limited in using the above resources, -unless the limits are granted to them. These limits can be granted -@strong{only} via global @code{GRANT (*.*)}, using this syntax: - -@example -GRANT ... WITH MAX_QUERIES_PER_HOUR = N1 - MAX_UPDATES_PER_HOUR = N2 - MAX_CONNECTIONS_PER_HOUR = N3; -@end example - -One can specify any combination of the above resources. -N1, N2 and N3 are integers and stands for count / hour. - -If user reaches any of the above limits withing one hour, his -connection will be terminated or refused and the appropriate error -message shall be issued. - -Current usage values for a particular user can be flushed (set to zero) -by issuing a @code{GRANT} statement with any of the above clauses, -including a @code{GRANT} statement with the current values. - -Also, current values for all users will be flushed if privileges are -reloaded (in the server or using @code{mysqladmin reload}) -or if the @code{FLUSH USER_RESOURCES} command is issued. - -The feature is enabled as soon as a single user is granted with any -of the limiting @code{GRANT} clauses. - -As a prerequisite for enabling this feature, the @code{user} table in -the @code{mysql} database must contain the additional columns, as -defined in the table creation scripts @code{mysql_install_db} and -@code{mysql_install_db.sh} in @file{scripts} subdirectory. - -@node Passwords, Password security, User resources, 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). +@evenheading @thispage @| @| MySQL Technical Reference for Version @value{mysql_version} -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 +@node Top, (dir), (dir), (dir) -@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. +This is an empty placeholder file for the MySQL manual. -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. +The MySQL manual is now maintained in a separate BitKeeper source tree! +Please see @url{http://www.mysql.com/doc/en/Installing_source_tree.html} +for more info on how to work with BitKeeper. -@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. +Please do not attempt to edit this file to add NEWS entries or to add +documentation! Use the one in the @code{mysqldoc} BK tree instead. -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. +This file will be replaced with the current @code{manual.de.texi} when building +the official source distribution. -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 +You can find a specific manual for any older version of MySQL +in the binary or source distribution for that version. @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 diff --git a/Docs/world.sql b/Docs/world.sql deleted file mode 100644 index f253819da2e..00000000000 --- a/Docs/world.sql +++ /dev/null @@ -1,5386 +0,0 @@ --- MySQL dump 8.19 --- --- Host: localhost Database: world ---------------------------------------------------------- --- Server version 4.0.1-alpha-Max - --- --- Table structure for table 'City' --- - -CREATE TABLE City ( - ID int(11) NOT NULL auto_increment, - name char(35) NOT NULL default '', - Country char(3) NOT NULL default '', - District char(20) NOT NULL default '', - Population int(11) NOT NULL default '0', - PRIMARY KEY (ID) -) TYPE=MyISAM; - -/*!40000 ALTER TABLE City DISABLE KEYS */; - --- --- Dumping data for table 'City' --- - - -INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); -INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); -INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); -INSERT INTO City VALUES (4,'Mazar-e-Sharif','AFG','Balkh',127800); -INSERT INTO City VALUES (5,'Amsterdam','NLD','Noord-Holland',731200); -INSERT INTO City VALUES (6,'Rotterdam','NLD','Zuid-Holland',593321); -INSERT INTO City VALUES (7,'Haag','NLD','Zuid-Holland',440900); -INSERT INTO City VALUES (8,'Utrecht','NLD','Utrecht',234323); -INSERT INTO City VALUES (9,'Eindhoven','NLD','Noord-Brabant',201843); -INSERT INTO City VALUES (10,'Tilburg','NLD','Noord-Brabant',193238); -INSERT INTO City VALUES (11,'Groningen','NLD','Groningen',172701); -INSERT INTO City VALUES (12,'Breda','NLD','Noord-Brabant',160398); -INSERT INTO City VALUES (13,'Apeldoorn','NLD','Gelderland',153491); -INSERT INTO City VALUES (14,'Nijmegen','NLD','Gelderland',152463); -INSERT INTO City VALUES (15,'Enschede','NLD','Overijssel',149544); -INSERT INTO City VALUES (16,'Haarlem','NLD','Noord-Holland',148772); -INSERT INTO City VALUES (17,'Almere','NLD','Flevoland',142465); -INSERT INTO City VALUES (18,'Arnhem','NLD','Gelderland',138020); -INSERT INTO City VALUES (19,'Zaanstad','NLD','Noord-Holland',135621); -INSERT INTO City VALUES (20,'�s-Hertogenbosch','NLD','Noord-Brabant',129170); -INSERT INTO City VALUES (21,'Amersfoort','NLD','Utrecht',126270); -INSERT INTO City VALUES (22,'Maastricht','NLD','Limburg',122087); -INSERT INTO City VALUES (23,'Dordrecht','NLD','Zuid-Holland',119811); -INSERT INTO City VALUES (24,'Leiden','NLD','Zuid-Holland',117196); -INSERT INTO City VALUES (25,'Haarlemmermeer','NLD','Noord-Holland',110722); -INSERT INTO City VALUES (26,'Zoetermeer','NLD','Zuid-Holland',110214); -INSERT INTO City VALUES (27,'Emmen','NLD','Drenthe',105853); -INSERT INTO City VALUES (28,'Zwolle','NLD','Overijssel',105819); -INSERT INTO City VALUES (29,'Ede','NLD','Gelderland',101574); -INSERT INTO City VALUES (30,'Delft','NLD','Zuid-Holland',95268); -INSERT INTO City VALUES (31,'Heerlen','NLD','Limburg',95052); -INSERT INTO City VALUES (32,'Alkmaar','NLD','Noord-Holland',92713); -INSERT INTO City VALUES (33,'Willemstad','ANT','Cura�ao',2345); -INSERT INTO City VALUES (34,'Tirana','ALB','Tirana',270000); -INSERT INTO City VALUES (35,'Alger','DZA','Alger',2168000); -INSERT INTO City VALUES (36,'Oran','DZA','Oran',609823); -INSERT INTO City VALUES (37,'Constantine','DZA','Constantine',443727); -INSERT INTO City VALUES (38,'Annaba','DZA','Annaba',222518); -INSERT INTO City VALUES (39,'Batna','DZA','Batna',183377); -INSERT INTO City VALUES (40,'S�tif','DZA','S�tif',179055); -INSERT INTO City VALUES (41,'Sidi Bel Abb�s','DZA','Sidi Bel Abb�s',153106); -INSERT INTO City VALUES (42,'Skikda','DZA','Skikda',128747); -INSERT INTO City VALUES (43,'Biskra','DZA','Biskra',128281); -INSERT INTO City VALUES (44,'Blida (el-Boulaida)','DZA','Blida',127284); -INSERT INTO City VALUES (45,'B�ja�a','DZA','B�ja�a',117162); -INSERT INTO City VALUES (46,'Mostaganem','DZA','Mostaganem',115212); -INSERT INTO City VALUES (47,'T�bessa','DZA','T�bessa',112007); -INSERT INTO City VALUES (48,'Tlemcen (Tilimsen)','DZA','Tlemcen',110242); -INSERT INTO City VALUES (49,'B�char','DZA','B�char',107311); -INSERT INTO City VALUES (50,'Tiaret','DZA','Tiaret',100118); -INSERT INTO City VALUES (51,'Ech-Chleff (el-Asnam)','DZA','Chlef',96794); -INSERT INTO City VALUES (52,'Gharda�a','DZA','Gharda�a',89415); -INSERT INTO City VALUES (53,'Tafuna','ASM','Tutuila',5200); -INSERT INTO City VALUES (54,'Fagatogo','ASM','Tutuila',2323); -INSERT INTO City VALUES (55,'Andorra la Vella','AND','Andorra la Vella',21189); -INSERT INTO City VALUES (56,'Luanda','AGO','Luanda',2022000); -INSERT INTO City VALUES (57,'Huambo','AGO','Huambo',163100); -INSERT INTO City VALUES (58,'Lobito','AGO','Benguela',130000); -INSERT INTO City VALUES (59,'Benguela','AGO','Benguela',128300); -INSERT INTO City VALUES (60,'Namibe','AGO','Namibe',118200); -INSERT INTO City VALUES (61,'South Hill','AIA','�',961); -INSERT INTO City VALUES (62,'The Valley','AIA','�',595); -INSERT INTO City VALUES (63,'Saint John�s','ATG','St John',24000); -INSERT INTO City VALUES (64,'Dubai','ARE','Dubai',669181); -INSERT INTO City VALUES (65,'Abu Dhabi','ARE','Abu Dhabi',398695); -INSERT INTO City VALUES (66,'Sharja','ARE','Sharja',320095); -INSERT INTO City VALUES (67,'al-Ayn','ARE','Abu Dhabi',225970); -INSERT INTO City VALUES (68,'Ajman','ARE','Ajman',114395); -INSERT INTO City VALUES (69,'Buenos Aires','ARG','Distrito Federal',2982146); -INSERT INTO City VALUES (70,'La Matanza','ARG','Buenos Aires',1266461); -INSERT INTO City VALUES (71,'C�rdoba','ARG','C�rdoba',1157507); -INSERT INTO City VALUES (72,'Rosario','ARG','Santa F�',907718); -INSERT INTO City VALUES (73,'Lomas de Zamora','ARG','Buenos Aires',622013); -INSERT INTO City VALUES (74,'Quilmes','ARG','Buenos Aires',559249); -INSERT INTO City VALUES (75,'Almirante Brown','ARG','Buenos Aires',538918); -INSERT INTO City VALUES (76,'La Plata','ARG','Buenos Aires',521936); -INSERT INTO City VALUES (77,'Mar del Plata','ARG','Buenos Aires',512880); -INSERT INTO City VALUES (78,'San Miguel de Tucum�n','ARG','Tucum�n',470809); -INSERT INTO City VALUES (79,'Lan�s','ARG','Buenos Aires',469735); -INSERT INTO City VALUES (80,'Merlo','ARG','Buenos Aires',463846); -INSERT INTO City VALUES (81,'General San Mart�n','ARG','Buenos Aires',422542); -INSERT INTO City VALUES (82,'Salta','ARG','Salta',367550); -INSERT INTO City VALUES (83,'Moreno','ARG','Buenos Aires',356993); -INSERT INTO City VALUES (84,'Santa F�','ARG','Santa F�',353063); -INSERT INTO City VALUES (85,'Avellaneda','ARG','Buenos Aires',353046); -INSERT INTO City VALUES (86,'Tres de Febrero','ARG','Buenos Aires',352311); -INSERT INTO City VALUES (87,'Mor�n','ARG','Buenos Aires',349246); -INSERT INTO City VALUES (88,'Florencio Varela','ARG','Buenos Aires',315432); -INSERT INTO City VALUES (89,'San Isidro','ARG','Buenos Aires',306341); -INSERT INTO City VALUES (90,'Tigre','ARG','Buenos Aires',296226); -INSERT INTO City VALUES (91,'Malvinas Argentinas','ARG','Buenos Aires',290335); -INSERT INTO City VALUES (92,'Vicente L�pez','ARG','Buenos Aires',288341); -INSERT INTO City VALUES (93,'Berazategui','ARG','Buenos Aires',276916); -INSERT INTO City VALUES (94,'Corrientes','ARG','Corrientes',258103); -INSERT INTO City VALUES (95,'San Miguel','ARG','Buenos Aires',248700); -INSERT INTO City VALUES (96,'Bah�a Blanca','ARG','Buenos Aires',239810); -INSERT INTO City VALUES (97,'Esteban Echeverr�a','ARG','Buenos Aires',235760); -INSERT INTO City VALUES (98,'Resistencia','ARG','Chaco',229212); -INSERT INTO City VALUES (99,'Jos� C. Paz','ARG','Buenos Aires',221754); -INSERT INTO City VALUES (100,'Paran�','ARG','Entre Rios',207041); -INSERT INTO City VALUES (101,'Godoy Cruz','ARG','Mendoza',206998); -INSERT INTO City VALUES (102,'Posadas','ARG','Misiones',201273); -INSERT INTO City VALUES (103,'Guaymall�n','ARG','Mendoza',200595); -INSERT INTO City VALUES (104,'Santiago del Estero','ARG','Santiago del Estero',189947); -INSERT INTO City VALUES (105,'San Salvador de Jujuy','ARG','Jujuy',178748); -INSERT INTO City VALUES (106,'Hurlingham','ARG','Buenos Aires',170028); -INSERT INTO City VALUES (107,'Neuqu�n','ARG','Neuqu�n',167296); -INSERT INTO City VALUES (108,'Ituzaing�','ARG','Buenos Aires',158197); -INSERT INTO City VALUES (109,'San Fernando','ARG','Buenos Aires',153036); -INSERT INTO City VALUES (110,'Formosa','ARG','Formosa',147636); -INSERT INTO City VALUES (111,'Las Heras','ARG','Mendoza',145823); -INSERT INTO City VALUES (112,'La Rioja','ARG','La Rioja',138117); -INSERT INTO City VALUES (113,'San Fernando del Valle de Cata','ARG','Catamarca',134935); -INSERT INTO City VALUES (114,'R�o Cuarto','ARG','C�rdoba',134355); -INSERT INTO City VALUES (115,'Comodoro Rivadavia','ARG','Chubut',124104); -INSERT INTO City VALUES (116,'Mendoza','ARG','Mendoza',123027); -INSERT INTO City VALUES (117,'San Nicol�s de los Arroyos','ARG','Buenos Aires',119302); -INSERT INTO City VALUES (118,'San Juan','ARG','San Juan',119152); -INSERT INTO City VALUES (119,'Escobar','ARG','Buenos Aires',116675); -INSERT INTO City VALUES (120,'Concordia','ARG','Entre Rios',116485); -INSERT INTO City VALUES (121,'Pilar','ARG','Buenos Aires',113428); -INSERT INTO City VALUES (122,'San Luis','ARG','San Luis',110136); -INSERT INTO City VALUES (123,'Ezeiza','ARG','Buenos Aires',99578); -INSERT INTO City VALUES (124,'San Rafael','ARG','Mendoza',94651); -INSERT INTO City VALUES (125,'Tandil','ARG','Buenos Aires',91101); -INSERT INTO City VALUES (126,'Yerevan','ARM','Yerevan',1248700); -INSERT INTO City VALUES (127,'Gjumri','ARM','�irak',211700); -INSERT INTO City VALUES (128,'Vanadzor','ARM','Lori',172700); -INSERT INTO City VALUES (129,'Oranjestad','ABW','�',29034); -INSERT INTO City VALUES (130,'Sydney','AUS','New South Wales',3276207); -INSERT INTO City VALUES (131,'Melbourne','AUS','Victoria',2865329); -INSERT INTO City VALUES (132,'Brisbane','AUS','Queensland',1291117); -INSERT INTO City VALUES (133,'Perth','AUS','West Australia',1096829); -INSERT INTO City VALUES (134,'Adelaide','AUS','South Australia',978100); -INSERT INTO City VALUES (135,'Canberra','AUS','Capital Region',322723); -INSERT INTO City VALUES (136,'Gold Coast','AUS','Queensland',311932); -INSERT INTO City VALUES (137,'Newcastle','AUS','New South Wales',270324); -INSERT INTO City VALUES (138,'Central Coast','AUS','New South Wales',227657); -INSERT INTO City VALUES (139,'Wollongong','AUS','New South Wales',219761); -INSERT INTO City VALUES (140,'Hobart','AUS','Tasmania',126118); -INSERT INTO City VALUES (141,'Geelong','AUS','Victoria',125382); -INSERT INTO City VALUES (142,'Townsville','AUS','Queensland',109914); -INSERT INTO City VALUES (143,'Cairns','AUS','Queensland',92273); -INSERT INTO City VALUES (144,'Baku','AZE','Baki',1787800); -INSERT INTO City VALUES (145,'G�nc�','AZE','G�nc�',299300); -INSERT INTO City VALUES (146,'Sumqayit','AZE','Sumqayit',283000); -INSERT INTO City VALUES (147,'Ming��evir','AZE','Ming��evir',93900); -INSERT INTO City VALUES (148,'Nassau','BHS','New Providence',172000); -INSERT INTO City VALUES (149,'al-Manama','BHR','al-Manama',148000); -INSERT INTO City VALUES (150,'Dhaka','BGD','Dhaka',3612850); -INSERT INTO City VALUES (151,'Chittagong','BGD','Chittagong',1392860); -INSERT INTO City VALUES (152,'Khulna','BGD','Khulna',663340); -INSERT INTO City VALUES (153,'Rajshahi','BGD','Rajshahi',294056); -INSERT INTO City VALUES (154,'Narayanganj','BGD','Dhaka',202134); -INSERT INTO City VALUES (155,'Rangpur','BGD','Rajshahi',191398); -INSERT INTO City VALUES (156,'Mymensingh','BGD','Dhaka',188713); -INSERT INTO City VALUES (157,'Barisal','BGD','Barisal',170232); -INSERT INTO City VALUES (158,'Tungi','BGD','Dhaka',168702); -INSERT INTO City VALUES (159,'Jessore','BGD','Khulna',139710); -INSERT INTO City VALUES (160,'Comilla','BGD','Chittagong',135313); -INSERT INTO City VALUES (161,'Nawabganj','BGD','Rajshahi',130577); -INSERT INTO City VALUES (162,'Dinajpur','BGD','Rajshahi',127815); -INSERT INTO City VALUES (163,'Bogra','BGD','Rajshahi',120170); -INSERT INTO City VALUES (164,'Sylhet','BGD','Sylhet',117396); -INSERT INTO City VALUES (165,'Brahmanbaria','BGD','Chittagong',109032); -INSERT INTO City VALUES (166,'Tangail','BGD','Dhaka',106004); -INSERT INTO City VALUES (167,'Jamalpur','BGD','Dhaka',103556); -INSERT INTO City VALUES (168,'Pabna','BGD','Rajshahi',103277); -INSERT INTO City VALUES (169,'Naogaon','BGD','Rajshahi',101266); -INSERT INTO City VALUES (170,'Sirajganj','BGD','Rajshahi',99669); -INSERT INTO City VALUES (171,'Narsinghdi','BGD','Dhaka',98342); -INSERT INTO City VALUES (172,'Saidpur','BGD','Rajshahi',96777); -INSERT INTO City VALUES (173,'Gazipur','BGD','Dhaka',96717); -INSERT INTO City VALUES (174,'Bridgetown','BRB','St Michael',6070); -INSERT INTO City VALUES (175,'Antwerpen','BEL','Antwerpen',446525); -INSERT INTO City VALUES (176,'Gent','BEL','East Flanderi',224180); -INSERT INTO City VALUES (177,'Charleroi','BEL','Hainaut',200827); -INSERT INTO City VALUES (178,'Li�ge','BEL','Li�ge',185639); -INSERT INTO City VALUES (179,'Bruxelles [Brussel]','BEL','Bryssel',133859); -INSERT INTO City VALUES (180,'Brugge','BEL','West Flanderi',116246); -INSERT INTO City VALUES (181,'Schaerbeek','BEL','Bryssel',105692); -INSERT INTO City VALUES (182,'Namur','BEL','Namur',105419); -INSERT INTO City VALUES (183,'Mons','BEL','Hainaut',90935); -INSERT INTO City VALUES (184,'Belize City','BLZ','Belize City',55810); -INSERT INTO City VALUES (185,'Belmopan','BLZ','Cayo',7105); -INSERT INTO City VALUES (186,'Cotonou','BEN','Atlantique',536827); -INSERT INTO City VALUES (187,'Porto-Novo','BEN','Ou�m�',194000); -INSERT INTO City VALUES (188,'Djougou','BEN','Atacora',134099); -INSERT INTO City VALUES (189,'Parakou','BEN','Borgou',103577); -INSERT INTO City VALUES (190,'Saint George','BMU','Saint George�s',1800); -INSERT INTO City VALUES (191,'Hamilton','BMU','Hamilton',1200); -INSERT INTO City VALUES (192,'Thimphu','BTN','Thimphu',22000); -INSERT INTO City VALUES (193,'Santa Cruz de la Sierra','BOL','Santa Cruz',935361); -INSERT INTO City VALUES (194,'La Paz','BOL','La Paz',758141); -INSERT INTO City VALUES (195,'El Alto','BOL','La Paz',534466); -INSERT INTO City VALUES (196,'Cochabamba','BOL','Cochabamba',482800); -INSERT INTO City VALUES (197,'Oruro','BOL','Oruro',223553); -INSERT INTO City VALUES (198,'Sucre','BOL','Chuquisaca',178426); -INSERT INTO City VALUES (199,'Potos�','BOL','Potos�',140642); -INSERT INTO City VALUES (200,'Tarija','BOL','Tarija',125255); -INSERT INTO City VALUES (201,'Sarajevo','BIH','Federaatio',360000); -INSERT INTO City VALUES (202,'Banja Luka','BIH','Republika Srpska',143079); -INSERT INTO City VALUES (203,'Zenica','BIH','Federaatio',96027); -INSERT INTO City VALUES (204,'Gaborone','BWA','Gaborone',213017); -INSERT INTO City VALUES (205,'Francistown','BWA','Francistown',101805); -INSERT INTO City VALUES (206,'S�o Paulo','BRA','S�o Paulo',9968485); -INSERT INTO City VALUES (207,'Rio de Janeiro','BRA','Rio de Janeiro',5598953); -INSERT INTO City VALUES (208,'Salvador','BRA','Bahia',2302832); -INSERT INTO City VALUES (209,'Belo Horizonte','BRA','Minas Gerais',2139125); -INSERT INTO City VALUES (210,'Fortaleza','BRA','Cear�',2097757); -INSERT INTO City VALUES (211,'Bras�lia','BRA','Distrito Federal',1969868); -INSERT INTO City VALUES (212,'Curitiba','BRA','Paran�',1584232); -INSERT INTO City VALUES (213,'Recife','BRA','Pernambuco',1378087); -INSERT INTO City VALUES (214,'Porto Alegre','BRA','Rio Grande do Sul',1314032); -INSERT INTO City VALUES (215,'Manaus','BRA','Amazonas',1255049); -INSERT INTO City VALUES (216,'Bel�m','BRA','Par�',1186926); -INSERT INTO City VALUES (217,'Guarulhos','BRA','S�o Paulo',1095874); -INSERT INTO City VALUES (218,'Goi�nia','BRA','Goi�s',1056330); -INSERT INTO City VALUES (219,'Campinas','BRA','S�o Paulo',950043); -INSERT INTO City VALUES (220,'S�o Gon�alo','BRA','Rio de Janeiro',869254); -INSERT INTO City VALUES (221,'Nova Igua�u','BRA','Rio de Janeiro',862225); -INSERT INTO City VALUES (222,'S�o Lu�s','BRA','Maranh�o',837588); -INSERT INTO City VALUES (223,'Macei�','BRA','Alagoas',786288); -INSERT INTO City VALUES (224,'Duque de Caxias','BRA','Rio de Janeiro',746758); -INSERT INTO City VALUES (225,'S�o Bernardo do Campo','BRA','S�o Paulo',723132); -INSERT INTO City VALUES (226,'Teresina','BRA','Piau�',691942); -INSERT INTO City VALUES (227,'Natal','BRA','Rio Grande do Norte',688955); -INSERT INTO City VALUES (228,'Osasco','BRA','S�o Paulo',659604); -INSERT INTO City VALUES (229,'Campo Grande','BRA','Mato Grosso do Sul',649593); -INSERT INTO City VALUES (230,'Santo Andr�','BRA','S�o Paulo',630073); -INSERT INTO City VALUES (231,'Jo�o Pessoa','BRA','Para�ba',584029); -INSERT INTO City VALUES (232,'Jaboat�o dos Guararapes','BRA','Pernambuco',558680); -INSERT INTO City VALUES (233,'Contagem','BRA','Minas Gerais',520801); -INSERT INTO City VALUES (234,'S�o Jos� dos Campos','BRA','S�o Paulo',515553); -INSERT INTO City VALUES (235,'Uberl�ndia','BRA','Minas Gerais',487222); -INSERT INTO City VALUES (236,'Feira de Santana','BRA','Bahia',479992); -INSERT INTO City VALUES (237,'Ribeir�o Preto','BRA','S�o Paulo',473276); -INSERT INTO City VALUES (238,'Sorocaba','BRA','S�o Paulo',466823); -INSERT INTO City VALUES (239,'Niter�i','BRA','Rio de Janeiro',459884); -INSERT INTO City VALUES (240,'Cuiab�','BRA','Mato Grosso',453813); -INSERT INTO City VALUES (241,'Juiz de Fora','BRA','Minas Gerais',450288); -INSERT INTO City VALUES (242,'Aracaju','BRA','Sergipe',445555); -INSERT INTO City VALUES (243,'S�o Jo�o de Meriti','BRA','Rio de Janeiro',440052); -INSERT INTO City VALUES (244,'Londrina','BRA','Paran�',432257); -INSERT INTO City VALUES (245,'Joinville','BRA','Santa Catarina',428011); -INSERT INTO City VALUES (246,'Belford Roxo','BRA','Rio de Janeiro',425194); -INSERT INTO City VALUES (247,'Santos','BRA','S�o Paulo',408748); -INSERT INTO City VALUES (248,'Ananindeua','BRA','Par�',400940); -INSERT INTO City VALUES (249,'Campos dos Goytacazes','BRA','Rio de Janeiro',398418); -INSERT INTO City VALUES (250,'Mau�','BRA','S�o Paulo',375055); -INSERT INTO City VALUES (251,'Carapicu�ba','BRA','S�o Paulo',357552); -INSERT INTO City VALUES (252,'Olinda','BRA','Pernambuco',354732); -INSERT INTO City VALUES (253,'Campina Grande','BRA','Para�ba',352497); -INSERT INTO City VALUES (254,'S�o Jos� do Rio Preto','BRA','S�o Paulo',351944); -INSERT INTO City VALUES (255,'Caxias do Sul','BRA','Rio Grande do Sul',349581); -INSERT INTO City VALUES (256,'Moji das Cruzes','BRA','S�o Paulo',339194); -INSERT INTO City VALUES (257,'Diadema','BRA','S�o Paulo',335078); -INSERT INTO City VALUES (258,'Aparecida de Goi�nia','BRA','Goi�s',324662); -INSERT INTO City VALUES (259,'Piracicaba','BRA','S�o Paulo',319104); -INSERT INTO City VALUES (260,'Cariacica','BRA','Esp�rito Santo',319033); -INSERT INTO City VALUES (261,'Vila Velha','BRA','Esp�rito Santo',318758); -INSERT INTO City VALUES (262,'Pelotas','BRA','Rio Grande do Sul',315415); -INSERT INTO City VALUES (263,'Bauru','BRA','S�o Paulo',313670); -INSERT INTO City VALUES (264,'Porto Velho','BRA','Rond�nia',309750); -INSERT INTO City VALUES (265,'Serra','BRA','Esp�rito Santo',302666); -INSERT INTO City VALUES (266,'Betim','BRA','Minas Gerais',302108); -INSERT INTO City VALUES (267,'Jund�a�','BRA','S�o Paulo',296127); -INSERT INTO City VALUES (268,'Canoas','BRA','Rio Grande do Sul',294125); -INSERT INTO City VALUES (269,'Franca','BRA','S�o Paulo',290139); -INSERT INTO City VALUES (270,'S�o Vicente','BRA','S�o Paulo',286848); -INSERT INTO City VALUES (271,'Maring�','BRA','Paran�',286461); -INSERT INTO City VALUES (272,'Montes Claros','BRA','Minas Gerais',286058); -INSERT INTO City VALUES (273,'An�polis','BRA','Goi�s',282197); -INSERT INTO City VALUES (274,'Florian�polis','BRA','Santa Catarina',281928); -INSERT INTO City VALUES (275,'Petr�polis','BRA','Rio de Janeiro',279183); -INSERT INTO City VALUES (276,'Itaquaquecetuba','BRA','S�o Paulo',270874); -INSERT INTO City VALUES (277,'Vit�ria','BRA','Esp�rito Santo',270626); -INSERT INTO City VALUES (278,'Ponta Grossa','BRA','Paran�',268013); -INSERT INTO City VALUES (279,'Rio Branco','BRA','Acre',259537); -INSERT INTO City VALUES (280,'Foz do Igua�u','BRA','Paran�',259425); -INSERT INTO City VALUES (281,'Macap�','BRA','Amap�',256033); -INSERT INTO City VALUES (282,'Ilh�us','BRA','Bahia',254970); -INSERT INTO City VALUES (283,'Vit�ria da Conquista','BRA','Bahia',253587); -INSERT INTO City VALUES (284,'Uberaba','BRA','Minas Gerais',249225); -INSERT INTO City VALUES (285,'Paulista','BRA','Pernambuco',248473); -INSERT INTO City VALUES (286,'Limeira','BRA','S�o Paulo',245497); -INSERT INTO City VALUES (287,'Blumenau','BRA','Santa Catarina',244379); -INSERT INTO City VALUES (288,'Caruaru','BRA','Pernambuco',244247); -INSERT INTO City VALUES (289,'Santar�m','BRA','Par�',241771); -INSERT INTO City VALUES (290,'Volta Redonda','BRA','Rio de Janeiro',240315); -INSERT INTO City VALUES (291,'Novo Hamburgo','BRA','Rio Grande do Sul',239940); -INSERT INTO City VALUES (292,'Caucaia','BRA','Cear�',238738); -INSERT INTO City VALUES (293,'Santa Maria','BRA','Rio Grande do Sul',238473); -INSERT INTO City VALUES (294,'Cascavel','BRA','Paran�',237510); -INSERT INTO City VALUES (295,'Guaruj�','BRA','S�o Paulo',237206); -INSERT INTO City VALUES (296,'Ribeir�o das Neves','BRA','Minas Gerais',232685); -INSERT INTO City VALUES (297,'Governador Valadares','BRA','Minas Gerais',231724); -INSERT INTO City VALUES (298,'Taubat�','BRA','S�o Paulo',229130); -INSERT INTO City VALUES (299,'Imperatriz','BRA','Maranh�o',224564); -INSERT INTO City VALUES (300,'Gravata�','BRA','Rio Grande do Sul',223011); -INSERT INTO City VALUES (301,'Embu','BRA','S�o Paulo',222223); -INSERT INTO City VALUES (302,'Mossor�','BRA','Rio Grande do Norte',214901); -INSERT INTO City VALUES (303,'V�rzea Grande','BRA','Mato Grosso',214435); -INSERT INTO City VALUES (304,'Petrolina','BRA','Pernambuco',210540); -INSERT INTO City VALUES (305,'Barueri','BRA','S�o Paulo',208426); -INSERT INTO City VALUES (306,'Viam�o','BRA','Rio Grande do Sul',207557); -INSERT INTO City VALUES (307,'Ipatinga','BRA','Minas Gerais',206338); -INSERT INTO City VALUES (308,'Juazeiro','BRA','Bahia',201073); -INSERT INTO City VALUES (309,'Juazeiro do Norte','BRA','Cear�',199636); -INSERT INTO City VALUES (310,'Tabo�o da Serra','BRA','S�o Paulo',197550); -INSERT INTO City VALUES (311,'S�o Jos� dos Pinhais','BRA','Paran�',196884); -INSERT INTO City VALUES (312,'Mag�','BRA','Rio de Janeiro',196147); -INSERT INTO City VALUES (313,'Suzano','BRA','S�o Paulo',195434); -INSERT INTO City VALUES (314,'S�o Leopoldo','BRA','Rio Grande do Sul',189258); -INSERT INTO City VALUES (315,'Mar�lia','BRA','S�o Paulo',188691); -INSERT INTO City VALUES (316,'S�o Carlos','BRA','S�o Paulo',187122); -INSERT INTO City VALUES (317,'Sumar�','BRA','S�o Paulo',186205); -INSERT INTO City VALUES (318,'Presidente Prudente','BRA','S�o Paulo',185340); -INSERT INTO City VALUES (319,'Divin�polis','BRA','Minas Gerais',185047); -INSERT INTO City VALUES (320,'Sete Lagoas','BRA','Minas Gerais',182984); -INSERT INTO City VALUES (321,'Rio Grande','BRA','Rio Grande do Sul',182222); -INSERT INTO City VALUES (322,'Itabuna','BRA','Bahia',182148); -INSERT INTO City VALUES (323,'Jequi�','BRA','Bahia',179128); -INSERT INTO City VALUES (324,'Arapiraca','BRA','Alagoas',178988); -INSERT INTO City VALUES (325,'Colombo','BRA','Paran�',177764); -INSERT INTO City VALUES (326,'Americana','BRA','S�o Paulo',177409); -INSERT INTO City VALUES (327,'Alvorada','BRA','Rio Grande do Sul',175574); -INSERT INTO City VALUES (328,'Araraquara','BRA','S�o Paulo',174381); -INSERT INTO City VALUES (329,'Itabora�','BRA','Rio de Janeiro',173977); -INSERT INTO City VALUES (330,'Santa B�rbara d�Oeste','BRA','S�o Paulo',171657); -INSERT INTO City VALUES (331,'Nova Friburgo','BRA','Rio de Janeiro',170697); -INSERT INTO City VALUES (332,'Jacare�','BRA','S�o Paulo',170356); -INSERT INTO City VALUES (333,'Ara�atuba','BRA','S�o Paulo',169303); -INSERT INTO City VALUES (334,'Barra Mansa','BRA','Rio de Janeiro',168953); -INSERT INTO City VALUES (335,'Praia Grande','BRA','S�o Paulo',168434); -INSERT INTO City VALUES (336,'Marab�','BRA','Par�',167795); -INSERT INTO City VALUES (337,'Crici�ma','BRA','Santa Catarina',167661); -INSERT INTO City VALUES (338,'Boa Vista','BRA','Roraima',167185); -INSERT INTO City VALUES (339,'Passo Fundo','BRA','Rio Grande do Sul',166343); -INSERT INTO City VALUES (340,'Dourados','BRA','Mato Grosso do Sul',164716); -INSERT INTO City VALUES (341,'Santa Luzia','BRA','Minas Gerais',164704); -INSERT INTO City VALUES (342,'Rio Claro','BRA','S�o Paulo',163551); -INSERT INTO City VALUES (343,'Maracana�','BRA','Cear�',162022); -INSERT INTO City VALUES (344,'Guarapuava','BRA','Paran�',160510); -INSERT INTO City VALUES (345,'Rondon�polis','BRA','Mato Grosso',155115); -INSERT INTO City VALUES (346,'S�o Jos�','BRA','Santa Catarina',155105); -INSERT INTO City VALUES (347,'Cachoeiro de Itapemirim','BRA','Esp�rito Santo',155024); -INSERT INTO City VALUES (348,'Nil�polis','BRA','Rio de Janeiro',153383); -INSERT INTO City VALUES (349,'Itapevi','BRA','S�o Paulo',150664); -INSERT INTO City VALUES (350,'Cabo de Santo Agostinho','BRA','Pernambuco',149964); -INSERT INTO City VALUES (351,'Cama�ari','BRA','Bahia',149146); -INSERT INTO City VALUES (352,'Sobral','BRA','Cear�',146005); -INSERT INTO City VALUES (353,'Itaja�','BRA','Santa Catarina',145197); -INSERT INTO City VALUES (354,'Chapec�','BRA','Santa Catarina',144158); -INSERT INTO City VALUES (355,'Cotia','BRA','S�o Paulo',140042); -INSERT INTO City VALUES (356,'Lages','BRA','Santa Catarina',139570); -INSERT INTO City VALUES (357,'Ferraz de Vasconcelos','BRA','S�o Paulo',139283); -INSERT INTO City VALUES (358,'Indaiatuba','BRA','S�o Paulo',135968); -INSERT INTO City VALUES (359,'Hortol�ndia','BRA','S�o Paulo',135755); -INSERT INTO City VALUES (360,'Caxias','BRA','Maranh�o',133980); -INSERT INTO City VALUES (361,'S�o Caetano do Sul','BRA','S�o Paulo',133321); -INSERT INTO City VALUES (362,'Itu','BRA','S�o Paulo',132736); -INSERT INTO City VALUES (363,'Nossa Senhora do Socorro','BRA','Sergipe',131351); -INSERT INTO City VALUES (364,'Parna�ba','BRA','Piau�',129756); -INSERT INTO City VALUES (365,'Po�os de Caldas','BRA','Minas Gerais',129683); -INSERT INTO City VALUES (366,'Teres�polis','BRA','Rio de Janeiro',128079); -INSERT INTO City VALUES (367,'Barreiras','BRA','Bahia',127801); -INSERT INTO City VALUES (368,'Castanhal','BRA','Par�',127634); -INSERT INTO City VALUES (369,'Alagoinhas','BRA','Bahia',126820); -INSERT INTO City VALUES (370,'Itapecerica da Serra','BRA','S�o Paulo',126672); -INSERT INTO City VALUES (371,'Uruguaiana','BRA','Rio Grande do Sul',126305); -INSERT INTO City VALUES (372,'Paranagu�','BRA','Paran�',126076); -INSERT INTO City VALUES (373,'Ibirit�','BRA','Minas Gerais',125982); -INSERT INTO City VALUES (374,'Timon','BRA','Maranh�o',125812); -INSERT INTO City VALUES (375,'Luzi�nia','BRA','Goi�s',125597); -INSERT INTO City VALUES (376,'Maca�','BRA','Rio de Janeiro',125597); -INSERT INTO City VALUES (377,'Te�filo Otoni','BRA','Minas Gerais',124489); -INSERT INTO City VALUES (378,'Moji-Gua�u','BRA','S�o Paulo',123782); -INSERT INTO City VALUES (379,'Palmas','BRA','Tocantins',121919); -INSERT INTO City VALUES (380,'Pindamonhangaba','BRA','S�o Paulo',121904); -INSERT INTO City VALUES (381,'Francisco Morato','BRA','S�o Paulo',121197); -INSERT INTO City VALUES (382,'Bag�','BRA','Rio Grande do Sul',120793); -INSERT INTO City VALUES (383,'Sapucaia do Sul','BRA','Rio Grande do Sul',120217); -INSERT INTO City VALUES (384,'Cabo Frio','BRA','Rio de Janeiro',119503); -INSERT INTO City VALUES (385,'Itapetininga','BRA','S�o Paulo',119391); -INSERT INTO City VALUES (386,'Patos de Minas','BRA','Minas Gerais',119262); -INSERT INTO City VALUES (387,'Camaragibe','BRA','Pernambuco',118968); -INSERT INTO City VALUES (388,'Bragan�a Paulista','BRA','S�o Paulo',116929); -INSERT INTO City VALUES (389,'Queimados','BRA','Rio de Janeiro',115020); -INSERT INTO City VALUES (390,'Aragua�na','BRA','Tocantins',114948); -INSERT INTO City VALUES (391,'Garanhuns','BRA','Pernambuco',114603); -INSERT INTO City VALUES (392,'Vit�ria de Santo Ant�o','BRA','Pernambuco',113595); -INSERT INTO City VALUES (393,'Santa Rita','BRA','Para�ba',113135); -INSERT INTO City VALUES (394,'Barbacena','BRA','Minas Gerais',113079); -INSERT INTO City VALUES (395,'Abaetetuba','BRA','Par�',111258); -INSERT INTO City VALUES (396,'Ja�','BRA','S�o Paulo',109965); -INSERT INTO City VALUES (397,'Lauro de Freitas','BRA','Bahia',109236); -INSERT INTO City VALUES (398,'Franco da Rocha','BRA','S�o Paulo',108964); -INSERT INTO City VALUES (399,'Teixeira de Freitas','BRA','Bahia',108441); -INSERT INTO City VALUES (400,'Varginha','BRA','Minas Gerais',108314); -INSERT INTO City VALUES (401,'Ribeir�o Pires','BRA','S�o Paulo',108121); -INSERT INTO City VALUES (402,'Sabar�','BRA','Minas Gerais',107781); -INSERT INTO City VALUES (403,'Catanduva','BRA','S�o Paulo',107761); -INSERT INTO City VALUES (404,'Rio Verde','BRA','Goi�s',107755); -INSERT INTO City VALUES (405,'Botucatu','BRA','S�o Paulo',107663); -INSERT INTO City VALUES (406,'Colatina','BRA','Esp�rito Santo',107354); -INSERT INTO City VALUES (407,'Santa Cruz do Sul','BRA','Rio Grande do Sul',106734); -INSERT INTO City VALUES (408,'Linhares','BRA','Esp�rito Santo',106278); -INSERT INTO City VALUES (409,'Apucarana','BRA','Paran�',105114); -INSERT INTO City VALUES (410,'Barretos','BRA','S�o Paulo',104156); -INSERT INTO City VALUES (411,'Guaratinguet�','BRA','S�o Paulo',103433); -INSERT INTO City VALUES (412,'Cachoeirinha','BRA','Rio Grande do Sul',103240); -INSERT INTO City VALUES (413,'Cod�','BRA','Maranh�o',103153); -INSERT INTO City VALUES (414,'Jaragu� do Sul','BRA','Santa Catarina',102580); -INSERT INTO City VALUES (415,'Cubat�o','BRA','S�o Paulo',102372); -INSERT INTO City VALUES (416,'Itabira','BRA','Minas Gerais',102217); -INSERT INTO City VALUES (417,'Itaituba','BRA','Par�',101320); -INSERT INTO City VALUES (418,'Araras','BRA','S�o Paulo',101046); -INSERT INTO City VALUES (419,'Resende','BRA','Rio de Janeiro',100627); -INSERT INTO City VALUES (420,'Atibaia','BRA','S�o Paulo',100356); -INSERT INTO City VALUES (421,'Pouso Alegre','BRA','Minas Gerais',100028); -INSERT INTO City VALUES (422,'Toledo','BRA','Paran�',99387); -INSERT INTO City VALUES (423,'Crato','BRA','Cear�',98965); -INSERT INTO City VALUES (424,'Passos','BRA','Minas Gerais',98570); -INSERT INTO City VALUES (425,'Araguari','BRA','Minas Gerais',98399); -INSERT INTO City VALUES (426,'S�o Jos� de Ribamar','BRA','Maranh�o',98318); -INSERT INTO City VALUES (427,'Pinhais','BRA','Paran�',98198); -INSERT INTO City VALUES (428,'Sert�ozinho','BRA','S�o Paulo',98140); -INSERT INTO City VALUES (429,'Conselheiro Lafaiete','BRA','Minas Gerais',97507); -INSERT INTO City VALUES (430,'Paulo Afonso','BRA','Bahia',97291); -INSERT INTO City VALUES (431,'Angra dos Reis','BRA','Rio de Janeiro',96864); -INSERT INTO City VALUES (432,'Eun�polis','BRA','Bahia',96610); -INSERT INTO City VALUES (433,'Salto','BRA','S�o Paulo',96348); -INSERT INTO City VALUES (434,'Ourinhos','BRA','S�o Paulo',96291); -INSERT INTO City VALUES (435,'Parnamirim','BRA','Rio Grande do Norte',96210); -INSERT INTO City VALUES (436,'Jacobina','BRA','Bahia',96131); -INSERT INTO City VALUES (437,'Coronel Fabriciano','BRA','Minas Gerais',95933); -INSERT INTO City VALUES (438,'Birigui','BRA','S�o Paulo',94685); -INSERT INTO City VALUES (439,'Tatu�','BRA','S�o Paulo',93897); -INSERT INTO City VALUES (440,'Ji-Paran�','BRA','Rond�nia',93346); -INSERT INTO City VALUES (441,'Bacabal','BRA','Maranh�o',93121); -INSERT INTO City VALUES (442,'Camet�','BRA','Par�',92779); -INSERT INTO City VALUES (443,'Gua�ba','BRA','Rio Grande do Sul',92224); -INSERT INTO City VALUES (444,'S�o Louren�o da Mata','BRA','Pernambuco',91999); -INSERT INTO City VALUES (445,'Santana do Livramento','BRA','Rio Grande do Sul',91779); -INSERT INTO City VALUES (446,'Votorantim','BRA','S�o Paulo',91777); -INSERT INTO City VALUES (447,'Campo Largo','BRA','Paran�',91203); -INSERT INTO City VALUES (448,'Patos','BRA','Para�ba',90519); -INSERT INTO City VALUES (449,'Ituiutaba','BRA','Minas Gerais',90507); -INSERT INTO City VALUES (450,'Corumb�','BRA','Mato Grosso do Sul',90111); -INSERT INTO City VALUES (451,'Palho�a','BRA','Santa Catarina',89465); -INSERT INTO City VALUES (452,'Barra do Pira�','BRA','Rio de Janeiro',89388); -INSERT INTO City VALUES (453,'Bento Gon�alves','BRA','Rio Grande do Sul',89254); -INSERT INTO City VALUES (454,'Po�','BRA','S�o Paulo',89236); -INSERT INTO City VALUES (455,'�guas Lindas de Goi�s','BRA','Goi�s',89200); -INSERT INTO City VALUES (456,'London','GBR','England',7285000); -INSERT INTO City VALUES (457,'Birmingham','GBR','England',1013000); -INSERT INTO City VALUES (458,'Glasgow','GBR','Scotland',619680); -INSERT INTO City VALUES (459,'Liverpool','GBR','England',461000); -INSERT INTO City VALUES (460,'Edinburgh','GBR','Scotland',450180); -INSERT INTO City VALUES (461,'Sheffield','GBR','England',431607); -INSERT INTO City VALUES (462,'Manchester','GBR','England',430000); -INSERT INTO City VALUES (463,'Leeds','GBR','England',424194); -INSERT INTO City VALUES (464,'Bristol','GBR','England',402000); -INSERT INTO City VALUES (465,'Cardiff','GBR','Wales',321000); -INSERT INTO City VALUES (466,'Coventry','GBR','England',304000); -INSERT INTO City VALUES (467,'Leicester','GBR','England',294000); -INSERT INTO City VALUES (468,'Bradford','GBR','England',289376); -INSERT INTO City VALUES (469,'Belfast','GBR','North Ireland',287500); -INSERT INTO City VALUES (470,'Nottingham','GBR','England',287000); -INSERT INTO City VALUES (471,'Kingston upon Hull','GBR','England',262000); -INSERT INTO City VALUES (472,'Plymouth','GBR','England',253000); -INSERT INTO City VALUES (473,'Stoke-on-Trent','GBR','England',252000); -INSERT INTO City VALUES (474,'Wolverhampton','GBR','England',242000); -INSERT INTO City VALUES (475,'Derby','GBR','England',236000); -INSERT INTO City VALUES (476,'Swansea','GBR','Wales',230000); -INSERT INTO City VALUES (477,'Southampton','GBR','England',216000); -INSERT INTO City VALUES (478,'Aberdeen','GBR','Scotland',213070); -INSERT INTO City VALUES (479,'Northampton','GBR','England',196000); -INSERT INTO City VALUES (480,'Dudley','GBR','England',192171); -INSERT INTO City VALUES (481,'Portsmouth','GBR','England',190000); -INSERT INTO City VALUES (482,'Newcastle upon Tyne','GBR','England',189150); -INSERT INTO City VALUES (483,'Sunderland','GBR','England',183310); -INSERT INTO City VALUES (484,'Luton','GBR','England',183000); -INSERT INTO City VALUES (485,'Swindon','GBR','England',180000); -INSERT INTO City VALUES (486,'Southend-on-Sea','GBR','England',176000); -INSERT INTO City VALUES (487,'Walsall','GBR','England',174739); -INSERT INTO City VALUES (488,'Bournemouth','GBR','England',162000); -INSERT INTO City VALUES (489,'Peterborough','GBR','England',156000); -INSERT INTO City VALUES (490,'Brighton','GBR','England',156124); -INSERT INTO City VALUES (491,'Blackpool','GBR','England',151000); -INSERT INTO City VALUES (492,'Dundee','GBR','Scotland',146690); -INSERT INTO City VALUES (493,'West Bromwich','GBR','England',146386); -INSERT INTO City VALUES (494,'Reading','GBR','England',148000); -INSERT INTO City VALUES (495,'Oldbury/Smethwick (Warley)','GBR','England',145542); -INSERT INTO City VALUES (496,'Middlesbrough','GBR','England',145000); -INSERT INTO City VALUES (497,'Huddersfield','GBR','England',143726); -INSERT INTO City VALUES (498,'Oxford','GBR','England',144000); -INSERT INTO City VALUES (499,'Poole','GBR','England',141000); -INSERT INTO City VALUES (500,'Bolton','GBR','England',139020); -INSERT INTO City VALUES (501,'Blackburn','GBR','England',140000); -INSERT INTO City VALUES (502,'Newport','GBR','Wales',139000); -INSERT INTO City VALUES (503,'Preston','GBR','England',135000); -INSERT INTO City VALUES (504,'Stockport','GBR','England',132813); -INSERT INTO City VALUES (505,'Norwich','GBR','England',124000); -INSERT INTO City VALUES (506,'Rotherham','GBR','England',121380); -INSERT INTO City VALUES (507,'Cambridge','GBR','England',121000); -INSERT INTO City VALUES (508,'Watford','GBR','England',113080); -INSERT INTO City VALUES (509,'Ipswich','GBR','England',114000); -INSERT INTO City VALUES (510,'Slough','GBR','England',112000); -INSERT INTO City VALUES (511,'Exeter','GBR','England',111000); -INSERT INTO City VALUES (512,'Cheltenham','GBR','England',106000); -INSERT INTO City VALUES (513,'Gloucester','GBR','England',107000); -INSERT INTO City VALUES (514,'Saint Helens','GBR','England',106293); -INSERT INTO City VALUES (515,'Sutton Coldfield','GBR','England',106001); -INSERT INTO City VALUES (516,'York','GBR','England',104425); -INSERT INTO City VALUES (517,'Oldham','GBR','England',103931); -INSERT INTO City VALUES (518,'Basildon','GBR','England',100924); -INSERT INTO City VALUES (519,'Worthing','GBR','England',100000); -INSERT INTO City VALUES (520,'Chelmsford','GBR','England',97451); -INSERT INTO City VALUES (521,'Colchester','GBR','England',96063); -INSERT INTO City VALUES (522,'Crawley','GBR','England',97000); -INSERT INTO City VALUES (523,'Gillingham','GBR','England',92000); -INSERT INTO City VALUES (524,'Solihull','GBR','England',94531); -INSERT INTO City VALUES (525,'Rochdale','GBR','England',94313); -INSERT INTO City VALUES (526,'Birkenhead','GBR','England',93087); -INSERT INTO City VALUES (527,'Worcester','GBR','England',95000); -INSERT INTO City VALUES (528,'Hartlepool','GBR','England',92000); -INSERT INTO City VALUES (529,'Halifax','GBR','England',91069); -INSERT INTO City VALUES (530,'Woking/Byfleet','GBR','England',92000); -INSERT INTO City VALUES (531,'Southport','GBR','England',90959); -INSERT INTO City VALUES (532,'Maidstone','GBR','England',90878); -INSERT INTO City VALUES (533,'Eastbourne','GBR','England',90000); -INSERT INTO City VALUES (534,'Grimsby','GBR','England',89000); -INSERT INTO City VALUES (535,'Saint Helier','GBR','Jersey',27523); -INSERT INTO City VALUES (536,'Douglas','GBR','�',23487); -INSERT INTO City VALUES (537,'Road Town','VGB','Tortola',8000); -INSERT INTO City VALUES (538,'Bandar Seri Begawan','BRN','Brunei and Muara',21484); -INSERT INTO City VALUES (539,'Sofija','BGR','Grad Sofija',1122302); -INSERT INTO City VALUES (540,'Plovdiv','BGR','Plovdiv',342584); -INSERT INTO City VALUES (541,'Varna','BGR','Varna',299801); -INSERT INTO City VALUES (542,'Burgas','BGR','Burgas',195255); -INSERT INTO City VALUES (543,'Ruse','BGR','Ruse',166467); -INSERT INTO City VALUES (544,'Stara Zagora','BGR','Haskovo',147939); -INSERT INTO City VALUES (545,'Pleven','BGR','Lovec',121952); -INSERT INTO City VALUES (546,'Sliven','BGR','Burgas',105530); -INSERT INTO City VALUES (547,'Dobric','BGR','Varna',100399); -INSERT INTO City VALUES (548,'�umen','BGR','Varna',94686); -INSERT INTO City VALUES (549,'Ouagadougou','BFA','Kadiogo',824000); -INSERT INTO City VALUES (550,'Bobo-Dioulasso','BFA','Houet',300000); -INSERT INTO City VALUES (551,'Koudougou','BFA','Boulkiemd�',105000); -INSERT INTO City VALUES (552,'Bujumbura','BDI','Bujumbura',300000); -INSERT INTO City VALUES (553,'George Town','CYM','Grand Cayman',19600); -INSERT INTO City VALUES (554,'Santiago de Chile','CHL','Santiago',4703954); -INSERT INTO City VALUES (555,'Puente Alto','CHL','Santiago',386236); -INSERT INTO City VALUES (556,'Vi�a del Mar','CHL','Valpara�so',312493); -INSERT INTO City VALUES (557,'Valpara�so','CHL','Valpara�so',293800); -INSERT INTO City VALUES (558,'Talcahuano','CHL','B�ob�o',277752); -INSERT INTO City VALUES (559,'Antofagasta','CHL','Antofagasta',251429); -INSERT INTO City VALUES (560,'San Bernardo','CHL','Santiago',241910); -INSERT INTO City VALUES (561,'Temuco','CHL','La Araucan�a',233041); -INSERT INTO City VALUES (562,'Concepci�n','CHL','B�ob�o',217664); -INSERT INTO City VALUES (563,'Rancagua','CHL','O�Higgins',212977); -INSERT INTO City VALUES (564,'Arica','CHL','Tarapac�',189036); -INSERT INTO City VALUES (565,'Talca','CHL','Maule',187557); -INSERT INTO City VALUES (566,'Chill�n','CHL','B�ob�o',178182); -INSERT INTO City VALUES (567,'Iquique','CHL','Tarapac�',177892); -INSERT INTO City VALUES (568,'Los Angeles','CHL','B�ob�o',158215); -INSERT INTO City VALUES (569,'Puerto Montt','CHL','Los Lagos',152194); -INSERT INTO City VALUES (570,'Coquimbo','CHL','Coquimbo',143353); -INSERT INTO City VALUES (571,'Osorno','CHL','Los Lagos',141468); -INSERT INTO City VALUES (572,'La Serena','CHL','Coquimbo',137409); -INSERT INTO City VALUES (573,'Calama','CHL','Antofagasta',137265); -INSERT INTO City VALUES (574,'Valdivia','CHL','Los Lagos',133106); -INSERT INTO City VALUES (575,'Punta Arenas','CHL','Magallanes',125631); -INSERT INTO City VALUES (576,'Copiap�','CHL','Atacama',120128); -INSERT INTO City VALUES (577,'Quilpu�','CHL','Valpara�so',118857); -INSERT INTO City VALUES (578,'Curic�','CHL','Maule',115766); -INSERT INTO City VALUES (579,'Ovalle','CHL','Coquimbo',94854); -INSERT INTO City VALUES (580,'Coronel','CHL','B�ob�o',93061); -INSERT INTO City VALUES (581,'San Pedro de la Paz','CHL','B�ob�o',91684); -INSERT INTO City VALUES (582,'Melipilla','CHL','Santiago',91056); -INSERT INTO City VALUES (583,'Avarua','COK','Rarotonga',11900); -INSERT INTO City VALUES (584,'San Jos�','CRI','San Jos�',339131); -INSERT INTO City VALUES (585,'Djibouti','DJI','Djibouti',383000); -INSERT INTO City VALUES (586,'Roseau','DMA','St George',16243); -INSERT INTO City VALUES (587,'Santo Domingo de Guzm�n','DOM','Distrito Nacional',1609966); -INSERT INTO City VALUES (588,'Santiago de los Caballeros','DOM','Santiago',365463); -INSERT INTO City VALUES (589,'La Romana','DOM','La Romana',140204); -INSERT INTO City VALUES (590,'San Pedro de Macor�s','DOM','San Pedro de Macor�s',124735); -INSERT INTO City VALUES (591,'San Francisco de Macor�s','DOM','Duarte',108485); -INSERT INTO City VALUES (592,'San Felipe de Puerto Plata','DOM','Puerto Plata',89423); -INSERT INTO City VALUES (593,'Guayaquil','ECU','Guayas',2070040); -INSERT INTO City VALUES (594,'Quito','ECU','Pichincha',1573458); -INSERT INTO City VALUES (595,'Cuenca','ECU','Azuay',270353); -INSERT INTO City VALUES (596,'Machala','ECU','El Oro',210368); -INSERT INTO City VALUES (597,'Santo Domingo de los Colorados','ECU','Pichincha',202111); -INSERT INTO City VALUES (598,'Portoviejo','ECU','Manab�',176413); -INSERT INTO City VALUES (599,'Ambato','ECU','Tungurahua',169612); -INSERT INTO City VALUES (600,'Manta','ECU','Manab�',164739); -INSERT INTO City VALUES (601,'Duran [Eloy Alfaro]','ECU','Guayas',152514); -INSERT INTO City VALUES (602,'Ibarra','ECU','Imbabura',130643); -INSERT INTO City VALUES (603,'Quevedo','ECU','Los R�os',129631); -INSERT INTO City VALUES (604,'Milagro','ECU','Guayas',124177); -INSERT INTO City VALUES (605,'Loja','ECU','Loja',123875); -INSERT INTO City VALUES (606,'R�obamba','ECU','Chimborazo',123163); -INSERT INTO City VALUES (607,'Esmeraldas','ECU','Esmeraldas',123045); -INSERT INTO City VALUES (608,'Cairo','EGY','Kairo',6789479); -INSERT INTO City VALUES (609,'Alexandria','EGY','Aleksandria',3328196); -INSERT INTO City VALUES (610,'Giza','EGY','Giza',2221868); -INSERT INTO City VALUES (611,'Shubra al-Khayma','EGY','al-Qalyubiya',870716); -INSERT INTO City VALUES (612,'Port Said','EGY','Port Said',469533); -INSERT INTO City VALUES (613,'Suez','EGY','Suez',417610); -INSERT INTO City VALUES (614,'al-Mahallat al-Kubra','EGY','al-Gharbiya',395402); -INSERT INTO City VALUES (615,'Tanta','EGY','al-Gharbiya',371010); -INSERT INTO City VALUES (616,'al-Mansura','EGY','al-Daqahliya',369621); -INSERT INTO City VALUES (617,'Luxor','EGY','Luxor',360503); -INSERT INTO City VALUES (618,'Asyut','EGY','Asyut',343498); -INSERT INTO City VALUES (619,'Bahtim','EGY','al-Qalyubiya',275807); -INSERT INTO City VALUES (620,'Zagazig','EGY','al-Sharqiya',267351); -INSERT INTO City VALUES (621,'al-Faiyum','EGY','al-Faiyum',260964); -INSERT INTO City VALUES (622,'Ismailia','EGY','Ismailia',254477); -INSERT INTO City VALUES (623,'Kafr al-Dawwar','EGY','al-Buhayra',231978); -INSERT INTO City VALUES (624,'Assuan','EGY','Assuan',219017); -INSERT INTO City VALUES (625,'Damanhur','EGY','al-Buhayra',212203); -INSERT INTO City VALUES (626,'al-Minya','EGY','al-Minya',201360); -INSERT INTO City VALUES (627,'Bani Suwayf','EGY','Bani Suwayf',172032); -INSERT INTO City VALUES (628,'Qina','EGY','Qina',171275); -INSERT INTO City VALUES (629,'Sawhaj','EGY','Sawhaj',170125); -INSERT INTO City VALUES (630,'Shibin al-Kawm','EGY','al-Minufiya',159909); -INSERT INTO City VALUES (631,'Bulaq al-Dakrur','EGY','Giza',148787); -INSERT INTO City VALUES (632,'Banha','EGY','al-Qalyubiya',145792); -INSERT INTO City VALUES (633,'Warraq al-Arab','EGY','Giza',127108); -INSERT INTO City VALUES (634,'Kafr al-Shaykh','EGY','Kafr al-Shaykh',124819); -INSERT INTO City VALUES (635,'Mallawi','EGY','al-Minya',119283); -INSERT INTO City VALUES (636,'Bilbays','EGY','al-Sharqiya',113608); -INSERT INTO City VALUES (637,'Mit Ghamr','EGY','al-Daqahliya',101801); -INSERT INTO City VALUES (638,'al-Arish','EGY','Shamal Sina',100447); -INSERT INTO City VALUES (639,'Talkha','EGY','al-Daqahliya',97700); -INSERT INTO City VALUES (640,'Qalyub','EGY','al-Qalyubiya',97200); -INSERT INTO City VALUES (641,'Jirja','EGY','Sawhaj',95400); -INSERT INTO City VALUES (642,'Idfu','EGY','Qina',94200); -INSERT INTO City VALUES (643,'al-Hawamidiya','EGY','Giza',91700); -INSERT INTO City VALUES (644,'Disuq','EGY','Kafr al-Shaykh',91300); -INSERT INTO City VALUES (645,'San Salvador','SLV','San Salvador',415346); -INSERT INTO City VALUES (646,'Santa Ana','SLV','Santa Ana',139389); -INSERT INTO City VALUES (647,'Mejicanos','SLV','San Salvador',138800); -INSERT INTO City VALUES (648,'Soyapango','SLV','San Salvador',129800); -INSERT INTO City VALUES (649,'San Miguel','SLV','San Miguel',127696); -INSERT INTO City VALUES (650,'Nueva San Salvador','SLV','La Libertad',98400); -INSERT INTO City VALUES (651,'Apopa','SLV','San Salvador',88800); -INSERT INTO City VALUES (652,'Asmara','ERI','Maekel',431000); -INSERT INTO City VALUES (653,'Madrid','ESP','Madrid',2879052); -INSERT INTO City VALUES (654,'Barcelona','ESP','Katalonia',1503451); -INSERT INTO City VALUES (655,'Valencia','ESP','Valencia',739412); -INSERT INTO City VALUES (656,'Sevilla','ESP','Andalusia',701927); -INSERT INTO City VALUES (657,'Zaragoza','ESP','Aragonia',603367); -INSERT INTO City VALUES (658,'M�laga','ESP','Andalusia',530553); -INSERT INTO City VALUES (659,'Bilbao','ESP','Baskimaa',357589); -INSERT INTO City VALUES (660,'Las Palmas de Gran Canaria','ESP','Canary Islands',354757); -INSERT INTO City VALUES (661,'Murcia','ESP','Murcia',353504); -INSERT INTO City VALUES (662,'Palma de Mallorca','ESP','Balears',326993); -INSERT INTO City VALUES (663,'Valladolid','ESP','Castilla and Le�n',319998); -INSERT INTO City VALUES (664,'C�rdoba','ESP','Andalusia',311708); -INSERT INTO City VALUES (665,'Vigo','ESP','Galicia',283670); -INSERT INTO City VALUES (666,'Alicante [Alacant]','ESP','Valencia',272432); -INSERT INTO City VALUES (667,'Gij�n','ESP','Asturia',267980); -INSERT INTO City VALUES (668,'L�Hospitalet de Llobregat','ESP','Katalonia',247986); -INSERT INTO City VALUES (669,'Granada','ESP','Andalusia',244767); -INSERT INTO City VALUES (670,'A Coru�a (La Coru�a)','ESP','Galicia',243402); -INSERT INTO City VALUES (671,'Vitoria-Gasteiz','ESP','Baskimaa',217154); -INSERT INTO City VALUES (672,'Santa Cruz de Tenerife','ESP','Canary Islands',213050); -INSERT INTO City VALUES (673,'Badalona','ESP','Katalonia',209635); -INSERT INTO City VALUES (674,'Oviedo','ESP','Asturia',200453); -INSERT INTO City VALUES (675,'M�stoles','ESP','Madrid',195351); -INSERT INTO City VALUES (676,'Elche [Elx]','ESP','Valencia',193174); -INSERT INTO City VALUES (677,'Sabadell','ESP','Katalonia',184859); -INSERT INTO City VALUES (678,'Santander','ESP','Cantabria',184165); -INSERT INTO City VALUES (679,'Jerez de la Frontera','ESP','Andalusia',182660); -INSERT INTO City VALUES (680,'Pamplona [Iru�a]','ESP','Navarra',180483); -INSERT INTO City VALUES (681,'Donostia-San Sebasti�n','ESP','Baskimaa',179208); -INSERT INTO City VALUES (682,'Cartagena','ESP','Murcia',177709); -INSERT INTO City VALUES (683,'Legan�s','ESP','Madrid',173163); -INSERT INTO City VALUES (684,'Fuenlabrada','ESP','Madrid',171173); -INSERT INTO City VALUES (685,'Almer�a','ESP','Andalusia',169027); -INSERT INTO City VALUES (686,'Terrassa','ESP','Katalonia',168695); -INSERT INTO City VALUES (687,'Alcal� de Henares','ESP','Madrid',164463); -INSERT INTO City VALUES (688,'Burgos','ESP','Castilla and Le�n',162802); -INSERT INTO City VALUES (689,'Salamanca','ESP','Castilla and Le�n',158720); -INSERT INTO City VALUES (690,'Albacete','ESP','Kastilia-La Mancha',147527); -INSERT INTO City VALUES (691,'Getafe','ESP','Madrid',145371); -INSERT INTO City VALUES (692,'C�diz','ESP','Andalusia',142449); -INSERT INTO City VALUES (693,'Alcorc�n','ESP','Madrid',142048); -INSERT INTO City VALUES (694,'Huelva','ESP','Andalusia',140583); -INSERT INTO City VALUES (695,'Le�n','ESP','Castilla and Le�n',139809); -INSERT INTO City VALUES (696,'Castell�n de la Plana [Castell','ESP','Valencia',139712); -INSERT INTO City VALUES (697,'Badajoz','ESP','Extremadura',136613); -INSERT INTO City VALUES (698,'[San Crist�bal de] la Laguna','ESP','Canary Islands',127945); -INSERT INTO City VALUES (699,'Logro�o','ESP','La Rioja',127093); -INSERT INTO City VALUES (700,'Santa Coloma de Gramenet','ESP','Katalonia',120802); -INSERT INTO City VALUES (701,'Tarragona','ESP','Katalonia',113016); -INSERT INTO City VALUES (702,'Lleida (L�rida)','ESP','Katalonia',112207); -INSERT INTO City VALUES (703,'Ja�n','ESP','Andalusia',109247); -INSERT INTO City VALUES (704,'Ourense (Orense)','ESP','Galicia',109120); -INSERT INTO City VALUES (705,'Matar�','ESP','Katalonia',104095); -INSERT INTO City VALUES (706,'Algeciras','ESP','Andalusia',103106); -INSERT INTO City VALUES (707,'Marbella','ESP','Andalusia',101144); -INSERT INTO City VALUES (708,'Barakaldo','ESP','Baskimaa',98212); -INSERT INTO City VALUES (709,'Dos Hermanas','ESP','Andalusia',94591); -INSERT INTO City VALUES (710,'Santiago de Compostela','ESP','Galicia',93745); -INSERT INTO City VALUES (711,'Torrej�n de Ardoz','ESP','Madrid',92262); -INSERT INTO City VALUES (712,'Cape Town','ZAF','Western Cape',2352121); -INSERT INTO City VALUES (713,'Soweto','ZAF','Gauteng',904165); -INSERT INTO City VALUES (714,'Johannesburg','ZAF','Gauteng',756653); -INSERT INTO City VALUES (715,'Port Elizabeth','ZAF','Eastern Cape',752319); -INSERT INTO City VALUES (716,'Pretoria','ZAF','Gauteng',658630); -INSERT INTO City VALUES (717,'Inanda','ZAF','KwaZulu-Natal',634065); -INSERT INTO City VALUES (718,'Durban','ZAF','KwaZulu-Natal',566120); -INSERT INTO City VALUES (719,'Vanderbijlpark','ZAF','Gauteng',468931); -INSERT INTO City VALUES (720,'Kempton Park','ZAF','Gauteng',442633); -INSERT INTO City VALUES (721,'Alberton','ZAF','Gauteng',410102); -INSERT INTO City VALUES (722,'Pinetown','ZAF','KwaZulu-Natal',378810); -INSERT INTO City VALUES (723,'Pietermaritzburg','ZAF','KwaZulu-Natal',370190); -INSERT INTO City VALUES (724,'Benoni','ZAF','Gauteng',365467); -INSERT INTO City VALUES (725,'Randburg','ZAF','Gauteng',341288); -INSERT INTO City VALUES (726,'Umlazi','ZAF','KwaZulu-Natal',339233); -INSERT INTO City VALUES (727,'Bloemfontein','ZAF','Free State',334341); -INSERT INTO City VALUES (728,'Vereeniging','ZAF','Gauteng',328535); -INSERT INTO City VALUES (729,'Wonderboom','ZAF','Gauteng',283289); -INSERT INTO City VALUES (730,'Roodepoort','ZAF','Gauteng',279340); -INSERT INTO City VALUES (731,'Boksburg','ZAF','Gauteng',262648); -INSERT INTO City VALUES (732,'Klerksdorp','ZAF','North West',261911); -INSERT INTO City VALUES (733,'Soshanguve','ZAF','Gauteng',242727); -INSERT INTO City VALUES (734,'Newcastle','ZAF','KwaZulu-Natal',222993); -INSERT INTO City VALUES (735,'East London','ZAF','Eastern Cape',221047); -INSERT INTO City VALUES (736,'Welkom','ZAF','Free State',203296); -INSERT INTO City VALUES (737,'Kimberley','ZAF','Northern Cape',197254); -INSERT INTO City VALUES (738,'Uitenhage','ZAF','Eastern Cape',192120); -INSERT INTO City VALUES (739,'Chatsworth','ZAF','KwaZulu-Natal',189885); -INSERT INTO City VALUES (740,'Mdantsane','ZAF','Eastern Cape',182639); -INSERT INTO City VALUES (741,'Krugersdorp','ZAF','Gauteng',181503); -INSERT INTO City VALUES (742,'Botshabelo','ZAF','Free State',177971); -INSERT INTO City VALUES (743,'Brakpan','ZAF','Gauteng',171363); -INSERT INTO City VALUES (744,'Witbank','ZAF','Mpumalanga',167183); -INSERT INTO City VALUES (745,'Oberholzer','ZAF','Gauteng',164367); -INSERT INTO City VALUES (746,'Germiston','ZAF','Gauteng',164252); -INSERT INTO City VALUES (747,'Springs','ZAF','Gauteng',162072); -INSERT INTO City VALUES (748,'Westonaria','ZAF','Gauteng',159632); -INSERT INTO City VALUES (749,'Randfontein','ZAF','Gauteng',120838); -INSERT INTO City VALUES (750,'Paarl','ZAF','Western Cape',105768); -INSERT INTO City VALUES (751,'Potchefstroom','ZAF','North West',101817); -INSERT INTO City VALUES (752,'Rustenburg','ZAF','North West',97008); -INSERT INTO City VALUES (753,'Nigel','ZAF','Gauteng',96734); -INSERT INTO City VALUES (754,'George','ZAF','Western Cape',93818); -INSERT INTO City VALUES (755,'Ladysmith','ZAF','KwaZulu-Natal',89292); -INSERT INTO City VALUES (756,'Addis Abeba','ETH','Addis Abeba',2495000); -INSERT INTO City VALUES (757,'Dire Dawa','ETH','Dire Dawa',164851); -INSERT INTO City VALUES (758,'Nazret','ETH','Oromia',127842); -INSERT INTO City VALUES (759,'Gonder','ETH','Amhara',112249); -INSERT INTO City VALUES (760,'Dese','ETH','Amhara',97314); -INSERT INTO City VALUES (761,'Mekele','ETH','Tigray',96938); -INSERT INTO City VALUES (762,'Bahir Dar','ETH','Amhara',96140); -INSERT INTO City VALUES (763,'Stanley','FLK','East Falkland',1636); -INSERT INTO City VALUES (764,'Suva','FJI','Central',77366); -INSERT INTO City VALUES (765,'Quezon','PHL','National Capital Reg',2173831); -INSERT INTO City VALUES (766,'Manila','PHL','National Capital Reg',1581082); -INSERT INTO City VALUES (767,'Kalookan','PHL','National Capital Reg',1177604); -INSERT INTO City VALUES (768,'Davao','PHL','Southern Mindanao',1147116); -INSERT INTO City VALUES (769,'Cebu','PHL','Central Visayas',718821); -INSERT INTO City VALUES (770,'Zamboanga','PHL','Western Mindanao',601794); -INSERT INTO City VALUES (771,'Pasig','PHL','National Capital Reg',505058); -INSERT INTO City VALUES (772,'Valenzuela','PHL','National Capital Reg',485433); -INSERT INTO City VALUES (773,'Las Pi�as','PHL','National Capital Reg',472780); -INSERT INTO City VALUES (774,'Antipolo','PHL','Southern Tagalog',470866); -INSERT INTO City VALUES (775,'Taguig','PHL','National Capital Reg',467375); -INSERT INTO City VALUES (776,'Cagayan de Oro','PHL','Northern Mindanao',461877); -INSERT INTO City VALUES (777,'Para�aque','PHL','National Capital Reg',449811); -INSERT INTO City VALUES (778,'Makati','PHL','National Capital Reg',444867); -INSERT INTO City VALUES (779,'Bacolod','PHL','Western Visayas',429076); -INSERT INTO City VALUES (780,'General Santos','PHL','Southern Mindanao',411822); -INSERT INTO City VALUES (781,'Marikina','PHL','National Capital Reg',391170); -INSERT INTO City VALUES (782,'Dasmari�as','PHL','Southern Tagalog',379520); -INSERT INTO City VALUES (783,'Muntinlupa','PHL','National Capital Reg',379310); -INSERT INTO City VALUES (784,'Iloilo','PHL','Western Visayas',365820); -INSERT INTO City VALUES (785,'Pasay','PHL','National Capital Reg',354908); -INSERT INTO City VALUES (786,'Malabon','PHL','National Capital Reg',338855); -INSERT INTO City VALUES (787,'San Jos� del Monte','PHL','Central Luzon',315807); -INSERT INTO City VALUES (788,'Bacoor','PHL','Southern Tagalog',305699); -INSERT INTO City VALUES (789,'Iligan','PHL','Central Mindanao',285061); -INSERT INTO City VALUES (790,'Calamba','PHL','Southern Tagalog',281146); -INSERT INTO City VALUES (791,'Mandaluyong','PHL','National Capital Reg',278474); -INSERT INTO City VALUES (792,'Butuan','PHL','Caraga',267279); -INSERT INTO City VALUES (793,'Angeles','PHL','Central Luzon',263971); -INSERT INTO City VALUES (794,'Tarlac','PHL','Central Luzon',262481); -INSERT INTO City VALUES (795,'Mandaue','PHL','Central Visayas',259728); -INSERT INTO City VALUES (796,'Baguio','PHL','CAR',252386); -INSERT INTO City VALUES (797,'Batangas','PHL','Southern Tagalog',247588); -INSERT INTO City VALUES (798,'Cainta','PHL','Southern Tagalog',242511); -INSERT INTO City VALUES (799,'San Pedro','PHL','Southern Tagalog',231403); -INSERT INTO City VALUES (800,'Navotas','PHL','National Capital Reg',230403); -INSERT INTO City VALUES (801,'Cabanatuan','PHL','Central Luzon',222859); -INSERT INTO City VALUES (802,'San Fernando','PHL','Central Luzon',221857); -INSERT INTO City VALUES (803,'Lipa','PHL','Southern Tagalog',218447); -INSERT INTO City VALUES (804,'Lapu-Lapu','PHL','Central Visayas',217019); -INSERT INTO City VALUES (805,'San Pablo','PHL','Southern Tagalog',207927); -INSERT INTO City VALUES (806,'Bi�an','PHL','Southern Tagalog',201186); -INSERT INTO City VALUES (807,'Taytay','PHL','Southern Tagalog',198183); -INSERT INTO City VALUES (808,'Lucena','PHL','Southern Tagalog',196075); -INSERT INTO City VALUES (809,'Imus','PHL','Southern Tagalog',195482); -INSERT INTO City VALUES (810,'Olongapo','PHL','Central Luzon',194260); -INSERT INTO City VALUES (811,'Binangonan','PHL','Southern Tagalog',187691); -INSERT INTO City VALUES (812,'Santa Rosa','PHL','Southern Tagalog',185633); -INSERT INTO City VALUES (813,'Tagum','PHL','Southern Mindanao',179531); -INSERT INTO City VALUES (814,'Tacloban','PHL','Eastern Visayas',178639); -INSERT INTO City VALUES (815,'Malolos','PHL','Central Luzon',175291); -INSERT INTO City VALUES (816,'Mabalacat','PHL','Central Luzon',171045); -INSERT INTO City VALUES (817,'Cotabato','PHL','Central Mindanao',163849); -INSERT INTO City VALUES (818,'Meycauayan','PHL','Central Luzon',163037); -INSERT INTO City VALUES (819,'Puerto Princesa','PHL','Southern Tagalog',161912); -INSERT INTO City VALUES (820,'Legazpi','PHL','Bicol',157010); -INSERT INTO City VALUES (821,'Silang','PHL','Southern Tagalog',156137); -INSERT INTO City VALUES (822,'Ormoc','PHL','Eastern Visayas',154297); -INSERT INTO City VALUES (823,'San Carlos','PHL','Ilocos',154264); -INSERT INTO City VALUES (824,'Kabankalan','PHL','Western Visayas',149769); -INSERT INTO City VALUES (825,'Talisay','PHL','Central Visayas',148110); -INSERT INTO City VALUES (826,'Valencia','PHL','Northern Mindanao',147924); -INSERT INTO City VALUES (827,'Calbayog','PHL','Eastern Visayas',147187); -INSERT INTO City VALUES (828,'Santa Maria','PHL','Central Luzon',144282); -INSERT INTO City VALUES (829,'Pagadian','PHL','Western Mindanao',142515); -INSERT INTO City VALUES (830,'Cadiz','PHL','Western Visayas',141954); -INSERT INTO City VALUES (831,'Bago','PHL','Western Visayas',141721); -INSERT INTO City VALUES (832,'Toledo','PHL','Central Visayas',141174); -INSERT INTO City VALUES (833,'Naga','PHL','Bicol',137810); -INSERT INTO City VALUES (834,'San Mateo','PHL','Southern Tagalog',135603); -INSERT INTO City VALUES (835,'Panabo','PHL','Southern Mindanao',133950); -INSERT INTO City VALUES (836,'Koronadal','PHL','Southern Mindanao',133786); -INSERT INTO City VALUES (837,'Marawi','PHL','Central Mindanao',131090); -INSERT INTO City VALUES (838,'Dagupan','PHL','Ilocos',130328); -INSERT INTO City VALUES (839,'Sagay','PHL','Western Visayas',129765); -INSERT INTO City VALUES (840,'Roxas','PHL','Western Visayas',126352); -INSERT INTO City VALUES (841,'Lubao','PHL','Central Luzon',125699); -INSERT INTO City VALUES (842,'Digos','PHL','Southern Mindanao',125171); -INSERT INTO City VALUES (843,'San Miguel','PHL','Central Luzon',123824); -INSERT INTO City VALUES (844,'Malaybalay','PHL','Northern Mindanao',123672); -INSERT INTO City VALUES (845,'Tuguegarao','PHL','Cagayan Valley',120645); -INSERT INTO City VALUES (846,'Ilagan','PHL','Cagayan Valley',119990); -INSERT INTO City VALUES (847,'Baliuag','PHL','Central Luzon',119675); -INSERT INTO City VALUES (848,'Surigao','PHL','Caraga',118534); -INSERT INTO City VALUES (849,'San Carlos','PHL','Western Visayas',118259); -INSERT INTO City VALUES (850,'San Juan del Monte','PHL','National Capital Reg',117680); -INSERT INTO City VALUES (851,'Tanauan','PHL','Southern Tagalog',117539); -INSERT INTO City VALUES (852,'Concepcion','PHL','Central Luzon',115171); -INSERT INTO City VALUES (853,'Rodriguez (Montalban)','PHL','Southern Tagalog',115167); -INSERT INTO City VALUES (854,'Sariaya','PHL','Southern Tagalog',114568); -INSERT INTO City VALUES (855,'Malasiqui','PHL','Ilocos',113190); -INSERT INTO City VALUES (856,'General Mariano Alvarez','PHL','Southern Tagalog',112446); -INSERT INTO City VALUES (857,'Urdaneta','PHL','Ilocos',111582); -INSERT INTO City VALUES (858,'Hagonoy','PHL','Central Luzon',111425); -INSERT INTO City VALUES (859,'San Jose','PHL','Southern Tagalog',111009); -INSERT INTO City VALUES (860,'Polomolok','PHL','Southern Mindanao',110709); -INSERT INTO City VALUES (861,'Santiago','PHL','Cagayan Valley',110531); -INSERT INTO City VALUES (862,'Tanza','PHL','Southern Tagalog',110517); -INSERT INTO City VALUES (863,'Ozamis','PHL','Northern Mindanao',110420); -INSERT INTO City VALUES (864,'Mexico','PHL','Central Luzon',109481); -INSERT INTO City VALUES (865,'San Jose','PHL','Central Luzon',108254); -INSERT INTO City VALUES (866,'Silay','PHL','Western Visayas',107722); -INSERT INTO City VALUES (867,'General Trias','PHL','Southern Tagalog',107691); -INSERT INTO City VALUES (868,'Tabaco','PHL','Bicol',107166); -INSERT INTO City VALUES (869,'Cabuyao','PHL','Southern Tagalog',106630); -INSERT INTO City VALUES (870,'Calapan','PHL','Southern Tagalog',105910); -INSERT INTO City VALUES (871,'Mati','PHL','Southern Mindanao',105908); -INSERT INTO City VALUES (872,'Midsayap','PHL','Central Mindanao',105760); -INSERT INTO City VALUES (873,'Cauayan','PHL','Cagayan Valley',103952); -INSERT INTO City VALUES (874,'Gingoog','PHL','Northern Mindanao',102379); -INSERT INTO City VALUES (875,'Dumaguete','PHL','Central Visayas',102265); -INSERT INTO City VALUES (876,'San Fernando','PHL','Ilocos',102082); -INSERT INTO City VALUES (877,'Arayat','PHL','Central Luzon',101792); -INSERT INTO City VALUES (878,'Bayawan (Tulong)','PHL','Central Visayas',101391); -INSERT INTO City VALUES (879,'Kidapawan','PHL','Central Mindanao',101205); -INSERT INTO City VALUES (880,'Daraga (Locsin)','PHL','Bicol',101031); -INSERT INTO City VALUES (881,'Marilao','PHL','Central Luzon',101017); -INSERT INTO City VALUES (882,'Malita','PHL','Southern Mindanao',100000); -INSERT INTO City VALUES (883,'Dipolog','PHL','Western Mindanao',99862); -INSERT INTO City VALUES (884,'Cavite','PHL','Southern Tagalog',99367); -INSERT INTO City VALUES (885,'Danao','PHL','Central Visayas',98781); -INSERT INTO City VALUES (886,'Bislig','PHL','Caraga',97860); -INSERT INTO City VALUES (887,'Talavera','PHL','Central Luzon',97329); -INSERT INTO City VALUES (888,'Guagua','PHL','Central Luzon',96858); -INSERT INTO City VALUES (889,'Bayambang','PHL','Ilocos',96609); -INSERT INTO City VALUES (890,'Nasugbu','PHL','Southern Tagalog',96113); -INSERT INTO City VALUES (891,'Baybay','PHL','Eastern Visayas',95630); -INSERT INTO City VALUES (892,'Capas','PHL','Central Luzon',95219); -INSERT INTO City VALUES (893,'Sultan Kudarat','PHL','ARMM',94861); -INSERT INTO City VALUES (894,'Laoag','PHL','Ilocos',94466); -INSERT INTO City VALUES (895,'Bayugan','PHL','Caraga',93623); -INSERT INTO City VALUES (896,'Malungon','PHL','Southern Mindanao',93232); -INSERT INTO City VALUES (897,'Santa Cruz','PHL','Southern Tagalog',92694); -INSERT INTO City VALUES (898,'Sorsogon','PHL','Bicol',92512); -INSERT INTO City VALUES (899,'Candelaria','PHL','Southern Tagalog',92429); -INSERT INTO City VALUES (900,'Ligao','PHL','Bicol',90603); -INSERT INTO City VALUES (901,'T�rshavn','FRO','Streymoyar',14542); -INSERT INTO City VALUES (902,'Libreville','GAB','Estuaire',419000); -INSERT INTO City VALUES (903,'Serekunda','GMB','Kombo St Mary',102600); -INSERT INTO City VALUES (904,'Banjul','GMB','Banjul',42326); -INSERT INTO City VALUES (905,'Tbilisi','GEO','Tbilisi',1235200); -INSERT INTO City VALUES (906,'Kutaisi','GEO','Imereti',240900); -INSERT INTO City VALUES (907,'Rustavi','GEO','Kvemo Kartli',155400); -INSERT INTO City VALUES (908,'Batumi','GEO','Adzaria [At�ara]',137700); -INSERT INTO City VALUES (909,'Sohumi','GEO','Abhasia [Aphazeti]',111700); -INSERT INTO City VALUES (910,'Accra','GHA','Greater Accra',1070000); -INSERT INTO City VALUES (911,'Kumasi','GHA','Ashanti',385192); -INSERT INTO City VALUES (912,'Tamale','GHA','Northern',151069); -INSERT INTO City VALUES (913,'Tema','GHA','Greater Accra',109975); -INSERT INTO City VALUES (914,'Sekondi-Takoradi','GHA','Western',103653); -INSERT INTO City VALUES (915,'Gibraltar','GIB','�',27025); -INSERT INTO City VALUES (916,'Saint George�s','GRD','St George',4621); -INSERT INTO City VALUES (917,'Nuuk','GRL','Kitaa',13445); -INSERT INTO City VALUES (918,'Les Abymes','GLP','Grande-Terre',62947); -INSERT INTO City VALUES (919,'Basse-Terre','GLP','Basse-Terre',12433); -INSERT INTO City VALUES (920,'Tamuning','GUM','�',9500); -INSERT INTO City VALUES (921,'Aga�a','GUM','�',1139); -INSERT INTO City VALUES (922,'Ciudad de Guatemala','GTM','Guatemala',823301); -INSERT INTO City VALUES (923,'Mixco','GTM','Guatemala',209791); -INSERT INTO City VALUES (924,'Villa Nueva','GTM','Guatemala',101295); -INSERT INTO City VALUES (925,'Quetzaltenango','GTM','Quetzaltenango',90801); -INSERT INTO City VALUES (926,'Conakry','GIN','Conakry',1090610); -INSERT INTO City VALUES (927,'Bissau','GNB','Bissau',241000); -INSERT INTO City VALUES (928,'Georgetown','GUY','Georgetown',254000); -INSERT INTO City VALUES (929,'Port-au-Prince','HTI','Ouest',884472); -INSERT INTO City VALUES (930,'Carrefour','HTI','Ouest',290204); -INSERT INTO City VALUES (931,'Delmas','HTI','Ouest',240429); -INSERT INTO City VALUES (932,'Le-Cap-Ha�tien','HTI','Nord',102233); -INSERT INTO City VALUES (933,'Tegucigalpa','HND','Distrito Central',813900); -INSERT INTO City VALUES (934,'San Pedro Sula','HND','Cort�s',383900); -INSERT INTO City VALUES (935,'La Ceiba','HND','Atl�ntida',89200); -INSERT INTO City VALUES (936,'Kowloon and New Kowloon','HKG','Kowloon and New Kowl',1987996); -INSERT INTO City VALUES (937,'Victoria','HKG','Hongkong',1312637); -INSERT INTO City VALUES (938,'Longyearbyen','SJM','L�nsimaa',1438); -INSERT INTO City VALUES (939,'Jakarta','IDN','Jakarta Raya',9604900); -INSERT INTO City VALUES (940,'Surabaya','IDN','East Java',2663820); -INSERT INTO City VALUES (941,'Bandung','IDN','West Java',2429000); -INSERT INTO City VALUES (942,'Medan','IDN','Sumatera Utara',1843919); -INSERT INTO City VALUES (943,'Palembang','IDN','Sumatera Selatan',1222764); -INSERT INTO City VALUES (944,'Tangerang','IDN','West Java',1198300); -INSERT INTO City VALUES (945,'Semarang','IDN','Central Java',1104405); -INSERT INTO City VALUES (946,'Ujung Pandang','IDN','Sulawesi Selatan',1060257); -INSERT INTO City VALUES (947,'Malang','IDN','East Java',716862); -INSERT INTO City VALUES (948,'Bandar Lampung','IDN','Lampung',680332); -INSERT INTO City VALUES (949,'Bekasi','IDN','West Java',644300); -INSERT INTO City VALUES (950,'Padang','IDN','Sumatera Barat',534474); -INSERT INTO City VALUES (951,'Surakarta','IDN','Central Java',518600); -INSERT INTO City VALUES (952,'Banjarmasin','IDN','Kalimantan Selatan',482931); -INSERT INTO City VALUES (953,'Pekan Baru','IDN','Riau',438638); -INSERT INTO City VALUES (954,'Denpasar','IDN','Bali',435000); -INSERT INTO City VALUES (955,'Yogyakarta','IDN','Yogyakarta',418944); -INSERT INTO City VALUES (956,'Pontianak','IDN','Kalimantan Barat',409632); -INSERT INTO City VALUES (957,'Samarinda','IDN','Kalimantan Timur',399175); -INSERT INTO City VALUES (958,'Jambi','IDN','Jambi',385201); -INSERT INTO City VALUES (959,'Depok','IDN','West Java',365200); -INSERT INTO City VALUES (960,'Cimahi','IDN','West Java',344600); -INSERT INTO City VALUES (961,'Balikpapan','IDN','Kalimantan Timur',338752); -INSERT INTO City VALUES (962,'Manado','IDN','Sulawesi Utara',332288); -INSERT INTO City VALUES (963,'Mataram','IDN','Nusa Tenggara Barat',306600); -INSERT INTO City VALUES (964,'Pekalongan','IDN','Central Java',301504); -INSERT INTO City VALUES (965,'Tegal','IDN','Central Java',289744); -INSERT INTO City VALUES (966,'Bogor','IDN','West Java',285114); -INSERT INTO City VALUES (967,'Ciputat','IDN','West Java',270800); -INSERT INTO City VALUES (968,'Pondokgede','IDN','West Java',263200); -INSERT INTO City VALUES (969,'Cirebon','IDN','West Java',254406); -INSERT INTO City VALUES (970,'Kediri','IDN','East Java',253760); -INSERT INTO City VALUES (971,'Ambon','IDN','Molukit',249312); -INSERT INTO City VALUES (972,'Jember','IDN','East Java',218500); -INSERT INTO City VALUES (973,'Cilacap','IDN','Central Java',206900); -INSERT INTO City VALUES (974,'Cimanggis','IDN','West Java',205100); -INSERT INTO City VALUES (975,'Pematang Siantar','IDN','Sumatera Utara',203056); -INSERT INTO City VALUES (976,'Purwokerto','IDN','Central Java',202500); -INSERT INTO City VALUES (977,'Ciomas','IDN','West Java',187400); -INSERT INTO City VALUES (978,'Tasikmalaya','IDN','West Java',179800); -INSERT INTO City VALUES (979,'Madiun','IDN','East Java',171532); -INSERT INTO City VALUES (980,'Bengkulu','IDN','Bengkulu',146439); -INSERT INTO City VALUES (981,'Karawang','IDN','West Java',145000); -INSERT INTO City VALUES (982,'Banda Aceh','IDN','Aceh',143409); -INSERT INTO City VALUES (983,'Palu','IDN','Sulawesi Tengah',142800); -INSERT INTO City VALUES (984,'Pasuruan','IDN','East Java',134019); -INSERT INTO City VALUES (985,'Kupang','IDN','Nusa Tenggara Timur',129300); -INSERT INTO City VALUES (986,'Tebing Tinggi','IDN','Sumatera Utara',129300); -INSERT INTO City VALUES (987,'Percut Sei Tuan','IDN','Sumatera Utara',129000); -INSERT INTO City VALUES (988,'Binjai','IDN','Sumatera Utara',127222); -INSERT INTO City VALUES (989,'Sukabumi','IDN','West Java',125766); -INSERT INTO City VALUES (990,'Waru','IDN','East Java',124300); -INSERT INTO City VALUES (991,'Pangkal Pinang','IDN','Sumatera Selatan',124000); -INSERT INTO City VALUES (992,'Magelang','IDN','Central Java',123800); -INSERT INTO City VALUES (993,'Blitar','IDN','East Java',122600); -INSERT INTO City VALUES (994,'Serang','IDN','West Java',122400); -INSERT INTO City VALUES (995,'Probolinggo','IDN','East Java',120770); -INSERT INTO City VALUES (996,'Cilegon','IDN','West Java',117000); -INSERT INTO City VALUES (997,'Cianjur','IDN','West Java',114300); -INSERT INTO City VALUES (998,'Ciparay','IDN','West Java',111500); -INSERT INTO City VALUES (999,'Lhokseumawe','IDN','Aceh',109600); -INSERT INTO City VALUES (1000,'Taman','IDN','East Java',107000); -INSERT INTO City VALUES (1001,'Depok','IDN','Yogyakarta',106800); -INSERT INTO City VALUES (1002,'Citeureup','IDN','West Java',105100); -INSERT INTO City VALUES (1003,'Pemalang','IDN','Central Java',103500); -INSERT INTO City VALUES (1004,'Klaten','IDN','Central Java',103300); -INSERT INTO City VALUES (1005,'Salatiga','IDN','Central Java',103000); -INSERT INTO City VALUES (1006,'Cibinong','IDN','West Java',101300); -INSERT INTO City VALUES (1007,'Palangka Raya','IDN','Kalimantan Tengah',99693); -INSERT INTO City VALUES (1008,'Mojokerto','IDN','East Java',96626); -INSERT INTO City VALUES (1009,'Purwakarta','IDN','West Java',95900); -INSERT INTO City VALUES (1010,'Garut','IDN','West Java',95800); -INSERT INTO City VALUES (1011,'Kudus','IDN','Central Java',95300); -INSERT INTO City VALUES (1012,'Kendari','IDN','Sulawesi Tenggara',94800); -INSERT INTO City VALUES (1013,'Jaya Pura','IDN','West Irian',94700); -INSERT INTO City VALUES (1014,'Gorontalo','IDN','Sulawesi Utara',94058); -INSERT INTO City VALUES (1015,'Majalaya','IDN','West Java',93200); -INSERT INTO City VALUES (1016,'Pondok Aren','IDN','West Java',92700); -INSERT INTO City VALUES (1017,'Jombang','IDN','East Java',92600); -INSERT INTO City VALUES (1018,'Sunggal','IDN','Sumatera Utara',92300); -INSERT INTO City VALUES (1019,'Batam','IDN','Riau',91871); -INSERT INTO City VALUES (1020,'Padang Sidempuan','IDN','Sumatera Utara',91200); -INSERT INTO City VALUES (1021,'Sawangan','IDN','West Java',91100); -INSERT INTO City VALUES (1022,'Banyuwangi','IDN','East Java',89900); -INSERT INTO City VALUES (1023,'Tanjung Pinang','IDN','Riau',89900); -INSERT INTO City VALUES (1024,'Mumbai (Bombay)','IND','Maharashtra',10500000); -INSERT INTO City VALUES (1025,'Delhi','IND','Delhi',7206704); -INSERT INTO City VALUES (1026,'Calcutta [Kolkata]','IND','West Bengali',4399819); -INSERT INTO City VALUES (1027,'Chennai (Madras)','IND','Tamil Nadu',3841396); -INSERT INTO City VALUES (1028,'Hyderabad','IND','Andhra Pradesh',2964638); -INSERT INTO City VALUES (1029,'Ahmedabad','IND','Gujarat',2876710); -INSERT INTO City VALUES (1030,'Bangalore','IND','Karnataka',2660088); -INSERT INTO City VALUES (1031,'Kanpur','IND','Uttar Pradesh',1874409); -INSERT INTO City VALUES (1032,'Nagpur','IND','Maharashtra',1624752); -INSERT INTO City VALUES (1033,'Lucknow','IND','Uttar Pradesh',1619115); -INSERT INTO City VALUES (1034,'Pune','IND','Maharashtra',1566651); -INSERT INTO City VALUES (1035,'Surat','IND','Gujarat',1498817); -INSERT INTO City VALUES (1036,'Jaipur','IND','Rajasthan',1458483); -INSERT INTO City VALUES (1037,'Indore','IND','Madhya Pradesh',1091674); -INSERT INTO City VALUES (1038,'Bhopal','IND','Madhya Pradesh',1062771); -INSERT INTO City VALUES (1039,'Ludhiana','IND','Punjab',1042740); -INSERT INTO City VALUES (1040,'Vadodara (Baroda)','IND','Gujarat',1031346); -INSERT INTO City VALUES (1041,'Kalyan','IND','Maharashtra',1014557); -INSERT INTO City VALUES (1042,'Madurai','IND','Tamil Nadu',977856); -INSERT INTO City VALUES (1043,'Haora (Howrah)','IND','West Bengali',950435); -INSERT INTO City VALUES (1044,'Varanasi (Benares)','IND','Uttar Pradesh',929270); -INSERT INTO City VALUES (1045,'Patna','IND','Bihar',917243); -INSERT INTO City VALUES (1046,'Srinagar','IND','Jammu and Kashmir',892506); -INSERT INTO City VALUES (1047,'Agra','IND','Uttar Pradesh',891790); -INSERT INTO City VALUES (1048,'Coimbatore','IND','Tamil Nadu',816321); -INSERT INTO City VALUES (1049,'Thane (Thana)','IND','Maharashtra',803389); -INSERT INTO City VALUES (1050,'Allahabad','IND','Uttar Pradesh',792858); -INSERT INTO City VALUES (1051,'Meerut','IND','Uttar Pradesh',753778); -INSERT INTO City VALUES (1052,'Vishakhapatnam','IND','Andhra Pradesh',752037); -INSERT INTO City VALUES (1053,'Jabalpur','IND','Madhya Pradesh',741927); -INSERT INTO City VALUES (1054,'Amritsar','IND','Punjab',708835); -INSERT INTO City VALUES (1055,'Faridabad','IND','Haryana',703592); -INSERT INTO City VALUES (1056,'Vijayawada','IND','Andhra Pradesh',701827); -INSERT INTO City VALUES (1057,'Gwalior','IND','Madhya Pradesh',690765); -INSERT INTO City VALUES (1058,'Jodhpur','IND','Rajasthan',666279); -INSERT INTO City VALUES (1059,'Nashik (Nasik)','IND','Maharashtra',656925); -INSERT INTO City VALUES (1060,'Hubli-Dharwad','IND','Karnataka',648298); -INSERT INTO City VALUES (1061,'Solapur (Sholapur)','IND','Maharashtra',604215); -INSERT INTO City VALUES (1062,'Ranchi','IND','Jharkhand',599306); -INSERT INTO City VALUES (1063,'Bareilly','IND','Uttar Pradesh',587211); -INSERT INTO City VALUES (1064,'Guwahati (Gauhati)','IND','Assam',584342); -INSERT INTO City VALUES (1065,'Shambajinagar (Aurangabad)','IND','Maharashtra',573272); -INSERT INTO City VALUES (1066,'Cochin (Kochi)','IND','Kerala',564589); -INSERT INTO City VALUES (1067,'Rajkot','IND','Gujarat',559407); -INSERT INTO City VALUES (1068,'Kota','IND','Rajasthan',537371); -INSERT INTO City VALUES (1069,'Thiruvananthapuram (Trivandrum','IND','Kerala',524006); -INSERT INTO City VALUES (1070,'Pimpri-Chinchwad','IND','Maharashtra',517083); -INSERT INTO City VALUES (1071,'Jalandhar (Jullundur)','IND','Punjab',509510); -INSERT INTO City VALUES (1072,'Gorakhpur','IND','Uttar Pradesh',505566); -INSERT INTO City VALUES (1073,'Chandigarh','IND','Chandigarh',504094); -INSERT INTO City VALUES (1074,'Mysore','IND','Karnataka',480692); -INSERT INTO City VALUES (1075,'Aligarh','IND','Uttar Pradesh',480520); -INSERT INTO City VALUES (1076,'Guntur','IND','Andhra Pradesh',471051); -INSERT INTO City VALUES (1077,'Jamshedpur','IND','Jharkhand',460577); -INSERT INTO City VALUES (1078,'Ghaziabad','IND','Uttar Pradesh',454156); -INSERT INTO City VALUES (1079,'Warangal','IND','Andhra Pradesh',447657); -INSERT INTO City VALUES (1080,'Raipur','IND','Chhatisgarh',438639); -INSERT INTO City VALUES (1081,'Moradabad','IND','Uttar Pradesh',429214); -INSERT INTO City VALUES (1082,'Durgapur','IND','West Bengali',425836); -INSERT INTO City VALUES (1083,'Amravati','IND','Maharashtra',421576); -INSERT INTO City VALUES (1084,'Calicut (Kozhikode)','IND','Kerala',419831); -INSERT INTO City VALUES (1085,'Bikaner','IND','Rajasthan',416289); -INSERT INTO City VALUES (1086,'Bhubaneswar','IND','Orissa',411542); -INSERT INTO City VALUES (1087,'Kolhapur','IND','Maharashtra',406370); -INSERT INTO City VALUES (1088,'Kataka (Cuttack)','IND','Orissa',403418); -INSERT INTO City VALUES (1089,'Ajmer','IND','Rajasthan',402700); -INSERT INTO City VALUES (1090,'Bhavnagar','IND','Gujarat',402338); -INSERT INTO City VALUES (1091,'Tiruchirapalli','IND','Tamil Nadu',387223); -INSERT INTO City VALUES (1092,'Bhilai','IND','Chhatisgarh',386159); -INSERT INTO City VALUES (1093,'Bhiwandi','IND','Maharashtra',379070); -INSERT INTO City VALUES (1094,'Saharanpur','IND','Uttar Pradesh',374945); -INSERT INTO City VALUES (1095,'Ulhasnagar','IND','Maharashtra',369077); -INSERT INTO City VALUES (1096,'Salem','IND','Tamil Nadu',366712); -INSERT INTO City VALUES (1097,'Ujjain','IND','Madhya Pradesh',362266); -INSERT INTO City VALUES (1098,'Malegaon','IND','Maharashtra',342595); -INSERT INTO City VALUES (1099,'Jamnagar','IND','Gujarat',341637); -INSERT INTO City VALUES (1100,'Bokaro Steel City','IND','Jharkhand',333683); -INSERT INTO City VALUES (1101,'Akola','IND','Maharashtra',328034); -INSERT INTO City VALUES (1102,'Belgaum','IND','Karnataka',326399); -INSERT INTO City VALUES (1103,'Rajahmundry','IND','Andhra Pradesh',324851); -INSERT INTO City VALUES (1104,'Nellore','IND','Andhra Pradesh',316606); -INSERT INTO City VALUES (1105,'Udaipur','IND','Rajasthan',308571); -INSERT INTO City VALUES (1106,'New Bombay','IND','Maharashtra',307297); -INSERT INTO City VALUES (1107,'Bhatpara','IND','West Bengali',304952); -INSERT INTO City VALUES (1108,'Gulbarga','IND','Karnataka',304099); -INSERT INTO City VALUES (1109,'New Delhi','IND','Delhi',301297); -INSERT INTO City VALUES (1110,'Jhansi','IND','Uttar Pradesh',300850); -INSERT INTO City VALUES (1111,'Gaya','IND','Bihar',291675); -INSERT INTO City VALUES (1112,'Kakinada','IND','Andhra Pradesh',279980); -INSERT INTO City VALUES (1113,'Dhule (Dhulia)','IND','Maharashtra',278317); -INSERT INTO City VALUES (1114,'Panihati','IND','West Bengali',275990); -INSERT INTO City VALUES (1115,'Nanded (Nander)','IND','Maharashtra',275083); -INSERT INTO City VALUES (1116,'Mangalore','IND','Karnataka',273304); -INSERT INTO City VALUES (1117,'Dehra Dun','IND','Uttaranchal',270159); -INSERT INTO City VALUES (1118,'Kamarhati','IND','West Bengali',266889); -INSERT INTO City VALUES (1119,'Davangere','IND','Karnataka',266082); -INSERT INTO City VALUES (1120,'Asansol','IND','West Bengali',262188); -INSERT INTO City VALUES (1121,'Bhagalpur','IND','Bihar',253225); -INSERT INTO City VALUES (1122,'Bellary','IND','Karnataka',245391); -INSERT INTO City VALUES (1123,'Barddhaman (Burdwan)','IND','West Bengali',245079); -INSERT INTO City VALUES (1124,'Rampur','IND','Uttar Pradesh',243742); -INSERT INTO City VALUES (1125,'Jalgaon','IND','Maharashtra',242193); -INSERT INTO City VALUES (1126,'Muzaffarpur','IND','Bihar',241107); -INSERT INTO City VALUES (1127,'Nizamabad','IND','Andhra Pradesh',241034); -INSERT INTO City VALUES (1128,'Muzaffarnagar','IND','Uttar Pradesh',240609); -INSERT INTO City VALUES (1129,'Patiala','IND','Punjab',238368); -INSERT INTO City VALUES (1130,'Shahjahanpur','IND','Uttar Pradesh',237713); -INSERT INTO City VALUES (1131,'Kurnool','IND','Andhra Pradesh',236800); -INSERT INTO City VALUES (1132,'Tiruppur (Tirupper)','IND','Tamil Nadu',235661); -INSERT INTO City VALUES (1133,'Rohtak','IND','Haryana',233400); -INSERT INTO City VALUES (1134,'South Dum Dum','IND','West Bengali',232811); -INSERT INTO City VALUES (1135,'Mathura','IND','Uttar Pradesh',226691); -INSERT INTO City VALUES (1136,'Chandrapur','IND','Maharashtra',226105); -INSERT INTO City VALUES (1137,'Barahanagar (Baranagar)','IND','West Bengali',224821); -INSERT INTO City VALUES (1138,'Darbhanga','IND','Bihar',218391); -INSERT INTO City VALUES (1139,'Siliguri (Shiliguri)','IND','West Bengali',216950); -INSERT INTO City VALUES (1140,'Raurkela','IND','Orissa',215489); -INSERT INTO City VALUES (1141,'Ambattur','IND','Tamil Nadu',215424); -INSERT INTO City VALUES (1142,'Panipat','IND','Haryana',215218); -INSERT INTO City VALUES (1143,'Firozabad','IND','Uttar Pradesh',215128); -INSERT INTO City VALUES (1144,'Ichalkaranji','IND','Maharashtra',214950); -INSERT INTO City VALUES (1145,'Jammu','IND','Jammu and Kashmir',214737); -INSERT INTO City VALUES (1146,'Ramagundam','IND','Andhra Pradesh',214384); -INSERT INTO City VALUES (1147,'Eluru','IND','Andhra Pradesh',212866); -INSERT INTO City VALUES (1148,'Brahmapur','IND','Orissa',210418); -INSERT INTO City VALUES (1149,'Alwar','IND','Rajasthan',205086); -INSERT INTO City VALUES (1150,'Pondicherry','IND','Pondicherry',203065); -INSERT INTO City VALUES (1151,'Thanjavur','IND','Tamil Nadu',202013); -INSERT INTO City VALUES (1152,'Bihar Sharif','IND','Bihar',201323); -INSERT INTO City VALUES (1153,'Tuticorin','IND','Tamil Nadu',199854); -INSERT INTO City VALUES (1154,'Imphal','IND','Manipur',198535); -INSERT INTO City VALUES (1155,'Latur','IND','Maharashtra',197408); -INSERT INTO City VALUES (1156,'Sagar','IND','Madhya Pradesh',195346); -INSERT INTO City VALUES (1157,'Farrukhabad-cum-Fatehgarh','IND','Uttar Pradesh',194567); -INSERT INTO City VALUES (1158,'Sangli','IND','Maharashtra',193197); -INSERT INTO City VALUES (1159,'Parbhani','IND','Maharashtra',190255); -INSERT INTO City VALUES (1160,'Nagar Coil','IND','Tamil Nadu',190084); -INSERT INTO City VALUES (1161,'Bijapur','IND','Karnataka',186939); -INSERT INTO City VALUES (1162,'Kukatpalle','IND','Andhra Pradesh',185378); -INSERT INTO City VALUES (1163,'Bally','IND','West Bengali',184474); -INSERT INTO City VALUES (1164,'Bhilwara','IND','Rajasthan',183965); -INSERT INTO City VALUES (1165,'Ratlam','IND','Madhya Pradesh',183375); -INSERT INTO City VALUES (1166,'Avadi','IND','Tamil Nadu',183215); -INSERT INTO City VALUES (1167,'Dindigul','IND','Tamil Nadu',182477); -INSERT INTO City VALUES (1168,'Ahmadnagar','IND','Maharashtra',181339); -INSERT INTO City VALUES (1169,'Bilaspur','IND','Chhatisgarh',179833); -INSERT INTO City VALUES (1170,'Shimoga','IND','Karnataka',179258); -INSERT INTO City VALUES (1171,'Kharagpur','IND','West Bengali',177989); -INSERT INTO City VALUES (1172,'Mira Bhayandar','IND','Maharashtra',175372); -INSERT INTO City VALUES (1173,'Vellore','IND','Tamil Nadu',175061); -INSERT INTO City VALUES (1174,'Jalna','IND','Maharashtra',174985); -INSERT INTO City VALUES (1175,'Burnpur','IND','West Bengali',174933); -INSERT INTO City VALUES (1176,'Anantapur','IND','Andhra Pradesh',174924); -INSERT INTO City VALUES (1177,'Allappuzha (Alleppey)','IND','Kerala',174666); -INSERT INTO City VALUES (1178,'Tirupati','IND','Andhra Pradesh',174369); -INSERT INTO City VALUES (1179,'Karnal','IND','Haryana',173751); -INSERT INTO City VALUES (1180,'Burhanpur','IND','Madhya Pradesh',172710); -INSERT INTO City VALUES (1181,'Hisar (Hissar)','IND','Haryana',172677); -INSERT INTO City VALUES (1182,'Tiruvottiyur','IND','Tamil Nadu',172562); -INSERT INTO City VALUES (1183,'Mirzapur-cum-Vindhyachal','IND','Uttar Pradesh',169336); -INSERT INTO City VALUES (1184,'Secunderabad','IND','Andhra Pradesh',167461); -INSERT INTO City VALUES (1185,'Nadiad','IND','Gujarat',167051); -INSERT INTO City VALUES (1186,'Dewas','IND','Madhya Pradesh',164364); -INSERT INTO City VALUES (1187,'Murwara (Katni)','IND','Madhya Pradesh',163431); -INSERT INTO City VALUES (1188,'Ganganagar','IND','Rajasthan',161482); -INSERT INTO City VALUES (1189,'Vizianagaram','IND','Andhra Pradesh',160359); -INSERT INTO City VALUES (1190,'Erode','IND','Tamil Nadu',159232); -INSERT INTO City VALUES (1191,'Machilipatnam (Masulipatam)','IND','Andhra Pradesh',159110); -INSERT INTO City VALUES (1192,'Bhatinda (Bathinda)','IND','Punjab',159042); -INSERT INTO City VALUES (1193,'Raichur','IND','Karnataka',157551); -INSERT INTO City VALUES (1194,'Agartala','IND','Tripura',157358); -INSERT INTO City VALUES (1195,'Arrah (Ara)','IND','Bihar',157082); -INSERT INTO City VALUES (1196,'Satna','IND','Madhya Pradesh',156630); -INSERT INTO City VALUES (1197,'Lalbahadur Nagar','IND','Andhra Pradesh',155500); -INSERT INTO City VALUES (1198,'Aizawl','IND','Mizoram',155240); -INSERT INTO City VALUES (1199,'Uluberia','IND','West Bengali',155172); -INSERT INTO City VALUES (1200,'Katihar','IND','Bihar',154367); -INSERT INTO City VALUES (1201,'Cuddalore','IND','Tamil Nadu',153086); -INSERT INTO City VALUES (1202,'Hugli-Chinsurah','IND','West Bengali',151806); -INSERT INTO City VALUES (1203,'Dhanbad','IND','Jharkhand',151789); -INSERT INTO City VALUES (1204,'Raiganj','IND','West Bengali',151045); -INSERT INTO City VALUES (1205,'Sambhal','IND','Uttar Pradesh',150869); -INSERT INTO City VALUES (1206,'Durg','IND','Chhatisgarh',150645); -INSERT INTO City VALUES (1207,'Munger (Monghyr)','IND','Bihar',150112); -INSERT INTO City VALUES (1208,'Kanchipuram','IND','Tamil Nadu',150100); -INSERT INTO City VALUES (1209,'North Dum Dum','IND','West Bengali',149965); -INSERT INTO City VALUES (1210,'Karimnagar','IND','Andhra Pradesh',148583); -INSERT INTO City VALUES (1211,'Bharatpur','IND','Rajasthan',148519); -INSERT INTO City VALUES (1212,'Sikar','IND','Rajasthan',148272); -INSERT INTO City VALUES (1213,'Hardwar (Haridwar)','IND','Uttaranchal',147305); -INSERT INTO City VALUES (1214,'Dabgram','IND','West Bengali',147217); -INSERT INTO City VALUES (1215,'Morena','IND','Madhya Pradesh',147124); -INSERT INTO City VALUES (1216,'Noida','IND','Uttar Pradesh',146514); -INSERT INTO City VALUES (1217,'Hapur','IND','Uttar Pradesh',146262); -INSERT INTO City VALUES (1218,'Bhusawal','IND','Maharashtra',145143); -INSERT INTO City VALUES (1219,'Khandwa','IND','Madhya Pradesh',145133); -INSERT INTO City VALUES (1220,'Yamuna Nagar','IND','Haryana',144346); -INSERT INTO City VALUES (1221,'Sonipat (Sonepat)','IND','Haryana',143922); -INSERT INTO City VALUES (1222,'Tenali','IND','Andhra Pradesh',143726); -INSERT INTO City VALUES (1223,'Raurkela Civil Township','IND','Orissa',140408); -INSERT INTO City VALUES (1224,'Kollam (Quilon)','IND','Kerala',139852); -INSERT INTO City VALUES (1225,'Kumbakonam','IND','Tamil Nadu',139483); -INSERT INTO City VALUES (1226,'Ingraj Bazar (English Bazar)','IND','West Bengali',139204); -INSERT INTO City VALUES (1227,'Timkur','IND','Karnataka',138903); -INSERT INTO City VALUES (1228,'Amroha','IND','Uttar Pradesh',137061); -INSERT INTO City VALUES (1229,'Serampore','IND','West Bengali',137028); -INSERT INTO City VALUES (1230,'Chapra','IND','Bihar',136877); -INSERT INTO City VALUES (1231,'Pali','IND','Rajasthan',136842); -INSERT INTO City VALUES (1232,'Maunath Bhanjan','IND','Uttar Pradesh',136697); -INSERT INTO City VALUES (1233,'Adoni','IND','Andhra Pradesh',136182); -INSERT INTO City VALUES (1234,'Jaunpur','IND','Uttar Pradesh',136062); -INSERT INTO City VALUES (1235,'Tirunelveli','IND','Tamil Nadu',135825); -INSERT INTO City VALUES (1236,'Bahraich','IND','Uttar Pradesh',135400); -INSERT INTO City VALUES (1237,'Gadag Betigeri','IND','Karnataka',134051); -INSERT INTO City VALUES (1238,'Proddatur','IND','Andhra Pradesh',133914); -INSERT INTO City VALUES (1239,'Chittoor','IND','Andhra Pradesh',133462); -INSERT INTO City VALUES (1240,'Barrackpur','IND','West Bengali',133265); -INSERT INTO City VALUES (1241,'Bharuch (Broach)','IND','Gujarat',133102); -INSERT INTO City VALUES (1242,'Naihati','IND','West Bengali',132701); -INSERT INTO City VALUES (1243,'Shillong','IND','Meghalaya',131719); -INSERT INTO City VALUES (1244,'Sambalpur','IND','Orissa',131138); -INSERT INTO City VALUES (1245,'Junagadh','IND','Gujarat',130484); -INSERT INTO City VALUES (1246,'Rae Bareli','IND','Uttar Pradesh',129904); -INSERT INTO City VALUES (1247,'Rewa','IND','Madhya Pradesh',128981); -INSERT INTO City VALUES (1248,'Gurgaon','IND','Haryana',128608); -INSERT INTO City VALUES (1249,'Khammam','IND','Andhra Pradesh',127992); -INSERT INTO City VALUES (1250,'Bulandshahr','IND','Uttar Pradesh',127201); -INSERT INTO City VALUES (1251,'Navsari','IND','Gujarat',126089); -INSERT INTO City VALUES (1252,'Malkajgiri','IND','Andhra Pradesh',126066); -INSERT INTO City VALUES (1253,'Midnapore (Medinipur)','IND','West Bengali',125498); -INSERT INTO City VALUES (1254,'Miraj','IND','Maharashtra',125407); -INSERT INTO City VALUES (1255,'Raj Nandgaon','IND','Chhatisgarh',125371); -INSERT INTO City VALUES (1256,'Alandur','IND','Tamil Nadu',125244); -INSERT INTO City VALUES (1257,'Puri','IND','Orissa',125199); -INSERT INTO City VALUES (1258,'Navadwip','IND','West Bengali',125037); -INSERT INTO City VALUES (1259,'Sirsa','IND','Haryana',125000); -INSERT INTO City VALUES (1260,'Korba','IND','Chhatisgarh',124501); -INSERT INTO City VALUES (1261,'Faizabad','IND','Uttar Pradesh',124437); -INSERT INTO City VALUES (1262,'Etawah','IND','Uttar Pradesh',124072); -INSERT INTO City VALUES (1263,'Pathankot','IND','Punjab',123930); -INSERT INTO City VALUES (1264,'Gandhinagar','IND','Gujarat',123359); -INSERT INTO City VALUES (1265,'Palghat (Palakkad)','IND','Kerala',123289); -INSERT INTO City VALUES (1266,'Veraval','IND','Gujarat',123000); -INSERT INTO City VALUES (1267,'Hoshiarpur','IND','Punjab',122705); -INSERT INTO City VALUES (1268,'Ambala','IND','Haryana',122596); -INSERT INTO City VALUES (1269,'Sitapur','IND','Uttar Pradesh',121842); -INSERT INTO City VALUES (1270,'Bhiwani','IND','Haryana',121629); -INSERT INTO City VALUES (1271,'Cuddapah','IND','Andhra Pradesh',121463); -INSERT INTO City VALUES (1272,'Bhimavaram','IND','Andhra Pradesh',121314); -INSERT INTO City VALUES (1273,'Krishnanagar','IND','West Bengali',121110); -INSERT INTO City VALUES (1274,'Chandannagar','IND','West Bengali',120378); -INSERT INTO City VALUES (1275,'Mandya','IND','Karnataka',120265); -INSERT INTO City VALUES (1276,'Dibrugarh','IND','Assam',120127); -INSERT INTO City VALUES (1277,'Nandyal','IND','Andhra Pradesh',119813); -INSERT INTO City VALUES (1278,'Balurghat','IND','West Bengali',119796); -INSERT INTO City VALUES (1279,'Neyveli','IND','Tamil Nadu',118080); -INSERT INTO City VALUES (1280,'Fatehpur','IND','Uttar Pradesh',117675); -INSERT INTO City VALUES (1281,'Mahbubnagar','IND','Andhra Pradesh',116833); -INSERT INTO City VALUES (1282,'Budaun','IND','Uttar Pradesh',116695); -INSERT INTO City VALUES (1283,'Porbandar','IND','Gujarat',116671); -INSERT INTO City VALUES (1284,'Silchar','IND','Assam',115483); -INSERT INTO City VALUES (1285,'Berhampore (Baharampur)','IND','West Bengali',115144); -INSERT INTO City VALUES (1286,'Purnea (Purnia)','IND','Jharkhand',114912); -INSERT INTO City VALUES (1287,'Bankura','IND','West Bengali',114876); -INSERT INTO City VALUES (1288,'Rajapalaiyam','IND','Tamil Nadu',114202); -INSERT INTO City VALUES (1289,'Titagarh','IND','West Bengali',114085); -INSERT INTO City VALUES (1290,'Halisahar','IND','West Bengali',114028); -INSERT INTO City VALUES (1291,'Hathras','IND','Uttar Pradesh',113285); -INSERT INTO City VALUES (1292,'Bhir (Bid)','IND','Maharashtra',112434); -INSERT INTO City VALUES (1293,'Pallavaram','IND','Tamil Nadu',111866); -INSERT INTO City VALUES (1294,'Anand','IND','Gujarat',110266); -INSERT INTO City VALUES (1295,'Mango','IND','Jharkhand',110024); -INSERT INTO City VALUES (1296,'Santipur','IND','West Bengali',109956); -INSERT INTO City VALUES (1297,'Bhind','IND','Madhya Pradesh',109755); -INSERT INTO City VALUES (1298,'Gondiya','IND','Maharashtra',109470); -INSERT INTO City VALUES (1299,'Tiruvannamalai','IND','Tamil Nadu',109196); -INSERT INTO City VALUES (1300,'Yeotmal (Yavatmal)','IND','Maharashtra',108578); -INSERT INTO City VALUES (1301,'Kulti-Barakar','IND','West Bengali',108518); -INSERT INTO City VALUES (1302,'Moga','IND','Punjab',108304); -INSERT INTO City VALUES (1303,'Shivapuri','IND','Madhya Pradesh',108277); -INSERT INTO City VALUES (1304,'Bidar','IND','Karnataka',108016); -INSERT INTO City VALUES (1305,'Guntakal','IND','Andhra Pradesh',107592); -INSERT INTO City VALUES (1306,'Unnao','IND','Uttar Pradesh',107425); -INSERT INTO City VALUES (1307,'Barasat','IND','West Bengali',107365); -INSERT INTO City VALUES (1308,'Tambaram','IND','Tamil Nadu',107187); -INSERT INTO City VALUES (1309,'Abohar','IND','Punjab',107163); -INSERT INTO City VALUES (1310,'Pilibhit','IND','Uttar Pradesh',106605); -INSERT INTO City VALUES (1311,'Valparai','IND','Tamil Nadu',106523); -INSERT INTO City VALUES (1312,'Gonda','IND','Uttar Pradesh',106078); -INSERT INTO City VALUES (1313,'Surendranagar','IND','Gujarat',105973); -INSERT INTO City VALUES (1314,'Qutubullapur','IND','Andhra Pradesh',105380); -INSERT INTO City VALUES (1315,'Beawar','IND','Rajasthan',105363); -INSERT INTO City VALUES (1316,'Hindupur','IND','Andhra Pradesh',104651); -INSERT INTO City VALUES (1317,'Gandhidham','IND','Gujarat',104585); -INSERT INTO City VALUES (1318,'Haldwani-cum-Kathgodam','IND','Uttaranchal',104195); -INSERT INTO City VALUES (1319,'Tellicherry (Thalassery)','IND','Kerala',103579); -INSERT INTO City VALUES (1320,'Wardha','IND','Maharashtra',102985); -INSERT INTO City VALUES (1321,'Rishra','IND','West Bengali',102649); -INSERT INTO City VALUES (1322,'Bhuj','IND','Gujarat',102176); -INSERT INTO City VALUES (1323,'Modinagar','IND','Uttar Pradesh',101660); -INSERT INTO City VALUES (1324,'Gudivada','IND','Andhra Pradesh',101656); -INSERT INTO City VALUES (1325,'Basirhat','IND','West Bengali',101409); -INSERT INTO City VALUES (1326,'Uttarpara-Kotrung','IND','West Bengali',100867); -INSERT INTO City VALUES (1327,'Ongole','IND','Andhra Pradesh',100836); -INSERT INTO City VALUES (1328,'North Barrackpur','IND','West Bengali',100513); -INSERT INTO City VALUES (1329,'Guna','IND','Madhya Pradesh',100490); -INSERT INTO City VALUES (1330,'Haldia','IND','West Bengali',100347); -INSERT INTO City VALUES (1331,'Habra','IND','West Bengali',100223); -INSERT INTO City VALUES (1332,'Kanchrapara','IND','West Bengali',100194); -INSERT INTO City VALUES (1333,'Tonk','IND','Rajasthan',100079); -INSERT INTO City VALUES (1334,'Champdani','IND','West Bengali',98818); -INSERT INTO City VALUES (1335,'Orai','IND','Uttar Pradesh',98640); -INSERT INTO City VALUES (1336,'Pudukkottai','IND','Tamil Nadu',98619); -INSERT INTO City VALUES (1337,'Sasaram','IND','Bihar',98220); -INSERT INTO City VALUES (1338,'Hazaribag','IND','Jharkhand',97712); -INSERT INTO City VALUES (1339,'Palayankottai','IND','Tamil Nadu',97662); -INSERT INTO City VALUES (1340,'Banda','IND','Uttar Pradesh',97227); -INSERT INTO City VALUES (1341,'Godhra','IND','Gujarat',96813); -INSERT INTO City VALUES (1342,'Hospet','IND','Karnataka',96322); -INSERT INTO City VALUES (1343,'Ashoknagar-Kalyangarh','IND','West Bengali',96315); -INSERT INTO City VALUES (1344,'Achalpur','IND','Maharashtra',96216); -INSERT INTO City VALUES (1345,'Patan','IND','Gujarat',96109); -INSERT INTO City VALUES (1346,'Mandasor','IND','Madhya Pradesh',95758); -INSERT INTO City VALUES (1347,'Damoh','IND','Madhya Pradesh',95661); -INSERT INTO City VALUES (1348,'Satara','IND','Maharashtra',95133); -INSERT INTO City VALUES (1349,'Meerut Cantonment','IND','Uttar Pradesh',94876); -INSERT INTO City VALUES (1350,'Dehri','IND','Bihar',94526); -INSERT INTO City VALUES (1351,'Delhi Cantonment','IND','Delhi',94326); -INSERT INTO City VALUES (1352,'Chhindwara','IND','Madhya Pradesh',93731); -INSERT INTO City VALUES (1353,'Bansberia','IND','West Bengali',93447); -INSERT INTO City VALUES (1354,'Nagaon','IND','Assam',93350); -INSERT INTO City VALUES (1355,'Kanpur Cantonment','IND','Uttar Pradesh',93109); -INSERT INTO City VALUES (1356,'Vidisha','IND','Madhya Pradesh',92917); -INSERT INTO City VALUES (1357,'Bettiah','IND','Bihar',92583); -INSERT INTO City VALUES (1358,'Purulia','IND','Jharkhand',92574); -INSERT INTO City VALUES (1359,'Hassan','IND','Karnataka',90803); -INSERT INTO City VALUES (1360,'Ambala Sadar','IND','Haryana',90712); -INSERT INTO City VALUES (1361,'Baidyabati','IND','West Bengali',90601); -INSERT INTO City VALUES (1362,'Morvi','IND','Gujarat',90357); -INSERT INTO City VALUES (1363,'Raigarh','IND','Chhatisgarh',89166); -INSERT INTO City VALUES (1364,'Vejalpur','IND','Gujarat',89053); -INSERT INTO City VALUES (1365,'Baghdad','IRQ','Baghdad',4336000); -INSERT INTO City VALUES (1366,'Mosul','IRQ','Ninawa',879000); -INSERT INTO City VALUES (1367,'Irbil','IRQ','Irbil',485968); -INSERT INTO City VALUES (1368,'Kirkuk','IRQ','al-Tamim',418624); -INSERT INTO City VALUES (1369,'Basra','IRQ','Basra',406296); -INSERT INTO City VALUES (1370,'al-Sulaymaniya','IRQ','al-Sulaymaniya',364096); -INSERT INTO City VALUES (1371,'al-Najaf','IRQ','al-Najaf',309010); -INSERT INTO City VALUES (1372,'Karbala','IRQ','Karbala',296705); -INSERT INTO City VALUES (1373,'al-Hilla','IRQ','Babil',268834); -INSERT INTO City VALUES (1374,'al-Nasiriya','IRQ','DhiQar',265937); -INSERT INTO City VALUES (1375,'al-Amara','IRQ','Maysan',208797); -INSERT INTO City VALUES (1376,'al-Diwaniya','IRQ','al-Qadisiya',196519); -INSERT INTO City VALUES (1377,'al-Ramadi','IRQ','al-Anbar',192556); -INSERT INTO City VALUES (1378,'al-Kut','IRQ','Wasit',183183); -INSERT INTO City VALUES (1379,'Baquba','IRQ','Diyala',114516); -INSERT INTO City VALUES (1380,'Teheran','IRN','Teheran',6758845); -INSERT INTO City VALUES (1381,'Mashhad','IRN','Khorasan',1887405); -INSERT INTO City VALUES (1382,'Esfahan','IRN','Esfahan',1266072); -INSERT INTO City VALUES (1383,'Tabriz','IRN','East Azerbaidzan',1191043); -INSERT INTO City VALUES (1384,'Shiraz','IRN','Fars',1053025); -INSERT INTO City VALUES (1385,'Karaj','IRN','Teheran',940968); -INSERT INTO City VALUES (1386,'Ahvaz','IRN','Khuzestan',804980); -INSERT INTO City VALUES (1387,'Qom','IRN','Qom',777677); -INSERT INTO City VALUES (1388,'Kermanshah','IRN','Kermanshah',692986); -INSERT INTO City VALUES (1389,'Urmia','IRN','West Azerbaidzan',435200); -INSERT INTO City VALUES (1390,'Zahedan','IRN','Sistan va Baluchesta',419518); -INSERT INTO City VALUES (1391,'Rasht','IRN','Gilan',417748); -INSERT INTO City VALUES (1392,'Hamadan','IRN','Hamadan',401281); -INSERT INTO City VALUES (1393,'Kerman','IRN','Kerman',384991); -INSERT INTO City VALUES (1394,'Arak','IRN','Markazi',380755); -INSERT INTO City VALUES (1395,'Ardebil','IRN','Ardebil',340386); -INSERT INTO City VALUES (1396,'Yazd','IRN','Yazd',326776); -INSERT INTO City VALUES (1397,'Qazvin','IRN','Qazvin',291117); -INSERT INTO City VALUES (1398,'Zanjan','IRN','Zanjan',286295); -INSERT INTO City VALUES (1399,'Sanandaj','IRN','Kordestan',277808); -INSERT INTO City VALUES (1400,'Bandar-e-Abbas','IRN','Hormozgan',273578); -INSERT INTO City VALUES (1401,'Khorramabad','IRN','Lorestan',272815); -INSERT INTO City VALUES (1402,'Eslamshahr','IRN','Teheran',265450); -INSERT INTO City VALUES (1403,'Borujerd','IRN','Lorestan',217804); -INSERT INTO City VALUES (1404,'Abadan','IRN','Khuzestan',206073); -INSERT INTO City VALUES (1405,'Dezful','IRN','Khuzestan',202639); -INSERT INTO City VALUES (1406,'Kashan','IRN','Esfahan',201372); -INSERT INTO City VALUES (1407,'Sari','IRN','Mazandaran',195882); -INSERT INTO City VALUES (1408,'Gorgan','IRN','Golestan',188710); -INSERT INTO City VALUES (1409,'Najafabad','IRN','Esfahan',178498); -INSERT INTO City VALUES (1410,'Sabzevar','IRN','Khorasan',170738); -INSERT INTO City VALUES (1411,'Khomeynishahr','IRN','Esfahan',165888); -INSERT INTO City VALUES (1412,'Amol','IRN','Mazandaran',159092); -INSERT INTO City VALUES (1413,'Neyshabur','IRN','Khorasan',158847); -INSERT INTO City VALUES (1414,'Babol','IRN','Mazandaran',158346); -INSERT INTO City VALUES (1415,'Khoy','IRN','West Azerbaidzan',148944); -INSERT INTO City VALUES (1416,'Malayer','IRN','Hamadan',144373); -INSERT INTO City VALUES (1417,'Bushehr','IRN','Bushehr',143641); -INSERT INTO City VALUES (1418,'Qaemshahr','IRN','Mazandaran',143286); -INSERT INTO City VALUES (1419,'Qarchak','IRN','Teheran',142690); -INSERT INTO City VALUES (1420,'Qods','IRN','Teheran',138278); -INSERT INTO City VALUES (1421,'Sirjan','IRN','Kerman',135024); -INSERT INTO City VALUES (1422,'Bojnurd','IRN','Khorasan',134835); -INSERT INTO City VALUES (1423,'Maragheh','IRN','East Azerbaidzan',132318); -INSERT INTO City VALUES (1424,'Birjand','IRN','Khorasan',127608); -INSERT INTO City VALUES (1425,'Ilam','IRN','Ilam',126346); -INSERT INTO City VALUES (1426,'Bukan','IRN','West Azerbaidzan',120020); -INSERT INTO City VALUES (1427,'Masjed-e-Soleyman','IRN','Khuzestan',116883); -INSERT INTO City VALUES (1428,'Saqqez','IRN','Kordestan',115394); -INSERT INTO City VALUES (1429,'Gonbad-e Qabus','IRN','Mazandaran',111253); -INSERT INTO City VALUES (1430,'Saveh','IRN','Qom',111245); -INSERT INTO City VALUES (1431,'Mahabad','IRN','West Azerbaidzan',107799); -INSERT INTO City VALUES (1432,'Varamin','IRN','Teheran',107233); -INSERT INTO City VALUES (1433,'Andimeshk','IRN','Khuzestan',106923); -INSERT INTO City VALUES (1434,'Khorramshahr','IRN','Khuzestan',105636); -INSERT INTO City VALUES (1435,'Shahrud','IRN','Semnan',104765); -INSERT INTO City VALUES (1436,'Marv Dasht','IRN','Fars',103579); -INSERT INTO City VALUES (1437,'Zabol','IRN','Sistan va Baluchesta',100887); -INSERT INTO City VALUES (1438,'Shahr-e Kord','IRN','Chaharmahal va Bakht',100477); -INSERT INTO City VALUES (1439,'Bandar-e Anzali','IRN','Gilan',98500); -INSERT INTO City VALUES (1440,'Rafsanjan','IRN','Kerman',98300); -INSERT INTO City VALUES (1441,'Marand','IRN','East Azerbaidzan',96400); -INSERT INTO City VALUES (1442,'Torbat-e Heydariyeh','IRN','Khorasan',94600); -INSERT INTO City VALUES (1443,'Jahrom','IRN','Fars',94200); -INSERT INTO City VALUES (1444,'Semnan','IRN','Semnan',91045); -INSERT INTO City VALUES (1445,'Miandoab','IRN','West Azerbaidzan',90100); -INSERT INTO City VALUES (1446,'Qomsheh','IRN','Esfahan',89800); -INSERT INTO City VALUES (1447,'Dublin','IRL','Leinster',481854); -INSERT INTO City VALUES (1448,'Cork','IRL','Munster',127187); -INSERT INTO City VALUES (1449,'Reykjav�k','ISL','H�fu�borgarsv��i',109184); -INSERT INTO City VALUES (1450,'Jerusalem','ISR','Jerusalem',633700); -INSERT INTO City VALUES (1451,'Tel Aviv-Jaffa','ISR','Tel Aviv',348100); -INSERT INTO City VALUES (1452,'Haifa','ISR','Haifa',265700); -INSERT INTO City VALUES (1453,'Rishon Le Ziyyon','ISR','Ha Merkaz',188200); -INSERT INTO City VALUES (1454,'Beerseba','ISR','Ha Darom',163700); -INSERT INTO City VALUES (1455,'Holon','ISR','Tel Aviv',163100); -INSERT INTO City VALUES (1456,'Petah Tiqwa','ISR','Ha Merkaz',159400); -INSERT INTO City VALUES (1457,'Ashdod','ISR','Ha Darom',155800); -INSERT INTO City VALUES (1458,'Netanya','ISR','Ha Merkaz',154900); -INSERT INTO City VALUES (1459,'Bat Yam','ISR','Tel Aviv',137000); -INSERT INTO City VALUES (1460,'Bene Beraq','ISR','Tel Aviv',133900); -INSERT INTO City VALUES (1461,'Ramat Gan','ISR','Tel Aviv',126900); -INSERT INTO City VALUES (1462,'Ashqelon','ISR','Ha Darom',92300); -INSERT INTO City VALUES (1463,'Rehovot','ISR','Ha Merkaz',90300); -INSERT INTO City VALUES (1464,'Roma','ITA','Latium',2643581); -INSERT INTO City VALUES (1465,'Milano','ITA','Lombardia',1300977); -INSERT INTO City VALUES (1466,'Napoli','ITA','Campania',1002619); -INSERT INTO City VALUES (1467,'Torino','ITA','Piemonte',903705); -INSERT INTO City VALUES (1468,'Palermo','ITA','Sisilia',683794); -INSERT INTO City VALUES (1469,'Genova','ITA','Liguria',636104); -INSERT INTO City VALUES (1470,'Bologna','ITA','Emilia-Romagna',381161); -INSERT INTO City VALUES (1471,'Firenze','ITA','Toscana',376662); -INSERT INTO City VALUES (1472,'Catania','ITA','Sisilia',337862); -INSERT INTO City VALUES (1473,'Bari','ITA','Apulia',331848); -INSERT INTO City VALUES (1474,'Venezia','ITA','Veneto',277305); -INSERT INTO City VALUES (1475,'Messina','ITA','Sisilia',259156); -INSERT INTO City VALUES (1476,'Verona','ITA','Veneto',255268); -INSERT INTO City VALUES (1477,'Trieste','ITA','Friuli-Venezia Giuli',216459); -INSERT INTO City VALUES (1478,'Padova','ITA','Veneto',211391); -INSERT INTO City VALUES (1479,'Taranto','ITA','Apulia',208214); -INSERT INTO City VALUES (1480,'Brescia','ITA','Lombardia',191317); -INSERT INTO City VALUES (1481,'Reggio di Calabria','ITA','Calabria',179617); -INSERT INTO City VALUES (1482,'Modena','ITA','Emilia-Romagna',176022); -INSERT INTO City VALUES (1483,'Prato','ITA','Toscana',172473); -INSERT INTO City VALUES (1484,'Parma','ITA','Emilia-Romagna',168717); -INSERT INTO City VALUES (1485,'Cagliari','ITA','Sardinia',165926); -INSERT INTO City VALUES (1486,'Livorno','ITA','Toscana',161673); -INSERT INTO City VALUES (1487,'Perugia','ITA','Umbria',156673); -INSERT INTO City VALUES (1488,'Foggia','ITA','Apulia',154891); -INSERT INTO City VALUES (1489,'Reggio nell� Emilia','ITA','Emilia-Romagna',143664); -INSERT INTO City VALUES (1490,'Salerno','ITA','Campania',142055); -INSERT INTO City VALUES (1491,'Ravenna','ITA','Emilia-Romagna',138418); -INSERT INTO City VALUES (1492,'Ferrara','ITA','Emilia-Romagna',132127); -INSERT INTO City VALUES (1493,'Rimini','ITA','Emilia-Romagna',131062); -INSERT INTO City VALUES (1494,'Syrakusa','ITA','Sisilia',126282); -INSERT INTO City VALUES (1495,'Sassari','ITA','Sardinia',120803); -INSERT INTO City VALUES (1496,'Monza','ITA','Lombardia',119516); -INSERT INTO City VALUES (1497,'Bergamo','ITA','Lombardia',117837); -INSERT INTO City VALUES (1498,'Pescara','ITA','Abruzzit',115698); -INSERT INTO City VALUES (1499,'Latina','ITA','Latium',114099); -INSERT INTO City VALUES (1500,'Vicenza','ITA','Veneto',109738); -INSERT INTO City VALUES (1501,'Terni','ITA','Umbria',107770); -INSERT INTO City VALUES (1502,'Forl�','ITA','Emilia-Romagna',107475); -INSERT INTO City VALUES (1503,'Trento','ITA','Trentino-Alto Adige',104906); -INSERT INTO City VALUES (1504,'Novara','ITA','Piemonte',102037); -INSERT INTO City VALUES (1505,'Piacenza','ITA','Emilia-Romagna',98384); -INSERT INTO City VALUES (1506,'Ancona','ITA','Marche',98329); -INSERT INTO City VALUES (1507,'Lecce','ITA','Apulia',98208); -INSERT INTO City VALUES (1508,'Bolzano','ITA','Trentino-Alto Adige',97232); -INSERT INTO City VALUES (1509,'Catanzaro','ITA','Calabria',96700); -INSERT INTO City VALUES (1510,'La Spezia','ITA','Liguria',95504); -INSERT INTO City VALUES (1511,'Udine','ITA','Friuli-Venezia Giuli',94932); -INSERT INTO City VALUES (1512,'Torre del Greco','ITA','Campania',94505); -INSERT INTO City VALUES (1513,'Andria','ITA','Apulia',94443); -INSERT INTO City VALUES (1514,'Brindisi','ITA','Apulia',93454); -INSERT INTO City VALUES (1515,'Giugliano in Campania','ITA','Campania',93286); -INSERT INTO City VALUES (1516,'Pisa','ITA','Toscana',92379); -INSERT INTO City VALUES (1517,'Barletta','ITA','Apulia',91904); -INSERT INTO City VALUES (1518,'Arezzo','ITA','Toscana',91729); -INSERT INTO City VALUES (1519,'Alessandria','ITA','Piemonte',90289); -INSERT INTO City VALUES (1520,'Cesena','ITA','Emilia-Romagna',89852); -INSERT INTO City VALUES (1521,'Pesaro','ITA','Marche',88987); -INSERT INTO City VALUES (1522,'Dili','TMP','Dili',47900); -INSERT INTO City VALUES (1523,'Wien','AUT','Wien',1608144); -INSERT INTO City VALUES (1524,'Graz','AUT','Steiermark',240967); -INSERT INTO City VALUES (1525,'Linz','AUT','North Austria',188022); -INSERT INTO City VALUES (1526,'Salzburg','AUT','Salzburg',144247); -INSERT INTO City VALUES (1527,'Innsbruck','AUT','Tiroli',111752); -INSERT INTO City VALUES (1528,'Klagenfurt','AUT','K�rnten',91141); -INSERT INTO City VALUES (1529,'Spanish Town','JAM','St. Catherine',110379); -INSERT INTO City VALUES (1530,'Kingston','JAM','St. Andrew',103962); -INSERT INTO City VALUES (1531,'Portmore','JAM','St. Andrew',99799); -INSERT INTO City VALUES (1532,'Tokyo','JPN','Tokyo-to',7980230); -INSERT INTO City VALUES (1533,'Jokohama [Yokohama]','JPN','Kanagawa',3339594); -INSERT INTO City VALUES (1534,'Osaka','JPN','Osaka',2595674); -INSERT INTO City VALUES (1535,'Nagoya','JPN','Aichi',2154376); -INSERT INTO City VALUES (1536,'Sapporo','JPN','Hokkaido',1790886); -INSERT INTO City VALUES (1537,'Kioto','JPN','Kyoto',1461974); -INSERT INTO City VALUES (1538,'Kobe','JPN','Hyogo',1425139); -INSERT INTO City VALUES (1539,'Fukuoka','JPN','Fukuoka',1308379); -INSERT INTO City VALUES (1540,'Kawasaki','JPN','Kanagawa',1217359); -INSERT INTO City VALUES (1541,'Hiroshima','JPN','Hiroshima',1119117); -INSERT INTO City VALUES (1542,'Kitakyushu','JPN','Fukuoka',1016264); -INSERT INTO City VALUES (1543,'Sendai','JPN','Miyagi',989975); -INSERT INTO City VALUES (1544,'Chiba','JPN','Chiba',863930); -INSERT INTO City VALUES (1545,'Sakai','JPN','Osaka',797735); -INSERT INTO City VALUES (1546,'Kumamoto','JPN','Kumamoto',656734); -INSERT INTO City VALUES (1547,'Okayama','JPN','Okayama',624269); -INSERT INTO City VALUES (1548,'Sagamihara','JPN','Kanagawa',586300); -INSERT INTO City VALUES (1549,'Hamamatsu','JPN','Shizuoka',568796); -INSERT INTO City VALUES (1550,'Kagoshima','JPN','Kagoshima',549977); -INSERT INTO City VALUES (1551,'Funabashi','JPN','Chiba',545299); -INSERT INTO City VALUES (1552,'Higashiosaka','JPN','Osaka',517785); -INSERT INTO City VALUES (1553,'Hachioji','JPN','Tokyo-to',513451); -INSERT INTO City VALUES (1554,'Niigata','JPN','Niigata',497464); -INSERT INTO City VALUES (1555,'Amagasaki','JPN','Hyogo',481434); -INSERT INTO City VALUES (1556,'Himeji','JPN','Hyogo',475167); -INSERT INTO City VALUES (1557,'Shizuoka','JPN','Shizuoka',473854); -INSERT INTO City VALUES (1558,'Urawa','JPN','Saitama',469675); -INSERT INTO City VALUES (1559,'Matsuyama','JPN','Ehime',466133); -INSERT INTO City VALUES (1560,'Matsudo','JPN','Chiba',461126); -INSERT INTO City VALUES (1561,'Kanazawa','JPN','Ishikawa',455386); -INSERT INTO City VALUES (1562,'Kawaguchi','JPN','Saitama',452155); -INSERT INTO City VALUES (1563,'Ichikawa','JPN','Chiba',441893); -INSERT INTO City VALUES (1564,'Omiya','JPN','Saitama',441649); -INSERT INTO City VALUES (1565,'Utsunomiya','JPN','Tochigi',440353); -INSERT INTO City VALUES (1566,'Oita','JPN','Oita',433401); -INSERT INTO City VALUES (1567,'Nagasaki','JPN','Nagasaki',432759); -INSERT INTO City VALUES (1568,'Yokosuka','JPN','Kanagawa',430200); -INSERT INTO City VALUES (1569,'Kurashiki','JPN','Okayama',425103); -INSERT INTO City VALUES (1570,'Gifu','JPN','Gifu',408007); -INSERT INTO City VALUES (1571,'Hirakata','JPN','Osaka',403151); -INSERT INTO City VALUES (1572,'Nishinomiya','JPN','Hyogo',397618); -INSERT INTO City VALUES (1573,'Toyonaka','JPN','Osaka',396689); -INSERT INTO City VALUES (1574,'Wakayama','JPN','Wakayama',391233); -INSERT INTO City VALUES (1575,'Fukuyama','JPN','Hiroshima',376921); -INSERT INTO City VALUES (1576,'Fujisawa','JPN','Kanagawa',372840); -INSERT INTO City VALUES (1577,'Asahikawa','JPN','Hokkaido',364813); -INSERT INTO City VALUES (1578,'Machida','JPN','Tokyo-to',364197); -INSERT INTO City VALUES (1579,'Nara','JPN','Nara',362812); -INSERT INTO City VALUES (1580,'Takatsuki','JPN','Osaka',361747); -INSERT INTO City VALUES (1581,'Iwaki','JPN','Fukushima',361737); -INSERT INTO City VALUES (1582,'Nagano','JPN','Nagano',361391); -INSERT INTO City VALUES (1583,'Toyohashi','JPN','Aichi',360066); -INSERT INTO City VALUES (1584,'Toyota','JPN','Aichi',346090); -INSERT INTO City VALUES (1585,'Suita','JPN','Osaka',345750); -INSERT INTO City VALUES (1586,'Takamatsu','JPN','Kagawa',332471); -INSERT INTO City VALUES (1587,'Koriyama','JPN','Fukushima',330335); -INSERT INTO City VALUES (1588,'Okazaki','JPN','Aichi',328711); -INSERT INTO City VALUES (1589,'Kawagoe','JPN','Saitama',327211); -INSERT INTO City VALUES (1590,'Tokorozawa','JPN','Saitama',325809); -INSERT INTO City VALUES (1591,'Toyama','JPN','Toyama',325790); -INSERT INTO City VALUES (1592,'Kochi','JPN','Kochi',324710); -INSERT INTO City VALUES (1593,'Kashiwa','JPN','Chiba',320296); -INSERT INTO City VALUES (1594,'Akita','JPN','Akita',314440); -INSERT INTO City VALUES (1595,'Miyazaki','JPN','Miyazaki',303784); -INSERT INTO City VALUES (1596,'Koshigaya','JPN','Saitama',301446); -INSERT INTO City VALUES (1597,'Naha','JPN','Okinawa',299851); -INSERT INTO City VALUES (1598,'Aomori','JPN','Aomori',295969); -INSERT INTO City VALUES (1599,'Hakodate','JPN','Hokkaido',294788); -INSERT INTO City VALUES (1600,'Akashi','JPN','Hyogo',292253); -INSERT INTO City VALUES (1601,'Yokkaichi','JPN','Mie',288173); -INSERT INTO City VALUES (1602,'Fukushima','JPN','Fukushima',287525); -INSERT INTO City VALUES (1603,'Morioka','JPN','Iwate',287353); -INSERT INTO City VALUES (1604,'Maebashi','JPN','Gumma',284473); -INSERT INTO City VALUES (1605,'Kasugai','JPN','Aichi',282348); -INSERT INTO City VALUES (1606,'Otsu','JPN','Shiga',282070); -INSERT INTO City VALUES (1607,'Ichihara','JPN','Chiba',279280); -INSERT INTO City VALUES (1608,'Yao','JPN','Osaka',276421); -INSERT INTO City VALUES (1609,'Ichinomiya','JPN','Aichi',270828); -INSERT INTO City VALUES (1610,'Tokushima','JPN','Tokushima',269649); -INSERT INTO City VALUES (1611,'Kakogawa','JPN','Hyogo',266281); -INSERT INTO City VALUES (1612,'Ibaraki','JPN','Osaka',261020); -INSERT INTO City VALUES (1613,'Neyagawa','JPN','Osaka',257315); -INSERT INTO City VALUES (1614,'Shimonoseki','JPN','Yamaguchi',257263); -INSERT INTO City VALUES (1615,'Yamagata','JPN','Yamagata',255617); -INSERT INTO City VALUES (1616,'Fukui','JPN','Fukui',254818); -INSERT INTO City VALUES (1617,'Hiratsuka','JPN','Kanagawa',254207); -INSERT INTO City VALUES (1618,'Mito','JPN','Ibaragi',246559); -INSERT INTO City VALUES (1619,'Sasebo','JPN','Nagasaki',244240); -INSERT INTO City VALUES (1620,'Hachinohe','JPN','Aomori',242979); -INSERT INTO City VALUES (1621,'Takasaki','JPN','Gumma',239124); -INSERT INTO City VALUES (1622,'Shimizu','JPN','Shizuoka',239123); -INSERT INTO City VALUES (1623,'Kurume','JPN','Fukuoka',235611); -INSERT INTO City VALUES (1624,'Fuji','JPN','Shizuoka',231527); -INSERT INTO City VALUES (1625,'Soka','JPN','Saitama',222768); -INSERT INTO City VALUES (1626,'Fuchu','JPN','Tokyo-to',220576); -INSERT INTO City VALUES (1627,'Chigasaki','JPN','Kanagawa',216015); -INSERT INTO City VALUES (1628,'Atsugi','JPN','Kanagawa',212407); -INSERT INTO City VALUES (1629,'Numazu','JPN','Shizuoka',211382); -INSERT INTO City VALUES (1630,'Ageo','JPN','Saitama',209442); -INSERT INTO City VALUES (1631,'Yamato','JPN','Kanagawa',208234); -INSERT INTO City VALUES (1632,'Matsumoto','JPN','Nagano',206801); -INSERT INTO City VALUES (1633,'Kure','JPN','Hiroshima',206504); -INSERT INTO City VALUES (1634,'Takarazuka','JPN','Hyogo',205993); -INSERT INTO City VALUES (1635,'Kasukabe','JPN','Saitama',201838); -INSERT INTO City VALUES (1636,'Chofu','JPN','Tokyo-to',201585); -INSERT INTO City VALUES (1637,'Odawara','JPN','Kanagawa',200171); -INSERT INTO City VALUES (1638,'Kofu','JPN','Yamanashi',199753); -INSERT INTO City VALUES (1639,'Kushiro','JPN','Hokkaido',197608); -INSERT INTO City VALUES (1640,'Kishiwada','JPN','Osaka',197276); -INSERT INTO City VALUES (1641,'Hitachi','JPN','Ibaragi',196622); -INSERT INTO City VALUES (1642,'Nagaoka','JPN','Niigata',192407); -INSERT INTO City VALUES (1643,'Itami','JPN','Hyogo',190886); -INSERT INTO City VALUES (1644,'Uji','JPN','Kyoto',188735); -INSERT INTO City VALUES (1645,'Suzuka','JPN','Mie',184061); -INSERT INTO City VALUES (1646,'Hirosaki','JPN','Aomori',177522); -INSERT INTO City VALUES (1647,'Ube','JPN','Yamaguchi',175206); -INSERT INTO City VALUES (1648,'Kodaira','JPN','Tokyo-to',174984); -INSERT INTO City VALUES (1649,'Takaoka','JPN','Toyama',174380); -INSERT INTO City VALUES (1650,'Obihiro','JPN','Hokkaido',173685); -INSERT INTO City VALUES (1651,'Tomakomai','JPN','Hokkaido',171958); -INSERT INTO City VALUES (1652,'Saga','JPN','Saga',170034); -INSERT INTO City VALUES (1653,'Sakura','JPN','Chiba',168072); -INSERT INTO City VALUES (1654,'Kamakura','JPN','Kanagawa',167661); -INSERT INTO City VALUES (1655,'Mitaka','JPN','Tokyo-to',167268); -INSERT INTO City VALUES (1656,'Izumi','JPN','Osaka',166979); -INSERT INTO City VALUES (1657,'Hino','JPN','Tokyo-to',166770); -INSERT INTO City VALUES (1658,'Hadano','JPN','Kanagawa',166512); -INSERT INTO City VALUES (1659,'Ashikaga','JPN','Tochigi',165243); -INSERT INTO City VALUES (1660,'Tsu','JPN','Mie',164543); -INSERT INTO City VALUES (1661,'Sayama','JPN','Saitama',162472); -INSERT INTO City VALUES (1662,'Yachiyo','JPN','Chiba',161222); -INSERT INTO City VALUES (1663,'Tsukuba','JPN','Ibaragi',160768); -INSERT INTO City VALUES (1664,'Tachikawa','JPN','Tokyo-to',159430); -INSERT INTO City VALUES (1665,'Kumagaya','JPN','Saitama',157171); -INSERT INTO City VALUES (1666,'Moriguchi','JPN','Osaka',155941); -INSERT INTO City VALUES (1667,'Otaru','JPN','Hokkaido',155784); -INSERT INTO City VALUES (1668,'Anjo','JPN','Aichi',153823); -INSERT INTO City VALUES (1669,'Narashino','JPN','Chiba',152849); -INSERT INTO City VALUES (1670,'Oyama','JPN','Tochigi',152820); -INSERT INTO City VALUES (1671,'Ogaki','JPN','Gifu',151758); -INSERT INTO City VALUES (1672,'Matsue','JPN','Shimane',149821); -INSERT INTO City VALUES (1673,'Kawanishi','JPN','Hyogo',149794); -INSERT INTO City VALUES (1674,'Hitachinaka','JPN','Tokyo-to',148006); -INSERT INTO City VALUES (1675,'Niiza','JPN','Saitama',147744); -INSERT INTO City VALUES (1676,'Nagareyama','JPN','Chiba',147738); -INSERT INTO City VALUES (1677,'Tottori','JPN','Tottori',147523); -INSERT INTO City VALUES (1678,'Tama','JPN','Ibaragi',146712); -INSERT INTO City VALUES (1679,'Iruma','JPN','Saitama',145922); -INSERT INTO City VALUES (1680,'Ota','JPN','Gumma',145317); -INSERT INTO City VALUES (1681,'Omuta','JPN','Fukuoka',142889); -INSERT INTO City VALUES (1682,'Komaki','JPN','Aichi',139827); -INSERT INTO City VALUES (1683,'Ome','JPN','Tokyo-to',139216); -INSERT INTO City VALUES (1684,'Kadoma','JPN','Osaka',138953); -INSERT INTO City VALUES (1685,'Yamaguchi','JPN','Yamaguchi',138210); -INSERT INTO City VALUES (1686,'Higashimurayama','JPN','Tokyo-to',136970); -INSERT INTO City VALUES (1687,'Yonago','JPN','Tottori',136461); -INSERT INTO City VALUES (1688,'Matsubara','JPN','Osaka',135010); -INSERT INTO City VALUES (1689,'Musashino','JPN','Tokyo-to',134426); -INSERT INTO City VALUES (1690,'Tsuchiura','JPN','Ibaragi',134072); -INSERT INTO City VALUES (1691,'Joetsu','JPN','Niigata',133505); -INSERT INTO City VALUES (1692,'Miyakonojo','JPN','Miyazaki',133183); -INSERT INTO City VALUES (1693,'Misato','JPN','Saitama',132957); -INSERT INTO City VALUES (1694,'Kakamigahara','JPN','Gifu',131831); -INSERT INTO City VALUES (1695,'Daito','JPN','Osaka',130594); -INSERT INTO City VALUES (1696,'Seto','JPN','Aichi',130470); -INSERT INTO City VALUES (1697,'Kariya','JPN','Aichi',127969); -INSERT INTO City VALUES (1698,'Urayasu','JPN','Chiba',127550); -INSERT INTO City VALUES (1699,'Beppu','JPN','Oita',127486); -INSERT INTO City VALUES (1700,'Niihama','JPN','Ehime',127207); -INSERT INTO City VALUES (1701,'Minoo','JPN','Osaka',127026); -INSERT INTO City VALUES (1702,'Fujieda','JPN','Shizuoka',126897); -INSERT INTO City VALUES (1703,'Abiko','JPN','Chiba',126670); -INSERT INTO City VALUES (1704,'Nobeoka','JPN','Miyazaki',125547); -INSERT INTO City VALUES (1705,'Tondabayashi','JPN','Osaka',125094); -INSERT INTO City VALUES (1706,'Ueda','JPN','Nagano',124217); -INSERT INTO City VALUES (1707,'Kashihara','JPN','Nara',124013); -INSERT INTO City VALUES (1708,'Matsusaka','JPN','Mie',123582); -INSERT INTO City VALUES (1709,'Isesaki','JPN','Gumma',123285); -INSERT INTO City VALUES (1710,'Zama','JPN','Kanagawa',122046); -INSERT INTO City VALUES (1711,'Kisarazu','JPN','Chiba',121967); -INSERT INTO City VALUES (1712,'Noda','JPN','Chiba',121030); -INSERT INTO City VALUES (1713,'Ishinomaki','JPN','Miyagi',120963); -INSERT INTO City VALUES (1714,'Fujinomiya','JPN','Shizuoka',119714); -INSERT INTO City VALUES (1715,'Kawachinagano','JPN','Osaka',119666); -INSERT INTO City VALUES (1716,'Imabari','JPN','Ehime',119357); -INSERT INTO City VALUES (1717,'Aizuwakamatsu','JPN','Fukushima',119287); -INSERT INTO City VALUES (1718,'Higashihiroshima','JPN','Hiroshima',119166); -INSERT INTO City VALUES (1719,'Habikino','JPN','Osaka',118968); -INSERT INTO City VALUES (1720,'Ebetsu','JPN','Hokkaido',118805); -INSERT INTO City VALUES (1721,'Hofu','JPN','Yamaguchi',118751); -INSERT INTO City VALUES (1722,'Kiryu','JPN','Gumma',118326); -INSERT INTO City VALUES (1723,'Okinawa','JPN','Okinawa',117748); -INSERT INTO City VALUES (1724,'Yaizu','JPN','Shizuoka',117258); -INSERT INTO City VALUES (1725,'Toyokawa','JPN','Aichi',115781); -INSERT INTO City VALUES (1726,'Ebina','JPN','Kanagawa',115571); -INSERT INTO City VALUES (1727,'Asaka','JPN','Saitama',114815); -INSERT INTO City VALUES (1728,'Higashikurume','JPN','Tokyo-to',111666); -INSERT INTO City VALUES (1729,'Ikoma','JPN','Nara',111645); -INSERT INTO City VALUES (1730,'Kitami','JPN','Hokkaido',111295); -INSERT INTO City VALUES (1731,'Koganei','JPN','Tokyo-to',110969); -INSERT INTO City VALUES (1732,'Iwatsuki','JPN','Saitama',110034); -INSERT INTO City VALUES (1733,'Mishima','JPN','Shizuoka',109699); -INSERT INTO City VALUES (1734,'Handa','JPN','Aichi',108600); -INSERT INTO City VALUES (1735,'Muroran','JPN','Hokkaido',108275); -INSERT INTO City VALUES (1736,'Komatsu','JPN','Ishikawa',107937); -INSERT INTO City VALUES (1737,'Yatsushiro','JPN','Kumamoto',107661); -INSERT INTO City VALUES (1738,'Iida','JPN','Nagano',107583); -INSERT INTO City VALUES (1739,'Tokuyama','JPN','Yamaguchi',107078); -INSERT INTO City VALUES (1740,'Kokubunji','JPN','Tokyo-to',106996); -INSERT INTO City VALUES (1741,'Akishima','JPN','Tokyo-to',106914); -INSERT INTO City VALUES (1742,'Iwakuni','JPN','Yamaguchi',106647); -INSERT INTO City VALUES (1743,'Kusatsu','JPN','Shiga',106232); -INSERT INTO City VALUES (1744,'Kuwana','JPN','Mie',106121); -INSERT INTO City VALUES (1745,'Sanda','JPN','Hyogo',105643); -INSERT INTO City VALUES (1746,'Hikone','JPN','Shiga',105508); -INSERT INTO City VALUES (1747,'Toda','JPN','Saitama',103969); -INSERT INTO City VALUES (1748,'Tajimi','JPN','Gifu',103171); -INSERT INTO City VALUES (1749,'Ikeda','JPN','Osaka',102710); -INSERT INTO City VALUES (1750,'Fukaya','JPN','Saitama',102156); -INSERT INTO City VALUES (1751,'Ise','JPN','Mie',101732); -INSERT INTO City VALUES (1752,'Sakata','JPN','Yamagata',101651); -INSERT INTO City VALUES (1753,'Kasuga','JPN','Fukuoka',101344); -INSERT INTO City VALUES (1754,'Kamagaya','JPN','Chiba',100821); -INSERT INTO City VALUES (1755,'Tsuruoka','JPN','Yamagata',100713); -INSERT INTO City VALUES (1756,'Hoya','JPN','Tokyo-to',100313); -INSERT INTO City VALUES (1757,'Nishio','JPN','Chiba',100032); -INSERT INTO City VALUES (1758,'Tokai','JPN','Aichi',99738); -INSERT INTO City VALUES (1759,'Inazawa','JPN','Aichi',98746); -INSERT INTO City VALUES (1760,'Sakado','JPN','Saitama',98221); -INSERT INTO City VALUES (1761,'Isehara','JPN','Kanagawa',98123); -INSERT INTO City VALUES (1762,'Takasago','JPN','Hyogo',97632); -INSERT INTO City VALUES (1763,'Fujimi','JPN','Saitama',96972); -INSERT INTO City VALUES (1764,'Urasoe','JPN','Okinawa',96002); -INSERT INTO City VALUES (1765,'Yonezawa','JPN','Yamagata',95592); -INSERT INTO City VALUES (1766,'Konan','JPN','Aichi',95521); -INSERT INTO City VALUES (1767,'Yamatokoriyama','JPN','Nara',95165); -INSERT INTO City VALUES (1768,'Maizuru','JPN','Kyoto',94784); -INSERT INTO City VALUES (1769,'Onomichi','JPN','Hiroshima',93756); -INSERT INTO City VALUES (1770,'Higashimatsuyama','JPN','Saitama',93342); -INSERT INTO City VALUES (1771,'Kimitsu','JPN','Chiba',93216); -INSERT INTO City VALUES (1772,'Isahaya','JPN','Nagasaki',93058); -INSERT INTO City VALUES (1773,'Kanuma','JPN','Tochigi',93053); -INSERT INTO City VALUES (1774,'Izumisano','JPN','Osaka',92583); -INSERT INTO City VALUES (1775,'Kameoka','JPN','Kyoto',92398); -INSERT INTO City VALUES (1776,'Mobara','JPN','Chiba',91664); -INSERT INTO City VALUES (1777,'Narita','JPN','Chiba',91470); -INSERT INTO City VALUES (1778,'Kashiwazaki','JPN','Niigata',91229); -INSERT INTO City VALUES (1779,'Tsuyama','JPN','Okayama',91170); -INSERT INTO City VALUES (1780,'Sanaa','YEM','Sanaa',503600); -INSERT INTO City VALUES (1781,'Aden','YEM','Aden',398300); -INSERT INTO City VALUES (1782,'Taizz','YEM','Taizz',317600); -INSERT INTO City VALUES (1783,'Hodeida','YEM','Hodeida',298500); -INSERT INTO City VALUES (1784,'al-Mukalla','YEM','Hadramawt',122400); -INSERT INTO City VALUES (1785,'Ibb','YEM','Ibb',103300); -INSERT INTO City VALUES (1786,'Amman','JOR','Amman',1000000); -INSERT INTO City VALUES (1787,'al-Zarqa','JOR','al-Zarqa',389815); -INSERT INTO City VALUES (1788,'Irbid','JOR','Irbid',231511); -INSERT INTO City VALUES (1789,'al-Rusayfa','JOR','al-Zarqa',137247); -INSERT INTO City VALUES (1790,'Wadi al-Sir','JOR','Amman',89104); -INSERT INTO City VALUES (1791,'Flying Fish Cove','CXR','�',700); -INSERT INTO City VALUES (1792,'Beograd','YUG','Central Serbia',1204000); -INSERT INTO City VALUES (1793,'Novi Sad','YUG','Vojvodina',179626); -INSERT INTO City VALUES (1794,'Ni�','YUG','Central Serbia',175391); -INSERT INTO City VALUES (1795,'Pri�tina','YUG','Kosovo and Metohija',155496); -INSERT INTO City VALUES (1796,'Kragujevac','YUG','Central Serbia',147305); -INSERT INTO City VALUES (1797,'Podgorica','YUG','Montenegro',135000); -INSERT INTO City VALUES (1798,'Subotica','YUG','Vojvodina',100386); -INSERT INTO City VALUES (1799,'Prizren','YUG','Kosovo and Metohija',92303); -INSERT INTO City VALUES (1800,'Phnom Penh','KHM','Phnom Penh',570155); -INSERT INTO City VALUES (1801,'Battambang','KHM','Battambang',129800); -INSERT INTO City VALUES (1802,'Siem Reap','KHM','Siem Reap',105100); -INSERT INTO City VALUES (1803,'Douala','CMR','Littoral',1448300); -INSERT INTO City VALUES (1804,'Yaound�','CMR','Centre',1372800); -INSERT INTO City VALUES (1805,'Garoua','CMR','Nord',177000); -INSERT INTO City VALUES (1806,'Maroua','CMR','Extr�me-Nord',143000); -INSERT INTO City VALUES (1807,'Bamenda','CMR','Nord-Ouest',138000); -INSERT INTO City VALUES (1808,'Bafoussam','CMR','Ouest',131000); -INSERT INTO City VALUES (1809,'Nkongsamba','CMR','Littoral',112454); -INSERT INTO City VALUES (1810,'Montr�al','CAN','Qu�bec',1016376); -INSERT INTO City VALUES (1811,'Calgary','CAN','Alberta',768082); -INSERT INTO City VALUES (1812,'Toronto','CAN','Ontario',688275); -INSERT INTO City VALUES (1813,'North York','CAN','Ontario',622632); -INSERT INTO City VALUES (1814,'Winnipeg','CAN','Manitoba',618477); -INSERT INTO City VALUES (1815,'Edmonton','CAN','Alberta',616306); -INSERT INTO City VALUES (1816,'Mississauga','CAN','Ontario',608072); -INSERT INTO City VALUES (1817,'Scarborough','CAN','Ontario',594501); -INSERT INTO City VALUES (1818,'Vancouver','CAN','British Colombia',514008); -INSERT INTO City VALUES (1819,'Etobicoke','CAN','Ontario',348845); -INSERT INTO City VALUES (1820,'London','CAN','Ontario',339917); -INSERT INTO City VALUES (1821,'Hamilton','CAN','Ontario',335614); -INSERT INTO City VALUES (1822,'Ottawa','CAN','Ontario',335277); -INSERT INTO City VALUES (1823,'Laval','CAN','Qu�bec',330393); -INSERT INTO City VALUES (1824,'Surrey','CAN','British Colombia',304477); -INSERT INTO City VALUES (1825,'Brampton','CAN','Ontario',296711); -INSERT INTO City VALUES (1826,'Windsor','CAN','Ontario',207588); -INSERT INTO City VALUES (1827,'Saskatoon','CAN','Saskatchewan',193647); -INSERT INTO City VALUES (1828,'Kitchener','CAN','Ontario',189959); -INSERT INTO City VALUES (1829,'Markham','CAN','Ontario',189098); -INSERT INTO City VALUES (1830,'Regina','CAN','Saskatchewan',180400); -INSERT INTO City VALUES (1831,'Burnaby','CAN','British Colombia',179209); -INSERT INTO City VALUES (1832,'Qu�bec','CAN','Qu�bec',167264); -INSERT INTO City VALUES (1833,'York','CAN','Ontario',154980); -INSERT INTO City VALUES (1834,'Richmond','CAN','British Colombia',148867); -INSERT INTO City VALUES (1835,'Vaughan','CAN','Ontario',147889); -INSERT INTO City VALUES (1836,'Burlington','CAN','Ontario',145150); -INSERT INTO City VALUES (1837,'Oshawa','CAN','Ontario',140173); -INSERT INTO City VALUES (1838,'Oakville','CAN','Ontario',139192); -INSERT INTO City VALUES (1839,'Saint Catharines','CAN','Ontario',136216); -INSERT INTO City VALUES (1840,'Longueuil','CAN','Qu�bec',127977); -INSERT INTO City VALUES (1841,'Richmond Hill','CAN','Ontario',116428); -INSERT INTO City VALUES (1842,'Thunder Bay','CAN','Ontario',115913); -INSERT INTO City VALUES (1843,'Nepean','CAN','Ontario',115100); -INSERT INTO City VALUES (1844,'Cape Breton','CAN','Nova Scotia',114733); -INSERT INTO City VALUES (1845,'East York','CAN','Ontario',114034); -INSERT INTO City VALUES (1846,'Halifax','CAN','Nova Scotia',113910); -INSERT INTO City VALUES (1847,'Cambridge','CAN','Ontario',109186); -INSERT INTO City VALUES (1848,'Gloucester','CAN','Ontario',107314); -INSERT INTO City VALUES (1849,'Abbotsford','CAN','British Colombia',105403); -INSERT INTO City VALUES (1850,'Guelph','CAN','Ontario',103593); -INSERT INTO City VALUES (1851,'Saint John�s','CAN','Newfoundland',101936); -INSERT INTO City VALUES (1852,'Coquitlam','CAN','British Colombia',101820); -INSERT INTO City VALUES (1853,'Saanich','CAN','British Colombia',101388); -INSERT INTO City VALUES (1854,'Gatineau','CAN','Qu�bec',100702); -INSERT INTO City VALUES (1855,'Delta','CAN','British Colombia',95411); -INSERT INTO City VALUES (1856,'Sudbury','CAN','Ontario',92686); -INSERT INTO City VALUES (1857,'Kelowna','CAN','British Colombia',89442); -INSERT INTO City VALUES (1858,'Barrie','CAN','Ontario',89269); -INSERT INTO City VALUES (1859,'Praia','CPV','S�o Tiago',94800); -INSERT INTO City VALUES (1860,'Almaty','KAZ','Almaty Qalasy',1129400); -INSERT INTO City VALUES (1861,'Qaraghandy','KAZ','Qaraghandy',436900); -INSERT INTO City VALUES (1862,'Shymkent','KAZ','South Kazakstan',360100); -INSERT INTO City VALUES (1863,'Taraz','KAZ','Taraz',330100); -INSERT INTO City VALUES (1864,'Astana','KAZ','Astana',311200); -INSERT INTO City VALUES (1865,'�skemen','KAZ','East Kazakstan',311000); -INSERT INTO City VALUES (1866,'Pavlodar','KAZ','Pavlodar',300500); -INSERT INTO City VALUES (1867,'Semey','KAZ','East Kazakstan',269600); -INSERT INTO City VALUES (1868,'Aqt�be','KAZ','Aqt�be',253100); -INSERT INTO City VALUES (1869,'Qostanay','KAZ','Qostanay',221400); -INSERT INTO City VALUES (1870,'Petropavl','KAZ','North Kazakstan',203500); -INSERT INTO City VALUES (1871,'Oral','KAZ','West Kazakstan',195500); -INSERT INTO City VALUES (1872,'Temirtau','KAZ','Qaraghandy',170500); -INSERT INTO City VALUES (1873,'Qyzylorda','KAZ','Qyzylorda',157400); -INSERT INTO City VALUES (1874,'Aqtau','KAZ','Mangghystau',143400); -INSERT INTO City VALUES (1875,'Atyrau','KAZ','Atyrau',142500); -INSERT INTO City VALUES (1876,'Ekibastuz','KAZ','Pavlodar',127200); -INSERT INTO City VALUES (1877,'K�kshetau','KAZ','North Kazakstan',123400); -INSERT INTO City VALUES (1878,'Rudnyy','KAZ','Qostanay',109500); -INSERT INTO City VALUES (1879,'Taldyqorghan','KAZ','Almaty',98000); -INSERT INTO City VALUES (1880,'Zhezqazghan','KAZ','Qaraghandy',90000); -INSERT INTO City VALUES (1881,'Nairobi','KEN','Nairobi',2290000); -INSERT INTO City VALUES (1882,'Mombasa','KEN','Coast',461753); -INSERT INTO City VALUES (1883,'Kisumu','KEN','Nyanza',192733); -INSERT INTO City VALUES (1884,'Nakuru','KEN','Rift Valley',163927); -INSERT INTO City VALUES (1885,'Machakos','KEN','Eastern',116293); -INSERT INTO City VALUES (1886,'Eldoret','KEN','Rift Valley',111882); -INSERT INTO City VALUES (1887,'Meru','KEN','Eastern',94947); -INSERT INTO City VALUES (1888,'Nyeri','KEN','Central',91258); -INSERT INTO City VALUES (1889,'Bangui','CAF','Bangui',524000); -INSERT INTO City VALUES (1890,'Shanghai','CHN','Shanghai',9696300); -INSERT INTO City VALUES (1891,'Peking','CHN','Peking',7472000); -INSERT INTO City VALUES (1892,'Chongqing','CHN','Chongqing',6351600); -INSERT INTO City VALUES (1893,'Tianjin','CHN','Tianjin',5286800); -INSERT INTO City VALUES (1894,'Wuhan','CHN','Hubei',4344600); -INSERT INTO City VALUES (1895,'Harbin','CHN','Heilongjiang',4289800); -INSERT INTO City VALUES (1896,'Shenyang','CHN','Liaoning',4265200); -INSERT INTO City VALUES (1897,'Kanton [Guangzhou]','CHN','Guangdong',4256300); -INSERT INTO City VALUES (1898,'Chengdu','CHN','Sichuan',3361500); -INSERT INTO City VALUES (1899,'Nanking [Nanjing]','CHN','Jiangsu',2870300); -INSERT INTO City VALUES (1900,'Changchun','CHN','Jilin',2812000); -INSERT INTO City VALUES (1901,'Xi�an','CHN','Shaanxi',2761400); -INSERT INTO City VALUES (1902,'Dalian','CHN','Liaoning',2697000); -INSERT INTO City VALUES (1903,'Qingdao','CHN','Shandong',2596000); -INSERT INTO City VALUES (1904,'Jinan','CHN','Shandong',2278100); -INSERT INTO City VALUES (1905,'Hangzhou','CHN','Zhejiang',2190500); -INSERT INTO City VALUES (1906,'Zhengzhou','CHN','Henan',2107200); -INSERT INTO City VALUES (1907,'Shijiazhuang','CHN','Hebei',2041500); -INSERT INTO City VALUES (1908,'Taiyuan','CHN','Shanxi',1968400); -INSERT INTO City VALUES (1909,'Kunming','CHN','Yunnan',1829500); -INSERT INTO City VALUES (1910,'Changsha','CHN','Hunan',1809800); -INSERT INTO City VALUES (1911,'Nanchang','CHN','Jiangxi',1691600); -INSERT INTO City VALUES (1912,'Fuzhou','CHN','Fujian',1593800); -INSERT INTO City VALUES (1913,'Lanzhou','CHN','Gansu',1565800); -INSERT INTO City VALUES (1914,'Guiyang','CHN','Guizhou',1465200); -INSERT INTO City VALUES (1915,'Ningbo','CHN','Zhejiang',1371200); -INSERT INTO City VALUES (1916,'Hefei','CHN','Anhui',1369100); -INSERT INTO City VALUES (1917,'Urumt�i [�r�mqi]','CHN','Xinxiang',1310100); -INSERT INTO City VALUES (1918,'Anshan','CHN','Liaoning',1200000); -INSERT INTO City VALUES (1919,'Fushun','CHN','Liaoning',1200000); -INSERT INTO City VALUES (1920,'Nanning','CHN','Guangxi',1161800); -INSERT INTO City VALUES (1921,'Zibo','CHN','Shandong',1140000); -INSERT INTO City VALUES (1922,'Qiqihar','CHN','Heilongjiang',1070000); -INSERT INTO City VALUES (1923,'Jilin','CHN','Jilin',1040000); -INSERT INTO City VALUES (1924,'Tangshan','CHN','Hebei',1040000); -INSERT INTO City VALUES (1925,'Baotou','CHN','Inner Mongolia',980000); -INSERT INTO City VALUES (1926,'Shenzhen','CHN','Guangdong',950500); -INSERT INTO City VALUES (1927,'Hohhot','CHN','Inner Mongolia',916700); -INSERT INTO City VALUES (1928,'Handan','CHN','Hebei',840000); -INSERT INTO City VALUES (1929,'Wuxi','CHN','Jiangsu',830000); -INSERT INTO City VALUES (1930,'Xuzhou','CHN','Jiangsu',810000); -INSERT INTO City VALUES (1931,'Datong','CHN','Shanxi',800000); -INSERT INTO City VALUES (1932,'Yichun','CHN','Heilongjiang',800000); -INSERT INTO City VALUES (1933,'Benxi','CHN','Liaoning',770000); -INSERT INTO City VALUES (1934,'Luoyang','CHN','Henan',760000); -INSERT INTO City VALUES (1935,'Suzhou','CHN','Jiangsu',710000); -INSERT INTO City VALUES (1936,'Xining','CHN','Qinghai',700200); -INSERT INTO City VALUES (1937,'Huainan','CHN','Anhui',700000); -INSERT INTO City VALUES (1938,'Jixi','CHN','Heilongjiang',683885); -INSERT INTO City VALUES (1939,'Daqing','CHN','Heilongjiang',660000); -INSERT INTO City VALUES (1940,'Fuxin','CHN','Liaoning',640000); -INSERT INTO City VALUES (1941,'Amoy [Xiamen]','CHN','Fujian',627500); -INSERT INTO City VALUES (1942,'Liuzhou','CHN','Guangxi',610000); -INSERT INTO City VALUES (1943,'Shantou','CHN','Guangdong',580000); -INSERT INTO City VALUES (1944,'Jinzhou','CHN','Liaoning',570000); -INSERT INTO City VALUES (1945,'Mudanjiang','CHN','Heilongjiang',570000); -INSERT INTO City VALUES (1946,'Yinchuan','CHN','Ningxia',544500); -INSERT INTO City VALUES (1947,'Changzhou','CHN','Jiangsu',530000); -INSERT INTO City VALUES (1948,'Zhangjiakou','CHN','Hebei',530000); -INSERT INTO City VALUES (1949,'Dandong','CHN','Liaoning',520000); -INSERT INTO City VALUES (1950,'Hegang','CHN','Heilongjiang',520000); -INSERT INTO City VALUES (1951,'Kaifeng','CHN','Henan',510000); -INSERT INTO City VALUES (1952,'Jiamusi','CHN','Heilongjiang',493409); -INSERT INTO City VALUES (1953,'Liaoyang','CHN','Liaoning',492559); -INSERT INTO City VALUES (1954,'Hengyang','CHN','Hunan',487148); -INSERT INTO City VALUES (1955,'Baoding','CHN','Hebei',483155); -INSERT INTO City VALUES (1956,'Hunjiang','CHN','Jilin',482043); -INSERT INTO City VALUES (1957,'Xinxiang','CHN','Henan',473762); -INSERT INTO City VALUES (1958,'Huangshi','CHN','Hubei',457601); -INSERT INTO City VALUES (1959,'Haikou','CHN','Hainan',454300); -INSERT INTO City VALUES (1960,'Yantai','CHN','Shandong',452127); -INSERT INTO City VALUES (1961,'Bengbu','CHN','Anhui',449245); -INSERT INTO City VALUES (1962,'Xiangtan','CHN','Hunan',441968); -INSERT INTO City VALUES (1963,'Weifang','CHN','Shandong',428522); -INSERT INTO City VALUES (1964,'Wuhu','CHN','Anhui',425740); -INSERT INTO City VALUES (1965,'Pingxiang','CHN','Jiangxi',425579); -INSERT INTO City VALUES (1966,'Yingkou','CHN','Liaoning',421589); -INSERT INTO City VALUES (1967,'Anyang','CHN','Henan',420332); -INSERT INTO City VALUES (1968,'Panzhihua','CHN','Sichuan',415466); -INSERT INTO City VALUES (1969,'Pingdingshan','CHN','Henan',410775); -INSERT INTO City VALUES (1970,'Xiangfan','CHN','Hubei',410407); -INSERT INTO City VALUES (1971,'Zhuzhou','CHN','Hunan',409924); -INSERT INTO City VALUES (1972,'Jiaozuo','CHN','Henan',409100); -INSERT INTO City VALUES (1973,'Wenzhou','CHN','Zhejiang',401871); -INSERT INTO City VALUES (1974,'Zhangjiang','CHN','Guangdong',400997); -INSERT INTO City VALUES (1975,'Zigong','CHN','Sichuan',393184); -INSERT INTO City VALUES (1976,'Shuangyashan','CHN','Heilongjiang',386081); -INSERT INTO City VALUES (1977,'Zaozhuang','CHN','Shandong',380846); -INSERT INTO City VALUES (1978,'Yakeshi','CHN','Inner Mongolia',377869); -INSERT INTO City VALUES (1979,'Yichang','CHN','Hubei',371601); -INSERT INTO City VALUES (1980,'Zhenjiang','CHN','Jiangsu',368316); -INSERT INTO City VALUES (1981,'Huaibei','CHN','Anhui',366549); -INSERT INTO City VALUES (1982,'Qinhuangdao','CHN','Hebei',364972); -INSERT INTO City VALUES (1983,'Guilin','CHN','Guangxi',364130); -INSERT INTO City VALUES (1984,'Liupanshui','CHN','Guizhou',363954); -INSERT INTO City VALUES (1985,'Panjin','CHN','Liaoning',362773); -INSERT INTO City VALUES (1986,'Yangquan','CHN','Shanxi',362268); -INSERT INTO City VALUES (1987,'Jinxi','CHN','Liaoning',357052); -INSERT INTO City VALUES (1988,'Liaoyuan','CHN','Jilin',354141); -INSERT INTO City VALUES (1989,'Lianyungang','CHN','Jiangsu',354139); -INSERT INTO City VALUES (1990,'Xianyang','CHN','Shaanxi',352125); -INSERT INTO City VALUES (1991,'Tai�an','CHN','Shandong',350696); -INSERT INTO City VALUES (1992,'Chifeng','CHN','Inner Mongolia',350077); -INSERT INTO City VALUES (1993,'Shaoguan','CHN','Guangdong',350043); -INSERT INTO City VALUES (1994,'Nantong','CHN','Jiangsu',343341); -INSERT INTO City VALUES (1995,'Leshan','CHN','Sichuan',341128); -INSERT INTO City VALUES (1996,'Baoji','CHN','Shaanxi',337765); -INSERT INTO City VALUES (1997,'Linyi','CHN','Shandong',324720); -INSERT INTO City VALUES (1998,'Tonghua','CHN','Jilin',324600); -INSERT INTO City VALUES (1999,'Siping','CHN','Jilin',317223); -INSERT INTO City VALUES (2000,'Changzhi','CHN','Shanxi',317144); -INSERT INTO City VALUES (2001,'Tengzhou','CHN','Shandong',315083); -INSERT INTO City VALUES (2002,'Chaozhou','CHN','Guangdong',313469); -INSERT INTO City VALUES (2003,'Yangzhou','CHN','Jiangsu',312892); -INSERT INTO City VALUES (2004,'Dongwan','CHN','Guangdong',308669); -INSERT INTO City VALUES (2005,'Ma�anshan','CHN','Anhui',305421); -INSERT INTO City VALUES (2006,'Foshan','CHN','Guangdong',303160); -INSERT INTO City VALUES (2007,'Yueyang','CHN','Hunan',302800); -INSERT INTO City VALUES (2008,'Xingtai','CHN','Hebei',302789); -INSERT INTO City VALUES (2009,'Changde','CHN','Hunan',301276); -INSERT INTO City VALUES (2010,'Shihezi','CHN','Xinxiang',299676); -INSERT INTO City VALUES (2011,'Yancheng','CHN','Jiangsu',296831); -INSERT INTO City VALUES (2012,'Jiujiang','CHN','Jiangxi',291187); -INSERT INTO City VALUES (2013,'Dongying','CHN','Shandong',281728); -INSERT INTO City VALUES (2014,'Shashi','CHN','Hubei',281352); -INSERT INTO City VALUES (2015,'Xintai','CHN','Shandong',281248); -INSERT INTO City VALUES (2016,'Jingdezhen','CHN','Jiangxi',281183); -INSERT INTO City VALUES (2017,'Tongchuan','CHN','Shaanxi',280657); -INSERT INTO City VALUES (2018,'Zhongshan','CHN','Guangdong',278829); -INSERT INTO City VALUES (2019,'Shiyan','CHN','Hubei',273786); -INSERT INTO City VALUES (2020,'Tieli','CHN','Heilongjiang',265683); -INSERT INTO City VALUES (2021,'Jining','CHN','Shandong',265248); -INSERT INTO City VALUES (2022,'Wuhai','CHN','Inner Mongolia',264081); -INSERT INTO City VALUES (2023,'Mianyang','CHN','Sichuan',262947); -INSERT INTO City VALUES (2024,'Luzhou','CHN','Sichuan',262892); -INSERT INTO City VALUES (2025,'Zunyi','CHN','Guizhou',261862); -INSERT INTO City VALUES (2026,'Shizuishan','CHN','Ningxia',257862); -INSERT INTO City VALUES (2027,'Neijiang','CHN','Sichuan',256012); -INSERT INTO City VALUES (2028,'Tongliao','CHN','Inner Mongolia',255129); -INSERT INTO City VALUES (2029,'Tieling','CHN','Liaoning',254842); -INSERT INTO City VALUES (2030,'Wafangdian','CHN','Liaoning',251733); -INSERT INTO City VALUES (2031,'Anqing','CHN','Anhui',250718); -INSERT INTO City VALUES (2032,'Shaoyang','CHN','Hunan',247227); -INSERT INTO City VALUES (2033,'Laiwu','CHN','Shandong',246833); -INSERT INTO City VALUES (2034,'Chengde','CHN','Hebei',246799); -INSERT INTO City VALUES (2035,'Tianshui','CHN','Gansu',244974); -INSERT INTO City VALUES (2036,'Nanyang','CHN','Henan',243303); -INSERT INTO City VALUES (2037,'Cangzhou','CHN','Hebei',242708); -INSERT INTO City VALUES (2038,'Yibin','CHN','Sichuan',241019); -INSERT INTO City VALUES (2039,'Huaiyin','CHN','Jiangsu',239675); -INSERT INTO City VALUES (2040,'Dunhua','CHN','Jilin',235100); -INSERT INTO City VALUES (2041,'Yanji','CHN','Jilin',230892); -INSERT INTO City VALUES (2042,'Jiangmen','CHN','Guangdong',230587); -INSERT INTO City VALUES (2043,'Tongling','CHN','Anhui',228017); -INSERT INTO City VALUES (2044,'Suihua','CHN','Heilongjiang',227881); -INSERT INTO City VALUES (2045,'Gongziling','CHN','Jilin',226569); -INSERT INTO City VALUES (2046,'Xiantao','CHN','Hubei',222884); -INSERT INTO City VALUES (2047,'Chaoyang','CHN','Liaoning',222394); -INSERT INTO City VALUES (2048,'Ganzhou','CHN','Jiangxi',220129); -INSERT INTO City VALUES (2049,'Huzhou','CHN','Zhejiang',218071); -INSERT INTO City VALUES (2050,'Baicheng','CHN','Jilin',217987); -INSERT INTO City VALUES (2051,'Shangzi','CHN','Heilongjiang',215373); -INSERT INTO City VALUES (2052,'Yangjiang','CHN','Guangdong',215196); -INSERT INTO City VALUES (2053,'Qitaihe','CHN','Heilongjiang',214957); -INSERT INTO City VALUES (2054,'Gejiu','CHN','Yunnan',214294); -INSERT INTO City VALUES (2055,'Jiangyin','CHN','Jiangsu',213659); -INSERT INTO City VALUES (2056,'Hebi','CHN','Henan',212976); -INSERT INTO City VALUES (2057,'Jiaxing','CHN','Zhejiang',211526); -INSERT INTO City VALUES (2058,'Wuzhou','CHN','Guangxi',210452); -INSERT INTO City VALUES (2059,'Meihekou','CHN','Jilin',209038); -INSERT INTO City VALUES (2060,'Xuchang','CHN','Henan',208815); -INSERT INTO City VALUES (2061,'Liaocheng','CHN','Shandong',207844); -INSERT INTO City VALUES (2062,'Haicheng','CHN','Liaoning',205560); -INSERT INTO City VALUES (2063,'Qianjiang','CHN','Hubei',205504); -INSERT INTO City VALUES (2064,'Baiyin','CHN','Gansu',204970); -INSERT INTO City VALUES (2065,'Bei�an','CHN','Heilongjiang',204899); -INSERT INTO City VALUES (2066,'Yixing','CHN','Jiangsu',200824); -INSERT INTO City VALUES (2067,'Laizhou','CHN','Shandong',198664); -INSERT INTO City VALUES (2068,'Qaramay','CHN','Xinxiang',197602); -INSERT INTO City VALUES (2069,'Acheng','CHN','Heilongjiang',197595); -INSERT INTO City VALUES (2070,'Dezhou','CHN','Shandong',195485); -INSERT INTO City VALUES (2071,'Nanping','CHN','Fujian',195064); -INSERT INTO City VALUES (2072,'Zhaoqing','CHN','Guangdong',194784); -INSERT INTO City VALUES (2073,'Beipiao','CHN','Liaoning',194301); -INSERT INTO City VALUES (2074,'Fengcheng','CHN','Jiangxi',193784); -INSERT INTO City VALUES (2075,'Fuyu','CHN','Jilin',192981); -INSERT INTO City VALUES (2076,'Xinyang','CHN','Henan',192509); -INSERT INTO City VALUES (2077,'Dongtai','CHN','Jiangsu',192247); -INSERT INTO City VALUES (2078,'Yuci','CHN','Shanxi',191356); -INSERT INTO City VALUES (2079,'Honghu','CHN','Hubei',190772); -INSERT INTO City VALUES (2080,'Ezhou','CHN','Hubei',190123); -INSERT INTO City VALUES (2081,'Heze','CHN','Shandong',189293); -INSERT INTO City VALUES (2082,'Daxian','CHN','Sichuan',188101); -INSERT INTO City VALUES (2083,'Linfen','CHN','Shanxi',187309); -INSERT INTO City VALUES (2084,'Tianmen','CHN','Hubei',186332); -INSERT INTO City VALUES (2085,'Yiyang','CHN','Hunan',185818); -INSERT INTO City VALUES (2086,'Quanzhou','CHN','Fujian',185154); -INSERT INTO City VALUES (2087,'Rizhao','CHN','Shandong',185048); -INSERT INTO City VALUES (2088,'Deyang','CHN','Sichuan',182488); -INSERT INTO City VALUES (2089,'Guangyuan','CHN','Sichuan',182241); -INSERT INTO City VALUES (2090,'Changshu','CHN','Jiangsu',181805); -INSERT INTO City VALUES (2091,'Zhangzhou','CHN','Fujian',181424); -INSERT INTO City VALUES (2092,'Hailar','CHN','Inner Mongolia',180650); -INSERT INTO City VALUES (2093,'Nanchong','CHN','Sichuan',180273); -INSERT INTO City VALUES (2094,'Jiutai','CHN','Jilin',180130); -INSERT INTO City VALUES (2095,'Zhaodong','CHN','Heilongjiang',179976); -INSERT INTO City VALUES (2096,'Shaoxing','CHN','Zhejiang',179818); -INSERT INTO City VALUES (2097,'Fuyang','CHN','Anhui',179572); -INSERT INTO City VALUES (2098,'Maoming','CHN','Guangdong',178683); -INSERT INTO City VALUES (2099,'Qujing','CHN','Yunnan',178669); -INSERT INTO City VALUES (2100,'Ghulja','CHN','Xinxiang',177193); -INSERT INTO City VALUES (2101,'Jiaohe','CHN','Jilin',176367); -INSERT INTO City VALUES (2102,'Puyang','CHN','Henan',175988); -INSERT INTO City VALUES (2103,'Huadian','CHN','Jilin',175873); -INSERT INTO City VALUES (2104,'Jiangyou','CHN','Sichuan',175753); -INSERT INTO City VALUES (2105,'Qashqar','CHN','Xinxiang',174570); -INSERT INTO City VALUES (2106,'Anshun','CHN','Guizhou',174142); -INSERT INTO City VALUES (2107,'Fuling','CHN','Sichuan',173878); -INSERT INTO City VALUES (2108,'Xinyu','CHN','Jiangxi',173524); -INSERT INTO City VALUES (2109,'Hanzhong','CHN','Shaanxi',169930); -INSERT INTO City VALUES (2110,'Danyang','CHN','Jiangsu',169603); -INSERT INTO City VALUES (2111,'Chenzhou','CHN','Hunan',169400); -INSERT INTO City VALUES (2112,'Xiaogan','CHN','Hubei',166280); -INSERT INTO City VALUES (2113,'Shangqiu','CHN','Henan',164880); -INSERT INTO City VALUES (2114,'Zhuhai','CHN','Guangdong',164747); -INSERT INTO City VALUES (2115,'Qingyuan','CHN','Guangdong',164641); -INSERT INTO City VALUES (2116,'Aqsu','CHN','Xinxiang',164092); -INSERT INTO City VALUES (2117,'Jining','CHN','Inner Mongolia',163552); -INSERT INTO City VALUES (2118,'Xiaoshan','CHN','Zhejiang',162930); -INSERT INTO City VALUES (2119,'Zaoyang','CHN','Hubei',162198); -INSERT INTO City VALUES (2120,'Xinghua','CHN','Jiangsu',161910); -INSERT INTO City VALUES (2121,'Hami','CHN','Xinxiang',161315); -INSERT INTO City VALUES (2122,'Huizhou','CHN','Guangdong',161023); -INSERT INTO City VALUES (2123,'Jinmen','CHN','Hubei',160794); -INSERT INTO City VALUES (2124,'Sanming','CHN','Fujian',160691); -INSERT INTO City VALUES (2125,'Ulanhot','CHN','Inner Mongolia',159538); -INSERT INTO City VALUES (2126,'Korla','CHN','Xinxiang',159344); -INSERT INTO City VALUES (2127,'Wanxian','CHN','Sichuan',156823); -INSERT INTO City VALUES (2128,'Rui�an','CHN','Zhejiang',156468); -INSERT INTO City VALUES (2129,'Zhoushan','CHN','Zhejiang',156317); -INSERT INTO City VALUES (2130,'Liangcheng','CHN','Shandong',156307); -INSERT INTO City VALUES (2131,'Jiaozhou','CHN','Shandong',153364); -INSERT INTO City VALUES (2132,'Taizhou','CHN','Jiangsu',152442); -INSERT INTO City VALUES (2133,'Suzhou','CHN','Anhui',151862); -INSERT INTO City VALUES (2134,'Yichun','CHN','Jiangxi',151585); -INSERT INTO City VALUES (2135,'Taonan','CHN','Jilin',150168); -INSERT INTO City VALUES (2136,'Pingdu','CHN','Shandong',150123); -INSERT INTO City VALUES (2137,'Ji�an','CHN','Jiangxi',148583); -INSERT INTO City VALUES (2138,'Longkou','CHN','Shandong',148362); -INSERT INTO City VALUES (2139,'Langfang','CHN','Hebei',148105); -INSERT INTO City VALUES (2140,'Zhoukou','CHN','Henan',146288); -INSERT INTO City VALUES (2141,'Suining','CHN','Sichuan',146086); -INSERT INTO City VALUES (2142,'Yulin','CHN','Guangxi',144467); -INSERT INTO City VALUES (2143,'Jinhua','CHN','Zhejiang',144280); -INSERT INTO City VALUES (2144,'Liu�an','CHN','Anhui',144248); -INSERT INTO City VALUES (2145,'Shuangcheng','CHN','Heilongjiang',142659); -INSERT INTO City VALUES (2146,'Suizhou','CHN','Hubei',142302); -INSERT INTO City VALUES (2147,'Ankang','CHN','Shaanxi',142170); -INSERT INTO City VALUES (2148,'Weinan','CHN','Shaanxi',140169); -INSERT INTO City VALUES (2149,'Longjing','CHN','Jilin',139417); -INSERT INTO City VALUES (2150,'Da�an','CHN','Jilin',138963); -INSERT INTO City VALUES (2151,'Lengshuijiang','CHN','Hunan',137994); -INSERT INTO City VALUES (2152,'Laiyang','CHN','Shandong',137080); -INSERT INTO City VALUES (2153,'Xianning','CHN','Hubei',136811); -INSERT INTO City VALUES (2154,'Dali','CHN','Yunnan',136554); -INSERT INTO City VALUES (2155,'Anda','CHN','Heilongjiang',136446); -INSERT INTO City VALUES (2156,'Jincheng','CHN','Shanxi',136396); -INSERT INTO City VALUES (2157,'Longyan','CHN','Fujian',134481); -INSERT INTO City VALUES (2158,'Xichang','CHN','Sichuan',134419); -INSERT INTO City VALUES (2159,'Wendeng','CHN','Shandong',133910); -INSERT INTO City VALUES (2160,'Hailun','CHN','Heilongjiang',133565); -INSERT INTO City VALUES (2161,'Binzhou','CHN','Shandong',133555); -INSERT INTO City VALUES (2162,'Linhe','CHN','Inner Mongolia',133183); -INSERT INTO City VALUES (2163,'Wuwei','CHN','Gansu',133101); -INSERT INTO City VALUES (2164,'Duyun','CHN','Guizhou',132971); -INSERT INTO City VALUES (2165,'Mishan','CHN','Heilongjiang',132744); -INSERT INTO City VALUES (2166,'Shangrao','CHN','Jiangxi',132455); -INSERT INTO City VALUES (2167,'Changji','CHN','Xinxiang',132260); -INSERT INTO City VALUES (2168,'Meixian','CHN','Guangdong',132156); -INSERT INTO City VALUES (2169,'Yushu','CHN','Jilin',131861); -INSERT INTO City VALUES (2170,'Tiefa','CHN','Liaoning',131807); -INSERT INTO City VALUES (2171,'Huai�an','CHN','Jiangsu',131149); -INSERT INTO City VALUES (2172,'Leiyang','CHN','Hunan',130115); -INSERT INTO City VALUES (2173,'Zalantun','CHN','Inner Mongolia',130031); -INSERT INTO City VALUES (2174,'Weihai','CHN','Shandong',128888); -INSERT INTO City VALUES (2175,'Loudi','CHN','Hunan',128418); -INSERT INTO City VALUES (2176,'Qingzhou','CHN','Shandong',128258); -INSERT INTO City VALUES (2177,'Qidong','CHN','Jiangsu',126872); -INSERT INTO City VALUES (2178,'Huaihua','CHN','Hunan',126785); -INSERT INTO City VALUES (2179,'Luohe','CHN','Henan',126438); -INSERT INTO City VALUES (2180,'Chuzhou','CHN','Anhui',125341); -INSERT INTO City VALUES (2181,'Kaiyuan','CHN','Liaoning',124219); -INSERT INTO City VALUES (2182,'Linqing','CHN','Shandong',123958); -INSERT INTO City VALUES (2183,'Chaohu','CHN','Anhui',123676); -INSERT INTO City VALUES (2184,'Laohekou','CHN','Hubei',123366); -INSERT INTO City VALUES (2185,'Dujiangyan','CHN','Sichuan',123357); -INSERT INTO City VALUES (2186,'Zhumadian','CHN','Henan',123232); -INSERT INTO City VALUES (2187,'Linchuan','CHN','Jiangxi',121949); -INSERT INTO City VALUES (2188,'Jiaonan','CHN','Shandong',121397); -INSERT INTO City VALUES (2189,'Sanmenxia','CHN','Henan',120523); -INSERT INTO City VALUES (2190,'Heyuan','CHN','Guangdong',120101); -INSERT INTO City VALUES (2191,'Manzhouli','CHN','Inner Mongolia',120023); -INSERT INTO City VALUES (2192,'Lhasa','CHN','Tibet',120000); -INSERT INTO City VALUES (2193,'Lianyuan','CHN','Hunan',118858); -INSERT INTO City VALUES (2194,'Kuytun','CHN','Xinxiang',118553); -INSERT INTO City VALUES (2195,'Puqi','CHN','Hubei',117264); -INSERT INTO City VALUES (2196,'Hongjiang','CHN','Hunan',116188); -INSERT INTO City VALUES (2197,'Qinzhou','CHN','Guangxi',114586); -INSERT INTO City VALUES (2198,'Renqiu','CHN','Hebei',114256); -INSERT INTO City VALUES (2199,'Yuyao','CHN','Zhejiang',114065); -INSERT INTO City VALUES (2200,'Guigang','CHN','Guangxi',114025); -INSERT INTO City VALUES (2201,'Kaili','CHN','Guizhou',113958); -INSERT INTO City VALUES (2202,'Yan�an','CHN','Shaanxi',113277); -INSERT INTO City VALUES (2203,'Beihai','CHN','Guangxi',112673); -INSERT INTO City VALUES (2204,'Xuangzhou','CHN','Anhui',112673); -INSERT INTO City VALUES (2205,'Quzhou','CHN','Zhejiang',112373); -INSERT INTO City VALUES (2206,'Yong�an','CHN','Fujian',111762); -INSERT INTO City VALUES (2207,'Zixing','CHN','Hunan',110048); -INSERT INTO City VALUES (2208,'Liyang','CHN','Jiangsu',109520); -INSERT INTO City VALUES (2209,'Yizheng','CHN','Jiangsu',109268); -INSERT INTO City VALUES (2210,'Yumen','CHN','Gansu',109234); -INSERT INTO City VALUES (2211,'Liling','CHN','Hunan',108504); -INSERT INTO City VALUES (2212,'Yuncheng','CHN','Shanxi',108359); -INSERT INTO City VALUES (2213,'Shanwei','CHN','Guangdong',107847); -INSERT INTO City VALUES (2214,'Cixi','CHN','Zhejiang',107329); -INSERT INTO City VALUES (2215,'Yuanjiang','CHN','Hunan',107004); -INSERT INTO City VALUES (2216,'Bozhou','CHN','Anhui',106346); -INSERT INTO City VALUES (2217,'Jinchang','CHN','Gansu',105287); -INSERT INTO City VALUES (2218,'Fu�an','CHN','Fujian',105265); -INSERT INTO City VALUES (2219,'Suqian','CHN','Jiangsu',105021); -INSERT INTO City VALUES (2220,'Shishou','CHN','Hubei',104571); -INSERT INTO City VALUES (2221,'Hengshui','CHN','Hebei',104269); -INSERT INTO City VALUES (2222,'Danjiangkou','CHN','Hubei',103211); -INSERT INTO City VALUES (2223,'Fujin','CHN','Heilongjiang',103104); -INSERT INTO City VALUES (2224,'Sanya','CHN','Hainan',102820); -INSERT INTO City VALUES (2225,'Guangshui','CHN','Hubei',102770); -INSERT INTO City VALUES (2226,'Huangshan','CHN','Anhui',102628); -INSERT INTO City VALUES (2227,'Xingcheng','CHN','Liaoning',102384); -INSERT INTO City VALUES (2228,'Zhucheng','CHN','Shandong',102134); -INSERT INTO City VALUES (2229,'Kunshan','CHN','Jiangsu',102052); -INSERT INTO City VALUES (2230,'Haining','CHN','Zhejiang',100478); -INSERT INTO City VALUES (2231,'Pingliang','CHN','Gansu',99265); -INSERT INTO City VALUES (2232,'Fuqing','CHN','Fujian',99193); -INSERT INTO City VALUES (2233,'Xinzhou','CHN','Shanxi',98667); -INSERT INTO City VALUES (2234,'Jieyang','CHN','Guangdong',98531); -INSERT INTO City VALUES (2235,'Zhangjiagang','CHN','Jiangsu',97994); -INSERT INTO City VALUES (2236,'Tong Xian','CHN','Peking',97168); -INSERT INTO City VALUES (2237,'Ya�an','CHN','Sichuan',95900); -INSERT INTO City VALUES (2238,'Jinzhou','CHN','Liaoning',95761); -INSERT INTO City VALUES (2239,'Emeishan','CHN','Sichuan',94000); -INSERT INTO City VALUES (2240,'Enshi','CHN','Hubei',93056); -INSERT INTO City VALUES (2241,'Bose','CHN','Guangxi',93009); -INSERT INTO City VALUES (2242,'Yuzhou','CHN','Henan',92889); -INSERT INTO City VALUES (2243,'Kaiyuan','CHN','Yunnan',91999); -INSERT INTO City VALUES (2244,'Tumen','CHN','Jilin',91471); -INSERT INTO City VALUES (2245,'Putian','CHN','Fujian',91030); -INSERT INTO City VALUES (2246,'Linhai','CHN','Zhejiang',90870); -INSERT INTO City VALUES (2247,'Xilin Hot','CHN','Inner Mongolia',90646); -INSERT INTO City VALUES (2248,'Shaowu','CHN','Fujian',90286); -INSERT INTO City VALUES (2249,'Junan','CHN','Shandong',90222); -INSERT INTO City VALUES (2250,'Huaying','CHN','Sichuan',89400); -INSERT INTO City VALUES (2251,'Pingyi','CHN','Shandong',89373); -INSERT INTO City VALUES (2252,'Huangyan','CHN','Zhejiang',89288); -INSERT INTO City VALUES (2253,'Bishkek','KGZ','Bishkek shaary',589400); -INSERT INTO City VALUES (2254,'Osh','KGZ','Osh',222700); -INSERT INTO City VALUES (2255,'Bikenibeu','KIR','South Tarawa',5055); -INSERT INTO City VALUES (2256,'Bairiki','KIR','South Tarawa',2226); -INSERT INTO City VALUES (2257,'Santaf� de Bogot�','COL','Santaf� de Bogot�',6260862); -INSERT INTO City VALUES (2258,'Cali','COL','Valle',2077386); -INSERT INTO City VALUES (2259,'Medell�n','COL','Antioquia',1861265); -INSERT INTO City VALUES (2260,'Barranquilla','COL','Atl�ntico',1223260); -INSERT INTO City VALUES (2261,'Cartagena','COL','Bol�var',805757); -INSERT INTO City VALUES (2262,'C�cuta','COL','Norte de Santander',606932); -INSERT INTO City VALUES (2263,'Bucaramanga','COL','Santander',515555); -INSERT INTO City VALUES (2264,'Ibagu�','COL','Tolima',393664); -INSERT INTO City VALUES (2265,'Pereira','COL','Risaralda',381725); -INSERT INTO City VALUES (2266,'Santa Marta','COL','Magdalena',359147); -INSERT INTO City VALUES (2267,'Manizales','COL','Caldas',337580); -INSERT INTO City VALUES (2268,'Bello','COL','Antioquia',333470); -INSERT INTO City VALUES (2269,'Pasto','COL','Nari�o',332396); -INSERT INTO City VALUES (2270,'Neiva','COL','Huila',300052); -INSERT INTO City VALUES (2271,'Soledad','COL','Atl�ntico',295058); -INSERT INTO City VALUES (2272,'Armenia','COL','Quind�o',288977); -INSERT INTO City VALUES (2273,'Villavicencio','COL','Meta',273140); -INSERT INTO City VALUES (2274,'Soacha','COL','Cundinamarca',272058); -INSERT INTO City VALUES (2275,'Valledupar','COL','Cesar',263247); -INSERT INTO City VALUES (2276,'Monter�a','COL','C�rdoba',248245); -INSERT INTO City VALUES (2277,'Itag��','COL','Antioquia',228985); -INSERT INTO City VALUES (2278,'Palmira','COL','Valle',226509); -INSERT INTO City VALUES (2279,'Buenaventura','COL','Valle',224336); -INSERT INTO City VALUES (2280,'Floridablanca','COL','Santander',221913); -INSERT INTO City VALUES (2281,'Sincelejo','COL','Sucre',220704); -INSERT INTO City VALUES (2282,'Popay�n','COL','Cauca',200719); -INSERT INTO City VALUES (2283,'Barrancabermeja','COL','Santander',178020); -INSERT INTO City VALUES (2284,'Dos Quebradas','COL','Risaralda',159363); -INSERT INTO City VALUES (2285,'Tulu�','COL','Valle',152488); -INSERT INTO City VALUES (2286,'Envigado','COL','Antioquia',135848); -INSERT INTO City VALUES (2287,'Cartago','COL','Valle',125884); -INSERT INTO City VALUES (2288,'Girardot','COL','Cundinamarca',110963); -INSERT INTO City VALUES (2289,'Buga','COL','Valle',110699); -INSERT INTO City VALUES (2290,'Tunja','COL','Boyac�',109740); -INSERT INTO City VALUES (2291,'Florencia','COL','Caquet�',108574); -INSERT INTO City VALUES (2292,'Maicao','COL','La Guajira',108053); -INSERT INTO City VALUES (2293,'Sogamoso','COL','Boyac�',107728); -INSERT INTO City VALUES (2294,'Giron','COL','Santander',90688); -INSERT INTO City VALUES (2295,'Moroni','COM','Njazidja',36000); -INSERT INTO City VALUES (2296,'Brazzaville','COG','Brazzaville',950000); -INSERT INTO City VALUES (2297,'Pointe-Noire','COG','Kouilou',500000); -INSERT INTO City VALUES (2298,'Kinshasa','COD','Kinshasa',5064000); -INSERT INTO City VALUES (2299,'Lubumbashi','COD','Shaba',851381); -INSERT INTO City VALUES (2300,'Mbuji-Mayi','COD','East Kasai',806475); -INSERT INTO City VALUES (2301,'Kolwezi','COD','Shaba',417810); -INSERT INTO City VALUES (2302,'Kisangani','COD','Haute-Za�re',417517); -INSERT INTO City VALUES (2303,'Kananga','COD','West Kasai',393030); -INSERT INTO City VALUES (2304,'Likasi','COD','Shaba',299118); -INSERT INTO City VALUES (2305,'Bukavu','COD','South Kivu',201569); -INSERT INTO City VALUES (2306,'Kikwit','COD','Bandundu',182142); -INSERT INTO City VALUES (2307,'Tshikapa','COD','West Kasai',180860); -INSERT INTO City VALUES (2308,'Matadi','COD','Bas-Za�re',172730); -INSERT INTO City VALUES (2309,'Mbandaka','COD','Equateur',169841); -INSERT INTO City VALUES (2310,'Mwene-Ditu','COD','East Kasai',137459); -INSERT INTO City VALUES (2311,'Boma','COD','Bas-Za�re',135284); -INSERT INTO City VALUES (2312,'Uvira','COD','South Kivu',115590); -INSERT INTO City VALUES (2313,'Butembo','COD','North Kivu',109406); -INSERT INTO City VALUES (2314,'Goma','COD','North Kivu',109094); -INSERT INTO City VALUES (2315,'Kalemie','COD','Shaba',101309); -INSERT INTO City VALUES (2316,'Bantam','CCK','Home Island',503); -INSERT INTO City VALUES (2317,'West Island','CCK','West Island',167); -INSERT INTO City VALUES (2318,'Pyongyang','PRK','Pyongyang-si',2484000); -INSERT INTO City VALUES (2319,'Hamhung','PRK','Hamgyong N',709730); -INSERT INTO City VALUES (2320,'Chongjin','PRK','Hamgyong P',582480); -INSERT INTO City VALUES (2321,'Nampo','PRK','Nampo-si',566200); -INSERT INTO City VALUES (2322,'Sinuiju','PRK','Pyongan P',326011); -INSERT INTO City VALUES (2323,'Wonsan','PRK','Kangwon',300148); -INSERT INTO City VALUES (2324,'Phyongsong','PRK','Pyongan N',272934); -INSERT INTO City VALUES (2325,'Sariwon','PRK','Hwanghae P',254146); -INSERT INTO City VALUES (2326,'Haeju','PRK','Hwanghae N',229172); -INSERT INTO City VALUES (2327,'Kanggye','PRK','Chagang',223410); -INSERT INTO City VALUES (2328,'Kimchaek','PRK','Hamgyong P',179000); -INSERT INTO City VALUES (2329,'Hyesan','PRK','Yanggang',178020); -INSERT INTO City VALUES (2330,'Kaesong','PRK','Kaesong-si',171500); -INSERT INTO City VALUES (2331,'Seoul','KOR','Seoul',9981619); -INSERT INTO City VALUES (2332,'Pusan','KOR','Pusan',3804522); -INSERT INTO City VALUES (2333,'Inchon','KOR','Inchon',2559424); -INSERT INTO City VALUES (2334,'Taegu','KOR','Taegu',2548568); -INSERT INTO City VALUES (2335,'Taejon','KOR','Taejon',1425835); -INSERT INTO City VALUES (2336,'Kwangju','KOR','Kwangju',1368341); -INSERT INTO City VALUES (2337,'Ulsan','KOR','Kyongsangnam',1084891); -INSERT INTO City VALUES (2338,'Songnam','KOR','Kyonggi',869094); -INSERT INTO City VALUES (2339,'Puchon','KOR','Kyonggi',779412); -INSERT INTO City VALUES (2340,'Suwon','KOR','Kyonggi',755550); -INSERT INTO City VALUES (2341,'Anyang','KOR','Kyonggi',591106); -INSERT INTO City VALUES (2342,'Chonju','KOR','Chollabuk',563153); -INSERT INTO City VALUES (2343,'Chongju','KOR','Chungchongbuk',531376); -INSERT INTO City VALUES (2344,'Koyang','KOR','Kyonggi',518282); -INSERT INTO City VALUES (2345,'Ansan','KOR','Kyonggi',510314); -INSERT INTO City VALUES (2346,'Pohang','KOR','Kyongsangbuk',508899); -INSERT INTO City VALUES (2347,'Chang-won','KOR','Kyongsangnam',481694); -INSERT INTO City VALUES (2348,'Masan','KOR','Kyongsangnam',441242); -INSERT INTO City VALUES (2349,'Kwangmyong','KOR','Kyonggi',350914); -INSERT INTO City VALUES (2350,'Chonan','KOR','Chungchongnam',330259); -INSERT INTO City VALUES (2351,'Chinju','KOR','Kyongsangnam',329886); -INSERT INTO City VALUES (2352,'Iksan','KOR','Chollabuk',322685); -INSERT INTO City VALUES (2353,'Pyongtaek','KOR','Kyonggi',312927); -INSERT INTO City VALUES (2354,'Kumi','KOR','Kyongsangbuk',311431); -INSERT INTO City VALUES (2355,'Uijongbu','KOR','Kyonggi',276111); -INSERT INTO City VALUES (2356,'Kyongju','KOR','Kyongsangbuk',272968); -INSERT INTO City VALUES (2357,'Kunsan','KOR','Chollabuk',266569); -INSERT INTO City VALUES (2358,'Cheju','KOR','Cheju',258511); -INSERT INTO City VALUES (2359,'Kimhae','KOR','Kyongsangnam',256370); -INSERT INTO City VALUES (2360,'Sunchon','KOR','Chollanam',249263); -INSERT INTO City VALUES (2361,'Mokpo','KOR','Chollanam',247452); -INSERT INTO City VALUES (2362,'Yong-in','KOR','Kyonggi',242643); -INSERT INTO City VALUES (2363,'Wonju','KOR','Kang-won',237460); -INSERT INTO City VALUES (2364,'Kunpo','KOR','Kyonggi',235233); -INSERT INTO City VALUES (2365,'Chunchon','KOR','Kang-won',234528); -INSERT INTO City VALUES (2366,'Namyangju','KOR','Kyonggi',229060); -INSERT INTO City VALUES (2367,'Kangnung','KOR','Kang-won',220403); -INSERT INTO City VALUES (2368,'Chungju','KOR','Chungchongbuk',205206); -INSERT INTO City VALUES (2369,'Andong','KOR','Kyongsangbuk',188443); -INSERT INTO City VALUES (2370,'Yosu','KOR','Chollanam',183596); -INSERT INTO City VALUES (2371,'Kyongsan','KOR','Kyongsangbuk',173746); -INSERT INTO City VALUES (2372,'Paju','KOR','Kyonggi',163379); -INSERT INTO City VALUES (2373,'Yangsan','KOR','Kyongsangnam',163351); -INSERT INTO City VALUES (2374,'Ichon','KOR','Kyonggi',155332); -INSERT INTO City VALUES (2375,'Asan','KOR','Chungchongnam',154663); -INSERT INTO City VALUES (2376,'Koje','KOR','Kyongsangnam',147562); -INSERT INTO City VALUES (2377,'Kimchon','KOR','Kyongsangbuk',147027); -INSERT INTO City VALUES (2378,'Nonsan','KOR','Chungchongnam',146619); -INSERT INTO City VALUES (2379,'Kuri','KOR','Kyonggi',142173); -INSERT INTO City VALUES (2380,'Chong-up','KOR','Chollabuk',139111); -INSERT INTO City VALUES (2381,'Chechon','KOR','Chungchongbuk',137070); -INSERT INTO City VALUES (2382,'Sosan','KOR','Chungchongnam',134746); -INSERT INTO City VALUES (2383,'Shihung','KOR','Kyonggi',133443); -INSERT INTO City VALUES (2384,'Tong-yong','KOR','Kyongsangnam',131717); -INSERT INTO City VALUES (2385,'Kongju','KOR','Chungchongnam',131229); -INSERT INTO City VALUES (2386,'Yongju','KOR','Kyongsangbuk',131097); -INSERT INTO City VALUES (2387,'Chinhae','KOR','Kyongsangnam',125997); -INSERT INTO City VALUES (2388,'Sangju','KOR','Kyongsangbuk',124116); -INSERT INTO City VALUES (2389,'Poryong','KOR','Chungchongnam',122604); -INSERT INTO City VALUES (2390,'Kwang-yang','KOR','Chollanam',122052); -INSERT INTO City VALUES (2391,'Miryang','KOR','Kyongsangnam',121501); -INSERT INTO City VALUES (2392,'Hanam','KOR','Kyonggi',115812); -INSERT INTO City VALUES (2393,'Kimje','KOR','Chollabuk',115427); -INSERT INTO City VALUES (2394,'Yongchon','KOR','Kyongsangbuk',113511); -INSERT INTO City VALUES (2395,'Sachon','KOR','Kyongsangnam',113494); -INSERT INTO City VALUES (2396,'Uiwang','KOR','Kyonggi',108788); -INSERT INTO City VALUES (2397,'Naju','KOR','Chollanam',107831); -INSERT INTO City VALUES (2398,'Namwon','KOR','Chollabuk',103544); -INSERT INTO City VALUES (2399,'Tonghae','KOR','Kang-won',95472); -INSERT INTO City VALUES (2400,'Mun-gyong','KOR','Kyongsangbuk',92239); -INSERT INTO City VALUES (2401,'Athenai','GRC','Attika',772072); -INSERT INTO City VALUES (2402,'Thessaloniki','GRC','Central Macedonia',383967); -INSERT INTO City VALUES (2403,'Pireus','GRC','Attika',182671); -INSERT INTO City VALUES (2404,'Patras','GRC','West Greece',153344); -INSERT INTO City VALUES (2405,'Peristerion','GRC','Attika',137288); -INSERT INTO City VALUES (2406,'Herakleion','GRC','Crete',116178); -INSERT INTO City VALUES (2407,'Kallithea','GRC','Attika',114233); -INSERT INTO City VALUES (2408,'Larisa','GRC','Thessalia',113090); -INSERT INTO City VALUES (2409,'Zagreb','HRV','Grad Zagreb',706770); -INSERT INTO City VALUES (2410,'Split','HRV','Split-Dalmatia',189388); -INSERT INTO City VALUES (2411,'Rijeka','HRV','Primorje-Gorski Kota',167964); -INSERT INTO City VALUES (2412,'Osijek','HRV','Osijek-Baranja',104761); -INSERT INTO City VALUES (2413,'La Habana','CUB','La Habana',2256000); -INSERT INTO City VALUES (2414,'Santiago de Cuba','CUB','Santiago de Cuba',433180); -INSERT INTO City VALUES (2415,'Camag�ey','CUB','Camag�ey',298726); -INSERT INTO City VALUES (2416,'Holgu�n','CUB','Holgu�n',249492); -INSERT INTO City VALUES (2417,'Santa Clara','CUB','Villa Clara',207350); -INSERT INTO City VALUES (2418,'Guant�namo','CUB','Guant�namo',205078); -INSERT INTO City VALUES (2419,'Pinar del R�o','CUB','Pinar del R�o',142100); -INSERT INTO City VALUES (2420,'Bayamo','CUB','Granma',141000); -INSERT INTO City VALUES (2421,'Cienfuegos','CUB','Cienfuegos',132770); -INSERT INTO City VALUES (2422,'Victoria de las Tunas','CUB','Las Tunas',132350); -INSERT INTO City VALUES (2423,'Matanzas','CUB','Matanzas',123273); -INSERT INTO City VALUES (2424,'Manzanillo','CUB','Granma',109350); -INSERT INTO City VALUES (2425,'Sancti-Sp�ritus','CUB','Sancti-Sp�ritus',100751); -INSERT INTO City VALUES (2426,'Ciego de �vila','CUB','Ciego de �vila',98505); -INSERT INTO City VALUES (2427,'al-Salimiya','KWT','Hawalli',130215); -INSERT INTO City VALUES (2428,'Jalib al-Shuyukh','KWT','Hawalli',102178); -INSERT INTO City VALUES (2429,'Kuwait','KWT','al-Asima',28859); -INSERT INTO City VALUES (2430,'Nicosia','CYP','Nicosia',195000); -INSERT INTO City VALUES (2431,'Limassol','CYP','Limassol',154400); -INSERT INTO City VALUES (2432,'Vientiane','LAO','Viangchan',531800); -INSERT INTO City VALUES (2433,'Savannakhet','LAO','Savannakhet',96652); -INSERT INTO City VALUES (2434,'Riga','LVA','Riika',764328); -INSERT INTO City VALUES (2435,'Daugavpils','LVA','Daugavpils',114829); -INSERT INTO City VALUES (2436,'Liepaja','LVA','Liepaja',89439); -INSERT INTO City VALUES (2437,'Maseru','LSO','Maseru',297000); -INSERT INTO City VALUES (2438,'Beirut','LBN','Beirut',1100000); -INSERT INTO City VALUES (2439,'Tripoli','LBN','al-Shamal',240000); -INSERT INTO City VALUES (2440,'Monrovia','LBR','Montserrado',850000); -INSERT INTO City VALUES (2441,'Tripoli','LBY','Tripoli',1682000); -INSERT INTO City VALUES (2442,'Bengasi','LBY','Bengasi',804000); -INSERT INTO City VALUES (2443,'Misrata','LBY','Misrata',121669); -INSERT INTO City VALUES (2444,'al-Zawiya','LBY','al-Zawiya',89338); -INSERT INTO City VALUES (2445,'Schaan','LIE','Schaan',5346); -INSERT INTO City VALUES (2446,'Vaduz','LIE','Vaduz',5043); -INSERT INTO City VALUES (2447,'Vilnius','LTU','Vilna',577969); -INSERT INTO City VALUES (2448,'Kaunas','LTU','Kaunas',412639); -INSERT INTO City VALUES (2449,'Klaipeda','LTU','Klaipeda',202451); -INSERT INTO City VALUES (2450,'�iauliai','LTU','�iauliai',146563); -INSERT INTO City VALUES (2451,'Panevezys','LTU','Panevezys',133695); -INSERT INTO City VALUES (2452,'Luxembourg [Luxemburg/L�tzebuerg]','LUX','Luxembourg',80700); -INSERT INTO City VALUES (2453,'El-Aai�n','ESH','El-Aai�n',169000); -INSERT INTO City VALUES (2454,'Macao','MAC','Macau',437500); -INSERT INTO City VALUES (2455,'Antananarivo','MDG','Antananarivo',675669); -INSERT INTO City VALUES (2456,'Toamasina','MDG','Toamasina',127441); -INSERT INTO City VALUES (2457,'Antsirab�','MDG','Antananarivo',120239); -INSERT INTO City VALUES (2458,'Mahajanga','MDG','Mahajanga',100807); -INSERT INTO City VALUES (2459,'Fianarantsoa','MDG','Fianarantsoa',99005); -INSERT INTO City VALUES (2460,'Skopje','MKD','Skopje',444299); -INSERT INTO City VALUES (2461,'Blantyre','MWI','Blantyre',478155); -INSERT INTO City VALUES (2462,'Lilongwe','MWI','Lilongwe',435964); -INSERT INTO City VALUES (2463,'Male','MDV','Maale',71000); -INSERT INTO City VALUES (2464,'Kuala Lumpur','MYS','Wilayah Persekutuan',1297526); -INSERT INTO City VALUES (2465,'Ipoh','MYS','Perak',382853); -INSERT INTO City VALUES (2466,'Johor Baharu','MYS','Johor',328436); -INSERT INTO City VALUES (2467,'Petaling Jaya','MYS','Selangor',254350); -INSERT INTO City VALUES (2468,'Kelang','MYS','Selangor',243355); -INSERT INTO City VALUES (2469,'Kuala Terengganu','MYS','Terengganu',228119); -INSERT INTO City VALUES (2470,'Pinang','MYS','Pulau Pinang',219603); -INSERT INTO City VALUES (2471,'Kota Bharu','MYS','Kelantan',219582); -INSERT INTO City VALUES (2472,'Kuantan','MYS','Pahang',199484); -INSERT INTO City VALUES (2473,'Taiping','MYS','Perak',183261); -INSERT INTO City VALUES (2474,'Seremban','MYS','Negeri Sembilan',182869); -INSERT INTO City VALUES (2475,'Kuching','MYS','Sarawak',148059); -INSERT INTO City VALUES (2476,'Sibu','MYS','Sarawak',126381); -INSERT INTO City VALUES (2477,'Sandakan','MYS','Sabah',125841); -INSERT INTO City VALUES (2478,'Alor Setar','MYS','Kedah',124412); -INSERT INTO City VALUES (2479,'Selayang Baru','MYS','Selangor',124228); -INSERT INTO City VALUES (2480,'Sungai Petani','MYS','Kedah',114763); -INSERT INTO City VALUES (2481,'Shah Alam','MYS','Selangor',102019); -INSERT INTO City VALUES (2482,'Bamako','MLI','Bamako',809552); -INSERT INTO City VALUES (2483,'Birkirkara','MLT','Outer Harbour',21445); -INSERT INTO City VALUES (2484,'Valletta','MLT','Inner Harbour',7073); -INSERT INTO City VALUES (2485,'Casablanca','MAR','Casablanca',2940623); -INSERT INTO City VALUES (2486,'Rabat','MAR','Rabat-Sal�-Zammour-Z',623457); -INSERT INTO City VALUES (2487,'Marrakech','MAR','Marrakech-Tensift-Al',621914); -INSERT INTO City VALUES (2488,'F�s','MAR','F�s-Boulemane',541162); -INSERT INTO City VALUES (2489,'Tanger','MAR','Tanger-T�touan',521735); -INSERT INTO City VALUES (2490,'Sal�','MAR','Rabat-Sal�-Zammour-Z',504420); -INSERT INTO City VALUES (2491,'Mekn�s','MAR','Mekn�s-Tafilalet',460000); -INSERT INTO City VALUES (2492,'Oujda','MAR','Oriental',365382); -INSERT INTO City VALUES (2493,'K�nitra','MAR','Gharb-Chrarda-B�ni H',292600); -INSERT INTO City VALUES (2494,'T�touan','MAR','Tanger-T�touan',277516); -INSERT INTO City VALUES (2495,'Safi','MAR','Doukkala-Abda',262300); -INSERT INTO City VALUES (2496,'Agadir','MAR','Souss Massa-Dra�',155244); -INSERT INTO City VALUES (2497,'Mohammedia','MAR','Casablanca',154706); -INSERT INTO City VALUES (2498,'Khouribga','MAR','Chaouia-Ouardigha',152090); -INSERT INTO City VALUES (2499,'Beni-Mellal','MAR','Tadla-Azilal',140212); -INSERT INTO City VALUES (2500,'T�mara','MAR','Rabat-Sal�-Zammour-Z',126303); -INSERT INTO City VALUES (2501,'El Jadida','MAR','Doukkala-Abda',119083); -INSERT INTO City VALUES (2502,'Nador','MAR','Oriental',112450); -INSERT INTO City VALUES (2503,'Ksar el Kebir','MAR','Tanger-T�touan',107065); -INSERT INTO City VALUES (2504,'Settat','MAR','Chaouia-Ouardigha',96200); -INSERT INTO City VALUES (2505,'Taza','MAR','Taza-Al Hoceima-Taou',92700); -INSERT INTO City VALUES (2506,'El Araich','MAR','Tanger-T�touan',90400); -INSERT INTO City VALUES (2507,'Dalap-Uliga-Darrit','MHL','Majuro',28000); -INSERT INTO City VALUES (2508,'Fort-de-France','MTQ','Fort-de-France',94050); -INSERT INTO City VALUES (2509,'Nouakchott','MRT','Nouakchott',667300); -INSERT INTO City VALUES (2510,'Nou�dhibou','MRT','Dakhlet Nou�dhibou',97600); -INSERT INTO City VALUES (2511,'Port-Louis','MUS','Port-Louis',138200); -INSERT INTO City VALUES (2512,'Beau Bassin-Rose Hill','MUS','Plaines Wilhelms',100616); -INSERT INTO City VALUES (2513,'Vacoas-Phoenix','MUS','Plaines Wilhelms',98464); -INSERT INTO City VALUES (2514,'Mamoutzou','MYT','Mamoutzou',12000); -INSERT INTO City VALUES (2515,'Ciudad de M�xico','MEX','Distrito Federal',8591309); -INSERT INTO City VALUES (2516,'Guadalajara','MEX','Jalisco',1647720); -INSERT INTO City VALUES (2517,'Ecatepec de Morelos','MEX','M�xico',1620303); -INSERT INTO City VALUES (2518,'Puebla','MEX','Puebla',1346176); -INSERT INTO City VALUES (2519,'Nezahualc�yotl','MEX','M�xico',1224924); -INSERT INTO City VALUES (2520,'Ju�rez','MEX','Chihuahua',1217818); -INSERT INTO City VALUES (2521,'Tijuana','MEX','Baja California',1212232); -INSERT INTO City VALUES (2522,'Le�n','MEX','Guanajuato',1133576); -INSERT INTO City VALUES (2523,'Monterrey','MEX','Nuevo Le�n',1108499); -INSERT INTO City VALUES (2524,'Zapopan','MEX','Jalisco',1002239); -INSERT INTO City VALUES (2525,'Naucalpan de Ju�rez','MEX','M�xico',857511); -INSERT INTO City VALUES (2526,'Mexicali','MEX','Baja California',764902); -INSERT INTO City VALUES (2527,'Culiac�n','MEX','Sinaloa',744859); -INSERT INTO City VALUES (2528,'Acapulco de Ju�rez','MEX','Guerrero',721011); -INSERT INTO City VALUES (2529,'Tlalnepantla de Baz','MEX','M�xico',720755); -INSERT INTO City VALUES (2530,'M�rida','MEX','Yucat�n',703324); -INSERT INTO City VALUES (2531,'Chihuahua','MEX','Chihuahua',670208); -INSERT INTO City VALUES (2532,'San Luis Potos�','MEX','San Luis Potos�',669353); -INSERT INTO City VALUES (2533,'Guadalupe','MEX','Nuevo Le�n',668780); -INSERT INTO City VALUES (2534,'Toluca','MEX','M�xico',665617); -INSERT INTO City VALUES (2535,'Aguascalientes','MEX','Aguascalientes',643360); -INSERT INTO City VALUES (2536,'Quer�taro','MEX','Quer�taro de Arteaga',639839); -INSERT INTO City VALUES (2537,'Morelia','MEX','Michoac�n de Ocampo',619958); -INSERT INTO City VALUES (2538,'Hermosillo','MEX','Sonora',608697); -INSERT INTO City VALUES (2539,'Saltillo','MEX','Coahuila de Zaragoza',577352); -INSERT INTO City VALUES (2540,'Torre�n','MEX','Coahuila de Zaragoza',529093); -INSERT INTO City VALUES (2541,'Centro (Villahermosa)','MEX','Tabasco',519873); -INSERT INTO City VALUES (2542,'San Nicol�s de los Garza','MEX','Nuevo Le�n',495540); -INSERT INTO City VALUES (2543,'Durango','MEX','Durango',490524); -INSERT INTO City VALUES (2544,'Chimalhuac�n','MEX','M�xico',490245); -INSERT INTO City VALUES (2545,'Tlaquepaque','MEX','Jalisco',475472); -INSERT INTO City VALUES (2546,'Atizap�n de Zaragoza','MEX','M�xico',467262); -INSERT INTO City VALUES (2547,'Veracruz','MEX','Veracruz',457119); -INSERT INTO City VALUES (2548,'Cuautitl�n Izcalli','MEX','M�xico',452976); -INSERT INTO City VALUES (2549,'Irapuato','MEX','Guanajuato',440039); -INSERT INTO City VALUES (2550,'Tuxtla Guti�rrez','MEX','Chiapas',433544); -INSERT INTO City VALUES (2551,'Tultitl�n','MEX','M�xico',432411); -INSERT INTO City VALUES (2552,'Reynosa','MEX','Tamaulipas',419776); -INSERT INTO City VALUES (2553,'Benito Ju�rez','MEX','Quintana Roo',419276); -INSERT INTO City VALUES (2554,'Matamoros','MEX','Tamaulipas',416428); -INSERT INTO City VALUES (2555,'Xalapa','MEX','Veracruz',390058); -INSERT INTO City VALUES (2556,'Celaya','MEX','Guanajuato',382140); -INSERT INTO City VALUES (2557,'Mazatl�n','MEX','Sinaloa',380265); -INSERT INTO City VALUES (2558,'Ensenada','MEX','Baja California',369573); -INSERT INTO City VALUES (2559,'Ahome','MEX','Sinaloa',358663); -INSERT INTO City VALUES (2560,'Cajeme','MEX','Sonora',355679); -INSERT INTO City VALUES (2561,'Cuernavaca','MEX','Morelos',337966); -INSERT INTO City VALUES (2562,'Tonal�','MEX','Jalisco',336109); -INSERT INTO City VALUES (2563,'Valle de Chalco Solidaridad','MEX','M�xico',323113); -INSERT INTO City VALUES (2564,'Nuevo Laredo','MEX','Tamaulipas',310277); -INSERT INTO City VALUES (2565,'Tepic','MEX','Nayarit',305025); -INSERT INTO City VALUES (2566,'Tampico','MEX','Tamaulipas',294789); -INSERT INTO City VALUES (2567,'Ixtapaluca','MEX','M�xico',293160); -INSERT INTO City VALUES (2568,'Apodaca','MEX','Nuevo Le�n',282941); -INSERT INTO City VALUES (2569,'Guasave','MEX','Sinaloa',277201); -INSERT INTO City VALUES (2570,'G�mez Palacio','MEX','Durango',272806); -INSERT INTO City VALUES (2571,'Tapachula','MEX','Chiapas',271141); -INSERT INTO City VALUES (2572,'Nicol�s Romero','MEX','M�xico',269393); -INSERT INTO City VALUES (2573,'Coatzacoalcos','MEX','Veracruz',267037); -INSERT INTO City VALUES (2574,'Uruapan','MEX','Michoac�n de Ocampo',265211); -INSERT INTO City VALUES (2575,'Victoria','MEX','Tamaulipas',262686); -INSERT INTO City VALUES (2576,'Oaxaca de Ju�rez','MEX','Oaxaca',256848); -INSERT INTO City VALUES (2577,'Coacalco de Berrioz�bal','MEX','M�xico',252270); -INSERT INTO City VALUES (2578,'Pachuca de Soto','MEX','Hidalgo',244688); -INSERT INTO City VALUES (2579,'General Escobedo','MEX','Nuevo Le�n',232961); -INSERT INTO City VALUES (2580,'Salamanca','MEX','Guanajuato',226864); -INSERT INTO City VALUES (2581,'Santa Catarina','MEX','Nuevo Le�n',226573); -INSERT INTO City VALUES (2582,'Tehuac�n','MEX','Puebla',225943); -INSERT INTO City VALUES (2583,'Chalco','MEX','M�xico',222201); -INSERT INTO City VALUES (2584,'C�rdenas','MEX','Tabasco',216903); -INSERT INTO City VALUES (2585,'Campeche','MEX','Campeche',216735); -INSERT INTO City VALUES (2586,'La Paz','MEX','M�xico',213045); -INSERT INTO City VALUES (2587,'Oth�n P. Blanco (Chetumal)','MEX','Quintana Roo',208014); -INSERT INTO City VALUES (2588,'Texcoco','MEX','M�xico',203681); -INSERT INTO City VALUES (2589,'La Paz','MEX','Baja California Sur',196708); -INSERT INTO City VALUES (2590,'Metepec','MEX','M�xico',194265); -INSERT INTO City VALUES (2591,'Monclova','MEX','Coahuila de Zaragoza',193657); -INSERT INTO City VALUES (2592,'Huixquilucan','MEX','M�xico',193156); -INSERT INTO City VALUES (2593,'Chilpancingo de los Bravo','MEX','Guerrero',192509); -INSERT INTO City VALUES (2594,'Puerto Vallarta','MEX','Jalisco',183741); -INSERT INTO City VALUES (2595,'Fresnillo','MEX','Zacatecas',182744); -INSERT INTO City VALUES (2596,'Ciudad Madero','MEX','Tamaulipas',182012); -INSERT INTO City VALUES (2597,'Soledad de Graciano S�nchez','MEX','San Luis Potos�',179956); -INSERT INTO City VALUES (2598,'San Juan del R�o','MEX','Quer�taro',179300); -INSERT INTO City VALUES (2599,'San Felipe del Progreso','MEX','M�xico',177330); -INSERT INTO City VALUES (2600,'C�rdoba','MEX','Veracruz',176952); -INSERT INTO City VALUES (2601,'Tec�mac','MEX','M�xico',172410); -INSERT INTO City VALUES (2602,'Ocosingo','MEX','Chiapas',171495); -INSERT INTO City VALUES (2603,'Carmen','MEX','Campeche',171367); -INSERT INTO City VALUES (2604,'L�zaro C�rdenas','MEX','Michoac�n de Ocampo',170878); -INSERT INTO City VALUES (2605,'Jiutepec','MEX','Morelos',170428); -INSERT INTO City VALUES (2606,'Papantla','MEX','Veracruz',170123); -INSERT INTO City VALUES (2607,'Comalcalco','MEX','Tabasco',164640); -INSERT INTO City VALUES (2608,'Zamora','MEX','Michoac�n de Ocampo',161191); -INSERT INTO City VALUES (2609,'Nogales','MEX','Sonora',159103); -INSERT INTO City VALUES (2610,'Huimanguillo','MEX','Tabasco',158335); -INSERT INTO City VALUES (2611,'Cuautla','MEX','Morelos',153132); -INSERT INTO City VALUES (2612,'Minatitl�n','MEX','Veracruz',152983); -INSERT INTO City VALUES (2613,'Poza Rica de Hidalgo','MEX','Veracruz',152678); -INSERT INTO City VALUES (2614,'Ciudad Valles','MEX','San Luis Potos�',146411); -INSERT INTO City VALUES (2615,'Navolato','MEX','Sinaloa',145396); -INSERT INTO City VALUES (2616,'San Luis R�o Colorado','MEX','Sonora',145276); -INSERT INTO City VALUES (2617,'P�njamo','MEX','Guanajuato',143927); -INSERT INTO City VALUES (2618,'San Andr�s Tuxtla','MEX','Veracruz',142251); -INSERT INTO City VALUES (2619,'Guanajuato','MEX','Guanajuato',141215); -INSERT INTO City VALUES (2620,'Navojoa','MEX','Sonora',140495); -INSERT INTO City VALUES (2621,'Zit�cuaro','MEX','Michoac�n de Ocampo',137970); -INSERT INTO City VALUES (2622,'Boca del R�o','MEX','Veracruz-Llave',135721); -INSERT INTO City VALUES (2623,'Allende','MEX','Guanajuato',134645); -INSERT INTO City VALUES (2624,'Silao','MEX','Guanajuato',134037); -INSERT INTO City VALUES (2625,'Macuspana','MEX','Tabasco',133795); -INSERT INTO City VALUES (2626,'San Juan Bautista Tuxtepec','MEX','Oaxaca',133675); -INSERT INTO City VALUES (2627,'San Crist�bal de las Casas','MEX','Chiapas',132317); -INSERT INTO City VALUES (2628,'Valle de Santiago','MEX','Guanajuato',130557); -INSERT INTO City VALUES (2629,'Guaymas','MEX','Sonora',130108); -INSERT INTO City VALUES (2630,'Colima','MEX','Colima',129454); -INSERT INTO City VALUES (2631,'Dolores Hidalgo','MEX','Guanajuato',128675); -INSERT INTO City VALUES (2632,'Lagos de Moreno','MEX','Jalisco',127949); -INSERT INTO City VALUES (2633,'Piedras Negras','MEX','Coahuila de Zaragoza',127898); -INSERT INTO City VALUES (2634,'Altamira','MEX','Tamaulipas',127490); -INSERT INTO City VALUES (2635,'T�xpam','MEX','Veracruz',126475); -INSERT INTO City VALUES (2636,'San Pedro Garza Garc�a','MEX','Nuevo Le�n',126147); -INSERT INTO City VALUES (2637,'Cuauht�moc','MEX','Chihuahua',124279); -INSERT INTO City VALUES (2638,'Manzanillo','MEX','Colima',124014); -INSERT INTO City VALUES (2639,'Iguala de la Independencia','MEX','Guerrero',123883); -INSERT INTO City VALUES (2640,'Zacatecas','MEX','Zacatecas',123700); -INSERT INTO City VALUES (2641,'Tlajomulco de Z��iga','MEX','Jalisco',123220); -INSERT INTO City VALUES (2642,'Tulancingo de Bravo','MEX','Hidalgo',121946); -INSERT INTO City VALUES (2643,'Zinacantepec','MEX','M�xico',121715); -INSERT INTO City VALUES (2644,'San Mart�n Texmelucan','MEX','Puebla',121093); -INSERT INTO City VALUES (2645,'Tepatitl�n de Morelos','MEX','Jalisco',118948); -INSERT INTO City VALUES (2646,'Mart�nez de la Torre','MEX','Veracruz',118815); -INSERT INTO City VALUES (2647,'Orizaba','MEX','Veracruz',118488); -INSERT INTO City VALUES (2648,'Apatzing�n','MEX','Michoac�n de Ocampo',117849); -INSERT INTO City VALUES (2649,'Atlixco','MEX','Puebla',117019); -INSERT INTO City VALUES (2650,'Delicias','MEX','Chihuahua',116132); -INSERT INTO City VALUES (2651,'Ixtlahuaca','MEX','M�xico',115548); -INSERT INTO City VALUES (2652,'El Mante','MEX','Tamaulipas',112453); -INSERT INTO City VALUES (2653,'Lerdo','MEX','Durango',112272); -INSERT INTO City VALUES (2654,'Almoloya de Ju�rez','MEX','M�xico',110550); -INSERT INTO City VALUES (2655,'Ac�mbaro','MEX','Guanajuato',110487); -INSERT INTO City VALUES (2656,'Acu�a','MEX','Coahuila de Zaragoza',110388); -INSERT INTO City VALUES (2657,'Guadalupe','MEX','Zacatecas',108881); -INSERT INTO City VALUES (2658,'Huejutla de Reyes','MEX','Hidalgo',108017); -INSERT INTO City VALUES (2659,'Hidalgo','MEX','Michoac�n de Ocampo',106198); -INSERT INTO City VALUES (2660,'Los Cabos','MEX','Baja California Sur',105199); -INSERT INTO City VALUES (2661,'Comit�n de Dom�nguez','MEX','Chiapas',104986); -INSERT INTO City VALUES (2662,'Cunduac�n','MEX','Tabasco',104164); -INSERT INTO City VALUES (2663,'R�o Bravo','MEX','Tamaulipas',103901); -INSERT INTO City VALUES (2664,'Temapache','MEX','Veracruz',102824); -INSERT INTO City VALUES (2665,'Chilapa de Alvarez','MEX','Guerrero',102716); -INSERT INTO City VALUES (2666,'Hidalgo del Parral','MEX','Chihuahua',100881); -INSERT INTO City VALUES (2667,'San Francisco del Rinc�n','MEX','Guanajuato',100149); -INSERT INTO City VALUES (2668,'Taxco de Alarc�n','MEX','Guerrero',99907); -INSERT INTO City VALUES (2669,'Zumpango','MEX','M�xico',99781); -INSERT INTO City VALUES (2670,'San Pedro Cholula','MEX','Puebla',99734); -INSERT INTO City VALUES (2671,'Lerma','MEX','M�xico',99714); -INSERT INTO City VALUES (2672,'Tecom�n','MEX','Colima',99296); -INSERT INTO City VALUES (2673,'Las Margaritas','MEX','Chiapas',97389); -INSERT INTO City VALUES (2674,'Cosoleacaque','MEX','Veracruz',97199); -INSERT INTO City VALUES (2675,'San Luis de la Paz','MEX','Guanajuato',96763); -INSERT INTO City VALUES (2676,'Jos� Azueta','MEX','Guerrero',95448); -INSERT INTO City VALUES (2677,'Santiago Ixcuintla','MEX','Nayarit',95311); -INSERT INTO City VALUES (2678,'San Felipe','MEX','Guanajuato',95305); -INSERT INTO City VALUES (2679,'Tejupilco','MEX','M�xico',94934); -INSERT INTO City VALUES (2680,'Tantoyuca','MEX','Veracruz',94709); -INSERT INTO City VALUES (2681,'Salvatierra','MEX','Guanajuato',94322); -INSERT INTO City VALUES (2682,'Tultepec','MEX','M�xico',93364); -INSERT INTO City VALUES (2683,'Temixco','MEX','Morelos',92686); -INSERT INTO City VALUES (2684,'Matamoros','MEX','Coahuila de Zaragoza',91858); -INSERT INTO City VALUES (2685,'P�nuco','MEX','Veracruz',90551); -INSERT INTO City VALUES (2686,'El Fuerte','MEX','Sinaloa',89556); -INSERT INTO City VALUES (2687,'Tierra Blanca','MEX','Veracruz',89143); -INSERT INTO City VALUES (2688,'Weno','FSM','Chuuk',22000); -INSERT INTO City VALUES (2689,'Palikir','FSM','Pohnpei',8600); -INSERT INTO City VALUES (2690,'Chisinau','MDA','Chisinau',719900); -INSERT INTO City VALUES (2691,'Tiraspol','MDA','Dnjestria',194300); -INSERT INTO City VALUES (2692,'Balti','MDA','Balti',153400); -INSERT INTO City VALUES (2693,'Bender (T�ghina)','MDA','Bender (T�ghina)',125700); -INSERT INTO City VALUES (2694,'Monte-Carlo','MCO','�',13154); -INSERT INTO City VALUES (2695,'Monaco-Ville','MCO','�',1234); -INSERT INTO City VALUES (2696,'Ulan Bator','MNG','Ulaanbaatar',773700); -INSERT INTO City VALUES (2697,'Plymouth','MSR','Plymouth',2000); -INSERT INTO City VALUES (2698,'Maputo','MOZ','Maputo',1018938); -INSERT INTO City VALUES (2699,'Matola','MOZ','Maputo',424662); -INSERT INTO City VALUES (2700,'Beira','MOZ','Sofala',397368); -INSERT INTO City VALUES (2701,'Nampula','MOZ','Nampula',303346); -INSERT INTO City VALUES (2702,'Chimoio','MOZ','Manica',171056); -INSERT INTO City VALUES (2703,'Na�ala-Porto','MOZ','Nampula',158248); -INSERT INTO City VALUES (2704,'Quelimane','MOZ','Zamb�zia',150116); -INSERT INTO City VALUES (2705,'Mocuba','MOZ','Zamb�zia',124700); -INSERT INTO City VALUES (2706,'Tete','MOZ','Tete',101984); -INSERT INTO City VALUES (2707,'Xai-Xai','MOZ','Gaza',99442); -INSERT INTO City VALUES (2708,'Gurue','MOZ','Zamb�zia',99300); -INSERT INTO City VALUES (2709,'Maxixe','MOZ','Inhambane',93985); -INSERT INTO City VALUES (2710,'Rangoon (Yangon)','MMR','Rangoon [Yangon]',3361700); -INSERT INTO City VALUES (2711,'Mandalay','MMR','Mandalay',885300); -INSERT INTO City VALUES (2712,'Moulmein (Mawlamyine)','MMR','Mon',307900); -INSERT INTO City VALUES (2713,'Pegu (Bago)','MMR','Pegu [Bago]',190900); -INSERT INTO City VALUES (2714,'Bassein (Pathein)','MMR','Irrawaddy [Ayeyarwad',183900); -INSERT INTO City VALUES (2715,'Monywa','MMR','Sagaing',138600); -INSERT INTO City VALUES (2716,'Sittwe (Akyab)','MMR','Rakhine',137600); -INSERT INTO City VALUES (2717,'Taunggyi (Taunggye)','MMR','Shan',131500); -INSERT INTO City VALUES (2718,'Meikhtila','MMR','Mandalay',129700); -INSERT INTO City VALUES (2719,'Mergui (Myeik)','MMR','Tenasserim [Tanintha',122700); -INSERT INTO City VALUES (2720,'Lashio (Lasho)','MMR','Shan',107600); -INSERT INTO City VALUES (2721,'Prome (Pyay)','MMR','Pegu [Bago]',105700); -INSERT INTO City VALUES (2722,'Henzada (Hinthada)','MMR','Irrawaddy [Ayeyarwad',104700); -INSERT INTO City VALUES (2723,'Myingyan','MMR','Mandalay',103600); -INSERT INTO City VALUES (2724,'Tavoy (Dawei)','MMR','Tenasserim [Tanintha',96800); -INSERT INTO City VALUES (2725,'Pagakku (Pakokku)','MMR','Magwe [Magway]',94800); -INSERT INTO City VALUES (2726,'Windhoek','NAM','Khomas',169000); -INSERT INTO City VALUES (2727,'Yangor','NRU','�',4050); -INSERT INTO City VALUES (2728,'Yaren','NRU','�',559); -INSERT INTO City VALUES (2729,'Kathmandu','NPL','Central',591835); -INSERT INTO City VALUES (2730,'Biratnagar','NPL','Eastern',157764); -INSERT INTO City VALUES (2731,'Pokhara','NPL','Western',146318); -INSERT INTO City VALUES (2732,'Lalitapur','NPL','Central',145847); -INSERT INTO City VALUES (2733,'Birgunj','NPL','Central',90639); -INSERT INTO City VALUES (2734,'Managua','NIC','Managua',959000); -INSERT INTO City VALUES (2735,'Le�n','NIC','Le�n',123865); -INSERT INTO City VALUES (2736,'Chinandega','NIC','Chinandega',97387); -INSERT INTO City VALUES (2737,'Masaya','NIC','Masaya',88971); -INSERT INTO City VALUES (2738,'Niamey','NER','Niamey',420000); -INSERT INTO City VALUES (2739,'Zinder','NER','Zinder',120892); -INSERT INTO City VALUES (2740,'Maradi','NER','Maradi',112965); -INSERT INTO City VALUES (2741,'Lagos','NGA','Lagos',1518000); -INSERT INTO City VALUES (2742,'Ibadan','NGA','Oyo & Osun',1432000); -INSERT INTO City VALUES (2743,'Ogbomosho','NGA','Oyo & Osun',730000); -INSERT INTO City VALUES (2744,'Kano','NGA','Kano & Jigawa',674100); -INSERT INTO City VALUES (2745,'Oshogbo','NGA','Oyo & Osun',476800); -INSERT INTO City VALUES (2746,'Ilorin','NGA','Kwara & Kogi',475800); -INSERT INTO City VALUES (2747,'Abeokuta','NGA','Ogun',427400); -INSERT INTO City VALUES (2748,'Port Harcourt','NGA','Rivers & Bayelsa',410000); -INSERT INTO City VALUES (2749,'Zaria','NGA','Kaduna',379200); -INSERT INTO City VALUES (2750,'Ilesha','NGA','Oyo & Osun',378400); -INSERT INTO City VALUES (2751,'Onitsha','NGA','Anambra & Enugu & Eb',371900); -INSERT INTO City VALUES (2752,'Iwo','NGA','Oyo & Osun',362000); -INSERT INTO City VALUES (2753,'Ado-Ekiti','NGA','Ondo & Ekiti',359400); -INSERT INTO City VALUES (2754,'Abuja','NGA','Federal Capital Dist',350100); -INSERT INTO City VALUES (2755,'Kaduna','NGA','Kaduna',342200); -INSERT INTO City VALUES (2756,'Mushin','NGA','Lagos',333200); -INSERT INTO City VALUES (2757,'Maiduguri','NGA','Borno & Yobe',320000); -INSERT INTO City VALUES (2758,'Enugu','NGA','Anambra & Enugu & Eb',316100); -INSERT INTO City VALUES (2759,'Ede','NGA','Oyo & Osun',307100); -INSERT INTO City VALUES (2760,'Aba','NGA','Imo & Abia',298900); -INSERT INTO City VALUES (2761,'Ife','NGA','Oyo & Osun',296800); -INSERT INTO City VALUES (2762,'Ila','NGA','Oyo & Osun',264000); -INSERT INTO City VALUES (2763,'Oyo','NGA','Oyo & Osun',256400); -INSERT INTO City VALUES (2764,'Ikerre','NGA','Ondo & Ekiti',244600); -INSERT INTO City VALUES (2765,'Benin City','NGA','Edo & Delta',229400); -INSERT INTO City VALUES (2766,'Iseyin','NGA','Oyo & Osun',217300); -INSERT INTO City VALUES (2767,'Katsina','NGA','Katsina',206500); -INSERT INTO City VALUES (2768,'Jos','NGA','Plateau & Nassarawa',206300); -INSERT INTO City VALUES (2769,'Sokoto','NGA','Sokoto & Kebbi & Zam',204900); -INSERT INTO City VALUES (2770,'Ilobu','NGA','Oyo & Osun',199000); -INSERT INTO City VALUES (2771,'Offa','NGA','Kwara & Kogi',197200); -INSERT INTO City VALUES (2772,'Ikorodu','NGA','Lagos',184900); -INSERT INTO City VALUES (2773,'Ilawe-Ekiti','NGA','Ondo & Ekiti',184500); -INSERT INTO City VALUES (2774,'Owo','NGA','Ondo & Ekiti',183500); -INSERT INTO City VALUES (2775,'Ikirun','NGA','Oyo & Osun',181400); -INSERT INTO City VALUES (2776,'Shaki','NGA','Oyo & Osun',174500); -INSERT INTO City VALUES (2777,'Calabar','NGA','Cross River',174400); -INSERT INTO City VALUES (2778,'Ondo','NGA','Ondo & Ekiti',173600); -INSERT INTO City VALUES (2779,'Akure','NGA','Ondo & Ekiti',162300); -INSERT INTO City VALUES (2780,'Gusau','NGA','Sokoto & Kebbi & Zam',158000); -INSERT INTO City VALUES (2781,'Ijebu-Ode','NGA','Ogun',156400); -INSERT INTO City VALUES (2782,'Effon-Alaiye','NGA','Oyo & Osun',153100); -INSERT INTO City VALUES (2783,'Kumo','NGA','Bauchi & Gombe',148000); -INSERT INTO City VALUES (2784,'Shomolu','NGA','Lagos',147700); -INSERT INTO City VALUES (2785,'Oka-Akoko','NGA','Ondo & Ekiti',142900); -INSERT INTO City VALUES (2786,'Ikare','NGA','Ondo & Ekiti',140800); -INSERT INTO City VALUES (2787,'Sapele','NGA','Edo & Delta',139200); -INSERT INTO City VALUES (2788,'Deba Habe','NGA','Bauchi & Gombe',138600); -INSERT INTO City VALUES (2789,'Minna','NGA','Niger',136900); -INSERT INTO City VALUES (2790,'Warri','NGA','Edo & Delta',126100); -INSERT INTO City VALUES (2791,'Bida','NGA','Niger',125500); -INSERT INTO City VALUES (2792,'Ikire','NGA','Oyo & Osun',123300); -INSERT INTO City VALUES (2793,'Makurdi','NGA','Benue',123100); -INSERT INTO City VALUES (2794,'Lafia','NGA','Plateau & Nassarawa',122500); -INSERT INTO City VALUES (2795,'Inisa','NGA','Oyo & Osun',119800); -INSERT INTO City VALUES (2796,'Shagamu','NGA','Ogun',117200); -INSERT INTO City VALUES (2797,'Awka','NGA','Anambra & Enugu & Eb',111200); -INSERT INTO City VALUES (2798,'Gombe','NGA','Bauchi & Gombe',107800); -INSERT INTO City VALUES (2799,'Igboho','NGA','Oyo & Osun',106800); -INSERT INTO City VALUES (2800,'Ejigbo','NGA','Oyo & Osun',105900); -INSERT INTO City VALUES (2801,'Agege','NGA','Lagos',105000); -INSERT INTO City VALUES (2802,'Ise-Ekiti','NGA','Ondo & Ekiti',103400); -INSERT INTO City VALUES (2803,'Ugep','NGA','Cross River',102600); -INSERT INTO City VALUES (2804,'Epe','NGA','Lagos',101000); -INSERT INTO City VALUES (2805,'Alofi','NIU','�',682); -INSERT INTO City VALUES (2806,'Kingston','NFK','�',800); -INSERT INTO City VALUES (2807,'Oslo','NOR','Oslo',508726); -INSERT INTO City VALUES (2808,'Bergen','NOR','Hordaland',230948); -INSERT INTO City VALUES (2809,'Trondheim','NOR','S�r-Tr�ndelag',150166); -INSERT INTO City VALUES (2810,'Stavanger','NOR','Rogaland',108848); -INSERT INTO City VALUES (2811,'B�rum','NOR','Akershus',101340); -INSERT INTO City VALUES (2812,'Abidjan','CIV','Abidjan',2500000); -INSERT INTO City VALUES (2813,'Bouak�','CIV','Bouak�',329850); -INSERT INTO City VALUES (2814,'Yamoussoukro','CIV','Yamoussoukro',130000); -INSERT INTO City VALUES (2815,'Daloa','CIV','Daloa',121842); -INSERT INTO City VALUES (2816,'Korhogo','CIV','Korhogo',109445); -INSERT INTO City VALUES (2817,'al-Sib','OMN','Masqat',155000); -INSERT INTO City VALUES (2818,'Salala','OMN','Zufar',131813); -INSERT INTO City VALUES (2819,'Bawshar','OMN','Masqat',107500); -INSERT INTO City VALUES (2820,'Suhar','OMN','al-Batina',90814); -INSERT INTO City VALUES (2821,'Masqat','OMN','Masqat',51969); -INSERT INTO City VALUES (2822,'Karachi','PAK','Sindh',9269265); -INSERT INTO City VALUES (2823,'Lahore','PAK','Punjab',5063499); -INSERT INTO City VALUES (2824,'Faisalabad','PAK','Punjab',1977246); -INSERT INTO City VALUES (2825,'Rawalpindi','PAK','Punjab',1406214); -INSERT INTO City VALUES (2826,'Multan','PAK','Punjab',1182441); -INSERT INTO City VALUES (2827,'Hyderabad','PAK','Sindh',1151274); -INSERT INTO City VALUES (2828,'Gujranwala','PAK','Punjab',1124749); -INSERT INTO City VALUES (2829,'Peshawar','PAK','Nothwest Border Prov',988005); -INSERT INTO City VALUES (2830,'Quetta','PAK','Baluchistan',560307); -INSERT INTO City VALUES (2831,'Islamabad','PAK','Islamabad',524500); -INSERT INTO City VALUES (2832,'Sargodha','PAK','Punjab',455360); -INSERT INTO City VALUES (2833,'Sialkot','PAK','Punjab',417597); -INSERT INTO City VALUES (2834,'Bahawalpur','PAK','Punjab',403408); -INSERT INTO City VALUES (2835,'Sukkur','PAK','Sindh',329176); -INSERT INTO City VALUES (2836,'Jhang','PAK','Punjab',292214); -INSERT INTO City VALUES (2837,'Sheikhupura','PAK','Punjab',271875); -INSERT INTO City VALUES (2838,'Larkana','PAK','Sindh',270366); -INSERT INTO City VALUES (2839,'Gujrat','PAK','Punjab',250121); -INSERT INTO City VALUES (2840,'Mardan','PAK','Nothwest Border Prov',244511); -INSERT INTO City VALUES (2841,'Kasur','PAK','Punjab',241649); -INSERT INTO City VALUES (2842,'Rahim Yar Khan','PAK','Punjab',228479); -INSERT INTO City VALUES (2843,'Sahiwal','PAK','Punjab',207388); -INSERT INTO City VALUES (2844,'Okara','PAK','Punjab',200901); -INSERT INTO City VALUES (2845,'Wah','PAK','Punjab',198400); -INSERT INTO City VALUES (2846,'Dera Ghazi Khan','PAK','Punjab',188100); -INSERT INTO City VALUES (2847,'Mirpur Khas','PAK','Sind',184500); -INSERT INTO City VALUES (2848,'Nawabshah','PAK','Sind',183100); -INSERT INTO City VALUES (2849,'Mingora','PAK','Nothwest Border Prov',174500); -INSERT INTO City VALUES (2850,'Chiniot','PAK','Punjab',169300); -INSERT INTO City VALUES (2851,'Kamoke','PAK','Punjab',151000); -INSERT INTO City VALUES (2852,'Mandi Burewala','PAK','Punjab',149900); -INSERT INTO City VALUES (2853,'Jhelum','PAK','Punjab',145800); -INSERT INTO City VALUES (2854,'Sadiqabad','PAK','Punjab',141500); -INSERT INTO City VALUES (2855,'Jacobabad','PAK','Sind',137700); -INSERT INTO City VALUES (2856,'Shikarpur','PAK','Sind',133300); -INSERT INTO City VALUES (2857,'Khanewal','PAK','Punjab',133000); -INSERT INTO City VALUES (2858,'Hafizabad','PAK','Punjab',130200); -INSERT INTO City VALUES (2859,'Kohat','PAK','Nothwest Border Prov',125300); -INSERT INTO City VALUES (2860,'Muzaffargarh','PAK','Punjab',121600); -INSERT INTO City VALUES (2861,'Khanpur','PAK','Punjab',117800); -INSERT INTO City VALUES (2862,'Gojra','PAK','Punjab',115000); -INSERT INTO City VALUES (2863,'Bahawalnagar','PAK','Punjab',109600); -INSERT INTO City VALUES (2864,'Muridke','PAK','Punjab',108600); -INSERT INTO City VALUES (2865,'Pak Pattan','PAK','Punjab',107800); -INSERT INTO City VALUES (2866,'Abottabad','PAK','Nothwest Border Prov',106000); -INSERT INTO City VALUES (2867,'Tando Adam','PAK','Sind',103400); -INSERT INTO City VALUES (2868,'Jaranwala','PAK','Punjab',103300); -INSERT INTO City VALUES (2869,'Khairpur','PAK','Sind',102200); -INSERT INTO City VALUES (2870,'Chishtian Mandi','PAK','Punjab',101700); -INSERT INTO City VALUES (2871,'Daska','PAK','Punjab',101500); -INSERT INTO City VALUES (2872,'Dadu','PAK','Sind',98600); -INSERT INTO City VALUES (2873,'Mandi Bahauddin','PAK','Punjab',97300); -INSERT INTO City VALUES (2874,'Ahmadpur East','PAK','Punjab',96000); -INSERT INTO City VALUES (2875,'Kamalia','PAK','Punjab',95300); -INSERT INTO City VALUES (2876,'Khuzdar','PAK','Baluchistan',93100); -INSERT INTO City VALUES (2877,'Vihari','PAK','Punjab',92300); -INSERT INTO City VALUES (2878,'Dera Ismail Khan','PAK','Nothwest Border Prov',90400); -INSERT INTO City VALUES (2879,'Wazirabad','PAK','Punjab',89700); -INSERT INTO City VALUES (2880,'Nowshera','PAK','Nothwest Border Prov',89400); -INSERT INTO City VALUES (2881,'Koror','PLW','Koror',12000); -INSERT INTO City VALUES (2882,'Ciudad de Panam�','PAN','Panam�',471373); -INSERT INTO City VALUES (2883,'San Miguelito','PAN','San Miguelito',315382); -INSERT INTO City VALUES (2884,'Port Moresby','PNG','National Capital Dis',247000); -INSERT INTO City VALUES (2885,'Asunci�n','PRY','Asunci�n',557776); -INSERT INTO City VALUES (2886,'Ciudad del Este','PRY','Alto Paran�',133881); -INSERT INTO City VALUES (2887,'San Lorenzo','PRY','Central',133395); -INSERT INTO City VALUES (2888,'Lambar�','PRY','Central',99681); -INSERT INTO City VALUES (2889,'Fernando de la Mora','PRY','Central',95287); -INSERT INTO City VALUES (2890,'Lima','PER','Lima',6464693); -INSERT INTO City VALUES (2891,'Arequipa','PER','Arequipa',762000); -INSERT INTO City VALUES (2892,'Trujillo','PER','La Libertad',652000); -INSERT INTO City VALUES (2893,'Chiclayo','PER','Lambayeque',517000); -INSERT INTO City VALUES (2894,'Callao','PER','Callao',424294); -INSERT INTO City VALUES (2895,'Iquitos','PER','Loreto',367000); -INSERT INTO City VALUES (2896,'Chimbote','PER','Ancash',336000); -INSERT INTO City VALUES (2897,'Huancayo','PER','Jun�n',327000); -INSERT INTO City VALUES (2898,'Piura','PER','Piura',325000); -INSERT INTO City VALUES (2899,'Cusco','PER','Cusco',291000); -INSERT INTO City VALUES (2900,'Pucallpa','PER','Ucayali',220866); -INSERT INTO City VALUES (2901,'Tacna','PER','Tacna',215683); -INSERT INTO City VALUES (2902,'Ica','PER','Ica',194820); -INSERT INTO City VALUES (2903,'Sullana','PER','Piura',147361); -INSERT INTO City VALUES (2904,'Juliaca','PER','Puno',142576); -INSERT INTO City VALUES (2905,'Hu�nuco','PER','Huanuco',129688); -INSERT INTO City VALUES (2906,'Ayacucho','PER','Ayacucho',118960); -INSERT INTO City VALUES (2907,'Chincha Alta','PER','Ica',110016); -INSERT INTO City VALUES (2908,'Cajamarca','PER','Cajamarca',108009); -INSERT INTO City VALUES (2909,'Puno','PER','Puno',101578); -INSERT INTO City VALUES (2910,'Ventanilla','PER','Callao',101056); -INSERT INTO City VALUES (2911,'Castilla','PER','Piura',90642); -INSERT INTO City VALUES (2912,'Adamstown','PCN','�',42); -INSERT INTO City VALUES (2913,'Garapan','MNP','Saipan',9200); -INSERT INTO City VALUES (2914,'Lisboa','PRT','Lisboa',563210); -INSERT INTO City VALUES (2915,'Porto','PRT','Porto',273060); -INSERT INTO City VALUES (2916,'Amadora','PRT','Lisboa',122106); -INSERT INTO City VALUES (2917,'Co�mbra','PRT','Co�mbra',96100); -INSERT INTO City VALUES (2918,'Braga','PRT','Braga',90535); -INSERT INTO City VALUES (2919,'San Juan','PRI','San Juan',434374); -INSERT INTO City VALUES (2920,'Bayam�n','PRI','Bayam�n',224044); -INSERT INTO City VALUES (2921,'Ponce','PRI','Ponce',186475); -INSERT INTO City VALUES (2922,'Carolina','PRI','Carolina',186076); -INSERT INTO City VALUES (2923,'Caguas','PRI','Caguas',140502); -INSERT INTO City VALUES (2924,'Arecibo','PRI','Arecibo',100131); -INSERT INTO City VALUES (2925,'Guaynabo','PRI','Guaynabo',100053); -INSERT INTO City VALUES (2926,'Mayag�ez','PRI','Mayag�ez',98434); -INSERT INTO City VALUES (2927,'Toa Baja','PRI','Toa Baja',94085); -INSERT INTO City VALUES (2928,'Warszawa','POL','Mazowieckie',1615369); -INSERT INTO City VALUES (2929,'L�dz','POL','Lodzkie',800110); -INSERT INTO City VALUES (2930,'Krak�w','POL','Malopolskie',738150); -INSERT INTO City VALUES (2931,'Wroclaw','POL','Dolnoslaskie',636765); -INSERT INTO City VALUES (2932,'Poznan','POL','Wielkopolskie',576899); -INSERT INTO City VALUES (2933,'Gdansk','POL','Pomorskie',458988); -INSERT INTO City VALUES (2934,'Szczecin','POL','Zachodnio-Pomorskie',416988); -INSERT INTO City VALUES (2935,'Bydgoszcz','POL','Kujawsko-Pomorskie',386855); -INSERT INTO City VALUES (2936,'Lublin','POL','Lubelskie',356251); -INSERT INTO City VALUES (2937,'Katowice','POL','Slaskie',345934); -INSERT INTO City VALUES (2938,'Bialystok','POL','Podlaskie',283937); -INSERT INTO City VALUES (2939,'Czestochowa','POL','Slaskie',257812); -INSERT INTO City VALUES (2940,'Gdynia','POL','Pomorskie',253521); -INSERT INTO City VALUES (2941,'Sosnowiec','POL','Slaskie',244102); -INSERT INTO City VALUES (2942,'Radom','POL','Mazowieckie',232262); -INSERT INTO City VALUES (2943,'Kielce','POL','Swietokrzyskie',212383); -INSERT INTO City VALUES (2944,'Gliwice','POL','Slaskie',212164); -INSERT INTO City VALUES (2945,'Torun','POL','Kujawsko-Pomorskie',206158); -INSERT INTO City VALUES (2946,'Bytom','POL','Slaskie',205560); -INSERT INTO City VALUES (2947,'Zabrze','POL','Slaskie',200177); -INSERT INTO City VALUES (2948,'Bielsko-Biala','POL','Slaskie',180307); -INSERT INTO City VALUES (2949,'Olsztyn','POL','Warminsko-Mazurskie',170904); -INSERT INTO City VALUES (2950,'Rzesz�w','POL','Podkarpackie',162049); -INSERT INTO City VALUES (2951,'Ruda Slaska','POL','Slaskie',159665); -INSERT INTO City VALUES (2952,'Rybnik','POL','Slaskie',144582); -INSERT INTO City VALUES (2953,'Walbrzych','POL','Dolnoslaskie',136923); -INSERT INTO City VALUES (2954,'Tychy','POL','Slaskie',133178); -INSERT INTO City VALUES (2955,'Dabrowa G�rnicza','POL','Slaskie',131037); -INSERT INTO City VALUES (2956,'Plock','POL','Mazowieckie',131011); -INSERT INTO City VALUES (2957,'Elblag','POL','Warminsko-Mazurskie',129782); -INSERT INTO City VALUES (2958,'Opole','POL','Opolskie',129553); -INSERT INTO City VALUES (2959,'Gorz�w Wielkopolski','POL','Lubuskie',126019); -INSERT INTO City VALUES (2960,'Wloclawek','POL','Kujawsko-Pomorskie',123373); -INSERT INTO City VALUES (2961,'Chorz�w','POL','Slaskie',121708); -INSERT INTO City VALUES (2962,'Tarn�w','POL','Malopolskie',121494); -INSERT INTO City VALUES (2963,'Zielona G�ra','POL','Lubuskie',118182); -INSERT INTO City VALUES (2964,'Koszalin','POL','Zachodnio-Pomorskie',112375); -INSERT INTO City VALUES (2965,'Legnica','POL','Dolnoslaskie',109335); -INSERT INTO City VALUES (2966,'Kalisz','POL','Wielkopolskie',106641); -INSERT INTO City VALUES (2967,'Grudziadz','POL','Kujawsko-Pomorskie',102434); -INSERT INTO City VALUES (2968,'Slupsk','POL','Pomorskie',102370); -INSERT INTO City VALUES (2969,'Jastrzebie-Zdr�j','POL','Slaskie',102294); -INSERT INTO City VALUES (2970,'Jaworzno','POL','Slaskie',97929); -INSERT INTO City VALUES (2971,'Jelenia G�ra','POL','Dolnoslaskie',93901); -INSERT INTO City VALUES (2972,'Malabo','GNQ','Bioko',40000); -INSERT INTO City VALUES (2973,'Doha','QAT','Doha',355000); -INSERT INTO City VALUES (2974,'Paris','FRA','�le-de-France',2125246); -INSERT INTO City VALUES (2975,'Marseille','FRA','Provence-Alpes-C�te',798430); -INSERT INTO City VALUES (2976,'Lyon','FRA','Rh�ne-Alpes',445452); -INSERT INTO City VALUES (2977,'Toulouse','FRA','Midi-Pyr�n�es',390350); -INSERT INTO City VALUES (2978,'Nice','FRA','Provence-Alpes-C�te',342738); -INSERT INTO City VALUES (2979,'Nantes','FRA','Pays de la Loire',270251); -INSERT INTO City VALUES (2980,'Strasbourg','FRA','Alsace',264115); -INSERT INTO City VALUES (2981,'Montpellier','FRA','Languedoc-Roussillon',225392); -INSERT INTO City VALUES (2982,'Bordeaux','FRA','Aquitaine',215363); -INSERT INTO City VALUES (2983,'Rennes','FRA','Haute-Normandie',206229); -INSERT INTO City VALUES (2984,'Le Havre','FRA','Champagne-Ardenne',190905); -INSERT INTO City VALUES (2985,'Reims','FRA','Nord-Pas-de-Calais',187206); -INSERT INTO City VALUES (2986,'Lille','FRA','Rh�ne-Alpes',184657); -INSERT INTO City VALUES (2987,'St-�tienne','FRA','Bretagne',180210); -INSERT INTO City VALUES (2988,'Toulon','FRA','Provence-Alpes-C�te',160639); -INSERT INTO City VALUES (2989,'Grenoble','FRA','Rh�ne-Alpes',153317); -INSERT INTO City VALUES (2990,'Angers','FRA','Pays de la Loire',151279); -INSERT INTO City VALUES (2991,'Dijon','FRA','Bourgogne',149867); -INSERT INTO City VALUES (2992,'Brest','FRA','Bretagne',149634); -INSERT INTO City VALUES (2993,'Le Mans','FRA','Pays de la Loire',146105); -INSERT INTO City VALUES (2994,'Clermont-Ferrand','FRA','Auvergne',137140); -INSERT INTO City VALUES (2995,'Amiens','FRA','Picardie',135501); -INSERT INTO City VALUES (2996,'Aix-en-Provence','FRA','Provence-Alpes-C�te',134222); -INSERT INTO City VALUES (2997,'Limoges','FRA','Limousin',133968); -INSERT INTO City VALUES (2998,'N�mes','FRA','Languedoc-Roussillon',133424); -INSERT INTO City VALUES (2999,'Tours','FRA','Centre',132820); -INSERT INTO City VALUES (3000,'Villeurbanne','FRA','Rh�ne-Alpes',124215); -INSERT INTO City VALUES (3001,'Metz','FRA','Lorraine',123776); -INSERT INTO City VALUES (3002,'Besan�on','FRA','Franche-Comt�',117733); -INSERT INTO City VALUES (3003,'Caen','FRA','Basse-Normandie',113987); -INSERT INTO City VALUES (3004,'Orl�ans','FRA','Centre',113126); -INSERT INTO City VALUES (3005,'Mulhouse','FRA','Alsace',110359); -INSERT INTO City VALUES (3006,'Rouen','FRA','Haute-Normandie',106592); -INSERT INTO City VALUES (3007,'Boulogne-Billancourt','FRA','�le-de-France',106367); -INSERT INTO City VALUES (3008,'Perpignan','FRA','Languedoc-Roussillon',105115); -INSERT INTO City VALUES (3009,'Nancy','FRA','Lorraine',103605); -INSERT INTO City VALUES (3010,'Roubaix','FRA','Nord-Pas-de-Calais',96984); -INSERT INTO City VALUES (3011,'Argenteuil','FRA','�le-de-France',93961); -INSERT INTO City VALUES (3012,'Tourcoing','FRA','Nord-Pas-de-Calais',93540); -INSERT INTO City VALUES (3013,'Montreuil','FRA','�le-de-France',90674); -INSERT INTO City VALUES (3014,'Cayenne','GUF','Cayenne',50699); -INSERT INTO City VALUES (3015,'Faaa','PYF','Tahiti',25888); -INSERT INTO City VALUES (3016,'Papeete','PYF','Tahiti',25553); -INSERT INTO City VALUES (3017,'Saint-Denis','REU','Saint-Denis',131480); -INSERT INTO City VALUES (3018,'Bucuresti','ROM','Bukarest',2016131); -INSERT INTO City VALUES (3019,'Iasi','ROM','Iasi',348070); -INSERT INTO City VALUES (3020,'Constanta','ROM','Constanta',342264); -INSERT INTO City VALUES (3021,'Cluj-Napoca','ROM','Cluj',332498); -INSERT INTO City VALUES (3022,'Galati','ROM','Galati',330276); -INSERT INTO City VALUES (3023,'Timisoara','ROM','Timis',324304); -INSERT INTO City VALUES (3024,'Brasov','ROM','Brasov',314225); -INSERT INTO City VALUES (3025,'Craiova','ROM','Dolj',313530); -INSERT INTO City VALUES (3026,'Ploiesti','ROM','Prahova',251348); -INSERT INTO City VALUES (3027,'Braila','ROM','Braila',233756); -INSERT INTO City VALUES (3028,'Oradea','ROM','Bihor',222239); -INSERT INTO City VALUES (3029,'Bacau','ROM','Bacau',209235); -INSERT INTO City VALUES (3030,'Pitesti','ROM','Arges',187170); -INSERT INTO City VALUES (3031,'Arad','ROM','Arad',184408); -INSERT INTO City VALUES (3032,'Sibiu','ROM','Sibiu',169611); -INSERT INTO City VALUES (3033,'T�rgu Mures','ROM','Mures',165153); -INSERT INTO City VALUES (3034,'Baia Mare','ROM','Maramures',149665); -INSERT INTO City VALUES (3035,'Buzau','ROM','Buzau',148372); -INSERT INTO City VALUES (3036,'Satu Mare','ROM','Satu Mare',130059); -INSERT INTO City VALUES (3037,'Botosani','ROM','Botosani',128730); -INSERT INTO City VALUES (3038,'Piatra Neamt','ROM','Neamt',125070); -INSERT INTO City VALUES (3039,'R�mnicu V�lcea','ROM','V�lcea',119741); -INSERT INTO City VALUES (3040,'Suceava','ROM','Suceava',118549); -INSERT INTO City VALUES (3041,'Drobeta-Turnu Severin','ROM','Mehedinti',117865); -INSERT INTO City VALUES (3042,'T�rgoviste','ROM','D�mbovita',98980); -INSERT INTO City VALUES (3043,'Focsani','ROM','Vrancea',98979); -INSERT INTO City VALUES (3044,'T�rgu Jiu','ROM','Gorj',98524); -INSERT INTO City VALUES (3045,'Tulcea','ROM','Tulcea',96278); -INSERT INTO City VALUES (3046,'Resita','ROM','Caras-Severin',93976); -INSERT INTO City VALUES (3047,'Kigali','RWA','Kigali',286000); -INSERT INTO City VALUES (3048,'Stockholm','SWE','Lisboa',750348); -INSERT INTO City VALUES (3049,'Gothenburg [G�teborg]','SWE','West G�tanmaan l�n',466990); -INSERT INTO City VALUES (3050,'Malm�','SWE','Sk�ne l�n',259579); -INSERT INTO City VALUES (3051,'Uppsala','SWE','Uppsala l�n',189569); -INSERT INTO City VALUES (3052,'Link�ping','SWE','East G�tanmaan l�n',133168); -INSERT INTO City VALUES (3053,'V�ster�s','SWE','V�stmanlands l�n',126328); -INSERT INTO City VALUES (3054,'�rebro','SWE','�rebros l�n',124207); -INSERT INTO City VALUES (3055,'Norrk�ping','SWE','East G�tanmaan l�n',122199); -INSERT INTO City VALUES (3056,'Helsingborg','SWE','Sk�ne l�n',117737); -INSERT INTO City VALUES (3057,'J�nk�ping','SWE','J�nk�pings l�n',117095); -INSERT INTO City VALUES (3058,'Ume�','SWE','V�sterbottens l�n',104512); -INSERT INTO City VALUES (3059,'Lund','SWE','Sk�ne l�n',98948); -INSERT INTO City VALUES (3060,'Bor�s','SWE','West G�tanmaan l�n',96883); -INSERT INTO City VALUES (3061,'Sundsvall','SWE','V�sternorrlands l�n',93126); -INSERT INTO City VALUES (3062,'G�vle','SWE','G�vleborgs l�n',90742); -INSERT INTO City VALUES (3063,'Jamestown','SHN','Saint Helena',1500); -INSERT INTO City VALUES (3064,'Basseterre','KNA','St George Basseterre',11600); -INSERT INTO City VALUES (3065,'Castries','LCA','Castries',2301); -INSERT INTO City VALUES (3066,'Kingstown','VCT','St George',17100); -INSERT INTO City VALUES (3067,'Saint-Pierre','SPM','Saint-Pierre',5808); -INSERT INTO City VALUES (3068,'Berlin','DEU','Berliini',3386667); -INSERT INTO City VALUES (3069,'Hamburg','DEU','Hamburg',1704735); -INSERT INTO City VALUES (3070,'Munich [M�nchen]','DEU','Baijeri',1194560); -INSERT INTO City VALUES (3071,'K�ln','DEU','Nordrhein-Westfalen',962507); -INSERT INTO City VALUES (3072,'Frankfurt am Main','DEU','Hessen',643821); -INSERT INTO City VALUES (3073,'Essen','DEU','Nordrhein-Westfalen',599515); -INSERT INTO City VALUES (3074,'Dortmund','DEU','Nordrhein-Westfalen',590213); -INSERT INTO City VALUES (3075,'Stuttgart','DEU','Baden-W�rttemberg',582443); -INSERT INTO City VALUES (3076,'D�sseldorf','DEU','Nordrhein-Westfalen',568855); -INSERT INTO City VALUES (3077,'Bremen','DEU','Bremen',540330); -INSERT INTO City VALUES (3078,'Duisburg','DEU','Nordrhein-Westfalen',519793); -INSERT INTO City VALUES (3079,'Hannover','DEU','Niedersachsen',514718); -INSERT INTO City VALUES (3080,'Leipzig','DEU','Saksi',489532); -INSERT INTO City VALUES (3081,'N�rnberg','DEU','Baijeri',486628); -INSERT INTO City VALUES (3082,'Dresden','DEU','Saksi',476668); -INSERT INTO City VALUES (3083,'Bochum','DEU','Nordrhein-Westfalen',392830); -INSERT INTO City VALUES (3084,'Wuppertal','DEU','Nordrhein-Westfalen',368993); -INSERT INTO City VALUES (3085,'Bielefeld','DEU','Nordrhein-Westfalen',321125); -INSERT INTO City VALUES (3086,'Mannheim','DEU','Baden-W�rttemberg',307730); -INSERT INTO City VALUES (3087,'Bonn','DEU','Nordrhein-Westfalen',301048); -INSERT INTO City VALUES (3088,'Gelsenkirchen','DEU','Nordrhein-Westfalen',281979); -INSERT INTO City VALUES (3089,'Karlsruhe','DEU','Baden-W�rttemberg',277204); -INSERT INTO City VALUES (3090,'Wiesbaden','DEU','Hessen',268716); -INSERT INTO City VALUES (3091,'M�nster','DEU','Nordrhein-Westfalen',264670); -INSERT INTO City VALUES (3092,'M�nchengladbach','DEU','Nordrhein-Westfalen',263697); -INSERT INTO City VALUES (3093,'Chemnitz','DEU','Saksi',263222); -INSERT INTO City VALUES (3094,'Augsburg','DEU','Baijeri',254867); -INSERT INTO City VALUES (3095,'Halle/Saale','DEU','Anhalt Sachsen',254360); -INSERT INTO City VALUES (3096,'Braunschweig','DEU','Niedersachsen',246322); -INSERT INTO City VALUES (3097,'Aachen','DEU','Nordrhein-Westfalen',243825); -INSERT INTO City VALUES (3098,'Krefeld','DEU','Nordrhein-Westfalen',241769); -INSERT INTO City VALUES (3099,'Magdeburg','DEU','Anhalt Sachsen',235073); -INSERT INTO City VALUES (3100,'Kiel','DEU','Schleswig-Holstein',233795); -INSERT INTO City VALUES (3101,'Oberhausen','DEU','Nordrhein-Westfalen',222349); -INSERT INTO City VALUES (3102,'L�beck','DEU','Schleswig-Holstein',213326); -INSERT INTO City VALUES (3103,'Hagen','DEU','Nordrhein-Westfalen',205201); -INSERT INTO City VALUES (3104,'Rostock','DEU','Mecklenburg-Vorpomme',203279); -INSERT INTO City VALUES (3105,'Freiburg im Breisgau','DEU','Baden-W�rttemberg',202455); -INSERT INTO City VALUES (3106,'Erfurt','DEU','Th�ringen',201267); -INSERT INTO City VALUES (3107,'Kassel','DEU','Hessen',196211); -INSERT INTO City VALUES (3108,'Saarbr�cken','DEU','Saarland',183836); -INSERT INTO City VALUES (3109,'Mainz','DEU','Rheinland-Pfalz',183134); -INSERT INTO City VALUES (3110,'Hamm','DEU','Nordrhein-Westfalen',181804); -INSERT INTO City VALUES (3111,'Herne','DEU','Nordrhein-Westfalen',175661); -INSERT INTO City VALUES (3112,'M�lheim an der Ruhr','DEU','Nordrhein-Westfalen',173895); -INSERT INTO City VALUES (3113,'Solingen','DEU','Nordrhein-Westfalen',165583); -INSERT INTO City VALUES (3114,'Osnabr�ck','DEU','Niedersachsen',164539); -INSERT INTO City VALUES (3115,'Ludwigshafen am Rhein','DEU','Rheinland-Pfalz',163771); -INSERT INTO City VALUES (3116,'Leverkusen','DEU','Nordrhein-Westfalen',160841); -INSERT INTO City VALUES (3117,'Oldenburg','DEU','Niedersachsen',154125); -INSERT INTO City VALUES (3118,'Neuss','DEU','Nordrhein-Westfalen',149702); -INSERT INTO City VALUES (3119,'Heidelberg','DEU','Baden-W�rttemberg',139672); -INSERT INTO City VALUES (3120,'Darmstadt','DEU','Hessen',137776); -INSERT INTO City VALUES (3121,'Paderborn','DEU','Nordrhein-Westfalen',137647); -INSERT INTO City VALUES (3122,'Potsdam','DEU','Brandenburg',128983); -INSERT INTO City VALUES (3123,'W�rzburg','DEU','Baijeri',127350); -INSERT INTO City VALUES (3124,'Regensburg','DEU','Baijeri',125236); -INSERT INTO City VALUES (3125,'Recklinghausen','DEU','Nordrhein-Westfalen',125022); -INSERT INTO City VALUES (3126,'G�ttingen','DEU','Niedersachsen',124775); -INSERT INTO City VALUES (3127,'Bremerhaven','DEU','Bremen',122735); -INSERT INTO City VALUES (3128,'Wolfsburg','DEU','Niedersachsen',121954); -INSERT INTO City VALUES (3129,'Bottrop','DEU','Nordrhein-Westfalen',121097); -INSERT INTO City VALUES (3130,'Remscheid','DEU','Nordrhein-Westfalen',120125); -INSERT INTO City VALUES (3131,'Heilbronn','DEU','Baden-W�rttemberg',119526); -INSERT INTO City VALUES (3132,'Pforzheim','DEU','Baden-W�rttemberg',117227); -INSERT INTO City VALUES (3133,'Offenbach am Main','DEU','Hessen',116627); -INSERT INTO City VALUES (3134,'Ulm','DEU','Baden-W�rttemberg',116103); -INSERT INTO City VALUES (3135,'Ingolstadt','DEU','Baijeri',114826); -INSERT INTO City VALUES (3136,'Gera','DEU','Th�ringen',114718); -INSERT INTO City VALUES (3137,'Salzgitter','DEU','Niedersachsen',112934); -INSERT INTO City VALUES (3138,'Cottbus','DEU','Brandenburg',110894); -INSERT INTO City VALUES (3139,'Reutlingen','DEU','Baden-W�rttemberg',110343); -INSERT INTO City VALUES (3140,'F�rth','DEU','Baijeri',109771); -INSERT INTO City VALUES (3141,'Siegen','DEU','Nordrhein-Westfalen',109225); -INSERT INTO City VALUES (3142,'Koblenz','DEU','Rheinland-Pfalz',108003); -INSERT INTO City VALUES (3143,'Moers','DEU','Nordrhein-Westfalen',106837); -INSERT INTO City VALUES (3144,'Bergisch Gladbach','DEU','Nordrhein-Westfalen',106150); -INSERT INTO City VALUES (3145,'Zwickau','DEU','Saksi',104146); -INSERT INTO City VALUES (3146,'Hildesheim','DEU','Niedersachsen',104013); -INSERT INTO City VALUES (3147,'Witten','DEU','Nordrhein-Westfalen',103384); -INSERT INTO City VALUES (3148,'Schwerin','DEU','Mecklenburg-Vorpomme',102878); -INSERT INTO City VALUES (3149,'Erlangen','DEU','Baijeri',100750); -INSERT INTO City VALUES (3150,'Kaiserslautern','DEU','Rheinland-Pfalz',100025); -INSERT INTO City VALUES (3151,'Trier','DEU','Rheinland-Pfalz',99891); -INSERT INTO City VALUES (3152,'Jena','DEU','Th�ringen',99779); -INSERT INTO City VALUES (3153,'Iserlohn','DEU','Nordrhein-Westfalen',99474); -INSERT INTO City VALUES (3154,'G�tersloh','DEU','Nordrhein-Westfalen',95028); -INSERT INTO City VALUES (3155,'Marl','DEU','Nordrhein-Westfalen',93735); -INSERT INTO City VALUES (3156,'L�nen','DEU','Nordrhein-Westfalen',92044); -INSERT INTO City VALUES (3157,'D�ren','DEU','Nordrhein-Westfalen',91092); -INSERT INTO City VALUES (3158,'Ratingen','DEU','Nordrhein-Westfalen',90951); -INSERT INTO City VALUES (3159,'Velbert','DEU','Nordrhein-Westfalen',89881); -INSERT INTO City VALUES (3160,'Esslingen am Neckar','DEU','Baden-W�rttemberg',89667); -INSERT INTO City VALUES (3161,'Honiara','SLB','Honiara',50100); -INSERT INTO City VALUES (3162,'Lusaka','ZMB','Lusaka',1317000); -INSERT INTO City VALUES (3163,'Ndola','ZMB','Copperbelt',329200); -INSERT INTO City VALUES (3164,'Kitwe','ZMB','Copperbelt',288600); -INSERT INTO City VALUES (3165,'Kabwe','ZMB','Central',154300); -INSERT INTO City VALUES (3166,'Chingola','ZMB','Copperbelt',142400); -INSERT INTO City VALUES (3167,'Mufulira','ZMB','Copperbelt',123900); -INSERT INTO City VALUES (3168,'Luanshya','ZMB','Copperbelt',118100); -INSERT INTO City VALUES (3169,'Apia','WSM','Upolu',35900); -INSERT INTO City VALUES (3170,'Serravalle','SMR','Serravalle/Dogano',4802); -INSERT INTO City VALUES (3171,'San Marino','SMR','San Marino',2294); -INSERT INTO City VALUES (3172,'S�o Tom�','STP','Aqua Grande',49541); -INSERT INTO City VALUES (3173,'Riyadh','SAU','Riyadh',3324000); -INSERT INTO City VALUES (3174,'Jedda','SAU','Mekka',2046300); -INSERT INTO City VALUES (3175,'Mekka','SAU','Mekka',965700); -INSERT INTO City VALUES (3176,'Medina','SAU','Medina',608300); -INSERT INTO City VALUES (3177,'al-Dammam','SAU','al-Sharqiya',482300); -INSERT INTO City VALUES (3178,'al-Taif','SAU','Mekka',416100); -INSERT INTO City VALUES (3179,'Tabuk','SAU','Tabuk',292600); -INSERT INTO City VALUES (3180,'Burayda','SAU','al-Qasim',248600); -INSERT INTO City VALUES (3181,'al-Hufuf','SAU','al-Sharqiya',225800); -INSERT INTO City VALUES (3182,'al-Mubarraz','SAU','al-Sharqiya',219100); -INSERT INTO City VALUES (3183,'Khamis Mushayt','SAU','Asir',217900); -INSERT INTO City VALUES (3184,'Hail','SAU','Hail',176800); -INSERT INTO City VALUES (3185,'al-Kharj','SAU','Riad',152100); -INSERT INTO City VALUES (3186,'al-Khubar','SAU','al-Sharqiya',141700); -INSERT INTO City VALUES (3187,'Jubayl','SAU','al-Sharqiya',140800); -INSERT INTO City VALUES (3188,'Hafar al-Batin','SAU','al-Sharqiya',137800); -INSERT INTO City VALUES (3189,'al-Tuqba','SAU','al-Sharqiya',125700); -INSERT INTO City VALUES (3190,'Yanbu','SAU','Medina',119800); -INSERT INTO City VALUES (3191,'Abha','SAU','Asir',112300); -INSERT INTO City VALUES (3192,'Ara�ar','SAU','al-Khudud al-Samaliy',108100); -INSERT INTO City VALUES (3193,'al-Qatif','SAU','al-Sharqiya',98900); -INSERT INTO City VALUES (3194,'al-Hawiya','SAU','Mekka',93900); -INSERT INTO City VALUES (3195,'Unayza','SAU','Qasim',91100); -INSERT INTO City VALUES (3196,'Najran','SAU','Najran',91000); -INSERT INTO City VALUES (3197,'Pikine','SEN','Cap-Vert',855287); -INSERT INTO City VALUES (3198,'Dakar','SEN','Cap-Vert',785071); -INSERT INTO City VALUES (3199,'Thi�s','SEN','Thi�s',248000); -INSERT INTO City VALUES (3200,'Kaolack','SEN','Kaolack',199000); -INSERT INTO City VALUES (3201,'Ziguinchor','SEN','Ziguinchor',192000); -INSERT INTO City VALUES (3202,'Rufisque','SEN','Cap-Vert',150000); -INSERT INTO City VALUES (3203,'Saint-Louis','SEN','Saint-Louis',132400); -INSERT INTO City VALUES (3204,'Mbour','SEN','Thi�s',109300); -INSERT INTO City VALUES (3205,'Diourbel','SEN','Diourbel',99400); -INSERT INTO City VALUES (3206,'Victoria','SYC','Mah�',41000); -INSERT INTO City VALUES (3207,'Freetown','SLE','Western',850000); -INSERT INTO City VALUES (3208,'Singapore','SGP','�',4017733); -INSERT INTO City VALUES (3209,'Bratislava','SVK','Bratislava',448292); -INSERT INTO City VALUES (3210,'Ko�ice','SVK','V�chodn� Slovensko',241874); -INSERT INTO City VALUES (3211,'Pre�ov','SVK','V�chodn� Slovensko',93977); -INSERT INTO City VALUES (3212,'Ljubljana','SVN','Osrednjeslovenska',270986); -INSERT INTO City VALUES (3213,'Maribor','SVN','Podravska',115532); -INSERT INTO City VALUES (3214,'Mogadishu','SOM','Banaadir',997000); -INSERT INTO City VALUES (3215,'Hargeysa','SOM','Woqooyi Galbeed',90000); -INSERT INTO City VALUES (3216,'Kismaayo','SOM','Jubbada Hoose',90000); -INSERT INTO City VALUES (3217,'Colombo','LKA','Western',645000); -INSERT INTO City VALUES (3218,'Dehiwala','LKA','Western',203000); -INSERT INTO City VALUES (3219,'Moratuwa','LKA','Western',190000); -INSERT INTO City VALUES (3220,'Jaffna','LKA','Northern',149000); -INSERT INTO City VALUES (3221,'Kandy','LKA','Central',140000); -INSERT INTO City VALUES (3222,'Sri Jayawardenepura Kotte','LKA','Western',118000); -INSERT INTO City VALUES (3223,'Negombo','LKA','Western',100000); -INSERT INTO City VALUES (3224,'Omdurman','SDN','Khartum',1271403); -INSERT INTO City VALUES (3225,'Khartum','SDN','Khartum',947483); -INSERT INTO City VALUES (3226,'Sharq al-Nil','SDN','Khartum',700887); -INSERT INTO City VALUES (3227,'Port Sudan','SDN','al-Bahr al-Ahmar',308195); -INSERT INTO City VALUES (3228,'Kassala','SDN','Kassala',234622); -INSERT INTO City VALUES (3229,'Obeid','SDN','Kurdufan al-Shamaliy',229425); -INSERT INTO City VALUES (3230,'Nyala','SDN','Darfur al-Janubiya',227183); -INSERT INTO City VALUES (3231,'Wad Madani','SDN','al-Jazira',211362); -INSERT INTO City VALUES (3232,'al-Qadarif','SDN','al-Qadarif',191164); -INSERT INTO City VALUES (3233,'Kusti','SDN','al-Bahr al-Abyad',173599); -INSERT INTO City VALUES (3234,'al-Fashir','SDN','Darfur al-Shamaliya',141884); -INSERT INTO City VALUES (3235,'Juba','SDN','Bahr al-Jabal',114980); -INSERT INTO City VALUES (3236,'Helsinki [Helsingfors]','FIN','Newmaa',555474); -INSERT INTO City VALUES (3237,'Espoo','FIN','Newmaa',213271); -INSERT INTO City VALUES (3238,'Tampere','FIN','Pirkanmaa',195468); -INSERT INTO City VALUES (3239,'Vantaa','FIN','Newmaa',178471); -INSERT INTO City VALUES (3240,'Turku [�bo]','FIN','Varsinais-Suomi',172561); -INSERT INTO City VALUES (3241,'Oulu','FIN','Pohjois-Pohjanmaa',120753); -INSERT INTO City VALUES (3242,'Lahti','FIN','P�ij�t-H�me',96921); -INSERT INTO City VALUES (3243,'Paramaribo','SUR','Paramaribo',112000); -INSERT INTO City VALUES (3244,'Mbabane','SWZ','Hhohho',61000); -INSERT INTO City VALUES (3245,'Z�rich','CHE','Z�rich',336800); -INSERT INTO City VALUES (3246,'Geneve','CHE','Geneve',173500); -INSERT INTO City VALUES (3247,'Basel','CHE','Basel-Stadt',166700); -INSERT INTO City VALUES (3248,'Bern','CHE','Bern',122700); -INSERT INTO City VALUES (3249,'Lausanne','CHE','Vaud',114500); -INSERT INTO City VALUES (3250,'Damascus','SYR','Damascus',1347000); -INSERT INTO City VALUES (3251,'Aleppo','SYR','Aleppo',1261983); -INSERT INTO City VALUES (3252,'Hims','SYR','Hims',507404); -INSERT INTO City VALUES (3253,'Hama','SYR','Hama',343361); -INSERT INTO City VALUES (3254,'Latakia','SYR','Latakia',264563); -INSERT INTO City VALUES (3255,'al-Qamishliya','SYR','al-Hasaka',144286); -INSERT INTO City VALUES (3256,'Dayr al-Zawr','SYR','Dayr al-Zawr',140459); -INSERT INTO City VALUES (3257,'Jaramana','SYR','Damaskos',138469); -INSERT INTO City VALUES (3258,'Duma','SYR','Damaskos',131158); -INSERT INTO City VALUES (3259,'al-Raqqa','SYR','al-Raqqa',108020); -INSERT INTO City VALUES (3260,'Idlib','SYR','Idlib',91081); -INSERT INTO City VALUES (3261,'Dushanbe','TJK','Karotegin',524000); -INSERT INTO City VALUES (3262,'Khujand','TJK','Khujand',161500); -INSERT INTO City VALUES (3263,'Taipei','TWN','Taipei',2641312); -INSERT INTO City VALUES (3264,'Kaohsiung','TWN','Kaohsiung',1475505); -INSERT INTO City VALUES (3265,'Taichung','TWN','Taichung',940589); -INSERT INTO City VALUES (3266,'Tainan','TWN','Tainan',728060); -INSERT INTO City VALUES (3267,'Panchiao','TWN','Taipei',523850); -INSERT INTO City VALUES (3268,'Chungho','TWN','Taipei',392176); -INSERT INTO City VALUES (3269,'Keelung (Chilung)','TWN','Keelung',385201); -INSERT INTO City VALUES (3270,'Sanchung','TWN','Taipei',380084); -INSERT INTO City VALUES (3271,'Hsinchuang','TWN','Taipei',365048); -INSERT INTO City VALUES (3272,'Hsinchu','TWN','Hsinchu',361958); -INSERT INTO City VALUES (3273,'Chungli','TWN','Taoyuan',318649); -INSERT INTO City VALUES (3274,'Fengshan','TWN','Kaohsiung',318562); -INSERT INTO City VALUES (3275,'Taoyuan','TWN','Taoyuan',316438); -INSERT INTO City VALUES (3276,'Chiayi','TWN','Chiayi',265109); -INSERT INTO City VALUES (3277,'Hsintien','TWN','Taipei',263603); -INSERT INTO City VALUES (3278,'Changhwa','TWN','Changhwa',227715); -INSERT INTO City VALUES (3279,'Yungho','TWN','Taipei',227700); -INSERT INTO City VALUES (3280,'Tucheng','TWN','Taipei',224897); -INSERT INTO City VALUES (3281,'Pingtung','TWN','Pingtung',214727); -INSERT INTO City VALUES (3282,'Yungkang','TWN','Tainan',193005); -INSERT INTO City VALUES (3283,'Pingchen','TWN','Taoyuan',188344); -INSERT INTO City VALUES (3284,'Tali','TWN','Taichung',171940); -INSERT INTO City VALUES (3285,'Taiping','TWN','',165524); -INSERT INTO City VALUES (3286,'Pate','TWN','Taoyuan',161700); -INSERT INTO City VALUES (3287,'Fengyuan','TWN','Taichung',161032); -INSERT INTO City VALUES (3288,'Luchou','TWN','Taipei',160516); -INSERT INTO City VALUES (3289,'Hsichuh','TWN','Taipei',154976); -INSERT INTO City VALUES (3290,'Shulin','TWN','Taipei',151260); -INSERT INTO City VALUES (3291,'Yuanlin','TWN','Changhwa',126402); -INSERT INTO City VALUES (3292,'Yangmei','TWN','Taoyuan',126323); -INSERT INTO City VALUES (3293,'Taliao','TWN','',115897); -INSERT INTO City VALUES (3294,'Kueishan','TWN','',112195); -INSERT INTO City VALUES (3295,'Tanshui','TWN','Taipei',111882); -INSERT INTO City VALUES (3296,'Taitung','TWN','Taitung',111039); -INSERT INTO City VALUES (3297,'Hualien','TWN','Hualien',108407); -INSERT INTO City VALUES (3298,'Nantou','TWN','Nantou',104723); -INSERT INTO City VALUES (3299,'Lungtan','TWN','Taipei',103088); -INSERT INTO City VALUES (3300,'Touliu','TWN','Y�nlin',98900); -INSERT INTO City VALUES (3301,'Tsaotun','TWN','Nantou',96800); -INSERT INTO City VALUES (3302,'Kangshan','TWN','Kaohsiung',92200); -INSERT INTO City VALUES (3303,'Ilan','TWN','Ilan',92000); -INSERT INTO City VALUES (3304,'Miaoli','TWN','Miaoli',90000); -INSERT INTO City VALUES (3305,'Dar es Salaam','TZA','Dar es Salaam',1747000); -INSERT INTO City VALUES (3306,'Dodoma','TZA','Dodoma',189000); -INSERT INTO City VALUES (3307,'Mwanza','TZA','Mwanza',172300); -INSERT INTO City VALUES (3308,'Zanzibar','TZA','Zanzibar West',157634); -INSERT INTO City VALUES (3309,'Tanga','TZA','Tanga',137400); -INSERT INTO City VALUES (3310,'Mbeya','TZA','Mbeya',130800); -INSERT INTO City VALUES (3311,'Morogoro','TZA','Morogoro',117800); -INSERT INTO City VALUES (3312,'Arusha','TZA','Arusha',102500); -INSERT INTO City VALUES (3313,'Moshi','TZA','Kilimanjaro',96800); -INSERT INTO City VALUES (3314,'Tabora','TZA','Tabora',92800); -INSERT INTO City VALUES (3315,'K�benhavn','DNK','K�benhavn',495699); -INSERT INTO City VALUES (3316,'�rhus','DNK','�rhus',284846); -INSERT INTO City VALUES (3317,'Odense','DNK','Fyn',183912); -INSERT INTO City VALUES (3318,'Aalborg','DNK','Nordjylland',161161); -INSERT INTO City VALUES (3319,'Frederiksberg','DNK','Frederiksberg',90327); -INSERT INTO City VALUES (3320,'Bangkok','THA','Bangkok',6320174); -INSERT INTO City VALUES (3321,'Nonthaburi','THA','Nonthaburi',292100); -INSERT INTO City VALUES (3322,'Nakhon Ratchasima','THA','Nakhon Ratchasima',181400); -INSERT INTO City VALUES (3323,'Chiang Mai','THA','Chiang Mai',171100); -INSERT INTO City VALUES (3324,'Udon Thani','THA','Udon Thani',158100); -INSERT INTO City VALUES (3325,'Hat Yai','THA','Songkhla',148632); -INSERT INTO City VALUES (3326,'Khon Kaen','THA','Khon Kaen',126500); -INSERT INTO City VALUES (3327,'Pak Kret','THA','Nonthaburi',126055); -INSERT INTO City VALUES (3328,'Nakhon Sawan','THA','Nakhon Sawan',123800); -INSERT INTO City VALUES (3329,'Ubon Ratchathani','THA','Ubon Ratchathani',116300); -INSERT INTO City VALUES (3330,'Songkhla','THA','Songkhla',94900); -INSERT INTO City VALUES (3331,'Nakhon Pathom','THA','Nakhon Pathom',94100); -INSERT INTO City VALUES (3332,'Lom�','TGO','Maritime',375000); -INSERT INTO City VALUES (3333,'Fakaofo','TKL','Fakaofo',300); -INSERT INTO City VALUES (3334,'Nuku�alofa','TON','Tongatapu',22400); -INSERT INTO City VALUES (3335,'Chaguanas','TTO','Caroni',56601); -INSERT INTO City VALUES (3336,'Port-of-Spain','TTO','Port-of-Spain',43396); -INSERT INTO City VALUES (3337,'N�Djam�na','TCD','Chari-Baguirmi',530965); -INSERT INTO City VALUES (3338,'Moundou','TCD','Logone Occidental',99500); -INSERT INTO City VALUES (3339,'Praha','CZE','Hlavn� mesto Praha',1181126); -INSERT INTO City VALUES (3340,'Brno','CZE','Jizn� Morava',381862); -INSERT INTO City VALUES (3341,'Ostrava','CZE','Severn� Morava',320041); -INSERT INTO City VALUES (3342,'Plzen','CZE','Zapadn� Cechy',166759); -INSERT INTO City VALUES (3343,'Olomouc','CZE','Severn� Morava',102702); -INSERT INTO City VALUES (3344,'Liberec','CZE','Severn� Cechy',99155); -INSERT INTO City VALUES (3345,'Cesk� Budejovice','CZE','Jizn� Cechy',98186); -INSERT INTO City VALUES (3346,'Hradec Kr�lov�','CZE','V�chodn� Cechy',98080); -INSERT INTO City VALUES (3347,'�st� nad Labem','CZE','Severn� Cechy',95491); -INSERT INTO City VALUES (3348,'Pardubice','CZE','V�chodn� Cechy',91309); -INSERT INTO City VALUES (3349,'Tunis','TUN','Tunis',690600); -INSERT INTO City VALUES (3350,'Sfax','TUN','Sfax',257800); -INSERT INTO City VALUES (3351,'Ariana','TUN','Ariana',197000); -INSERT INTO City VALUES (3352,'Ettadhamen','TUN','Ariana',178600); -INSERT INTO City VALUES (3353,'Sousse','TUN','Sousse',145900); -INSERT INTO City VALUES (3354,'Kairouan','TUN','Kairouan',113100); -INSERT INTO City VALUES (3355,'Biserta','TUN','Biserta',108900); -INSERT INTO City VALUES (3356,'Gab�s','TUN','Gab�s',106600); -INSERT INTO City VALUES (3357,'Istanbul','TUR','Istanbul',8787958); -INSERT INTO City VALUES (3358,'Ankara','TUR','Ankara',3038159); -INSERT INTO City VALUES (3359,'Izmir','TUR','Izmir',2130359); -INSERT INTO City VALUES (3360,'Adana','TUR','Adana',1131198); -INSERT INTO City VALUES (3361,'Bursa','TUR','Bursa',1095842); -INSERT INTO City VALUES (3362,'Gaziantep','TUR','Gaziantep',789056); -INSERT INTO City VALUES (3363,'Konya','TUR','Konya',628364); -INSERT INTO City VALUES (3364,'Mersin (I�el)','TUR','I�el',587212); -INSERT INTO City VALUES (3365,'Antalya','TUR','Antalya',564914); -INSERT INTO City VALUES (3366,'Diyarbakir','TUR','Diyarbakir',479884); -INSERT INTO City VALUES (3367,'Kayseri','TUR','Kayseri',475657); -INSERT INTO City VALUES (3368,'Eskisehir','TUR','Eskisehir',470781); -INSERT INTO City VALUES (3369,'Sanliurfa','TUR','Sanliurfa',405905); -INSERT INTO City VALUES (3370,'Samsun','TUR','Samsun',339871); -INSERT INTO City VALUES (3371,'Malatya','TUR','Malatya',330312); -INSERT INTO City VALUES (3372,'Gebze','TUR','Kocaeli',264170); -INSERT INTO City VALUES (3373,'Denizli','TUR','Denizli',253848); -INSERT INTO City VALUES (3374,'Sivas','TUR','Sivas',246642); -INSERT INTO City VALUES (3375,'Erzurum','TUR','Erzurum',246535); -INSERT INTO City VALUES (3376,'Tarsus','TUR','Adana',246206); -INSERT INTO City VALUES (3377,'Kahramanmaras','TUR','Kahramanmaras',245772); -INSERT INTO City VALUES (3378,'El�zig','TUR','El�zig',228815); -INSERT INTO City VALUES (3379,'Van','TUR','Van',219319); -INSERT INTO City VALUES (3380,'Sultanbeyli','TUR','Istanbul',211068); -INSERT INTO City VALUES (3381,'Izmit (Kocaeli)','TUR','Kocaeli',210068); -INSERT INTO City VALUES (3382,'Manisa','TUR','Manisa',207148); -INSERT INTO City VALUES (3383,'Batman','TUR','Batman',203793); -INSERT INTO City VALUES (3384,'Balikesir','TUR','Balikesir',196382); -INSERT INTO City VALUES (3385,'Sakarya (Adapazari)','TUR','Sakarya',190641); -INSERT INTO City VALUES (3386,'Iskenderun','TUR','Hatay',153022); -INSERT INTO City VALUES (3387,'Osmaniye','TUR','Osmaniye',146003); -INSERT INTO City VALUES (3388,'�orum','TUR','�orum',145495); -INSERT INTO City VALUES (3389,'K�tahya','TUR','K�tahya',144761); -INSERT INTO City VALUES (3390,'Hatay (Antakya)','TUR','Hatay',143982); -INSERT INTO City VALUES (3391,'Kirikkale','TUR','Kirikkale',142044); -INSERT INTO City VALUES (3392,'Adiyaman','TUR','Adiyaman',141529); -INSERT INTO City VALUES (3393,'Trabzon','TUR','Trabzon',138234); -INSERT INTO City VALUES (3394,'Ordu','TUR','Ordu',133642); -INSERT INTO City VALUES (3395,'Aydin','TUR','Aydin',128651); -INSERT INTO City VALUES (3396,'Usak','TUR','Usak',128162); -INSERT INTO City VALUES (3397,'Edirne','TUR','Edirne',123383); -INSERT INTO City VALUES (3398,'�orlu','TUR','Tekirdag',123300); -INSERT INTO City VALUES (3399,'Isparta','TUR','Isparta',121911); -INSERT INTO City VALUES (3400,'Karab�k','TUR','Karab�k',118285); -INSERT INTO City VALUES (3401,'Kilis','TUR','Kilis',118245); -INSERT INTO City VALUES (3402,'Alanya','TUR','Antalya',117300); -INSERT INTO City VALUES (3403,'Kiziltepe','TUR','Mardin',112000); -INSERT INTO City VALUES (3404,'Zonguldak','TUR','Zonguldak',111542); -INSERT INTO City VALUES (3405,'Siirt','TUR','Siirt',107100); -INSERT INTO City VALUES (3406,'Viransehir','TUR','Sanliurfa',106400); -INSERT INTO City VALUES (3407,'Tekirdag','TUR','Tekirdag',106077); -INSERT INTO City VALUES (3408,'Karaman','TUR','Karaman',104200); -INSERT INTO City VALUES (3409,'Afyon','TUR','Afyon',103984); -INSERT INTO City VALUES (3410,'Aksaray','TUR','Aksaray',102681); -INSERT INTO City VALUES (3411,'Ceyhan','TUR','Adana',102412); -INSERT INTO City VALUES (3412,'Erzincan','TUR','Erzincan',102304); -INSERT INTO City VALUES (3413,'Bismil','TUR','Diyarbakir',101400); -INSERT INTO City VALUES (3414,'Nazilli','TUR','Aydin',99900); -INSERT INTO City VALUES (3415,'Tokat','TUR','Tokat',99500); -INSERT INTO City VALUES (3416,'Kars','TUR','Kars',93000); -INSERT INTO City VALUES (3417,'Ineg�l','TUR','Bursa',90500); -INSERT INTO City VALUES (3418,'Bandirma','TUR','Balikesir',90200); -INSERT INTO City VALUES (3419,'Ashgabat','TKM','Ahal',540600); -INSERT INTO City VALUES (3420,'Ch�rjew','TKM','Lebap',189200); -INSERT INTO City VALUES (3421,'Dashhowuz','TKM','Dashhowuz',141800); -INSERT INTO City VALUES (3422,'Mary','TKM','Mary',101000); -INSERT INTO City VALUES (3423,'Cockburn Town','TCA','Grand Turk',4800); -INSERT INTO City VALUES (3424,'Funafuti','TUV','Funafuti',4600); -INSERT INTO City VALUES (3425,'Kampala','UGA','Central',890800); -INSERT INTO City VALUES (3426,'Kyiv','UKR','Kiova',2624000); -INSERT INTO City VALUES (3427,'Harkova [Harkiv]','UKR','Harkova',1500000); -INSERT INTO City VALUES (3428,'Dnipropetrovsk','UKR','Dnipropetrovsk',1103000); -INSERT INTO City VALUES (3429,'Donetsk','UKR','Donetsk',1050000); -INSERT INTO City VALUES (3430,'Odesa','UKR','Odesa',1011000); -INSERT INTO City VALUES (3431,'Zaporizzja','UKR','Zaporizzja',848000); -INSERT INTO City VALUES (3432,'Lviv','UKR','Lviv',788000); -INSERT INTO City VALUES (3433,'Kryvyi Rig','UKR','Dnipropetrovsk',703000); -INSERT INTO City VALUES (3434,'Mykolajiv','UKR','Mykolajiv',508000); -INSERT INTO City VALUES (3435,'Mariupol','UKR','Donetsk',490000); -INSERT INTO City VALUES (3436,'Lugansk','UKR','Lugansk',469000); -INSERT INTO City VALUES (3437,'Vinnytsja','UKR','Vinnytsja',391000); -INSERT INTO City VALUES (3438,'Makijivka','UKR','Donetsk',384000); -INSERT INTO City VALUES (3439,'Herson','UKR','Herson',353000); -INSERT INTO City VALUES (3440,'Sevastopol','UKR','Krim',348000); -INSERT INTO City VALUES (3441,'Simferopol','UKR','Krim',339000); -INSERT INTO City VALUES (3442,'Pultava [Poltava]','UKR','Pultava',313000); -INSERT INTO City VALUES (3443,'T�ernigiv','UKR','T�ernigiv',313000); -INSERT INTO City VALUES (3444,'T�erkasy','UKR','T�erkasy',309000); -INSERT INTO City VALUES (3445,'Gorlivka','UKR','Donetsk',299000); -INSERT INTO City VALUES (3446,'Zytomyr','UKR','Zytomyr',297000); -INSERT INTO City VALUES (3447,'Sumy','UKR','Sumy',294000); -INSERT INTO City VALUES (3448,'Dniprodzerzynsk','UKR','Dnipropetrovsk',270000); -INSERT INTO City VALUES (3449,'Kirovograd','UKR','Kirovograd',265000); -INSERT INTO City VALUES (3450,'Hmelnytskyi','UKR','Hmelnytskyi',262000); -INSERT INTO City VALUES (3451,'T�ernivtsi','UKR','T�ernivtsi',259000); -INSERT INTO City VALUES (3452,'Rivne','UKR','Rivne',245000); -INSERT INTO City VALUES (3453,'Krement�uk','UKR','Pultava',239000); -INSERT INTO City VALUES (3454,'Ivano-Frankivsk','UKR','Ivano-Frankivsk',237000); -INSERT INTO City VALUES (3455,'Ternopil','UKR','Ternopil',236000); -INSERT INTO City VALUES (3456,'Lutsk','UKR','Volynia',217000); -INSERT INTO City VALUES (3457,'Bila Tserkva','UKR','Kiova',215000); -INSERT INTO City VALUES (3458,'Kramatorsk','UKR','Donetsk',186000); -INSERT INTO City VALUES (3459,'Melitopol','UKR','Zaporizzja',169000); -INSERT INTO City VALUES (3460,'Kert�','UKR','Krim',162000); -INSERT INTO City VALUES (3461,'Nikopol','UKR','Dnipropetrovsk',149000); -INSERT INTO City VALUES (3462,'Berdjansk','UKR','Zaporizzja',130000); -INSERT INTO City VALUES (3463,'Pavlograd','UKR','Dnipropetrovsk',127000); -INSERT INTO City VALUES (3464,'Sjeverodonetsk','UKR','Lugansk',127000); -INSERT INTO City VALUES (3465,'Slovjansk','UKR','Donetsk',127000); -INSERT INTO City VALUES (3466,'Uzgorod','UKR','Taka-Karpatia',127000); -INSERT INTO City VALUES (3467,'Alt�evsk','UKR','Lugansk',119000); -INSERT INTO City VALUES (3468,'Lysyt�ansk','UKR','Lugansk',116000); -INSERT INTO City VALUES (3469,'Jevpatorija','UKR','Krim',112000); -INSERT INTO City VALUES (3470,'Kamjanets-Podilskyi','UKR','Hmelnytskyi',109000); -INSERT INTO City VALUES (3471,'Jenakijeve','UKR','Donetsk',105000); -INSERT INTO City VALUES (3472,'Krasnyi Lut�','UKR','Lugansk',101000); -INSERT INTO City VALUES (3473,'Stahanov','UKR','Lugansk',101000); -INSERT INTO City VALUES (3474,'Oleksandrija','UKR','Kirovograd',99000); -INSERT INTO City VALUES (3475,'Konotop','UKR','Sumy',96000); -INSERT INTO City VALUES (3476,'Kostjantynivka','UKR','Donetsk',95000); -INSERT INTO City VALUES (3477,'Berdyt�iv','UKR','Zytomyr',90000); -INSERT INTO City VALUES (3478,'Izmajil','UKR','Odesa',90000); -INSERT INTO City VALUES (3479,'�ostka','UKR','Sumy',90000); -INSERT INTO City VALUES (3480,'Uman','UKR','T�erkasy',90000); -INSERT INTO City VALUES (3481,'Brovary','UKR','Kiova',89000); -INSERT INTO City VALUES (3482,'Mukat�eve','UKR','Taka-Karpatia',89000); -INSERT INTO City VALUES (3483,'Budapest','HUN','Budapest',1811552); -INSERT INTO City VALUES (3484,'Debrecen','HUN','Hajd�-Bihar',203648); -INSERT INTO City VALUES (3485,'Miskolc','HUN','Borsod-Aba�j-Zempl�n',172357); -INSERT INTO City VALUES (3486,'Szeged','HUN','Csongr�d',158158); -INSERT INTO City VALUES (3487,'P�cs','HUN','Baranya',157332); -INSERT INTO City VALUES (3488,'Gy�r','HUN','Gy�r-Moson-Sopron',127119); -INSERT INTO City VALUES (3489,'Nyiregyh�za','HUN','Szabolcs-Szatm�r-Ber',112419); -INSERT INTO City VALUES (3490,'Kecskem�t','HUN','B�cs-Kiskun',105606); -INSERT INTO City VALUES (3491,'Sz�kesfeh�rv�r','HUN','Fej�r',105119); -INSERT INTO City VALUES (3492,'Montevideo','URY','Montevideo',1236000); -INSERT INTO City VALUES (3493,'Noum�a','NCL','�',76293); -INSERT INTO City VALUES (3494,'Auckland','NZL','Auckland',381800); -INSERT INTO City VALUES (3495,'Christchurch','NZL','Canterbury',324200); -INSERT INTO City VALUES (3496,'Manukau','NZL','Auckland',281800); -INSERT INTO City VALUES (3497,'North Shore','NZL','Auckland',187700); -INSERT INTO City VALUES (3498,'Waitakere','NZL','Auckland',170600); -INSERT INTO City VALUES (3499,'Wellington','NZL','Wellington',166700); -INSERT INTO City VALUES (3500,'Dunedin','NZL','Dunedin',119600); -INSERT INTO City VALUES (3501,'Hamilton','NZL','Hamilton',117100); -INSERT INTO City VALUES (3502,'Lower Hutt','NZL','Wellington',98100); -INSERT INTO City VALUES (3503,'Toskent','UZB','Toskent Shahri',2117500); -INSERT INTO City VALUES (3504,'Namangan','UZB','Namangan',370500); -INSERT INTO City VALUES (3505,'Samarkand','UZB','Samarkand',361800); -INSERT INTO City VALUES (3506,'Andijon','UZB','Andijon',318600); -INSERT INTO City VALUES (3507,'Buhoro','UZB','Buhoro',237100); -INSERT INTO City VALUES (3508,'Karsi','UZB','Qashqadaryo',194100); -INSERT INTO City VALUES (3509,'Nukus','UZB','Karakalpakistan',194100); -INSERT INTO City VALUES (3510,'K�kon','UZB','Fargona',190100); -INSERT INTO City VALUES (3511,'Fargona','UZB','Fargona',180500); -INSERT INTO City VALUES (3512,'Circik','UZB','Toskent',146400); -INSERT INTO City VALUES (3513,'Margilon','UZB','Fargona',140800); -INSERT INTO City VALUES (3514,'�rgenc','UZB','Khorazm',138900); -INSERT INTO City VALUES (3515,'Angren','UZB','Toskent',128000); -INSERT INTO City VALUES (3516,'Cizah','UZB','Cizah',124800); -INSERT INTO City VALUES (3517,'Navoi','UZB','Navoi',116300); -INSERT INTO City VALUES (3518,'Olmalik','UZB','Toskent',114900); -INSERT INTO City VALUES (3519,'Termiz','UZB','Surkhondaryo',109500); -INSERT INTO City VALUES (3520,'Minsk','BLR','Horad Minsk',1674000); -INSERT INTO City VALUES (3521,'Gomel','BLR','Gomel',475000); -INSERT INTO City VALUES (3522,'Mogiljov','BLR','Mogiljov',356000); -INSERT INTO City VALUES (3523,'Vitebsk','BLR','Vitebsk',340000); -INSERT INTO City VALUES (3524,'Grodno','BLR','Grodno',302000); -INSERT INTO City VALUES (3525,'Brest','BLR','Brest',286000); -INSERT INTO City VALUES (3526,'Bobruisk','BLR','Mogiljov',221000); -INSERT INTO City VALUES (3527,'Baranovit�i','BLR','Brest',167000); -INSERT INTO City VALUES (3528,'Borisov','BLR','Minsk',151000); -INSERT INTO City VALUES (3529,'Pinsk','BLR','Brest',130000); -INSERT INTO City VALUES (3530,'Or�a','BLR','Vitebsk',124000); -INSERT INTO City VALUES (3531,'Mozyr','BLR','Gomel',110000); -INSERT INTO City VALUES (3532,'Novopolotsk','BLR','Vitebsk',106000); -INSERT INTO City VALUES (3533,'Lida','BLR','Grodno',101000); -INSERT INTO City VALUES (3534,'Soligorsk','BLR','Minsk',101000); -INSERT INTO City VALUES (3535,'Molodet�no','BLR','Minsk',97000); -INSERT INTO City VALUES (3536,'Mata-Utu','WLF','Wallis',1137); -INSERT INTO City VALUES (3537,'Port-Vila','VUT','Shefa',33700); -INSERT INTO City VALUES (3538,'Citt� del Vaticano','VAT','�',455); -INSERT INTO City VALUES (3539,'Caracas','VEN','Distrito Federal',1975294); -INSERT INTO City VALUES (3540,'Maraca�bo','VEN','Zulia',1304776); -INSERT INTO City VALUES (3541,'Barquisimeto','VEN','Lara',877239); -INSERT INTO City VALUES (3542,'Valencia','VEN','Carabobo',794246); -INSERT INTO City VALUES (3543,'Ciudad Guayana','VEN','Bol�var',663713); -INSERT INTO City VALUES (3544,'Petare','VEN','Miranda',488868); -INSERT INTO City VALUES (3545,'Maracay','VEN','Aragua',444443); -INSERT INTO City VALUES (3546,'Barcelona','VEN','Anzo�tegui',322267); -INSERT INTO City VALUES (3547,'Matur�n','VEN','Monagas',319726); -INSERT INTO City VALUES (3548,'San Crist�bal','VEN','T�chira',319373); -INSERT INTO City VALUES (3549,'Ciudad Bol�var','VEN','Bol�var',301107); -INSERT INTO City VALUES (3550,'Cuman�','VEN','Sucre',293105); -INSERT INTO City VALUES (3551,'M�rida','VEN','M�rida',224887); -INSERT INTO City VALUES (3552,'Cabimas','VEN','Zulia',221329); -INSERT INTO City VALUES (3553,'Barinas','VEN','Barinas',217831); -INSERT INTO City VALUES (3554,'Turmero','VEN','Aragua',217499); -INSERT INTO City VALUES (3555,'Baruta','VEN','Miranda',207290); -INSERT INTO City VALUES (3556,'Puerto Cabello','VEN','Carabobo',187722); -INSERT INTO City VALUES (3557,'Santa Ana de Coro','VEN','Falc�n',185766); -INSERT INTO City VALUES (3558,'Los Teques','VEN','Miranda',178784); -INSERT INTO City VALUES (3559,'Punto Fijo','VEN','Falc�n',167215); -INSERT INTO City VALUES (3560,'Guarenas','VEN','Miranda',165889); -INSERT INTO City VALUES (3561,'Acarigua','VEN','Portuguesa',158954); -INSERT INTO City VALUES (3562,'Puerto La Cruz','VEN','Anzo�tegui',155700); -INSERT INTO City VALUES (3563,'Ciudad Losada','VEN','',134501); -INSERT INTO City VALUES (3564,'Guacara','VEN','Carabobo',131334); -INSERT INTO City VALUES (3565,'Valera','VEN','Trujillo',130281); -INSERT INTO City VALUES (3566,'Guanare','VEN','Portuguesa',125621); -INSERT INTO City VALUES (3567,'Car�pano','VEN','Sucre',119639); -INSERT INTO City VALUES (3568,'Catia La Mar','VEN','Distrito Federal',117012); -INSERT INTO City VALUES (3569,'El Tigre','VEN','Anzo�tegui',116256); -INSERT INTO City VALUES (3570,'Guatire','VEN','Miranda',109121); -INSERT INTO City VALUES (3571,'Calabozo','VEN','Gu�rico',107146); -INSERT INTO City VALUES (3572,'Pozuelos','VEN','Anzo�tegui',105690); -INSERT INTO City VALUES (3573,'Ciudad Ojeda','VEN','Zulia',99354); -INSERT INTO City VALUES (3574,'Ocumare del Tuy','VEN','Miranda',97168); -INSERT INTO City VALUES (3575,'Valle de la Pascua','VEN','Gu�rico',95927); -INSERT INTO City VALUES (3576,'Araure','VEN','Portuguesa',94269); -INSERT INTO City VALUES (3577,'San Fernando de Apure','VEN','Apure',93809); -INSERT INTO City VALUES (3578,'San Felipe','VEN','Yaracuy',90940); -INSERT INTO City VALUES (3579,'El Lim�n','VEN','Aragua',90000); -INSERT INTO City VALUES (3580,'Moscow','RUS','Moscow (City)',8389200); -INSERT INTO City VALUES (3581,'St Petersburg','RUS','Pietari',4694000); -INSERT INTO City VALUES (3582,'Novosibirsk','RUS','Novosibirsk',1398800); -INSERT INTO City VALUES (3583,'Nizni Novgorod','RUS','Nizni Novgorod',1357000); -INSERT INTO City VALUES (3584,'Jekaterinburg','RUS','Sverdlovsk',1266300); -INSERT INTO City VALUES (3585,'Samara','RUS','Samara',1156100); -INSERT INTO City VALUES (3586,'Omsk','RUS','Omsk',1148900); -INSERT INTO City VALUES (3587,'Kazan','RUS','Tatarstan',1101000); -INSERT INTO City VALUES (3588,'Ufa','RUS','Ba�kortostan',1091200); -INSERT INTO City VALUES (3589,'T�eljabinsk','RUS','T�eljabinsk',1083200); -INSERT INTO City VALUES (3590,'Rostov-na-Donu','RUS','Rostov-na-Donu',1012700); -INSERT INTO City VALUES (3591,'Perm','RUS','Perm',1009700); -INSERT INTO City VALUES (3592,'Volgograd','RUS','Volgograd',993400); -INSERT INTO City VALUES (3593,'Voronez','RUS','Voronez',907700); -INSERT INTO City VALUES (3594,'Krasnojarsk','RUS','Krasnojarsk',875500); -INSERT INTO City VALUES (3595,'Saratov','RUS','Saratov',874000); -INSERT INTO City VALUES (3596,'Toljatti','RUS','Samara',722900); -INSERT INTO City VALUES (3597,'Uljanovsk','RUS','Uljanovsk',667400); -INSERT INTO City VALUES (3598,'Izevsk','RUS','Udmurtia',652800); -INSERT INTO City VALUES (3599,'Krasnodar','RUS','Krasnodar',639000); -INSERT INTO City VALUES (3600,'Jaroslavl','RUS','Jaroslavl',616700); -INSERT INTO City VALUES (3601,'Habarovsk','RUS','Habarovsk',609400); -INSERT INTO City VALUES (3602,'Vladivostok','RUS','Primorje',606200); -INSERT INTO City VALUES (3603,'Irkutsk','RUS','Irkutsk',593700); -INSERT INTO City VALUES (3604,'Barnaul','RUS','Altai',580100); -INSERT INTO City VALUES (3605,'Novokuznetsk','RUS','Kemerovo',561600); -INSERT INTO City VALUES (3606,'Penza','RUS','Penza',532200); -INSERT INTO City VALUES (3607,'Rjazan','RUS','Rjazan',529900); -INSERT INTO City VALUES (3608,'Orenburg','RUS','Orenburg',523600); -INSERT INTO City VALUES (3609,'Lipetsk','RUS','Lipetsk',521000); -INSERT INTO City VALUES (3610,'Nabereznyje T�elny','RUS','Tatarstan',514700); -INSERT INTO City VALUES (3611,'Tula','RUS','Tula',506100); -INSERT INTO City VALUES (3612,'Tjumen','RUS','Tjumen',503400); -INSERT INTO City VALUES (3613,'Kemerovo','RUS','Kemerovo',492700); -INSERT INTO City VALUES (3614,'Astrahan','RUS','Astrahan',486100); -INSERT INTO City VALUES (3615,'Tomsk','RUS','Tomsk',482100); -INSERT INTO City VALUES (3616,'Kirov','RUS','Kirov',466200); -INSERT INTO City VALUES (3617,'Ivanovo','RUS','Ivanovo',459200); -INSERT INTO City VALUES (3618,'T�eboksary','RUS','T�uvassia',459200); -INSERT INTO City VALUES (3619,'Brjansk','RUS','Brjansk',457400); -INSERT INTO City VALUES (3620,'Tver','RUS','Tver',454900); -INSERT INTO City VALUES (3621,'Kursk','RUS','Kursk',443500); -INSERT INTO City VALUES (3622,'Magnitogorsk','RUS','T�eljabinsk',427900); -INSERT INTO City VALUES (3623,'Kaliningrad','RUS','Kaliningrad',424400); -INSERT INTO City VALUES (3624,'Nizni Tagil','RUS','Sverdlovsk',390900); -INSERT INTO City VALUES (3625,'Murmansk','RUS','Murmansk',376300); -INSERT INTO City VALUES (3626,'Ulan-Ude','RUS','Burjatia',370400); -INSERT INTO City VALUES (3627,'Kurgan','RUS','Kurgan',364700); -INSERT INTO City VALUES (3628,'Arkangeli','RUS','Arkangeli',361800); -INSERT INTO City VALUES (3629,'Sot�i','RUS','Krasnodar',358600); -INSERT INTO City VALUES (3630,'Smolensk','RUS','Smolensk',353400); -INSERT INTO City VALUES (3631,'Orjol','RUS','Orjol',344500); -INSERT INTO City VALUES (3632,'Stavropol','RUS','Stavropol',343300); -INSERT INTO City VALUES (3633,'Belgorod','RUS','Belgorod',342000); -INSERT INTO City VALUES (3634,'Kaluga','RUS','Kaluga',339300); -INSERT INTO City VALUES (3635,'Vladimir','RUS','Vladimir',337100); -INSERT INTO City VALUES (3636,'Mahat�kala','RUS','Dagestan',332800); -INSERT INTO City VALUES (3637,'T�erepovets','RUS','Vologda',324400); -INSERT INTO City VALUES (3638,'Saransk','RUS','Mordva',314800); -INSERT INTO City VALUES (3639,'Tambov','RUS','Tambov',312000); -INSERT INTO City VALUES (3640,'Vladikavkaz','RUS','North Ossetia-Alania',310100); -INSERT INTO City VALUES (3641,'T�ita','RUS','T�ita',309900); -INSERT INTO City VALUES (3642,'Vologda','RUS','Vologda',302500); -INSERT INTO City VALUES (3643,'Veliki Novgorod','RUS','Novgorod',299500); -INSERT INTO City VALUES (3644,'Komsomolsk-na-Amure','RUS','Habarovsk',291600); -INSERT INTO City VALUES (3645,'Kostroma','RUS','Kostroma',288100); -INSERT INTO City VALUES (3646,'Volzski','RUS','Volgograd',286900); -INSERT INTO City VALUES (3647,'Taganrog','RUS','Rostov-na-Donu',284400); -INSERT INTO City VALUES (3648,'Petroskoi','RUS','Karjala',282100); -INSERT INTO City VALUES (3649,'Bratsk','RUS','Irkutsk',277600); -INSERT INTO City VALUES (3650,'Dzerzinsk','RUS','Nizni Novgorod',277100); -INSERT INTO City VALUES (3651,'Surgut','RUS','Hanti-Mansia',274900); -INSERT INTO City VALUES (3652,'Orsk','RUS','Orenburg',273900); -INSERT INTO City VALUES (3653,'Sterlitamak','RUS','Ba�kortostan',265200); -INSERT INTO City VALUES (3654,'Angarsk','RUS','Irkutsk',264700); -INSERT INTO City VALUES (3655,'Jo�kar-Ola','RUS','Marinmaa',249200); -INSERT INTO City VALUES (3656,'Rybinsk','RUS','Jaroslavl',239600); -INSERT INTO City VALUES (3657,'Prokopjevsk','RUS','Kemerovo',237300); -INSERT INTO City VALUES (3658,'Niznevartovsk','RUS','Hanti-Mansia',233900); -INSERT INTO City VALUES (3659,'Nalt�ik','RUS','Kabardi-Balkaria',233400); -INSERT INTO City VALUES (3660,'Syktyvkar','RUS','Komi',229700); -INSERT INTO City VALUES (3661,'Severodvinsk','RUS','Arkangeli',229300); -INSERT INTO City VALUES (3662,'Bijsk','RUS','Altai',225000); -INSERT INTO City VALUES (3663,'Niznekamsk','RUS','Tatarstan',223400); -INSERT INTO City VALUES (3664,'Blagove�t�ensk','RUS','Amur',222000); -INSERT INTO City VALUES (3665,'�ahty','RUS','Rostov-na-Donu',221800); -INSERT INTO City VALUES (3666,'Staryi Oskol','RUS','Belgorod',213800); -INSERT INTO City VALUES (3667,'Zelenograd','RUS','Moscow (City)',207100); -INSERT INTO City VALUES (3668,'Balakovo','RUS','Saratov',206000); -INSERT INTO City VALUES (3669,'Novorossijsk','RUS','Krasnodar',203300); -INSERT INTO City VALUES (3670,'Pihkova','RUS','Pihkova',201500); -INSERT INTO City VALUES (3671,'Zlatoust','RUS','T�eljabinsk',196900); -INSERT INTO City VALUES (3672,'Jakutsk','RUS','Saha (Jakutia)',195400); -INSERT INTO City VALUES (3673,'Podolsk','RUS','Moskova',194300); -INSERT INTO City VALUES (3674,'Petropavlovsk-Kamt�atski','RUS','Kamt�atka',194100); -INSERT INTO City VALUES (3675,'Kamensk-Uralski','RUS','Sverdlovsk',190600); -INSERT INTO City VALUES (3676,'Engels','RUS','Saratov',189000); -INSERT INTO City VALUES (3677,'Syzran','RUS','Samara',186900); -INSERT INTO City VALUES (3678,'Grozny','RUS','T�et�enia',186000); -INSERT INTO City VALUES (3679,'Novot�erkassk','RUS','Rostov-na-Donu',184400); -INSERT INTO City VALUES (3680,'Berezniki','RUS','Perm',181900); -INSERT INTO City VALUES (3681,'Juzno-Sahalinsk','RUS','Sahalin',179200); -INSERT INTO City VALUES (3682,'Volgodonsk','RUS','Rostov-na-Donu',178200); -INSERT INTO City VALUES (3683,'Abakan','RUS','Hakassia',169200); -INSERT INTO City VALUES (3684,'Maikop','RUS','Adygea',167300); -INSERT INTO City VALUES (3685,'Miass','RUS','T�eljabinsk',166200); -INSERT INTO City VALUES (3686,'Armavir','RUS','Krasnodar',164900); -INSERT INTO City VALUES (3687,'Ljubertsy','RUS','Moskova',163900); -INSERT INTO City VALUES (3688,'Rubtsovsk','RUS','Altai',162600); -INSERT INTO City VALUES (3689,'Kovrov','RUS','Vladimir',159900); -INSERT INTO City VALUES (3690,'Nahodka','RUS','Primorje',157700); -INSERT INTO City VALUES (3691,'Ussurijsk','RUS','Primorje',157300); -INSERT INTO City VALUES (3692,'Salavat','RUS','Ba�kortostan',156800); -INSERT INTO City VALUES (3693,'Myti�t�i','RUS','Moskova',155700); -INSERT INTO City VALUES (3694,'Kolomna','RUS','Moskova',150700); -INSERT INTO City VALUES (3695,'Elektrostal','RUS','Moskova',147000); -INSERT INTO City VALUES (3696,'Murom','RUS','Vladimir',142400); -INSERT INTO City VALUES (3697,'Kolpino','RUS','Pietari',141200); -INSERT INTO City VALUES (3698,'Norilsk','RUS','Krasnojarsk',140800); -INSERT INTO City VALUES (3699,'Almetjevsk','RUS','Tatarstan',140700); -INSERT INTO City VALUES (3700,'Novomoskovsk','RUS','Tula',138100); -INSERT INTO City VALUES (3701,'Dimitrovgrad','RUS','Uljanovsk',137000); -INSERT INTO City VALUES (3702,'Pervouralsk','RUS','Sverdlovsk',136100); -INSERT INTO City VALUES (3703,'Himki','RUS','Moskova',133700); -INSERT INTO City VALUES (3704,'Bala�iha','RUS','Moskova',132900); -INSERT INTO City VALUES (3705,'Nevinnomyssk','RUS','Stavropol',132600); -INSERT INTO City VALUES (3706,'Pjatigorsk','RUS','Stavropol',132500); -INSERT INTO City VALUES (3707,'Korolev','RUS','Moskova',132400); -INSERT INTO City VALUES (3708,'Serpuhov','RUS','Moskova',132000); -INSERT INTO City VALUES (3709,'Odintsovo','RUS','Moskova',127400); -INSERT INTO City VALUES (3710,'Orehovo-Zujevo','RUS','Moskova',124900); -INSERT INTO City VALUES (3711,'Kamy�in','RUS','Volgograd',124600); -INSERT INTO City VALUES (3712,'Novot�eboksarsk','RUS','T�uvassia',123400); -INSERT INTO City VALUES (3713,'T�erkessk','RUS','Karat�ai-T�erkessia',121700); -INSERT INTO City VALUES (3714,'At�insk','RUS','Krasnojarsk',121600); -INSERT INTO City VALUES (3715,'Magadan','RUS','Magadan',121000); -INSERT INTO City VALUES (3716,'Mit�urinsk','RUS','Tambov',120700); -INSERT INTO City VALUES (3717,'Kislovodsk','RUS','Stavropol',120400); -INSERT INTO City VALUES (3718,'Jelets','RUS','Lipetsk',119400); -INSERT INTO City VALUES (3719,'Seversk','RUS','Tomsk',118600); -INSERT INTO City VALUES (3720,'Noginsk','RUS','Moskova',117200); -INSERT INTO City VALUES (3721,'Velikije Luki','RUS','Pihkova',116300); -INSERT INTO City VALUES (3722,'Novokuiby�evsk','RUS','Samara',116200); -INSERT INTO City VALUES (3723,'Neftekamsk','RUS','Ba�kortostan',115700); -INSERT INTO City VALUES (3724,'Leninsk-Kuznetski','RUS','Kemerovo',113800); -INSERT INTO City VALUES (3725,'Oktjabrski','RUS','Ba�kortostan',111500); -INSERT INTO City VALUES (3726,'Sergijev Posad','RUS','Moskova',111100); -INSERT INTO City VALUES (3727,'Arzamas','RUS','Nizni Novgorod',110700); -INSERT INTO City VALUES (3728,'Kiseljovsk','RUS','Kemerovo',110000); -INSERT INTO City VALUES (3729,'Novotroitsk','RUS','Orenburg',109600); -INSERT INTO City VALUES (3730,'Obninsk','RUS','Kaluga',108300); -INSERT INTO City VALUES (3731,'Kansk','RUS','Krasnojarsk',107400); -INSERT INTO City VALUES (3732,'Glazov','RUS','Udmurtia',106300); -INSERT INTO City VALUES (3733,'Solikamsk','RUS','Perm',106000); -INSERT INTO City VALUES (3734,'Sarapul','RUS','Udmurtia',105700); -INSERT INTO City VALUES (3735,'Ust-Ilimsk','RUS','Irkutsk',105200); -INSERT INTO City VALUES (3736,'�t�olkovo','RUS','Moskova',104900); -INSERT INTO City VALUES (3737,'Mezduret�ensk','RUS','Kemerovo',104400); -INSERT INTO City VALUES (3738,'Usolje-Sibirskoje','RUS','Irkutsk',103500); -INSERT INTO City VALUES (3739,'Elista','RUS','Kalmykia',103300); -INSERT INTO City VALUES (3740,'Novo�ahtinsk','RUS','Rostov-na-Donu',101900); -INSERT INTO City VALUES (3741,'Votkinsk','RUS','Udmurtia',101700); -INSERT INTO City VALUES (3742,'Kyzyl','RUS','Tyva',101100); -INSERT INTO City VALUES (3743,'Serov','RUS','Sverdlovsk',100400); -INSERT INTO City VALUES (3744,'Zelenodolsk','RUS','Tatarstan',100200); -INSERT INTO City VALUES (3745,'Zeleznodoroznyi','RUS','Moskova',100100); -INSERT INTO City VALUES (3746,'Kine�ma','RUS','Ivanovo',100000); -INSERT INTO City VALUES (3747,'Kuznetsk','RUS','Penza',98200); -INSERT INTO City VALUES (3748,'Uhta','RUS','Komi',98000); -INSERT INTO City VALUES (3749,'Jessentuki','RUS','Stavropol',97900); -INSERT INTO City VALUES (3750,'Tobolsk','RUS','Tjumen',97600); -INSERT INTO City VALUES (3751,'Neftejugansk','RUS','Hanti-Mansia',97400); -INSERT INTO City VALUES (3752,'Bataisk','RUS','Rostov-na-Donu',97300); -INSERT INTO City VALUES (3753,'Nojabrsk','RUS','Yamalin Nenetsia',97300); -INSERT INTO City VALUES (3754,'Bala�ov','RUS','Saratov',97100); -INSERT INTO City VALUES (3755,'Zeleznogorsk','RUS','Kursk',96900); -INSERT INTO City VALUES (3756,'Zukovski','RUS','Moskova',96500); -INSERT INTO City VALUES (3757,'Anzero-Sudzensk','RUS','Kemerovo',96100); -INSERT INTO City VALUES (3758,'Bugulma','RUS','Tatarstan',94100); -INSERT INTO City VALUES (3759,'Zeleznogorsk','RUS','Krasnojarsk',94000); -INSERT INTO City VALUES (3760,'Novouralsk','RUS','Sverdlovsk',93300); -INSERT INTO City VALUES (3761,'Pu�kin','RUS','Pietari',92900); -INSERT INTO City VALUES (3762,'Vorkuta','RUS','Komi',92600); -INSERT INTO City VALUES (3763,'Derbent','RUS','Dagestan',92300); -INSERT INTO City VALUES (3764,'Kirovo-T�epetsk','RUS','Kirov',91600); -INSERT INTO City VALUES (3765,'Krasnogorsk','RUS','Moskova',91000); -INSERT INTO City VALUES (3766,'Klin','RUS','Moskova',90000); -INSERT INTO City VALUES (3767,'T�aikovski','RUS','Perm',90000); -INSERT INTO City VALUES (3768,'Novyi Urengoi','RUS','Yamalin Nenetsia',89800); -INSERT INTO City VALUES (3769,'Ho Chi Minh City','VNM','Ho Chi Minh City',3980000); -INSERT INTO City VALUES (3770,'Hanoi','VNM','Hanoi',1410000); -INSERT INTO City VALUES (3771,'Haiphong','VNM','Haiphong',783133); -INSERT INTO City VALUES (3772,'Da Nang','VNM','Quang Nam-Da Nang',382674); -INSERT INTO City VALUES (3773,'Bi�n Hoa','VNM','Dong Nai',282095); -INSERT INTO City VALUES (3774,'Nha Trang','VNM','Khanh Hoa',221331); -INSERT INTO City VALUES (3775,'Hue','VNM','Thua Thien-Hue',219149); -INSERT INTO City VALUES (3776,'Can Tho','VNM','Can Tho',215587); -INSERT INTO City VALUES (3777,'Cam Pha','VNM','Quang Binh',209086); -INSERT INTO City VALUES (3778,'Nam Dinh','VNM','Nam Ha',171699); -INSERT INTO City VALUES (3779,'Quy Nhon','VNM','Binh Dinh',163385); -INSERT INTO City VALUES (3780,'Vung Tau','VNM','Ba Ria-Vung Tau',145145); -INSERT INTO City VALUES (3781,'Rach Gia','VNM','Kien Giang',141132); -INSERT INTO City VALUES (3782,'Long Xuyen','VNM','An Giang',132681); -INSERT INTO City VALUES (3783,'Thai Nguyen','VNM','Bac Thai',127643); -INSERT INTO City VALUES (3784,'Hong Gai','VNM','Quang Ninh',127484); -INSERT INTO City VALUES (3785,'Phan Thi�t','VNM','Binh Thuan',114236); -INSERT INTO City VALUES (3786,'Cam Ranh','VNM','Khanh Hoa',114041); -INSERT INTO City VALUES (3787,'Vinh','VNM','Nghe An',112455); -INSERT INTO City VALUES (3788,'My Tho','VNM','Tien Giang',108404); -INSERT INTO City VALUES (3789,'Da Lat','VNM','Lam Dong',106409); -INSERT INTO City VALUES (3790,'Buon Ma Thuot','VNM','Dac Lac',97044); -INSERT INTO City VALUES (3791,'Tallinn','EST','Harjumaa',403981); -INSERT INTO City VALUES (3792,'Tartu','EST','Tartumaa',101246); -INSERT INTO City VALUES (3793,'New York','USA','New York',8008278); -INSERT INTO City VALUES (3794,'Los Angeles','USA','California',3694820); -INSERT INTO City VALUES (3795,'Chicago','USA','Illinois',2896016); -INSERT INTO City VALUES (3796,'Houston','USA','Texas',1953631); -INSERT INTO City VALUES (3797,'Philadelphia','USA','Pennsylvania',1517550); -INSERT INTO City VALUES (3798,'Phoenix','USA','Arizona',1321045); -INSERT INTO City VALUES (3799,'San Diego','USA','California',1223400); -INSERT INTO City VALUES (3800,'Dallas','USA','Texas',1188580); -INSERT INTO City VALUES (3801,'San Antonio','USA','Texas',1144646); -INSERT INTO City VALUES (3802,'Detroit','USA','Michigan',951270); -INSERT INTO City VALUES (3803,'San Jose','USA','California',894943); -INSERT INTO City VALUES (3804,'Indianapolis','USA','Indiana',791926); -INSERT INTO City VALUES (3805,'San Francisco','USA','California',776733); -INSERT INTO City VALUES (3806,'Jacksonville','USA','Florida',735167); -INSERT INTO City VALUES (3807,'Columbus','USA','Ohio',711470); -INSERT INTO City VALUES (3808,'Austin','USA','Texas',656562); -INSERT INTO City VALUES (3809,'Baltimore','USA','Maryland',651154); -INSERT INTO City VALUES (3810,'Memphis','USA','Tennessee',650100); -INSERT INTO City VALUES (3811,'Milwaukee','USA','Wisconsin',596974); -INSERT INTO City VALUES (3812,'Boston','USA','Massachusetts',589141); -INSERT INTO City VALUES (3813,'Washington','USA','District of Columbia',572059); -INSERT INTO City VALUES (3814,'Nashville-Davidson','USA','Tennessee',569891); -INSERT INTO City VALUES (3815,'El Paso','USA','Texas',563662); -INSERT INTO City VALUES (3816,'Seattle','USA','Washington',563374); -INSERT INTO City VALUES (3817,'Denver','USA','Colorado',554636); -INSERT INTO City VALUES (3818,'Charlotte','USA','North Carolina',540828); -INSERT INTO City VALUES (3819,'Fort Worth','USA','Texas',534694); -INSERT INTO City VALUES (3820,'Portland','USA','Oregon',529121); -INSERT INTO City VALUES (3821,'Oklahoma City','USA','Oklahoma',506132); -INSERT INTO City VALUES (3822,'Tucson','USA','Arizona',486699); -INSERT INTO City VALUES (3823,'New Orleans','USA','Louisiana',484674); -INSERT INTO City VALUES (3824,'Las Vegas','USA','Nevada',478434); -INSERT INTO City VALUES (3825,'Cleveland','USA','Ohio',478403); -INSERT INTO City VALUES (3826,'Long Beach','USA','California',461522); -INSERT INTO City VALUES (3827,'Albuquerque','USA','New Mexico',448607); -INSERT INTO City VALUES (3828,'Kansas City','USA','Missouri',441545); -INSERT INTO City VALUES (3829,'Fresno','USA','California',427652); -INSERT INTO City VALUES (3830,'Virginia Beach','USA','Virginia',425257); -INSERT INTO City VALUES (3831,'Atlanta','USA','Georgia',416474); -INSERT INTO City VALUES (3832,'Sacramento','USA','California',407018); -INSERT INTO City VALUES (3833,'Oakland','USA','California',399484); -INSERT INTO City VALUES (3834,'Mesa','USA','Arizona',396375); -INSERT INTO City VALUES (3835,'Tulsa','USA','Oklahoma',393049); -INSERT INTO City VALUES (3836,'Omaha','USA','Nebraska',390007); -INSERT INTO City VALUES (3837,'Minneapolis','USA','Minnesota',382618); -INSERT INTO City VALUES (3838,'Honolulu','USA','Hawaii',371657); -INSERT INTO City VALUES (3839,'Miami','USA','Florida',362470); -INSERT INTO City VALUES (3840,'Colorado Springs','USA','Colorado',360890); -INSERT INTO City VALUES (3841,'Saint Louis','USA','Missouri',348189); -INSERT INTO City VALUES (3842,'Wichita','USA','Kansas',344284); -INSERT INTO City VALUES (3843,'Santa Ana','USA','California',337977); -INSERT INTO City VALUES (3844,'Pittsburgh','USA','Pennsylvania',334563); -INSERT INTO City VALUES (3845,'Arlington','USA','Texas',332969); -INSERT INTO City VALUES (3846,'Cincinnati','USA','Ohio',331285); -INSERT INTO City VALUES (3847,'Anaheim','USA','California',328014); -INSERT INTO City VALUES (3848,'Toledo','USA','Ohio',313619); -INSERT INTO City VALUES (3849,'Tampa','USA','Florida',303447); -INSERT INTO City VALUES (3850,'Buffalo','USA','New York',292648); -INSERT INTO City VALUES (3851,'Saint Paul','USA','Minnesota',287151); -INSERT INTO City VALUES (3852,'Corpus Christi','USA','Texas',277454); -INSERT INTO City VALUES (3853,'Aurora','USA','Colorado',276393); -INSERT INTO City VALUES (3854,'Raleigh','USA','North Carolina',276093); -INSERT INTO City VALUES (3855,'Newark','USA','New Jersey',273546); -INSERT INTO City VALUES (3856,'Lexington-Fayette','USA','Kentucky',260512); -INSERT INTO City VALUES (3857,'Anchorage','USA','Alaska',260283); -INSERT INTO City VALUES (3858,'Louisville','USA','Kentucky',256231); -INSERT INTO City VALUES (3859,'Riverside','USA','California',255166); -INSERT INTO City VALUES (3860,'Saint Petersburg','USA','Florida',248232); -INSERT INTO City VALUES (3861,'Bakersfield','USA','California',247057); -INSERT INTO City VALUES (3862,'Stockton','USA','California',243771); -INSERT INTO City VALUES (3863,'Birmingham','USA','Alabama',242820); -INSERT INTO City VALUES (3864,'Jersey City','USA','New Jersey',240055); -INSERT INTO City VALUES (3865,'Norfolk','USA','Virginia',234403); -INSERT INTO City VALUES (3866,'Baton Rouge','USA','Louisiana',227818); -INSERT INTO City VALUES (3867,'Hialeah','USA','Florida',226419); -INSERT INTO City VALUES (3868,'Lincoln','USA','Nebraska',225581); -INSERT INTO City VALUES (3869,'Greensboro','USA','North Carolina',223891); -INSERT INTO City VALUES (3870,'Plano','USA','Texas',222030); -INSERT INTO City VALUES (3871,'Rochester','USA','New York',219773); -INSERT INTO City VALUES (3872,'Glendale','USA','Arizona',218812); -INSERT INTO City VALUES (3873,'Akron','USA','Ohio',217074); -INSERT INTO City VALUES (3874,'Garland','USA','Texas',215768); -INSERT INTO City VALUES (3875,'Madison','USA','Wisconsin',208054); -INSERT INTO City VALUES (3876,'Fort Wayne','USA','Indiana',205727); -INSERT INTO City VALUES (3877,'Fremont','USA','California',203413); -INSERT INTO City VALUES (3878,'Scottsdale','USA','Arizona',202705); -INSERT INTO City VALUES (3879,'Montgomery','USA','Alabama',201568); -INSERT INTO City VALUES (3880,'Shreveport','USA','Louisiana',200145); -INSERT INTO City VALUES (3881,'Augusta-Richmond County','USA','Georgia',199775); -INSERT INTO City VALUES (3882,'Lubbock','USA','Texas',199564); -INSERT INTO City VALUES (3883,'Chesapeake','USA','Virginia',199184); -INSERT INTO City VALUES (3884,'Mobile','USA','Alabama',198915); -INSERT INTO City VALUES (3885,'Des Moines','USA','Iowa',198682); -INSERT INTO City VALUES (3886,'Grand Rapids','USA','Michigan',197800); -INSERT INTO City VALUES (3887,'Richmond','USA','Virginia',197790); -INSERT INTO City VALUES (3888,'Yonkers','USA','New York',196086); -INSERT INTO City VALUES (3889,'Spokane','USA','Washington',195629); -INSERT INTO City VALUES (3890,'Glendale','USA','California',194973); -INSERT INTO City VALUES (3891,'Tacoma','USA','Washington',193556); -INSERT INTO City VALUES (3892,'Irving','USA','Texas',191615); -INSERT INTO City VALUES (3893,'Huntington Beach','USA','California',189594); -INSERT INTO City VALUES (3894,'Modesto','USA','California',188856); -INSERT INTO City VALUES (3895,'Durham','USA','North Carolina',187035); -INSERT INTO City VALUES (3896,'Columbus','USA','Georgia',186291); -INSERT INTO City VALUES (3897,'Orlando','USA','Florida',185951); -INSERT INTO City VALUES (3898,'Boise City','USA','Idaho',185787); -INSERT INTO City VALUES (3899,'Winston-Salem','USA','North Carolina',185776); -INSERT INTO City VALUES (3900,'San Bernardino','USA','California',185401); -INSERT INTO City VALUES (3901,'Jackson','USA','Mississippi',184256); -INSERT INTO City VALUES (3902,'Little Rock','USA','Arkansas',183133); -INSERT INTO City VALUES (3903,'Salt Lake City','USA','Utah',181743); -INSERT INTO City VALUES (3904,'Reno','USA','Nevada',180480); -INSERT INTO City VALUES (3905,'Newport News','USA','Virginia',180150); -INSERT INTO City VALUES (3906,'Chandler','USA','Arizona',176581); -INSERT INTO City VALUES (3907,'Laredo','USA','Texas',176576); -INSERT INTO City VALUES (3908,'Henderson','USA','Nevada',175381); -INSERT INTO City VALUES (3909,'Arlington','USA','Virginia',174838); -INSERT INTO City VALUES (3910,'Knoxville','USA','Tennessee',173890); -INSERT INTO City VALUES (3911,'Amarillo','USA','Texas',173627); -INSERT INTO City VALUES (3912,'Providence','USA','Rhode Island',173618); -INSERT INTO City VALUES (3913,'Chula Vista','USA','California',173556); -INSERT INTO City VALUES (3914,'Worcester','USA','Massachusetts',172648); -INSERT INTO City VALUES (3915,'Oxnard','USA','California',170358); -INSERT INTO City VALUES (3916,'Dayton','USA','Ohio',166179); -INSERT INTO City VALUES (3917,'Garden Grove','USA','California',165196); -INSERT INTO City VALUES (3918,'Oceanside','USA','California',161029); -INSERT INTO City VALUES (3919,'Tempe','USA','Arizona',158625); -INSERT INTO City VALUES (3920,'Huntsville','USA','Alabama',158216); -INSERT INTO City VALUES (3921,'Ontario','USA','California',158007); -INSERT INTO City VALUES (3922,'Chattanooga','USA','Tennessee',155554); -INSERT INTO City VALUES (3923,'Fort Lauderdale','USA','Florida',152397); -INSERT INTO City VALUES (3924,'Springfield','USA','Massachusetts',152082); -INSERT INTO City VALUES (3925,'Springfield','USA','Missouri',151580); -INSERT INTO City VALUES (3926,'Santa Clarita','USA','California',151088); -INSERT INTO City VALUES (3927,'Salinas','USA','California',151060); -INSERT INTO City VALUES (3928,'Tallahassee','USA','Florida',150624); -INSERT INTO City VALUES (3929,'Rockford','USA','Illinois',150115); -INSERT INTO City VALUES (3930,'Pomona','USA','California',149473); -INSERT INTO City VALUES (3931,'Metairie','USA','Louisiana',149428); -INSERT INTO City VALUES (3932,'Paterson','USA','New Jersey',149222); -INSERT INTO City VALUES (3933,'Overland Park','USA','Kansas',149080); -INSERT INTO City VALUES (3934,'Santa Rosa','USA','California',147595); -INSERT INTO City VALUES (3935,'Syracuse','USA','New York',147306); -INSERT INTO City VALUES (3936,'Kansas City','USA','Kansas',146866); -INSERT INTO City VALUES (3937,'Hampton','USA','Virginia',146437); -INSERT INTO City VALUES (3938,'Lakewood','USA','Colorado',144126); -INSERT INTO City VALUES (3939,'Vancouver','USA','Washington',143560); -INSERT INTO City VALUES (3940,'Irvine','USA','California',143072); -INSERT INTO City VALUES (3941,'Aurora','USA','Illinois',142990); -INSERT INTO City VALUES (3942,'Moreno Valley','USA','California',142381); -INSERT INTO City VALUES (3943,'Pasadena','USA','California',141674); -INSERT INTO City VALUES (3944,'Hayward','USA','California',140030); -INSERT INTO City VALUES (3945,'Brownsville','USA','Texas',139722); -INSERT INTO City VALUES (3946,'Bridgeport','USA','Connecticut',139529); -INSERT INTO City VALUES (3947,'Hollywood','USA','Florida',139357); -INSERT INTO City VALUES (3948,'Warren','USA','Michigan',138247); -INSERT INTO City VALUES (3949,'Torrance','USA','California',137946); -INSERT INTO City VALUES (3950,'Eugene','USA','Oregon',137893); -INSERT INTO City VALUES (3951,'Pembroke Pines','USA','Florida',137427); -INSERT INTO City VALUES (3952,'Salem','USA','Oregon',136924); -INSERT INTO City VALUES (3953,'Pasadena','USA','Texas',133936); -INSERT INTO City VALUES (3954,'Escondido','USA','California',133559); -INSERT INTO City VALUES (3955,'Sunnyvale','USA','California',131760); -INSERT INTO City VALUES (3956,'Savannah','USA','Georgia',131510); -INSERT INTO City VALUES (3957,'Fontana','USA','California',128929); -INSERT INTO City VALUES (3958,'Orange','USA','California',128821); -INSERT INTO City VALUES (3959,'Naperville','USA','Illinois',128358); -INSERT INTO City VALUES (3960,'Alexandria','USA','Virginia',128283); -INSERT INTO City VALUES (3961,'Rancho Cucamonga','USA','California',127743); -INSERT INTO City VALUES (3962,'Grand Prairie','USA','Texas',127427); -INSERT INTO City VALUES (3963,'East Los Angeles','USA','California',126379); -INSERT INTO City VALUES (3964,'Fullerton','USA','California',126003); -INSERT INTO City VALUES (3965,'Corona','USA','California',124966); -INSERT INTO City VALUES (3966,'Flint','USA','Michigan',124943); -INSERT INTO City VALUES (3967,'Paradise','USA','Nevada',124682); -INSERT INTO City VALUES (3968,'Mesquite','USA','Texas',124523); -INSERT INTO City VALUES (3969,'Sterling Heights','USA','Michigan',124471); -INSERT INTO City VALUES (3970,'Sioux Falls','USA','South Dakota',123975); -INSERT INTO City VALUES (3971,'New Haven','USA','Connecticut',123626); -INSERT INTO City VALUES (3972,'Topeka','USA','Kansas',122377); -INSERT INTO City VALUES (3973,'Concord','USA','California',121780); -INSERT INTO City VALUES (3974,'Evansville','USA','Indiana',121582); -INSERT INTO City VALUES (3975,'Hartford','USA','Connecticut',121578); -INSERT INTO City VALUES (3976,'Fayetteville','USA','North Carolina',121015); -INSERT INTO City VALUES (3977,'Cedar Rapids','USA','Iowa',120758); -INSERT INTO City VALUES (3978,'Elizabeth','USA','New Jersey',120568); -INSERT INTO City VALUES (3979,'Lansing','USA','Michigan',119128); -INSERT INTO City VALUES (3980,'Lancaster','USA','California',118718); -INSERT INTO City VALUES (3981,'Fort Collins','USA','Colorado',118652); -INSERT INTO City VALUES (3982,'Coral Springs','USA','Florida',117549); -INSERT INTO City VALUES (3983,'Stamford','USA','Connecticut',117083); -INSERT INTO City VALUES (3984,'Thousand Oaks','USA','California',117005); -INSERT INTO City VALUES (3985,'Vallejo','USA','California',116760); -INSERT INTO City VALUES (3986,'Palmdale','USA','California',116670); -INSERT INTO City VALUES (3987,'Columbia','USA','South Carolina',116278); -INSERT INTO City VALUES (3988,'El Monte','USA','California',115965); -INSERT INTO City VALUES (3989,'Abilene','USA','Texas',115930); -INSERT INTO City VALUES (3990,'North Las Vegas','USA','Nevada',115488); -INSERT INTO City VALUES (3991,'Ann Arbor','USA','Michigan',114024); -INSERT INTO City VALUES (3992,'Beaumont','USA','Texas',113866); -INSERT INTO City VALUES (3993,'Waco','USA','Texas',113726); -INSERT INTO City VALUES (3994,'Macon','USA','Georgia',113336); -INSERT INTO City VALUES (3995,'Independence','USA','Missouri',113288); -INSERT INTO City VALUES (3996,'Peoria','USA','Illinois',112936); -INSERT INTO City VALUES (3997,'Inglewood','USA','California',112580); -INSERT INTO City VALUES (3998,'Springfield','USA','Illinois',111454); -INSERT INTO City VALUES (3999,'Simi Valley','USA','California',111351); -INSERT INTO City VALUES (4000,'Lafayette','USA','Louisiana',110257); -INSERT INTO City VALUES (4001,'Gilbert','USA','Arizona',109697); -INSERT INTO City VALUES (4002,'Carrollton','USA','Texas',109576); -INSERT INTO City VALUES (4003,'Bellevue','USA','Washington',109569); -INSERT INTO City VALUES (4004,'West Valley City','USA','Utah',108896); -INSERT INTO City VALUES (4005,'Clarksville','USA','Tennessee',108787); -INSERT INTO City VALUES (4006,'Costa Mesa','USA','California',108724); -INSERT INTO City VALUES (4007,'Peoria','USA','Arizona',108364); -INSERT INTO City VALUES (4008,'South Bend','USA','Indiana',107789); -INSERT INTO City VALUES (4009,'Downey','USA','California',107323); -INSERT INTO City VALUES (4010,'Waterbury','USA','Connecticut',107271); -INSERT INTO City VALUES (4011,'Manchester','USA','New Hampshire',107006); -INSERT INTO City VALUES (4012,'Allentown','USA','Pennsylvania',106632); -INSERT INTO City VALUES (4013,'McAllen','USA','Texas',106414); -INSERT INTO City VALUES (4014,'Joliet','USA','Illinois',106221); -INSERT INTO City VALUES (4015,'Lowell','USA','Massachusetts',105167); -INSERT INTO City VALUES (4016,'Provo','USA','Utah',105166); -INSERT INTO City VALUES (4017,'West Covina','USA','California',105080); -INSERT INTO City VALUES (4018,'Wichita Falls','USA','Texas',104197); -INSERT INTO City VALUES (4019,'Erie','USA','Pennsylvania',103717); -INSERT INTO City VALUES (4020,'Daly City','USA','California',103621); -INSERT INTO City VALUES (4021,'Citrus Heights','USA','California',103455); -INSERT INTO City VALUES (4022,'Norwalk','USA','California',103298); -INSERT INTO City VALUES (4023,'Gary','USA','Indiana',102746); -INSERT INTO City VALUES (4024,'Berkeley','USA','California',102743); -INSERT INTO City VALUES (4025,'Santa Clara','USA','California',102361); -INSERT INTO City VALUES (4026,'Green Bay','USA','Wisconsin',102313); -INSERT INTO City VALUES (4027,'Cape Coral','USA','Florida',102286); -INSERT INTO City VALUES (4028,'Arvada','USA','Colorado',102153); -INSERT INTO City VALUES (4029,'Pueblo','USA','Colorado',102121); -INSERT INTO City VALUES (4030,'Sandy','USA','Utah',101853); -INSERT INTO City VALUES (4031,'Athens-Clarke County','USA','Georgia',101489); -INSERT INTO City VALUES (4032,'Cambridge','USA','Massachusetts',101355); -INSERT INTO City VALUES (4033,'Westminster','USA','Colorado',100940); -INSERT INTO City VALUES (4034,'San Buenaventura','USA','California',100916); -INSERT INTO City VALUES (4035,'Portsmouth','USA','Virginia',100565); -INSERT INTO City VALUES (4036,'Livonia','USA','Michigan',100545); -INSERT INTO City VALUES (4037,'Burbank','USA','California',100316); -INSERT INTO City VALUES (4038,'Clearwater','USA','Florida',99936); -INSERT INTO City VALUES (4039,'Midland','USA','Texas',98293); -INSERT INTO City VALUES (4040,'Davenport','USA','Iowa',98256); -INSERT INTO City VALUES (4041,'Mission Viejo','USA','California',98049); -INSERT INTO City VALUES (4042,'Miami Beach','USA','Florida',97855); -INSERT INTO City VALUES (4043,'Sunrise Manor','USA','Nevada',95362); -INSERT INTO City VALUES (4044,'New Bedford','USA','Massachusetts',94780); -INSERT INTO City VALUES (4045,'El Cajon','USA','California',94578); -INSERT INTO City VALUES (4046,'Norman','USA','Oklahoma',94193); -INSERT INTO City VALUES (4047,'Richmond','USA','California',94100); -INSERT INTO City VALUES (4048,'Albany','USA','New York',93994); -INSERT INTO City VALUES (4049,'Brockton','USA','Massachusetts',93653); -INSERT INTO City VALUES (4050,'Roanoke','USA','Virginia',93357); -INSERT INTO City VALUES (4051,'Billings','USA','Montana',92988); -INSERT INTO City VALUES (4052,'Compton','USA','California',92864); -INSERT INTO City VALUES (4053,'Gainesville','USA','Florida',92291); -INSERT INTO City VALUES (4054,'Fairfield','USA','California',92256); -INSERT INTO City VALUES (4055,'Arden-Arcade','USA','California',92040); -INSERT INTO City VALUES (4056,'San Mateo','USA','California',91799); -INSERT INTO City VALUES (4057,'Visalia','USA','California',91762); -INSERT INTO City VALUES (4058,'Boulder','USA','Colorado',91238); -INSERT INTO City VALUES (4059,'Cary','USA','North Carolina',91213); -INSERT INTO City VALUES (4060,'Santa Monica','USA','California',91084); -INSERT INTO City VALUES (4061,'Fall River','USA','Massachusetts',90555); -INSERT INTO City VALUES (4062,'Kenosha','USA','Wisconsin',89447); -INSERT INTO City VALUES (4063,'Elgin','USA','Illinois',89408); -INSERT INTO City VALUES (4064,'Odessa','USA','Texas',89293); -INSERT INTO City VALUES (4065,'Carson','USA','California',89089); -INSERT INTO City VALUES (4066,'Charleston','USA','South Carolina',89063); -INSERT INTO City VALUES (4067,'Charlotte Amalie','VIR','St Thomas',13000); -INSERT INTO City VALUES (4068,'Harare','ZWE','Harare',1410000); -INSERT INTO City VALUES (4069,'Bulawayo','ZWE','Bulawayo',621742); -INSERT INTO City VALUES (4070,'Chitungwiza','ZWE','Harare',274912); -INSERT INTO City VALUES (4071,'Mount Darwin','ZWE','Harare',164362); -INSERT INTO City VALUES (4072,'Mutare','ZWE','Manicaland',131367); -INSERT INTO City VALUES (4073,'Gweru','ZWE','Midlands',128037); -INSERT INTO City VALUES (4074,'Gaza','PSE','Gaza',353632); -INSERT INTO City VALUES (4075,'Khan Yunis','PSE','Khan Yunis',123175); -INSERT INTO City VALUES (4076,'Hebron','PSE','Hebron',119401); -INSERT INTO City VALUES (4077,'Jabaliya','PSE','North Gaza',113901); -INSERT INTO City VALUES (4078,'Nablus','PSE','Nablus',100231); -INSERT INTO City VALUES (4079,'Rafah','PSE','Rafah',92020); - -/*!40000 ALTER TABLE City ENABLE KEYS */; - --- --- Table structure for table 'Country' --- - -CREATE TABLE Country ( - Code char(3) NOT NULL default '', - Name char(52) NOT NULL default '', - Continent enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL default 'Asia', - Region char(26) NOT NULL default '', - SurfaceArea float(10,2) NOT NULL default '0.00', - IndepYear smallint(6) default NULL, - Population int(11) NOT NULL default '0', - LifeExpectancy float(3,1) default NULL, - GNP float(10,2) default NULL, - GNPOld float(10,2) default NULL, - LocalName char(45) NOT NULL default '', - GovernmentForm char(45) NOT NULL default '', - HeadOfState char(60) default NULL, - Capital int(11) default NULL, - Code2 char(2) NOT NULL default '', - PRIMARY KEY (Code) -) TYPE=MyISAM; - -/*!40000 ALTER TABLE Country DISABLE KEYS */; - --- --- Dumping data for table 'Country' --- - - -INSERT INTO Country VALUES ('AFG','Afghanistan','Asia','Southern and Central Asia',652090.00,1919,22720000,45.9,5976.00,NULL,'Afganistan/Afqanestan','Islamic Emirate','Mohammad Omar',1,'AF'); -INSERT INTO Country VALUES ('NLD','Netherlands','Europe','Western Europe',41526.00,1581,15864000,78.3,371362.00,360478.00,'Nederland','Constitutional Monarchy','Beatrix',5,'NL'); -INSERT INTO Country VALUES ('ANT','Netherlands Antilles','North America','Caribbean',800.00,0,217000,74.7,1941.00,NULL,'Nederlandse Antillen','Nonmetropolitan Territory of The Netherlands','Beatrix',33,'AN'); -INSERT INTO Country VALUES ('ALB','Albania','Europe','Southern Europe',28748.00,1912,3401200,71.6,3205.00,2500.00,'Shqip�ria','Republic','Rexhep Mejdani',34,'AL'); -INSERT INTO Country VALUES ('DZA','Algeria','Africa','Northern Africa',2381741.00,1962,31471000,69.7,49982.00,46966.00,'Al-Jaza�ir/Alg�rie','Republic','Abdelaziz Bouteflika',35,'DZ'); -INSERT INTO Country VALUES ('ASM','American Samoa','Oceania','Polynesia',199.00,0,68000,75.1,334.00,NULL,'Amerika Samoa','US Territory','George W. Bush',54,'AS'); -INSERT INTO Country VALUES ('AND','Andorra','Europe','Southern Europe',468.00,1278,78000,83.5,1630.00,NULL,'Andorra','Parliamentary Coprincipality','',55,'AD'); -INSERT INTO Country VALUES ('AGO','Angola','Africa','Central Africa',1246700.00,1975,12878000,38.3,6648.00,7984.00,'Angola','Republic','Jos� Eduardo dos Santos',56,'AO'); -INSERT INTO Country VALUES ('AIA','Anguilla','North America','Caribbean',96.00,0,8000,76.1,63.20,NULL,'Anguilla','Dependent Territory of the UK','Elisabeth II',62,'AI'); -INSERT INTO Country VALUES ('ATG','Antigua and Barbuda','North America','Caribbean',442.00,1981,68000,70.5,612.00,584.00,'Antigua and Barbuda','Constitutional Monarchy','Elisabeth II',63,'AG'); -INSERT INTO Country VALUES ('ARE','United Arab Emirates','Asia','Middle East',83600.00,1971,2441000,74.1,37966.00,36846.00,'Al-Imarat al-�Arabiya al-Muttahida','Emirate Federation','Zayid bin Sultan al-Nahayan',65,'AE'); -INSERT INTO Country VALUES ('ARG','Argentina','South America','South America',2780400.00,1816,37032000,75.1,340238.00,323310.00,'Argentina','Federal Republic','Fernando de la R�a',69,'AR'); -INSERT INTO Country VALUES ('ARM','Armenia','Asia','Middle East',29800.00,1991,3520000,66.4,1813.00,1627.00,'Hajastan','Republic','Robert Kot�arjan',126,'AM'); -INSERT INTO Country VALUES ('ABW','Aruba','North America','Caribbean',193.00,0,103000,78.4,828.00,793.00,'Aruba','Nonmetropolitan Territory of The Netherlands','Beatrix',129,'AW'); -INSERT INTO Country VALUES ('AUS','Australia','Oceania','Australia and New Zealand',7741220.00,1901,18886000,79.8,351182.00,392911.00,'Australia','Constitutional Monarchy, Federation','Elisabeth II',135,'AU'); -INSERT INTO Country VALUES ('AZE','Azerbaijan','Asia','Middle East',86600.00,1991,7734000,62.9,4127.00,4100.00,'Az�rbaycan','Federal Republic','Heyd�r �liyev',144,'AZ'); -INSERT INTO Country VALUES ('BHS','Bahamas','North America','Caribbean',13878.00,1973,307000,71.1,3527.00,3347.00,'The Bahamas','Constitutional Monarchy','Elisabeth II',148,'BS'); -INSERT INTO Country VALUES ('BHR','Bahrain','Asia','Middle East',694.00,1971,617000,73.0,6366.00,6097.00,'Al-Bahrayn','Monarchy (Emirate)','Hamad ibn Isa al-Khalifa',149,'BH'); -INSERT INTO Country VALUES ('BGD','Bangladesh','Asia','Southern and Central Asia',143998.00,1971,129155000,60.2,32852.00,31966.00,'Bangladesh','Republic','Shahabuddin Ahmad',150,'BD'); -INSERT INTO Country VALUES ('BRB','Barbados','North America','Caribbean',430.00,1966,270000,73.0,2223.00,2186.00,'Barbados','Constitutional Monarchy','Elisabeth II',174,'BB'); -INSERT INTO Country VALUES ('BEL','Belgium','Europe','Western Europe',30518.00,1830,10239000,77.8,249704.00,243948.00,'Belgi�/Belgique','Constitutional Monarchy, Federation','Albert II',179,'BE'); -INSERT INTO Country VALUES ('BLZ','Belize','North America','Central America',22696.00,1981,241000,70.9,630.00,616.00,'Belize','Constitutional Monarchy','Elisabeth II',185,'BZ'); -INSERT INTO Country VALUES ('BEN','Benin','Africa','Western Africa',112622.00,1960,6097000,50.2,2357.00,2141.00,'B�nin','Republic','Mathieu K�r�kou',187,'BJ'); -INSERT INTO Country VALUES ('BMU','Bermuda','North America','North America',53.00,0,65000,76.9,2328.00,2190.00,'Bermuda','Dependent Territory of the UK','Elisabeth II',191,'BM'); -INSERT INTO Country VALUES ('BTN','Bhutan','Asia','Southern and Central Asia',47000.00,1910,2124000,52.4,372.00,383.00,'Druk-Yul','Monarchy','Jigme Singye Wangchuk',192,'BT'); -INSERT INTO Country VALUES ('BOL','Bolivia','South America','South America',1098581.00,1825,8329000,63.7,8571.00,7967.00,'Bolivia','Republic','Hugo B�nzer Su�rez',194,'BO'); -INSERT INTO Country VALUES ('BIH','Bosnia and Herzegovina','Europe','Southern Europe',51197.00,1992,3972000,71.5,2841.00,NULL,'Bosna i Hercegovina','Federal Republic','Ante Jelavic',201,'BA'); -INSERT INTO Country VALUES ('BWA','Botswana','Africa','Southern Africa',581730.00,1966,1622000,39.3,4834.00,4935.00,'Botswana','Republic','Festus G. Mogae',204,'BW'); -INSERT INTO Country VALUES ('BRA','Brazil','South America','South America',8547403.00,1822,170115000,62.9,776739.00,804108.00,'Brasil','Federal Republic','Fernando Henrique Cardoso',211,'BR'); -INSERT INTO Country VALUES ('GBR','United Kingdom','Europe','British Islands',242900.00,1066,59623400,77.7,1378330.00,1296830.00,'United Kingdom','Constitutional Monarchy','Elisabeth II',456,'GB'); -INSERT INTO Country VALUES ('VGB','Virgin Islands, British','North America','Caribbean',151.00,0,21000,75.4,612.00,573.00,'British Virgin Islands','Dependent Territory of the UK','Elisabeth II',537,'VG'); -INSERT INTO Country VALUES ('BRN','Brunei','Asia','Southeast Asia',5765.00,1984,328000,73.6,11705.00,12460.00,'Brunei Darussalam','Monarchy (Sultanate)','Haji Hassan al-Bolkiah',538,'BN'); -INSERT INTO Country VALUES ('BGR','Bulgaria','Europe','Eastern Europe',110994.00,1908,8190900,70.9,12178.00,10169.00,'Balgarija','Republic','Petar Stojanov',539,'BG'); -INSERT INTO Country VALUES ('BFA','Burkina Faso','Africa','Western Africa',274000.00,1960,11937000,46.7,2425.00,2201.00,'Burkina Faso','Republic','Blaise Compaor�',549,'BF'); -INSERT INTO Country VALUES ('BDI','Burundi','Africa','Eastern Africa',27834.00,1962,6695000,46.2,903.00,982.00,'Burundi/Uburundi','Republic','Pierre Buyoya',552,'BI'); -INSERT INTO Country VALUES ('CYM','Cayman Islands','North America','Caribbean',264.00,0,38000,78.9,1263.00,1186.00,'Cayman Islands','Dependent Territory of the UK','Elisabeth II',553,'KY'); -INSERT INTO Country VALUES ('CHL','Chile','South America','South America',756626.00,1810,15211000,75.7,72949.00,75780.00,'Chile','Republic','Ricardo Lagos Escobar',554,'CL'); -INSERT INTO Country VALUES ('COK','Cook Islands','Oceania','Polynesia',236.00,0,20000,71.1,100.00,NULL,'The Cook Islands','Nonmetropolitan Territory of New Zealand','Elisabeth II',583,'CK'); -INSERT INTO Country VALUES ('CRI','Costa Rica','North America','Central America',51100.00,1821,4023000,75.8,10226.00,9757.00,'Costa Rica','Republic','Miguel �ngel Rodr�guez Echeverr�a',584,'CR'); -INSERT INTO Country VALUES ('DJI','Djibouti','Africa','Eastern Africa',23200.00,1977,638000,50.8,382.00,373.00,'Djibouti/Jibuti','Republic','Ismail Omar Guelleh',585,'DJ'); -INSERT INTO Country VALUES ('DMA','Dominica','North America','Caribbean',751.00,1978,71000,73.4,256.00,243.00,'Dominica','Republic','Vernon Shaw',586,'DM'); -INSERT INTO Country VALUES ('DOM','Dominican Republic','North America','Caribbean',48511.00,1844,8495000,73.2,15846.00,15076.00,'Rep�blica Dominicana','Republic','Hip�lito Mej�a Dom�nguez',587,'DO'); -INSERT INTO Country VALUES ('ECU','Ecuador','South America','South America',283561.00,1822,12646000,71.1,19770.00,19769.00,'Ecuador','Republic','Gustavo Noboa Bejarano',594,'EC'); -INSERT INTO Country VALUES ('EGY','Egypt','Africa','Northern Africa',1001449.00,1922,68470000,63.3,82710.00,75617.00,'Misr','Republic','Hosni Mubarak',608,'EG'); -INSERT INTO Country VALUES ('SLV','El Salvador','North America','Central America',21041.00,1841,6276000,69.7,11863.00,11203.00,'El Salvador','Republic','Francisco Guillermo Flores P�rez',645,'SV'); -INSERT INTO Country VALUES ('ERI','Eritrea','Africa','Eastern Africa',117600.00,1993,3850000,55.8,650.00,755.00,'Ertra','Republic','Isayas Afewerki [Isaias Afwerki]',652,'ER'); -INSERT INTO Country VALUES ('ESP','Spain','Europe','Southern Europe',505992.00,1492,39441700,78.8,553233.00,532031.00,'Espa�a','Constitutional Monarchy','Juan Carlos I',653,'ES'); -INSERT INTO Country VALUES ('ZAF','South Africa','Africa','Southern Africa',1221037.00,1910,40377000,51.1,116729.00,129092.00,'South Africa','Republic','Thabo Mbeki',716,'ZA'); -INSERT INTO Country VALUES ('ETH','Ethiopia','Africa','Eastern Africa',1104300.00,-1000,62565000,45.2,6353.00,6180.00,'YeItyop�iya','Republic','Negasso Gidada',756,'ET'); -INSERT INTO Country VALUES ('FLK','Falkland Islands','South America','South America',12173.00,0,2000,NULL,0.00,NULL,'Falkland Islands','Dependent Territory of the UK','Elisabeth II',763,'FK'); -INSERT INTO Country VALUES ('FJI','Fiji Islands','Oceania','Melanesia',18274.00,1970,817000,67.9,1536.00,2149.00,'Fiji Islands','Republic','Josefa Iloilo',764,'FJ'); -INSERT INTO Country VALUES ('PHL','Philippines','Asia','Southeast Asia',300000.00,1946,75967000,67.5,65107.00,82239.00,'Pilipinas','Republic','Gloria Macapagal-Arroyo',766,'PH'); -INSERT INTO Country VALUES ('FRO','Faroe Islands','Europe','Nordic Countries',1399.00,0,43000,78.4,0.00,NULL,'F�royar','Part of Denmark','Margrethe II',901,'FO'); -INSERT INTO Country VALUES ('GAB','Gabon','Africa','Central Africa',267668.00,1960,1226000,50.1,5493.00,5279.00,'Le Gabon','Republic','Omar Bongo',902,'GA'); -INSERT INTO Country VALUES ('GMB','Gambia','Africa','Western Africa',11295.00,1965,1305000,53.2,320.00,325.00,'The Gambia','Republic','Yahya Jammeh',904,'GM'); -INSERT INTO Country VALUES ('GEO','Georgia','Asia','Middle East',69700.00,1991,4968000,64.5,6064.00,5924.00,'Sakartvelo','Republic','Eduard �evardnadze',905,'GE'); -INSERT INTO Country VALUES ('GHA','Ghana','Africa','Western Africa',238533.00,1957,20212000,57.4,7137.00,6884.00,'Ghana','Republic','John Kufuor',910,'GH'); -INSERT INTO Country VALUES ('GIB','Gibraltar','Europe','Southern Europe',6.00,0,25000,79.0,258.00,NULL,'Gibraltar','Dependent Territory of the UK','Elisabeth II',915,'GI'); -INSERT INTO Country VALUES ('GRD','Grenada','North America','Caribbean',344.00,1974,94000,64.5,318.00,NULL,'Grenada','Constitutional Monarchy','Elisabeth II',916,'GD'); -INSERT INTO Country VALUES ('GRL','Greenland','North America','North America',2166090.00,0,56000,68.1,0.00,NULL,'Kalaallit Nunaat/Gr�nland','Part of Denmark','Margrethe II',917,'GL'); -INSERT INTO Country VALUES ('GLP','Guadeloupe','North America','Caribbean',1705.00,0,456000,77.0,3501.00,NULL,'Guadeloupe','Overseas Department of France','Jacques Chirac',919,'GP'); -INSERT INTO Country VALUES ('GUM','Guam','Oceania','Micronesia',549.00,0,168000,77.8,1197.00,1136.00,'Guam','US Territory','George W. Bush',921,'GU'); -INSERT INTO Country VALUES ('GTM','Guatemala','North America','Central America',108889.00,1821,11385000,66.2,19008.00,17797.00,'Guatemala','Republic','Alfonso Portillo Cabrera',922,'GT'); -INSERT INTO Country VALUES ('GIN','Guinea','Africa','Western Africa',245857.00,1958,7430000,45.6,2352.00,2383.00,'Guin�e','Republic','Lansana Cont�',926,'GN'); -INSERT INTO Country VALUES ('GNB','Guinea-Bissau','Africa','Western Africa',36125.00,1974,1213000,49.0,293.00,272.00,'Guin�-Bissau','Republic','Kumba Ial�',927,'GW'); -INSERT INTO Country VALUES ('GUY','Guyana','South America','South America',214969.00,1966,861000,64.0,722.00,743.00,'Guyana','Republic','Bharrat Jagdeo',928,'GY'); -INSERT INTO Country VALUES ('HTI','Haiti','North America','Caribbean',27750.00,1804,8222000,49.2,3459.00,3107.00,'Ha�ti/Dayti','Republic','Jean-Bertrand Aristide',929,'HT'); -INSERT INTO Country VALUES ('HND','Honduras','North America','Central America',112088.00,1838,6485000,69.9,5333.00,4697.00,'Honduras','Republic','Carlos Roberto Flores Facuss�',933,'HN'); -INSERT INTO Country VALUES ('HKG','Hong Kong','Asia','Eastern Asia',1075.00,0,6782000,79.5,166448.00,173610.00,'Xianggang/Hong Kong','Special Administrative Region of China','Jiang Zemin',937,'HK'); -INSERT INTO Country VALUES ('SJM','Svalbard and Jan Mayen','Europe','Nordic Countries',62422.00,0,3200,NULL,0.00,NULL,'Svalbard og Jan Mayen','Dependent Territory of Norway','Harald V',938,'SJ'); -INSERT INTO Country VALUES ('IDN','Indonesia','Asia','Southeast Asia',1904569.00,1945,212107000,68.0,84982.00,215002.00,'Indonesia','Republic','Abdurrahman Wahid',939,'ID'); -INSERT INTO Country VALUES ('IND','India','Asia','Southern and Central Asia',3287263.00,1947,1013662000,62.5,447114.00,430572.00,'Bharat/India','Federal Republic','Kocheril Raman Narayanan',1109,'IN'); -INSERT INTO Country VALUES ('IRQ','Iraq','Asia','Middle East',438317.00,1932,23115000,66.5,11500.00,NULL,'Al-�Iraq','Republic','Saddam Hussein al-Takriti',1365,'IQ'); -INSERT INTO Country VALUES ('IRN','Iran','Asia','Southern and Central Asia',1648195.00,1906,67702000,69.7,195746.00,160151.00,'Iran','Islamic Republic','Ali Mohammad Khatami-Ardakani',1380,'IR'); -INSERT INTO Country VALUES ('IRL','Ireland','Europe','British Islands',70273.00,1921,3775100,76.8,75921.00,73132.00,'Ireland/�ire','Republic','Mary McAleese',1447,'IE'); -INSERT INTO Country VALUES ('ISL','Iceland','Europe','Nordic Countries',103000.00,1944,279000,79.4,8255.00,7474.00,'�sland','Republic','�lafur Ragnar Gr�msson',1449,'IS'); -INSERT INTO Country VALUES ('ISR','Israel','Asia','Middle East',21056.00,1948,6217000,78.6,97477.00,98577.00,'Yisra�el/Isra�il','Republic','Moshe Katzav',1450,'IL'); -INSERT INTO Country VALUES ('ITA','Italy','Europe','Southern Europe',301316.00,1861,57680000,79.0,1161755.00,1145372.00,'Italia','Republic','Carlo Azeglio Ciampi',1464,'IT'); -INSERT INTO Country VALUES ('TMP','East Timor','Asia','Southeast Asia',14874.00,0,885000,46.0,0.00,NULL,'Timor Timur','Administrated by the UN','Jos� Alexandre Gusm�o',1522,'TP'); -INSERT INTO Country VALUES ('AUT','Austria','Europe','Western Europe',83859.00,1918,8091800,77.7,211860.00,206025.00,'�sterreich','Federal Republic','Thomas Klestil',1523,'AT'); -INSERT INTO Country VALUES ('JAM','Jamaica','North America','Caribbean',10990.00,1962,2583000,75.2,6871.00,6722.00,'Jamaica','Constitutional Monarchy','Elisabeth II',1530,'JM'); -INSERT INTO Country VALUES ('JPN','Japan','Asia','Eastern Asia',377829.00,-660,126714000,80.7,3787042.00,4192638.00,'Nihon/Nippon','Constitutional Monarchy','Akihito',1532,'JP'); -INSERT INTO Country VALUES ('YEM','Yemen','Asia','Middle East',527968.00,1918,18112000,59.8,6041.00,5729.00,'Al-Yaman','Republic','Ali Abdallah Salih',1780,'YE'); -INSERT INTO Country VALUES ('JOR','Jordan','Asia','Middle East',88946.00,1946,5083000,77.4,7526.00,7051.00,'Al-Urdunn','Constitutional Monarchy','Abdullah II',1786,'JO'); -INSERT INTO Country VALUES ('CXR','Christmas Island','Oceania','Australia and New Zealand',135.00,0,2500,NULL,0.00,NULL,'Christmas Island','Territory of Australia','Elisabeth II',1791,'CX'); -INSERT INTO Country VALUES ('YUG','Yugoslavia','Europe','Southern Europe',102173.00,1918,10640000,72.4,17000.00,NULL,'Jugoslavija','Federal Republic','Vojislav Ko�tunica',1792,'YU'); -INSERT INTO Country VALUES ('KHM','Cambodia','Asia','Southeast Asia',181035.00,1953,11168000,56.5,5121.00,5670.00,'K�mpuch�a','Constitutional Monarchy','Norodom Sihanouk',1800,'KH'); -INSERT INTO Country VALUES ('CMR','Cameroon','Africa','Central Africa',475442.00,1960,15085000,54.8,9174.00,8596.00,'Cameroun/Cameroon','Republic','Paul Biya',1804,'CM'); -INSERT INTO Country VALUES ('CAN','Canada','North America','North America',9970610.00,1867,31147000,79.4,598862.00,625626.00,'Canada','Constitutional Monarchy, Federation','Elisabeth II',1822,'CA'); -INSERT INTO Country VALUES ('CPV','Cape Verde','Africa','Western Africa',4033.00,1975,428000,68.9,435.00,420.00,'Cabo Verde','Republic','Ant�nio Mascarenhas Monteiro',1859,'CV'); -INSERT INTO Country VALUES ('KAZ','Kazakstan','Asia','Southern and Central Asia',2724900.00,1991,16223000,63.2,24375.00,23383.00,'Qazaqstan','Republic','Nursultan Nazarbajev',1864,'KZ'); -INSERT INTO Country VALUES ('KEN','Kenya','Africa','Eastern Africa',580367.00,1963,30080000,48.0,9217.00,10241.00,'Kenya','Republic','Daniel arap Moi',1881,'KE'); -INSERT INTO Country VALUES ('CAF','Central African Republic','Africa','Central Africa',622984.00,1960,3615000,44.0,1054.00,993.00,'Centrafrique/B�-Afr�ka','Republic','Ange-F�lix Patass�',1889,'CF'); -INSERT INTO Country VALUES ('CHN','China','Asia','Eastern Asia',9572900.00,-1523,1277558000,71.4,982268.00,917719.00,'Zhongquo','People\'sRepublic','Jiang Zemin',1891,'CN'); -INSERT INTO Country VALUES ('KGZ','Kyrgyzstan','Asia','Southern and Central Asia',199900.00,1991,4699000,63.4,1626.00,1767.00,'Kyrgyzstan','Republic','Askar Akajev',2253,'KG'); -INSERT INTO Country VALUES ('KIR','Kiribati','Oceania','Micronesia',726.00,1979,83000,59.8,40.70,NULL,'Kiribati','Republic','Teburoro Tito',2256,'KI'); -INSERT INTO Country VALUES ('COL','Colombia','South America','South America',1138914.00,1810,42321000,70.3,102896.00,105116.00,'Colombia','Republic','Andr�s Pastrana Arango',2257,'CO'); -INSERT INTO Country VALUES ('COM','Comoros','Africa','Eastern Africa',1862.00,1975,578000,60.0,4401.00,4361.00,'Komori/Comores','Republic','Azali Assoumani',2295,'KM'); -INSERT INTO Country VALUES ('COG','Congo','Africa','Central Africa',342000.00,1960,2943000,47.4,2108.00,2287.00,'Congo','Republic','Denis Sassou-Nguesso',2296,'CG'); -INSERT INTO Country VALUES ('COD','Congo, The Democratic Republic of the','Africa','Central Africa',2344858.00,1960,51654000,48.8,6964.00,2474.00,'R�publique D�mocratique du Congo','Republic','Joseph Kabila',2298,'CD'); -INSERT INTO Country VALUES ('CCK','Cocos (Keeling) Islands','Oceania','Australia and New Zealand',14.00,0,600,NULL,0.00,NULL,'Cocos (Keeling) Islands','Territory of Australia','Elisabeth II',2317,'CC'); -INSERT INTO Country VALUES ('PRK','North Korea','Asia','Eastern Asia',120538.00,1948,24039000,70.7,5332.00,NULL,'Choson Minjujuui In�min Konghwaguk (Bukhan)','Socialistic Republic','Kim Jong-il',2318,'KP'); -INSERT INTO Country VALUES ('KOR','South Korea','Asia','Eastern Asia',99434.00,1948,46844000,74.4,320749.00,442544.00,'Taehan Min�guk (Namhan)','Republic','Kim Dae-jung',2331,'KR'); -INSERT INTO Country VALUES ('GRC','Greece','Europe','Southern Europe',131626.00,1830,10545700,78.4,120724.00,119946.00,'Ell�da','Republic','Kostis Stefanopoulos',2401,'GR'); -INSERT INTO Country VALUES ('HRV','Croatia','Europe','Southern Europe',56538.00,1991,4473000,73.7,20208.00,19300.00,'Hrvatska','Republic','�tipe Mesic',2409,'HR'); -INSERT INTO Country VALUES ('CUB','Cuba','North America','Caribbean',110861.00,1902,11201000,76.2,17843.00,18862.00,'Cuba','Socialistic Republic','Fidel Castro Ruz',2413,'CU'); -INSERT INTO Country VALUES ('KWT','Kuwait','Asia','Middle East',17818.00,1961,1972000,76.1,27037.00,30373.00,'Al-Kuwayt','Constitutional Monarchy (Emirate)','Jabir al-Ahmad al-Jabir al-Sabah',2429,'KW'); -INSERT INTO Country VALUES ('CYP','Cyprus','Asia','Middle East',9251.00,1960,754700,76.7,9333.00,8246.00,'K�pros/Kibris','Republic','Glafkos Klerides',2430,'CY'); -INSERT INTO Country VALUES ('LAO','Laos','Asia','Southeast Asia',236800.00,1953,5433000,53.1,1292.00,1746.00,'Lao','Republic','Khamtay Siphandone',2432,'LA'); -INSERT INTO Country VALUES ('LVA','Latvia','Europe','Baltic Countries',64589.00,1991,2424200,68.4,6398.00,5639.00,'Latvija','Republic','Vaira Vike-Freiberga',2434,'LV'); -INSERT INTO Country VALUES ('LSO','Lesotho','Africa','Southern Africa',30355.00,1966,2153000,50.8,1061.00,1161.00,'Lesotho','Constitutional Monarchy','Letsie III',2437,'LS'); -INSERT INTO Country VALUES ('LBN','Lebanon','Asia','Middle East',10400.00,1941,3282000,71.3,17121.00,15129.00,'Lubnan','Republic','�mile Lahoud',2438,'LB'); -INSERT INTO Country VALUES ('LBR','Liberia','Africa','Western Africa',111369.00,1847,3154000,51.0,2012.00,NULL,'Liberia','Republic','Charles Taylor',2440,'LR'); -INSERT INTO Country VALUES ('LBY','Libyan Arab Jamahiriya','Africa','Northern Africa',1759540.00,1951,5605000,75.5,44806.00,40562.00,'Libiya','Socialistic State','Muammar al-Qadhafi',2441,'LY'); -INSERT INTO Country VALUES ('LIE','Liechtenstein','Europe','Western Europe',160.00,1806,32300,78.8,1119.00,1084.00,'Liechtenstein','Constitutional Monarchy','Hans-Adam II',2446,'LI'); -INSERT INTO Country VALUES ('LTU','Lithuania','Europe','Baltic Countries',65301.00,1991,3698500,69.1,10692.00,9585.00,'Lietuva','Republic','Valdas Adamkus',2447,'LT'); -INSERT INTO Country VALUES ('LUX','Luxembourg','Europe','Western Europe',2586.00,1867,435700,77.1,16321.00,15519.00,'Luxembourg/L�tzebuerg','Constitutional Monarchy','Henri',2452,'LU'); -INSERT INTO Country VALUES ('ESH','Western Sahara','Africa','Northern Africa',266000.00,0,293000,49.8,60.00,NULL,'As-Sahrawiya','Occupied by Marocco','Mohammed Abdel Aziz',2453,'EH'); -INSERT INTO Country VALUES ('MAC','Macao','Asia','Eastern Asia',18.00,0,473000,81.6,5749.00,5940.00,'Macau/Aomen','Special Administrative Region of China','Jiang Zemin',2454,'MO'); -INSERT INTO Country VALUES ('MDG','Madagascar','Africa','Eastern Africa',587041.00,1960,15942000,55.0,3750.00,3545.00,'Madagasikara/Madagascar','Federal Republic','Didier Ratsiraka',2455,'MG'); -INSERT INTO Country VALUES ('MKD','Macedonia','Europe','Southern Europe',25713.00,1991,2024000,73.8,1694.00,1915.00,'Makedonija','Republic','Boris Trajkovski',2460,'MK'); -INSERT INTO Country VALUES ('MWI','Malawi','Africa','Eastern Africa',118484.00,1964,10925000,37.6,1687.00,2527.00,'Malawi','Republic','Bakili Muluzi',2462,'MW'); -INSERT INTO Country VALUES ('MDV','Maldives','Asia','Southern and Central Asia',298.00,1965,286000,62.2,199.00,NULL,'Dhivehi Raajje/Maldives','Republic','Maumoon Abdul Gayoom',2463,'MV'); -INSERT INTO Country VALUES ('MYS','Malaysia','Asia','Southeast Asia',329758.00,1957,22244000,70.8,69213.00,97884.00,'Malaysia','Constitutional Monarchy, Federation','Salahuddin Abdul Aziz Shah Alhaj',2464,'MY'); -INSERT INTO Country VALUES ('MLI','Mali','Africa','Western Africa',1240192.00,1960,11234000,46.7,2642.00,2453.00,'Mali','Republic','Alpha Oumar Konar�',2482,'ML'); -INSERT INTO Country VALUES ('MLT','Malta','Europe','Southern Europe',316.00,1964,380200,77.9,3512.00,3338.00,'Malta','Republic','Guido de Marco',2484,'MT'); -INSERT INTO Country VALUES ('MAR','Morocco','Africa','Northern Africa',446550.00,1956,28351000,69.1,36124.00,33514.00,'Al-Maghrib','Constitutional Monarchy','Mohammed VI',2486,'MA'); -INSERT INTO Country VALUES ('MHL','Marshall Islands','Oceania','Micronesia',181.00,1990,64000,65.5,97.00,NULL,'Marshall Islands/Majol','Republic','Kessai Note',2507,'MH'); -INSERT INTO Country VALUES ('MTQ','Martinique','North America','Caribbean',1102.00,0,395000,78.3,2731.00,2559.00,'Martinique','Overseas Department of France','Jacques Chirac',2508,'MQ'); -INSERT INTO Country VALUES ('MRT','Mauritania','Africa','Western Africa',1025520.00,1960,2670000,50.8,998.00,1081.00,'Muritaniya/Mauritanie','Republic','Maaouiya Ould Sid�Ahmad Taya',2509,'MR'); -INSERT INTO Country VALUES ('MUS','Mauritius','Africa','Eastern Africa',2040.00,1968,1158000,71.0,4251.00,4186.00,'Mauritius','Republic','Cassam Uteem',2511,'MU'); -INSERT INTO Country VALUES ('MYT','Mayotte','Africa','Eastern Africa',373.00,0,149000,59.5,0.00,NULL,'Mayotte','Territorial Collectivity of France','Jacques Chirac',2514,'YT'); -INSERT INTO Country VALUES ('MEX','Mexico','North America','Central America',1958201.00,1810,98881000,71.5,414972.00,401461.00,'M�xico','Federal Republic','Vicente Fox Quesada',2515,'MX'); -INSERT INTO Country VALUES ('FSM','Micronesia, Federated States of','Oceania','Micronesia',702.00,1990,119000,68.6,212.00,NULL,'Micronesia','Federal Republic','Leo A. Falcam',2689,'FM'); -INSERT INTO Country VALUES ('MDA','Moldova','Europe','Eastern Europe',33851.00,1991,4380000,64.5,1579.00,1872.00,'Moldova','Republic','Vladimir Voronin',2690,'MD'); -INSERT INTO Country VALUES ('MCO','Monaco','Europe','Western Europe',1.50,1861,34000,78.8,776.00,NULL,'Monaco','Constitutional Monarchy','Rainier III',2695,'MC'); -INSERT INTO Country VALUES ('MNG','Mongolia','Asia','Eastern Asia',1566500.00,1921,2662000,67.3,1043.00,933.00,'Mongol Uls','Republic','Natsagiin Bagabandi',2696,'MN'); -INSERT INTO Country VALUES ('MSR','Montserrat','North America','Caribbean',102.00,0,11000,78.0,109.00,NULL,'Montserrat','Dependent Territory of the UK','Elisabeth II',2697,'MS'); -INSERT INTO Country VALUES ('MOZ','Mozambique','Africa','Eastern Africa',801590.00,1975,19680000,37.5,2891.00,2711.00,'Mo�ambique','Republic','Joaqu�m A. Chissano',2698,'MZ'); -INSERT INTO Country VALUES ('MMR','Myanmar','Asia','Southeast Asia',676578.00,1948,45611000,54.9,180375.00,171028.00,'Myanma Pye','Republic','kenraali Than Shwe',2710,'MM'); -INSERT INTO Country VALUES ('NAM','Namibia','Africa','Southern Africa',824292.00,1990,1726000,42.5,3101.00,3384.00,'Namibia','Republic','Sam Nujoma',2726,'NA'); -INSERT INTO Country VALUES ('NRU','Nauru','Oceania','Micronesia',21.00,1968,12000,60.8,197.00,NULL,'Naoero/Nauru','Republic','Bernard Dowiyogo',2728,'NR'); -INSERT INTO Country VALUES ('NPL','Nepal','Asia','Southern and Central Asia',147181.00,1769,23930000,57.8,4768.00,4837.00,'Nepal','Constitutional Monarchy','Gyanendra Bir Bikram',2729,'NP'); -INSERT INTO Country VALUES ('NIC','Nicaragua','North America','Central America',130000.00,1838,5074000,68.7,1988.00,2023.00,'Nicaragua','Republic','Arnoldo Alem�n Lacayo',2734,'NI'); -INSERT INTO Country VALUES ('NER','Niger','Africa','Western Africa',1267000.00,1960,10730000,41.3,1706.00,1580.00,'Niger','Republic','Mamadou Tandja',2738,'NE'); -INSERT INTO Country VALUES ('NGA','Nigeria','Africa','Western Africa',923768.00,1960,111506000,51.6,65707.00,58623.00,'Nigeria','Federal Republic','Olusegun Obasanjo',2754,'NG'); -INSERT INTO Country VALUES ('NIU','Niue','Oceania','Polynesia',260.00,0,2000,NULL,0.00,NULL,'Niue','Nonmetropolitan Territory of New Zealand','Elisabeth II',2805,'NU'); -INSERT INTO Country VALUES ('NFK','Norfolk Island','Oceania','Australia and New Zealand',36.00,0,2000,NULL,0.00,NULL,'Norfolk Island','Territory of Australia','Elisabeth II',2806,'NF'); -INSERT INTO Country VALUES ('NOR','Norway','Europe','Nordic Countries',323877.00,1905,4478500,78.7,145895.00,153370.00,'Norge','Constitutional Monarchy','Harald V',2807,'NO'); -INSERT INTO Country VALUES ('CIV','C�te d�Ivoire','Africa','Western Africa',322463.00,1960,14786000,45.2,11345.00,10285.00,'C�te d�Ivoire','Republic','Laurent Gbagbo',2814,'CI'); -INSERT INTO Country VALUES ('OMN','Oman','Asia','Middle East',309500.00,1951,2542000,71.8,16904.00,16153.00,'�Uman','Monarchy (Sultanate)','Qabus ibn Sa�id',2821,'OM'); -INSERT INTO Country VALUES ('PAK','Pakistan','Asia','Southern and Central Asia',796095.00,1947,156483000,61.1,61289.00,58549.00,'Pakistan','Republic','Mohammad Rafiq Tarar',2831,'PK'); -INSERT INTO Country VALUES ('PLW','Palau','Oceania','Micronesia',459.00,1994,19000,68.6,105.00,NULL,'Belau/Palau','Republic','Kuniwo Nakamura',2881,'PW'); -INSERT INTO Country VALUES ('PAN','Panama','North America','Central America',75517.00,1903,2856000,75.5,9131.00,8700.00,'Panam�','Republic','Mireya Elisa Moscoso Rodr�guez',2882,'PA'); -INSERT INTO Country VALUES ('PNG','Papua New Guinea','Oceania','Melanesia',462840.00,1975,4807000,63.1,4988.00,6328.00,'Papua New Guinea/Papua Niugini','Constitutional Monarchy','Elisabeth II',2884,'PG'); -INSERT INTO Country VALUES ('PRY','Paraguay','South America','South America',406752.00,1811,5496000,73.7,8444.00,9555.00,'Paraguay','Republic','Luis �ngel Gonz�lez Macchi',2885,'PY'); -INSERT INTO Country VALUES ('PER','Peru','South America','South America',1285216.00,1821,25662000,70.0,64140.00,65186.00,'Per�/Piruw','Republic','Valentin Paniagua Corazao',2890,'PE'); -INSERT INTO Country VALUES ('PCN','Pitcairn','Oceania','Polynesia',49.00,0,50,NULL,0.00,NULL,'Pitcairn','Dependent Territory of the UK','Elisabeth II',2912,'PN'); -INSERT INTO Country VALUES ('MNP','Northern Mariana Islands','Oceania','Micronesia',464.00,0,78000,75.5,0.00,NULL,'Northern Mariana Islands','Commonwealth of the US','George W. Bush',2913,'MP'); -INSERT INTO Country VALUES ('PRT','Portugal','Europe','Southern Europe',91982.00,1143,9997600,75.8,105954.00,102133.00,'Portugal','Republic','Jorge Samp�io',2914,'PT'); -INSERT INTO Country VALUES ('PRI','Puerto Rico','North America','Caribbean',8875.00,0,3869000,75.6,34100.00,32100.00,'Puerto Rico','Commonwealth of the US','George W. Bush',2919,'PR'); -INSERT INTO Country VALUES ('POL','Poland','Europe','Eastern Europe',323250.00,1918,38653600,73.2,151697.00,135636.00,'Polska','Republic','Aleksander Kwasniewski',2928,'PL'); -INSERT INTO Country VALUES ('GNQ','Equatorial Guinea','Africa','Central Africa',28051.00,1968,453000,53.6,283.00,542.00,'Guinea Ecuatorial','Republic','Teodoro Obiang Nguema Mbasogo',2972,'GQ'); -INSERT INTO Country VALUES ('QAT','Qatar','Asia','Middle East',11000.00,1971,599000,72.4,9472.00,8920.00,'Qatar','Monarchy','Hamad ibn Khalifa al-Thani',2973,'QA'); -INSERT INTO Country VALUES ('FRA','France','Europe','Western Europe',551500.00,843,59225700,78.8,1424285.00,1392448.00,'France','Republic','Jacques Chirac',2974,'FR'); -INSERT INTO Country VALUES ('GUF','French Guiana','South America','South America',90000.00,0,181000,76.1,681.00,NULL,'Guyane fran�aise','Overseas Department of France','Jacques Chirac',3014,'GF'); -INSERT INTO Country VALUES ('PYF','French Polynesia','Oceania','Polynesia',4000.00,0,235000,74.8,818.00,781.00,'Polyn�sie fran�aise','Nonmetropolitan Territory of France','Jacques Chirac',3016,'PF'); -INSERT INTO Country VALUES ('REU','R�union','Africa','Eastern Africa',2510.00,0,699000,72.7,8287.00,7988.00,'R�union','Overseas Department of France','Jacques Chirac',3017,'RE'); -INSERT INTO Country VALUES ('ROM','Romania','Europe','Eastern Europe',238391.00,1878,22455500,69.9,38158.00,34843.00,'Rom�nia','Republic','Ion Iliescu',3018,'RO'); -INSERT INTO Country VALUES ('RWA','Rwanda','Africa','Eastern Africa',26338.00,1962,7733000,39.3,2036.00,1863.00,'Rwanda/Urwanda','Republic','Paul Kagame',3047,'RW'); -INSERT INTO Country VALUES ('SWE','Sweden','Europe','Nordic Countries',449964.00,836,8861400,79.6,226492.00,227757.00,'Sverige','Constitutional Monarchy','Carl XVI Gustaf',3048,'SE'); -INSERT INTO Country VALUES ('SHN','Saint Helena','Africa','Western Africa',314.00,0,6000,76.8,0.00,NULL,'Saint Helena','Dependent Territory of the UK','Elisabeth II',3063,'SH'); -INSERT INTO Country VALUES ('KNA','Saint Kitts and Nevis','North America','Caribbean',261.00,1983,38000,70.7,299.00,NULL,'Saint Kitts and Nevis','Constitutional Monarchy','Elisabeth II',3064,'KN'); -INSERT INTO Country VALUES ('LCA','Saint Lucia','North America','Caribbean',622.00,1979,154000,72.3,571.00,NULL,'Saint Lucia','Constitutional Monarchy','Elisabeth II',3065,'LC'); -INSERT INTO Country VALUES ('VCT','Saint Vincent and the Grenadines','North America','Caribbean',388.00,1979,114000,72.3,285.00,NULL,'Saint Vincent and the Grenadines','Constitutional Monarchy','Elisabeth II',3066,'VC'); -INSERT INTO Country VALUES ('SPM','Saint Pierre and Miquelon','North America','North America',242.00,0,7000,77.6,0.00,NULL,'Saint-Pierre-et-Miquelon','Territorial Collectivity of France','Jacques Chirac',3067,'PM'); -INSERT INTO Country VALUES ('DEU','Germany','Europe','Western Europe',357022.00,1955,82164700,77.4,2133367.00,2102826.00,'Deutschland','Federal Republic','Johannes Rau',3068,'DE'); -INSERT INTO Country VALUES ('SLB','Solomon Islands','Oceania','Melanesia',28896.00,1978,444000,71.3,182.00,220.00,'Solomon Islands','Constitutional Monarchy','Elisabeth II',3161,'SB'); -INSERT INTO Country VALUES ('ZMB','Zambia','Africa','Eastern Africa',752618.00,1964,9169000,37.2,3377.00,3922.00,'Zambia','Republic','Frederick Chiluba',3162,'ZM'); -INSERT INTO Country VALUES ('WSM','Samoa','Oceania','Polynesia',2831.00,1962,180000,69.2,141.00,157.00,'Samoa','Parlementary Monarchy','Malietoa Tanumafili II',3169,'WS'); -INSERT INTO Country VALUES ('SMR','San Marino','Europe','Southern Europe',61.00,885,27000,81.1,510.00,NULL,'San Marino','Republic',NULL,3171,'SM'); -INSERT INTO Country VALUES ('STP','Sao Tome and Principe','Africa','Central Africa',964.00,1975,147000,65.3,6.00,NULL,'S�o Tom� e Pr�ncipe','Republic','Miguel Trovoada',3172,'ST'); -INSERT INTO Country VALUES ('SAU','Saudi Arabia','Asia','Middle East',2149690.00,1932,21607000,67.8,137635.00,146171.00,'Al-�Arabiya as-Sa�udiya','Monarchy','Fahd ibn Abdul-Aziz al-Sa�ud',3173,'SA'); -INSERT INTO Country VALUES ('SEN','Senegal','Africa','Western Africa',196722.00,1960,9481000,62.2,4787.00,4542.00,'S�n�gal/Sounougal','Republic','Abdoulaye Wade',3198,'SN'); -INSERT INTO Country VALUES ('SYC','Seychelles','Africa','Eastern Africa',455.00,1976,77000,70.4,536.00,539.00,'Sesel/Seychelles','Republic','France-Albert Ren�',3206,'SC'); -INSERT INTO Country VALUES ('SLE','Sierra Leone','Africa','Western Africa',71740.00,1961,4854000,45.3,746.00,858.00,'Sierra Leone','Republic','Ahmed Tejan Kabbah',3207,'SL'); -INSERT INTO Country VALUES ('SGP','Singapore','Asia','Southeast Asia',618.00,1965,3567000,80.1,86503.00,96318.00,'Singapore/Singapura/Xinjiapo/Singapur','Republic','Sellapan Rama Nathan',3208,'SG'); -INSERT INTO Country VALUES ('SVK','Slovakia','Europe','Eastern Europe',49012.00,1993,5398700,73.7,20594.00,19452.00,'Slovensko','Republic','Rudolf Schuster',3209,'SK'); -INSERT INTO Country VALUES ('SVN','Slovenia','Europe','Southern Europe',20256.00,1991,1987800,74.9,19756.00,18202.00,'Slovenija','Republic','Milan Kucan',3212,'SI'); -INSERT INTO Country VALUES ('SOM','Somalia','Africa','Eastern Africa',637657.00,1960,10097000,46.2,935.00,NULL,'Soomaaliya','Republic','Abdiqassim Salad Hassan',3214,'SO'); -INSERT INTO Country VALUES ('LKA','Sri Lanka','Asia','Southern and Central Asia',65610.00,1948,18827000,71.8,15706.00,15091.00,'Sri Lanka/Ilankai','Republic','Chandrika Kumaratunga',3217,'LK'); -INSERT INTO Country VALUES ('SDN','Sudan','Africa','Northern Africa',2505813.00,1956,29490000,56.6,10162.00,NULL,'As-Sudan','Islamic Republic','Omar Hassan Ahmad al-Bashir',3225,'SD'); -INSERT INTO Country VALUES ('FIN','Finland','Europe','Nordic Countries',338145.00,1917,5171300,77.4,121914.00,119833.00,'Suomi','Republic','Tarja Halonen',3236,'FI'); -INSERT INTO Country VALUES ('SUR','Suriname','South America','South America',163265.00,1975,417000,71.4,870.00,706.00,'Suriname','Republic','Ronald Venetiaan',3243,'SR'); -INSERT INTO Country VALUES ('SWZ','Swaziland','Africa','Southern Africa',17364.00,1968,1008000,40.4,1206.00,1312.00,'kaNgwane','Monarchy','Mswati III',3244,'SZ'); -INSERT INTO Country VALUES ('CHE','Switzerland','Europe','Western Europe',41284.00,1499,7160400,79.6,264478.00,256092.00,'Schweiz/Suisse/Svizzera/Svizra','Federation','Adolf Ogi',3248,'CH'); -INSERT INTO Country VALUES ('SYR','Syria','Asia','Middle East',185180.00,1941,16125000,68.5,65984.00,64926.00,'Suriya','Republic','Bashar al-Assad',3250,'SY'); -INSERT INTO Country VALUES ('TJK','Tajikistan','Asia','Southern and Central Asia',143100.00,1991,6188000,64.1,1990.00,1056.00,'To�ikiston','Republic','Emomali Rahmonov',3261,'TJ'); -INSERT INTO Country VALUES ('TWN','Taiwan','Asia','Eastern Asia',36188.00,1945,22256000,76.4,256254.00,263451.00,'T�ai-wan','Republic','Chen Shui-bian',3263,'TW'); -INSERT INTO Country VALUES ('TZA','Tanzania','Africa','Eastern Africa',883749.00,1961,33517000,52.3,8005.00,7388.00,'Tanzania','Republic','Benjamin William Mkapa',3306,'TZ'); -INSERT INTO Country VALUES ('DNK','Denmark','Europe','Nordic Countries',43094.00,800,5330000,76.5,174099.00,169264.00,'Danmark','Constitutional Monarchy','Margrethe II',3315,'DK'); -INSERT INTO Country VALUES ('THA','Thailand','Asia','Southeast Asia',513115.00,1350,61399000,68.6,116416.00,153907.00,'Prathet Thai','Constitutional Monarchy','Bhumibol Adulyadej',3320,'TH'); -INSERT INTO Country VALUES ('TGO','Togo','Africa','Western Africa',56785.00,1960,4629000,54.7,1449.00,1400.00,'Togo','Republic','Gnassingb� Eyad�ma',3332,'TG'); -INSERT INTO Country VALUES ('TKL','Tokelau','Oceania','Polynesia',12.00,0,2000,NULL,0.00,NULL,'Tokelau','Nonmetropolitan Territory of New Zealand','Elisabeth II',3333,'TK'); -INSERT INTO Country VALUES ('TON','Tonga','Oceania','Polynesia',650.00,1970,99000,67.9,146.00,170.00,'Tonga','Monarchy','Taufa\'ahau Tupou IV',3334,'TO'); -INSERT INTO Country VALUES ('TTO','Trinidad and Tobago','North America','Caribbean',5130.00,1962,1295000,68.0,6232.00,5867.00,'Trinidad and Tobago','Republic','Arthur N. R. Robinson',3336,'TT'); -INSERT INTO Country VALUES ('TCD','Chad','Africa','Central Africa',1284000.00,1960,7651000,50.5,1208.00,1102.00,'Tchad/Tshad','Republic','Idriss D�by',3337,'TD'); -INSERT INTO Country VALUES ('CZE','Czech Republic','Europe','Eastern Europe',78866.00,1993,10278100,74.5,55017.00,52037.00,'�esko','Republic','V�clav Havel',3339,'CZ'); -INSERT INTO Country VALUES ('TUN','Tunisia','Africa','Northern Africa',163610.00,1956,9586000,73.7,20026.00,18898.00,'Tunis/Tunisie','Republic','Zine al-Abidine Ben Ali',3349,'TN'); -INSERT INTO Country VALUES ('TUR','Turkey','Asia','Middle East',774815.00,1923,66591000,71.0,210721.00,189122.00,'T�rkiye','Republic','Ahmet Necdet Sezer',3358,'TR'); -INSERT INTO Country VALUES ('TKM','Turkmenistan','Asia','Southern and Central Asia',488100.00,1991,4459000,60.9,4397.00,2000.00,'T�rkmenostan','Republic','Saparmurad Nijazov',3419,'TM'); -INSERT INTO Country VALUES ('TCA','Turks and Caicos Islands','North America','Caribbean',430.00,0,17000,73.3,96.00,NULL,'The Turks and Caicos Islands','Dependent Territory of the UK','Elisabeth II',3423,'TC'); -INSERT INTO Country VALUES ('TUV','Tuvalu','Oceania','Polynesia',26.00,1978,12000,66.3,6.00,NULL,'Tuvalu','Constitutional Monarchy','Elisabeth II',3424,'TV'); -INSERT INTO Country VALUES ('UGA','Uganda','Africa','Eastern Africa',241038.00,1962,21778000,42.9,6313.00,6887.00,'Uganda','Republic','Yoweri Museveni',3425,'UG'); -INSERT INTO Country VALUES ('UKR','Ukraine','Europe','Eastern Europe',603700.00,1991,50456000,66.0,42168.00,49677.00,'Ukrajina','Republic','Leonid Kut�ma',3426,'UA'); -INSERT INTO Country VALUES ('HUN','Hungary','Europe','Eastern Europe',93030.00,1918,10043200,71.4,48267.00,45914.00,'Magyarorsz�g','Republic','Ferenc M�dl',3483,'HU'); -INSERT INTO Country VALUES ('URY','Uruguay','South America','South America',175016.00,1828,3337000,75.2,20831.00,19967.00,'Uruguay','Republic','Jorge Batlle Ib��ez',3492,'UY'); -INSERT INTO Country VALUES ('NCL','New Caledonia','Oceania','Melanesia',18575.00,0,214000,72.8,3563.00,NULL,'Nouvelle-Cal�donie','Nonmetropolitan Territory of France','Jacques Chirac',3493,'NC'); -INSERT INTO Country VALUES ('NZL','New Zealand','Oceania','Australia and New Zealand',270534.00,1907,3862000,77.8,54669.00,64960.00,'New Zealand/Aotearoa','Constitutional Monarchy','Elisabeth II',3499,'NZ'); -INSERT INTO Country VALUES ('UZB','Uzbekistan','Asia','Southern and Central Asia',447400.00,1991,24318000,63.7,14194.00,21300.00,'Uzbekiston','Republic','Islam Karimov',3503,'UZ'); -INSERT INTO Country VALUES ('BLR','Belarus','Europe','Eastern Europe',207600.00,1991,10236000,68.0,13714.00,NULL,'Belarus','Republic','Aljaksandr Luka�enka',3520,'BY'); -INSERT INTO Country VALUES ('WLF','Wallis and Futuna','Oceania','Polynesia',200.00,0,15000,NULL,0.00,NULL,'Wallis-et-Futuna','Nonmetropolitan Territory of France','Jacques Chirac',3536,'WF'); -INSERT INTO Country VALUES ('VUT','Vanuatu','Oceania','Melanesia',12189.00,1980,190000,60.6,261.00,246.00,'Vanuatu','Republic','John Bani',3537,'VU'); -INSERT INTO Country VALUES ('VAT','Holy See (Vatican City State)','Europe','Southern Europe',0.40,1929,1000,NULL,9.00,NULL,'Santa Sede/Citt� del Vaticano','Independent Church State','Johannes Paavali II',3538,'VA'); -INSERT INTO Country VALUES ('VEN','Venezuela','South America','South America',912050.00,1811,24170000,73.1,95023.00,88434.00,'Venezuela','Federal Republic','Hugo Ch�vez Fr�as',3539,'VE'); -INSERT INTO Country VALUES ('RUS','Russian Federation','Europe','Eastern Europe',17075400.00,1991,146934000,67.2,276608.00,442989.00,'Rossija','Federal Republic','Vladimir Putin',3580,'RU'); -INSERT INTO Country VALUES ('VNM','Vietnam','Asia','Southeast Asia',331689.00,1945,79832000,69.3,21929.00,22834.00,'Vi�t Nam','Socialistic Republic','Tr�n Duc Luong',3770,'VN'); -INSERT INTO Country VALUES ('EST','Estonia','Europe','Baltic Countries',45227.00,1991,1439200,69.5,5328.00,3371.00,'Eesti','Republic','Lennart Meri',3791,'EE'); -INSERT INTO Country VALUES ('USA','United States','North America','North America',9363520.00,1776,278357000,77.1,8510700.00,8110900.00,'United States','Federal Republic','George W. Bush',3813,'US'); -INSERT INTO Country VALUES ('VIR','Virgin Islands, U.S.','North America','Caribbean',347.00,0,93000,78.1,0.00,NULL,'Virgin Islands of the United States','US Territory','George W. Bush',4067,'VI'); -INSERT INTO Country VALUES ('ZWE','Zimbabwe','Africa','Eastern Africa',390757.00,1980,11669000,37.8,5951.00,8670.00,'Zimbabwe','Republic','Robert G. Mugabe',4068,'ZW'); -INSERT INTO Country VALUES ('PSE','Palestine','Asia','Middle East',6257.00,0,3101000,71.4,4173.00,NULL,'Filastin','Autonomous Area','Yasser (Yasir) Arafat',4074,'PS'); -INSERT INTO Country VALUES ('ATA','Antarctica','Antarctica','Antarctica',13120000.00,0,0,NULL,0.00,NULL,'�','Co-administrated','',NULL,'AQ'); -INSERT INTO Country VALUES ('BVT','Bouvet Island','Antarctica','Antarctica',59.00,0,0,NULL,0.00,NULL,'Bouvet�ya','Dependent Territory of Norway','Harald V',NULL,'BV'); -INSERT INTO Country VALUES ('IOT','British Indian Ocean Territory','Africa','Eastern Africa',78.00,0,0,NULL,0.00,NULL,'British Indian Ocean Territory','Dependent Territory of the UK','Elisabeth II',NULL,'IO'); -INSERT INTO Country VALUES ('SGS','South Georgia and the South Sandwich Islands','Antarctica','Antarctica',3903.00,0,0,NULL,0.00,NULL,'South Georgia and the South Sandwich Islands','Dependent Territory of the UK','Elisabeth II',NULL,'GS'); -INSERT INTO Country VALUES ('HMD','Heard Island and McDonald Islands','Antarctica','Antarctica',359.00,0,0,NULL,0.00,NULL,'Heard and McDonald Islands','Territory of Australia','Elisabeth II',NULL,'HM'); -INSERT INTO Country VALUES ('ATF','French Southern territories','Antarctica','Antarctica',7780.00,0,0,NULL,0.00,NULL,'Terres australes fran�aises','Nonmetropolitan Territory of France','Jacques Chirac',NULL,'TF'); -INSERT INTO Country VALUES ('UMI','United States Minor Outlying Islands','Oceania','Micronesia/Caribbean',16.00,0,0,NULL,0.00,NULL,'United States Minor Outlying Islands','Dependent Territory of the US','George W. Bush',NULL,'UM'); - -/*!40000 ALTER TABLE Country ENABLE KEYS */; - --- --- Table structure for table 'CountryLanguage' --- - -CREATE TABLE CountryLanguage ( - Country char(3) NOT NULL default '', - Language char(30) NOT NULL default '', - IsOfficial enum('T','F') NOT NULL default 'F', - Percentage float(3,1) NOT NULL default '0.0', - PRIMARY KEY (Country,Language) -) TYPE=MyISAM; - -/*!40000 ALTER TABLE CountryLanguage DISABLE KEYS */; - --- --- Dumping data for table 'CountryLanguage' --- - - -INSERT INTO CountryLanguage VALUES ('AFG','Pashto','T',52.4); -INSERT INTO CountryLanguage VALUES ('NLD','Dutch','T',95.6); -INSERT INTO CountryLanguage VALUES ('ANT','Papiamento','T',86.2); -INSERT INTO CountryLanguage VALUES ('ALB','Albaniana','T',97.9); -INSERT INTO CountryLanguage VALUES ('DZA','Arabic','T',86.0); -INSERT INTO CountryLanguage VALUES ('ASM','Samoan','T',90.6); -INSERT INTO CountryLanguage VALUES ('AND','Spanish','F',44.6); -INSERT INTO CountryLanguage VALUES ('AGO','Ovimbundu','F',37.2); -INSERT INTO CountryLanguage VALUES ('AIA','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('ATG','Creole English','F',95.7); -INSERT INTO CountryLanguage VALUES ('ARE','Arabic','T',42.0); -INSERT INTO CountryLanguage VALUES ('ARG','Spanish','T',96.8); -INSERT INTO CountryLanguage VALUES ('ARM','Armenian','T',93.4); -INSERT INTO CountryLanguage VALUES ('ABW','Papiamento','F',76.7); -INSERT INTO CountryLanguage VALUES ('AUS','English','T',81.2); -INSERT INTO CountryLanguage VALUES ('AZE','Azerbaijani','T',89.0); -INSERT INTO CountryLanguage VALUES ('BHS','Creole English','F',89.7); -INSERT INTO CountryLanguage VALUES ('BHR','Arabic','T',67.7); -INSERT INTO CountryLanguage VALUES ('BGD','Bengali','T',97.7); -INSERT INTO CountryLanguage VALUES ('BRB','Bajan','F',95.1); -INSERT INTO CountryLanguage VALUES ('BEL','Dutch','T',59.2); -INSERT INTO CountryLanguage VALUES ('BLZ','English','T',50.8); -INSERT INTO CountryLanguage VALUES ('BEN','Fon','F',39.8); -INSERT INTO CountryLanguage VALUES ('BMU','English','T',100.0); -INSERT INTO CountryLanguage VALUES ('BTN','Dzongkha','T',50.0); -INSERT INTO CountryLanguage VALUES ('BOL','Spanish','T',87.7); -INSERT INTO CountryLanguage VALUES ('BIH','Serbo-Croatian','T',99.2); -INSERT INTO CountryLanguage VALUES ('BWA','Tswana','F',75.5); -INSERT INTO CountryLanguage VALUES ('BRA','Portuguese','T',97.5); -INSERT INTO CountryLanguage VALUES ('GBR','English','T',97.3); -INSERT INTO CountryLanguage VALUES ('VGB','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('BRN','Malay','T',45.5); -INSERT INTO CountryLanguage VALUES ('BGR','Bulgariana','T',83.2); -INSERT INTO CountryLanguage VALUES ('BFA','Mossi','F',50.2); -INSERT INTO CountryLanguage VALUES ('BDI','Kirundi','T',98.1); -INSERT INTO CountryLanguage VALUES ('CYM','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('CHL','Spanish','T',89.7); -INSERT INTO CountryLanguage VALUES ('COK','Maori','T',0.0); -INSERT INTO CountryLanguage VALUES ('CRI','Spanish','T',97.5); -INSERT INTO CountryLanguage VALUES ('DJI','Somali','F',43.9); -INSERT INTO CountryLanguage VALUES ('DMA','Creole English','F',100.0); -INSERT INTO CountryLanguage VALUES ('DOM','Spanish','T',98.0); -INSERT INTO CountryLanguage VALUES ('ECU','Spanish','T',93.0); -INSERT INTO CountryLanguage VALUES ('EGY','Arabic','T',98.8); -INSERT INTO CountryLanguage VALUES ('SLV','Spanish','T',100.0); -INSERT INTO CountryLanguage VALUES ('ERI','Tigrinja','T',49.1); -INSERT INTO CountryLanguage VALUES ('ESP','Spanish','T',74.4); -INSERT INTO CountryLanguage VALUES ('ZAF','Zulu','T',22.7); -INSERT INTO CountryLanguage VALUES ('ETH','Oromo','F',31.0); -INSERT INTO CountryLanguage VALUES ('FLK','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('FJI','Fijian','T',50.8); -INSERT INTO CountryLanguage VALUES ('PHL','Pilipino','T',29.3); -INSERT INTO CountryLanguage VALUES ('FRO','Faroese','T',100.0); -INSERT INTO CountryLanguage VALUES ('GAB','Fang','F',35.8); -INSERT INTO CountryLanguage VALUES ('GMB','Malinke','F',34.1); -INSERT INTO CountryLanguage VALUES ('GEO','Georgiana','T',71.7); -INSERT INTO CountryLanguage VALUES ('GHA','Akan','F',52.4); -INSERT INTO CountryLanguage VALUES ('GIB','English','T',88.9); -INSERT INTO CountryLanguage VALUES ('GRD','Creole English','F',100.0); -INSERT INTO CountryLanguage VALUES ('GRL','Greenlandic','T',87.5); -INSERT INTO CountryLanguage VALUES ('GLP','Creole French','F',95.0); -INSERT INTO CountryLanguage VALUES ('GUM','English','T',37.5); -INSERT INTO CountryLanguage VALUES ('GTM','Spanish','T',64.7); -INSERT INTO CountryLanguage VALUES ('GIN','Ful','F',38.6); -INSERT INTO CountryLanguage VALUES ('GNB','Crioulo','F',36.4); -INSERT INTO CountryLanguage VALUES ('GUY','Creole English','F',96.4); -INSERT INTO CountryLanguage VALUES ('HTI','Haiti Creole','F',100.0); -INSERT INTO CountryLanguage VALUES ('HND','Spanish','T',97.2); -INSERT INTO CountryLanguage VALUES ('HKG','Canton Chinese','F',88.7); -INSERT INTO CountryLanguage VALUES ('SJM','Norwegian','T',0.0); -INSERT INTO CountryLanguage VALUES ('IDN','Javanese','F',39.4); -INSERT INTO CountryLanguage VALUES ('IND','Hindi','T',39.9); -INSERT INTO CountryLanguage VALUES ('IRQ','Arabic','T',77.2); -INSERT INTO CountryLanguage VALUES ('IRN','Persian','T',45.7); -INSERT INTO CountryLanguage VALUES ('IRL','English','T',98.4); -INSERT INTO CountryLanguage VALUES ('ISL','Icelandic','T',95.7); -INSERT INTO CountryLanguage VALUES ('ISR','Hebrew','T',63.1); -INSERT INTO CountryLanguage VALUES ('ITA','Italian','T',94.1); -INSERT INTO CountryLanguage VALUES ('TMP','Sunda','F',0.0); -INSERT INTO CountryLanguage VALUES ('AUT','German','T',92.0); -INSERT INTO CountryLanguage VALUES ('JAM','Creole English','F',94.2); -INSERT INTO CountryLanguage VALUES ('JPN','Japanese','T',99.1); -INSERT INTO CountryLanguage VALUES ('YEM','Arabic','T',99.6); -INSERT INTO CountryLanguage VALUES ('JOR','Arabic','T',97.9); -INSERT INTO CountryLanguage VALUES ('CXR','Chinese','F',0.0); -INSERT INTO CountryLanguage VALUES ('YUG','Serbo-Croatian','T',75.2); -INSERT INTO CountryLanguage VALUES ('KHM','Khmer','T',88.6); -INSERT INTO CountryLanguage VALUES ('CMR','Fang','F',19.7); -INSERT INTO CountryLanguage VALUES ('CAN','English','T',60.4); -INSERT INTO CountryLanguage VALUES ('CPV','Crioulo','F',100.0); -INSERT INTO CountryLanguage VALUES ('KAZ','Kazakh','T',46.0); -INSERT INTO CountryLanguage VALUES ('KEN','Kikuyu','F',20.9); -INSERT INTO CountryLanguage VALUES ('CAF','Gbaya','F',23.8); -INSERT INTO CountryLanguage VALUES ('CHN','Chinese','T',92.0); -INSERT INTO CountryLanguage VALUES ('KGZ','Kirgiz','T',59.7); -INSERT INTO CountryLanguage VALUES ('KIR','Kiribati','T',98.9); -INSERT INTO CountryLanguage VALUES ('COL','Spanish','T',99.0); -INSERT INTO CountryLanguage VALUES ('COM','Comorian','T',75.0); -INSERT INTO CountryLanguage VALUES ('COG','Kongo','F',51.5); -INSERT INTO CountryLanguage VALUES ('COD','Luba','F',18.0); -INSERT INTO CountryLanguage VALUES ('CCK','Malay','F',0.0); -INSERT INTO CountryLanguage VALUES ('PRK','Korean','T',99.9); -INSERT INTO CountryLanguage VALUES ('KOR','Korean','T',99.9); -INSERT INTO CountryLanguage VALUES ('GRC','Greek','T',98.5); -INSERT INTO CountryLanguage VALUES ('HRV','Serbo-Croatian','T',95.9); -INSERT INTO CountryLanguage VALUES ('CUB','Spanish','T',100.0); -INSERT INTO CountryLanguage VALUES ('KWT','Arabic','T',78.1); -INSERT INTO CountryLanguage VALUES ('CYP','Greek','T',74.1); -INSERT INTO CountryLanguage VALUES ('LAO','Lao','T',67.2); -INSERT INTO CountryLanguage VALUES ('LVA','Latvian','T',55.1); -INSERT INTO CountryLanguage VALUES ('LSO','Sotho','T',85.0); -INSERT INTO CountryLanguage VALUES ('LBN','Arabic','T',93.0); -INSERT INTO CountryLanguage VALUES ('LBR','Kpelle','F',19.5); -INSERT INTO CountryLanguage VALUES ('LBY','Arabic','T',96.0); -INSERT INTO CountryLanguage VALUES ('LIE','German','T',89.0); -INSERT INTO CountryLanguage VALUES ('LTU','Lithuanian','T',81.6); -INSERT INTO CountryLanguage VALUES ('LUX','Luxembourgish','T',64.4); -INSERT INTO CountryLanguage VALUES ('ESH','Arabic','T',100.0); -INSERT INTO CountryLanguage VALUES ('MAC','Canton Chinese','F',85.6); -INSERT INTO CountryLanguage VALUES ('MDG','Malagasy','T',98.9); -INSERT INTO CountryLanguage VALUES ('MKD','Macedonian','T',66.5); -INSERT INTO CountryLanguage VALUES ('MWI','Chichewa','T',58.3); -INSERT INTO CountryLanguage VALUES ('MDV','Dhivehi','T',100.0); -INSERT INTO CountryLanguage VALUES ('MYS','Malay','T',58.4); -INSERT INTO CountryLanguage VALUES ('MLI','Bambara','F',31.8); -INSERT INTO CountryLanguage VALUES ('MLT','Maltese','T',95.8); -INSERT INTO CountryLanguage VALUES ('MAR','Arabic','T',65.0); -INSERT INTO CountryLanguage VALUES ('MHL','Marshallese','T',96.8); -INSERT INTO CountryLanguage VALUES ('MTQ','Creole French','F',96.6); -INSERT INTO CountryLanguage VALUES ('MRT','Hassaniya','F',81.7); -INSERT INTO CountryLanguage VALUES ('MUS','Creole French','F',70.6); -INSERT INTO CountryLanguage VALUES ('MYT','Mahor�','F',41.9); -INSERT INTO CountryLanguage VALUES ('MEX','Spanish','T',92.1); -INSERT INTO CountryLanguage VALUES ('FSM','Trukese','F',41.6); -INSERT INTO CountryLanguage VALUES ('MDA','Romanian','T',61.9); -INSERT INTO CountryLanguage VALUES ('MCO','French','T',41.9); -INSERT INTO CountryLanguage VALUES ('MNG','Mongolian','T',78.8); -INSERT INTO CountryLanguage VALUES ('MSR','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('MOZ','Makua','F',27.8); -INSERT INTO CountryLanguage VALUES ('MMR','Burmese','T',69.0); -INSERT INTO CountryLanguage VALUES ('NAM','Ovambo','F',50.7); -INSERT INTO CountryLanguage VALUES ('NRU','Nauru','T',57.5); -INSERT INTO CountryLanguage VALUES ('NPL','Nepali','T',50.4); -INSERT INTO CountryLanguage VALUES ('NIC','Spanish','T',97.6); -INSERT INTO CountryLanguage VALUES ('NER','Hausa','F',53.1); -INSERT INTO CountryLanguage VALUES ('NGA','Joruba','F',21.4); -INSERT INTO CountryLanguage VALUES ('NIU','Niue','F',0.0); -INSERT INTO CountryLanguage VALUES ('NFK','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('NOR','Norwegian','T',96.6); -INSERT INTO CountryLanguage VALUES ('CIV','Akan','F',30.0); -INSERT INTO CountryLanguage VALUES ('OMN','Arabic','T',76.7); -INSERT INTO CountryLanguage VALUES ('PAK','Punjabi','F',48.2); -INSERT INTO CountryLanguage VALUES ('PLW','Palau','T',82.2); -INSERT INTO CountryLanguage VALUES ('PAN','Spanish','T',76.8); -INSERT INTO CountryLanguage VALUES ('PNG','Papuan Languages','F',78.1); -INSERT INTO CountryLanguage VALUES ('PRY','Spanish','T',55.1); -INSERT INTO CountryLanguage VALUES ('PER','Spanish','T',79.8); -INSERT INTO CountryLanguage VALUES ('PCN','Pitcairnese','F',0.0); -INSERT INTO CountryLanguage VALUES ('MNP','Philippene Languages','F',34.1); -INSERT INTO CountryLanguage VALUES ('PRT','Portuguese','T',99.0); -INSERT INTO CountryLanguage VALUES ('PRI','Spanish','T',51.3); -INSERT INTO CountryLanguage VALUES ('POL','Polish','T',97.6); -INSERT INTO CountryLanguage VALUES ('GNQ','Fang','F',84.8); -INSERT INTO CountryLanguage VALUES ('QAT','Arabic','T',40.7); -INSERT INTO CountryLanguage VALUES ('FRA','French','T',93.6); -INSERT INTO CountryLanguage VALUES ('GUF','Creole French','F',94.3); -INSERT INTO CountryLanguage VALUES ('PYF','Tahitian','F',46.4); -INSERT INTO CountryLanguage VALUES ('REU','Creole French','F',91.5); -INSERT INTO CountryLanguage VALUES ('ROM','Romanian','T',90.7); -INSERT INTO CountryLanguage VALUES ('RWA','Rwanda','T',100.0); -INSERT INTO CountryLanguage VALUES ('SWE','Swedish','T',89.5); -INSERT INTO CountryLanguage VALUES ('SHN','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('KNA','Creole English','F',100.0); -INSERT INTO CountryLanguage VALUES ('LCA','Creole French','F',80.0); -INSERT INTO CountryLanguage VALUES ('VCT','Creole English','F',99.1); -INSERT INTO CountryLanguage VALUES ('SPM','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('DEU','German','T',91.3); -INSERT INTO CountryLanguage VALUES ('SLB','Malenasian Languages','F',85.6); -INSERT INTO CountryLanguage VALUES ('ZMB','Bemba','F',29.7); -INSERT INTO CountryLanguage VALUES ('WSM','Samoan-English','F',52.0); -INSERT INTO CountryLanguage VALUES ('SMR','Italian','T',100.0); -INSERT INTO CountryLanguage VALUES ('STP','Crioulo','F',86.3); -INSERT INTO CountryLanguage VALUES ('SAU','Arabic','T',95.0); -INSERT INTO CountryLanguage VALUES ('SEN','Wolof','T',48.1); -INSERT INTO CountryLanguage VALUES ('SYC','Seselwa','F',91.3); -INSERT INTO CountryLanguage VALUES ('SLE','Mende','F',34.8); -INSERT INTO CountryLanguage VALUES ('SGP','Chinese','T',77.1); -INSERT INTO CountryLanguage VALUES ('SVK','Slovak','T',85.6); -INSERT INTO CountryLanguage VALUES ('SVN','Slovene','T',87.9); -INSERT INTO CountryLanguage VALUES ('SOM','Somali','T',98.3); -INSERT INTO CountryLanguage VALUES ('LKA','Singali','T',60.3); -INSERT INTO CountryLanguage VALUES ('SDN','Arabic','T',49.4); -INSERT INTO CountryLanguage VALUES ('FIN','Finnish','T',92.7); -INSERT INTO CountryLanguage VALUES ('SUR','Sranantonga','F',81.0); -INSERT INTO CountryLanguage VALUES ('SWZ','Swazi','T',89.9); -INSERT INTO CountryLanguage VALUES ('CHE','German','T',63.6); -INSERT INTO CountryLanguage VALUES ('SYR','Arabic','T',90.0); -INSERT INTO CountryLanguage VALUES ('TJK','Tadzhik','T',62.2); -INSERT INTO CountryLanguage VALUES ('TWN','Min','F',66.7); -INSERT INTO CountryLanguage VALUES ('TZA','Nyamwesi','F',21.1); -INSERT INTO CountryLanguage VALUES ('DNK','Danish','T',93.5); -INSERT INTO CountryLanguage VALUES ('THA','Thai','T',52.6); -INSERT INTO CountryLanguage VALUES ('TGO','Ewe','T',23.2); -INSERT INTO CountryLanguage VALUES ('TKL','Tokelau','F',0.0); -INSERT INTO CountryLanguage VALUES ('TON','Tongan','T',98.3); -INSERT INTO CountryLanguage VALUES ('TTO','English','F',93.5); -INSERT INTO CountryLanguage VALUES ('TCD','Sara','F',27.7); -INSERT INTO CountryLanguage VALUES ('CZE','Czech','T',81.2); -INSERT INTO CountryLanguage VALUES ('TUN','Arabic','T',69.9); -INSERT INTO CountryLanguage VALUES ('TUR','Turkish','T',87.6); -INSERT INTO CountryLanguage VALUES ('TKM','Turkmenian','T',76.7); -INSERT INTO CountryLanguage VALUES ('TCA','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('TUV','Tuvalu','T',92.5); -INSERT INTO CountryLanguage VALUES ('UGA','Ganda','F',18.1); -INSERT INTO CountryLanguage VALUES ('UKR','Ukrainian','T',64.7); -INSERT INTO CountryLanguage VALUES ('HUN','Hungarian','T',98.5); -INSERT INTO CountryLanguage VALUES ('URY','Spanish','T',95.7); -INSERT INTO CountryLanguage VALUES ('NCL','Malenasian Languages','F',45.4); -INSERT INTO CountryLanguage VALUES ('NZL','English','T',87.0); -INSERT INTO CountryLanguage VALUES ('UZB','Uzbek','T',72.6); -INSERT INTO CountryLanguage VALUES ('BLR','Belorussian','T',65.6); -INSERT INTO CountryLanguage VALUES ('WLF','Wallis','F',0.0); -INSERT INTO CountryLanguage VALUES ('VUT','Bislama','T',56.6); -INSERT INTO CountryLanguage VALUES ('VAT','Italian','T',0.0); -INSERT INTO CountryLanguage VALUES ('VEN','Spanish','T',96.9); -INSERT INTO CountryLanguage VALUES ('RUS','Russian','T',86.6); -INSERT INTO CountryLanguage VALUES ('VNM','Vietnamese','T',86.8); -INSERT INTO CountryLanguage VALUES ('EST','Estonian','T',65.3); -INSERT INTO CountryLanguage VALUES ('USA','English','T',86.2); -INSERT INTO CountryLanguage VALUES ('VIR','English','T',81.7); -INSERT INTO CountryLanguage VALUES ('UMI','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('ZWE','Shona','F',72.1); -INSERT INTO CountryLanguage VALUES ('PSE','Arabic','F',95.9); -INSERT INTO CountryLanguage VALUES ('AFG','Dari','T',32.1); -INSERT INTO CountryLanguage VALUES ('NLD','Fries','F',3.7); -INSERT INTO CountryLanguage VALUES ('ANT','English','F',7.8); -INSERT INTO CountryLanguage VALUES ('ALB','Greek','F',1.8); -INSERT INTO CountryLanguage VALUES ('DZA','Berberi','F',14.0); -INSERT INTO CountryLanguage VALUES ('ASM','English','T',3.1); -INSERT INTO CountryLanguage VALUES ('AND','Catalan','T',32.3); -INSERT INTO CountryLanguage VALUES ('AGO','Mbundu','F',21.6); -INSERT INTO CountryLanguage VALUES ('ATG','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('ARE','Hindi','F',0.0); -INSERT INTO CountryLanguage VALUES ('ARG','Italian','F',1.7); -INSERT INTO CountryLanguage VALUES ('ARM','Azerbaijani','F',2.6); -INSERT INTO CountryLanguage VALUES ('ABW','English','F',9.5); -INSERT INTO CountryLanguage VALUES ('AUS','Italian','F',2.2); -INSERT INTO CountryLanguage VALUES ('AZE','Russian','F',3.0); -INSERT INTO CountryLanguage VALUES ('BHS','Creole French','F',10.3); -INSERT INTO CountryLanguage VALUES ('BHR','English','F',0.0); -INSERT INTO CountryLanguage VALUES ('BGD','Chakma','F',0.4); -INSERT INTO CountryLanguage VALUES ('BRB','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('BEL','French','T',32.6); -INSERT INTO CountryLanguage VALUES ('BLZ','Spanish','F',31.6); -INSERT INTO CountryLanguage VALUES ('BEN','Joruba','F',12.2); -INSERT INTO CountryLanguage VALUES ('BTN','Nepali','F',34.8); -INSERT INTO CountryLanguage VALUES ('BOL','Ket�ua','T',8.1); -INSERT INTO CountryLanguage VALUES ('BWA','Shona','F',12.3); -INSERT INTO CountryLanguage VALUES ('BRA','German','F',0.5); -INSERT INTO CountryLanguage VALUES ('GBR','Kymri','F',0.9); -INSERT INTO CountryLanguage VALUES ('BRN','Malay-English','F',28.8); -INSERT INTO CountryLanguage VALUES ('BGR','Turkish','F',9.4); -INSERT INTO CountryLanguage VALUES ('BFA','Ful','F',9.7); -INSERT INTO CountryLanguage VALUES ('BDI','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('CHL','Araucan','F',9.6); -INSERT INTO CountryLanguage VALUES ('COK','English','F',0.0); -INSERT INTO CountryLanguage VALUES ('CRI','Creole English','F',2.0); -INSERT INTO CountryLanguage VALUES ('DJI','Afar','F',34.8); -INSERT INTO CountryLanguage VALUES ('DMA','Creole French','F',0.0); -INSERT INTO CountryLanguage VALUES ('DOM','Creole French','F',2.0); -INSERT INTO CountryLanguage VALUES ('ECU','Ket�ua','F',7.0); -INSERT INTO CountryLanguage VALUES ('EGY','Sinaberberi','F',0.0); -INSERT INTO CountryLanguage VALUES ('SLV','Nahua','F',0.0); -INSERT INTO CountryLanguage VALUES ('ERI','Tigre','F',31.7); -INSERT INTO CountryLanguage VALUES ('ESP','Catalan','F',16.9); -INSERT INTO CountryLanguage VALUES ('ZAF','Xhosa','T',17.7); -INSERT INTO CountryLanguage VALUES ('ETH','Amhara','F',30.0); -INSERT INTO CountryLanguage VALUES ('FJI','Hindi','F',43.7); -INSERT INTO CountryLanguage VALUES ('PHL','Cebuano','F',23.3); -INSERT INTO CountryLanguage VALUES ('FRO','Danish','T',0.0); -INSERT INTO CountryLanguage VALUES ('GAB','Punu-sira-nzebi','F',17.1); -INSERT INTO CountryLanguage VALUES ('GMB','Ful','F',16.2); -INSERT INTO CountryLanguage VALUES ('GEO','Russian','F',8.8); -INSERT INTO CountryLanguage VALUES ('GHA','Mossi','F',15.8); -INSERT INTO CountryLanguage VALUES ('GIB','Arabic','F',7.4); -INSERT INTO CountryLanguage VALUES ('GRL','Danish','T',12.5); -INSERT INTO CountryLanguage VALUES ('GLP','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('GUM','Chamorro','T',29.6); -INSERT INTO CountryLanguage VALUES ('GTM','Quich�','F',10.1); -INSERT INTO CountryLanguage VALUES ('GIN','Malinke','F',23.2); -INSERT INTO CountryLanguage VALUES ('GNB','Ful','F',16.6); -INSERT INTO CountryLanguage VALUES ('GUY','Caribbean','F',2.2); -INSERT INTO CountryLanguage VALUES ('HTI','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('HND','Garifuna','F',1.3); -INSERT INTO CountryLanguage VALUES ('HKG','English','T',2.2); -INSERT INTO CountryLanguage VALUES ('SJM','Russian','F',0.0); -INSERT INTO CountryLanguage VALUES ('IDN','Sunda','F',15.8); -INSERT INTO CountryLanguage VALUES ('IND','Bengali','F',8.2); -INSERT INTO CountryLanguage VALUES ('IRQ','Kurdish','F',19.0); -INSERT INTO CountryLanguage VALUES ('IRN','Azerbaijani','F',16.8); -INSERT INTO CountryLanguage VALUES ('IRL','Irish','T',1.6); -INSERT INTO CountryLanguage VALUES ('ISL','English','F',0.0); -INSERT INTO CountryLanguage VALUES ('ISR','Arabic','T',18.0); -INSERT INTO CountryLanguage VALUES ('ITA','Sardinian','F',2.7); -INSERT INTO CountryLanguage VALUES ('TMP','Portuguese','T',0.0); -INSERT INTO CountryLanguage VALUES ('AUT','Serbo-Croatian','F',2.2); -INSERT INTO CountryLanguage VALUES ('JAM','Hindi','F',1.9); -INSERT INTO CountryLanguage VALUES ('JPN','Korean','F',0.5); -INSERT INTO CountryLanguage VALUES ('YEM','Soqutri','F',0.0); -INSERT INTO CountryLanguage VALUES ('JOR','Circassian','F',1.0); -INSERT INTO CountryLanguage VALUES ('CXR','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('YUG','Albaniana','F',16.5); -INSERT INTO CountryLanguage VALUES ('KHM','Vietnamese','F',5.5); -INSERT INTO CountryLanguage VALUES ('CMR','Bamileke-bamum','F',18.6); -INSERT INTO CountryLanguage VALUES ('CAN','French','T',23.4); -INSERT INTO CountryLanguage VALUES ('CPV','Portuguese','T',0.0); -INSERT INTO CountryLanguage VALUES ('KAZ','Russian','F',34.7); -INSERT INTO CountryLanguage VALUES ('KEN','Luhya','F',13.8); -INSERT INTO CountryLanguage VALUES ('CAF','Banda','F',23.5); -INSERT INTO CountryLanguage VALUES ('CHN','Zhuang','F',1.4); -INSERT INTO CountryLanguage VALUES ('KGZ','Russian','T',16.2); -INSERT INTO CountryLanguage VALUES ('KIR','Tuvalu','F',0.5); -INSERT INTO CountryLanguage VALUES ('COL','Chibcha','F',0.4); -INSERT INTO CountryLanguage VALUES ('COM','Comorian-French','F',12.9); -INSERT INTO CountryLanguage VALUES ('COG','Teke','F',17.3); -INSERT INTO CountryLanguage VALUES ('COD','Kongo','F',16.0); -INSERT INTO CountryLanguage VALUES ('CCK','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('PRK','Chinese','F',0.1); -INSERT INTO CountryLanguage VALUES ('KOR','Chinese','F',0.1); -INSERT INTO CountryLanguage VALUES ('GRC','Turkish','F',0.9); -INSERT INTO CountryLanguage VALUES ('HRV','Slovene','F',0.0); -INSERT INTO CountryLanguage VALUES ('KWT','English','F',0.0); -INSERT INTO CountryLanguage VALUES ('CYP','Turkish','T',22.4); -INSERT INTO CountryLanguage VALUES ('LAO','Mon-khmer','F',16.5); -INSERT INTO CountryLanguage VALUES ('LVA','Russian','F',32.5); -INSERT INTO CountryLanguage VALUES ('LSO','Zulu','F',15.0); -INSERT INTO CountryLanguage VALUES ('LBN','Armenian','F',5.9); -INSERT INTO CountryLanguage VALUES ('LBR','Bassa','F',13.7); -INSERT INTO CountryLanguage VALUES ('LBY','Berberi','F',1.0); -INSERT INTO CountryLanguage VALUES ('LIE','Italian','F',2.5); -INSERT INTO CountryLanguage VALUES ('LTU','Russian','F',8.1); -INSERT INTO CountryLanguage VALUES ('LUX','Portuguese','F',13.0); -INSERT INTO CountryLanguage VALUES ('MAC','Portuguese','T',2.3); -INSERT INTO CountryLanguage VALUES ('MDG','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('MKD','Albaniana','F',22.9); -INSERT INTO CountryLanguage VALUES ('MWI','Lomwe','F',18.4); -INSERT INTO CountryLanguage VALUES ('MDV','English','F',0.0); -INSERT INTO CountryLanguage VALUES ('MYS','Chinese','F',9.0); -INSERT INTO CountryLanguage VALUES ('MLI','Ful','F',13.9); -INSERT INTO CountryLanguage VALUES ('MLT','English','T',2.1); -INSERT INTO CountryLanguage VALUES ('MAR','Berberi','F',33.0); -INSERT INTO CountryLanguage VALUES ('MHL','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('MTQ','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('MRT','Wolof','F',6.6); -INSERT INTO CountryLanguage VALUES ('MUS','Bhojpuri','F',21.1); -INSERT INTO CountryLanguage VALUES ('MYT','French','T',20.3); -INSERT INTO CountryLanguage VALUES ('MEX','N�huatl','F',1.8); -INSERT INTO CountryLanguage VALUES ('FSM','Pohnpei','F',23.8); -INSERT INTO CountryLanguage VALUES ('MDA','Russian','F',23.2); -INSERT INTO CountryLanguage VALUES ('MCO','Monegasque','F',16.1); -INSERT INTO CountryLanguage VALUES ('MNG','Kazakh','F',5.9); -INSERT INTO CountryLanguage VALUES ('MOZ','Tsonga','F',12.4); -INSERT INTO CountryLanguage VALUES ('MMR','Shan','F',8.5); -INSERT INTO CountryLanguage VALUES ('NAM','Nama','F',12.4); -INSERT INTO CountryLanguage VALUES ('NRU','Kiribati','F',17.9); -INSERT INTO CountryLanguage VALUES ('NPL','Maithili','F',11.9); -INSERT INTO CountryLanguage VALUES ('NIC','Miskito','F',1.6); -INSERT INTO CountryLanguage VALUES ('NER','Songhai-zerma','F',21.2); -INSERT INTO CountryLanguage VALUES ('NGA','Hausa','F',21.1); -INSERT INTO CountryLanguage VALUES ('NIU','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('NOR','English','F',0.5); -INSERT INTO CountryLanguage VALUES ('CIV','Gur','F',11.7); -INSERT INTO CountryLanguage VALUES ('OMN','Balochi','F',0.0); -INSERT INTO CountryLanguage VALUES ('PAK','Pashto','F',13.1); -INSERT INTO CountryLanguage VALUES ('PLW','Philippene Languages','F',9.2); -INSERT INTO CountryLanguage VALUES ('PAN','Creole English','F',14.0); -INSERT INTO CountryLanguage VALUES ('PNG','Malenasian Languages','F',20.0); -INSERT INTO CountryLanguage VALUES ('PRY','Guaran�','T',40.1); -INSERT INTO CountryLanguage VALUES ('PER','Ket�ua','T',16.4); -INSERT INTO CountryLanguage VALUES ('MNP','Chamorro','F',30.0); -INSERT INTO CountryLanguage VALUES ('PRI','English','F',47.4); -INSERT INTO CountryLanguage VALUES ('POL','German','F',1.3); -INSERT INTO CountryLanguage VALUES ('GNQ','Bubi','F',8.7); -INSERT INTO CountryLanguage VALUES ('QAT','Urdu','F',0.0); -INSERT INTO CountryLanguage VALUES ('FRA','Arabic','F',2.5); -INSERT INTO CountryLanguage VALUES ('GUF','Indian Languages','F',1.9); -INSERT INTO CountryLanguage VALUES ('PYF','French','T',40.8); -INSERT INTO CountryLanguage VALUES ('REU','Chinese','F',2.8); -INSERT INTO CountryLanguage VALUES ('ROM','Hungarian','F',7.2); -INSERT INTO CountryLanguage VALUES ('RWA','French','T',0.0); -INSERT INTO CountryLanguage VALUES ('SWE','Finnish','F',2.4); -INSERT INTO CountryLanguage VALUES ('KNA','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('LCA','English','T',20.0); -INSERT INTO CountryLanguage VALUES ('VCT','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('DEU','Turkish','F',2.6); -INSERT INTO CountryLanguage VALUES ('SLB','Papuan Languages','F',8.6); -INSERT INTO CountryLanguage VALUES ('ZMB','Tongan','F',11.0); -INSERT INTO CountryLanguage VALUES ('WSM','Samoan','T',47.5); -INSERT INTO CountryLanguage VALUES ('STP','French','F',0.7); -INSERT INTO CountryLanguage VALUES ('SEN','Ful','F',21.7); -INSERT INTO CountryLanguage VALUES ('SYC','English','T',3.8); -INSERT INTO CountryLanguage VALUES ('SLE','Temne','F',31.8); -INSERT INTO CountryLanguage VALUES ('SGP','Malay','T',14.1); -INSERT INTO CountryLanguage VALUES ('SVK','Hungarian','F',10.5); -INSERT INTO CountryLanguage VALUES ('SVN','Serbo-Croatian','F',7.9); -INSERT INTO CountryLanguage VALUES ('SOM','Arabic','T',0.0); -INSERT INTO CountryLanguage VALUES ('LKA','Tamil','T',19.6); -INSERT INTO CountryLanguage VALUES ('SDN','Dinka','F',11.5); -INSERT INTO CountryLanguage VALUES ('FIN','Swedish','T',5.7); -INSERT INTO CountryLanguage VALUES ('SUR','Hindi','F',0.0); -INSERT INTO CountryLanguage VALUES ('SWZ','Zulu','F',2.0); -INSERT INTO CountryLanguage VALUES ('CHE','French','T',19.2); -INSERT INTO CountryLanguage VALUES ('SYR','Kurdish','F',9.0); -INSERT INTO CountryLanguage VALUES ('TJK','Uzbek','F',23.2); -INSERT INTO CountryLanguage VALUES ('TWN','Mandarin Chinese','T',20.1); -INSERT INTO CountryLanguage VALUES ('TZA','Swahili','T',8.8); -INSERT INTO CountryLanguage VALUES ('DNK','Turkish','F',0.8); -INSERT INTO CountryLanguage VALUES ('THA','Lao','F',26.9); -INSERT INTO CountryLanguage VALUES ('TGO','Kaby�','T',13.8); -INSERT INTO CountryLanguage VALUES ('TKL','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('TON','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('TTO','Hindi','F',3.4); -INSERT INTO CountryLanguage VALUES ('TCD','Arabic','T',12.3); -INSERT INTO CountryLanguage VALUES ('CZE','Moravian','F',12.9); -INSERT INTO CountryLanguage VALUES ('TUN','Arabic-French','F',26.3); -INSERT INTO CountryLanguage VALUES ('TUR','Kurdish','F',10.6); -INSERT INTO CountryLanguage VALUES ('TKM','Uzbek','F',9.2); -INSERT INTO CountryLanguage VALUES ('TUV','Kiribati','F',7.5); -INSERT INTO CountryLanguage VALUES ('UGA','Nkole','F',10.7); -INSERT INTO CountryLanguage VALUES ('UKR','Russian','F',32.9); -INSERT INTO CountryLanguage VALUES ('HUN','Romani','F',0.5); -INSERT INTO CountryLanguage VALUES ('NCL','French','T',34.3); -INSERT INTO CountryLanguage VALUES ('NZL','Maori','F',4.3); -INSERT INTO CountryLanguage VALUES ('UZB','Russian','F',10.9); -INSERT INTO CountryLanguage VALUES ('BLR','Russian','T',32.0); -INSERT INTO CountryLanguage VALUES ('WLF','Futuna','F',0.0); -INSERT INTO CountryLanguage VALUES ('VUT','English','T',28.3); -INSERT INTO CountryLanguage VALUES ('VEN','Goajiro','F',0.4); -INSERT INTO CountryLanguage VALUES ('RUS','Tatar','F',3.2); -INSERT INTO CountryLanguage VALUES ('VNM','Tho','F',1.8); -INSERT INTO CountryLanguage VALUES ('EST','Russian','F',27.8); -INSERT INTO CountryLanguage VALUES ('USA','Spanish','F',7.5); -INSERT INTO CountryLanguage VALUES ('VIR','Spanish','F',13.3); -INSERT INTO CountryLanguage VALUES ('ZWE','Ndebele','F',16.2); -INSERT INTO CountryLanguage VALUES ('PSE','Hebrew','F',4.1); -INSERT INTO CountryLanguage VALUES ('AFG','Uzbek','F',8.8); -INSERT INTO CountryLanguage VALUES ('NLD','Arabic','F',0.9); -INSERT INTO CountryLanguage VALUES ('ANT','Dutch','T',0.0); -INSERT INTO CountryLanguage VALUES ('ALB','Macedonian','F',0.1); -INSERT INTO CountryLanguage VALUES ('ASM','Tongan','F',3.1); -INSERT INTO CountryLanguage VALUES ('AND','Portuguese','F',10.8); -INSERT INTO CountryLanguage VALUES ('AGO','Kongo','F',13.2); -INSERT INTO CountryLanguage VALUES ('ARG','Indian Languages','F',0.3); -INSERT INTO CountryLanguage VALUES ('ABW','Spanish','F',7.4); -INSERT INTO CountryLanguage VALUES ('AUS','Greek','F',1.6); -INSERT INTO CountryLanguage VALUES ('AZE','Lezgian','F',2.3); -INSERT INTO CountryLanguage VALUES ('BGD','Marma','F',0.2); -INSERT INTO CountryLanguage VALUES ('BEL','Italian','F',2.4); -INSERT INTO CountryLanguage VALUES ('BLZ','Maya Languages','F',9.6); -INSERT INTO CountryLanguage VALUES ('BEN','Adja','F',11.1); -INSERT INTO CountryLanguage VALUES ('BTN','Asami','F',15.2); -INSERT INTO CountryLanguage VALUES ('BOL','Aimar�','T',3.2); -INSERT INTO CountryLanguage VALUES ('BWA','San','F',3.5); -INSERT INTO CountryLanguage VALUES ('BRA','Italian','F',0.4); -INSERT INTO CountryLanguage VALUES ('GBR','Gaeli','F',0.1); -INSERT INTO CountryLanguage VALUES ('BRN','Chinese','F',9.3); -INSERT INTO CountryLanguage VALUES ('BGR','Romani','F',3.7); -INSERT INTO CountryLanguage VALUES ('BFA','Gurma','F',5.7); -INSERT INTO CountryLanguage VALUES ('BDI','Swahili','F',0.0); -INSERT INTO CountryLanguage VALUES ('CHL','Aimar�','F',0.5); -INSERT INTO CountryLanguage VALUES ('CRI','Chibcha','F',0.3); -INSERT INTO CountryLanguage VALUES ('DJI','Arabic','T',10.6); -INSERT INTO CountryLanguage VALUES ('ERI','Afar','F',4.3); -INSERT INTO CountryLanguage VALUES ('ESP','Galecian','F',6.4); -INSERT INTO CountryLanguage VALUES ('ZAF','Afrikaans','T',14.3); -INSERT INTO CountryLanguage VALUES ('ETH','Tigrinja','F',7.2); -INSERT INTO CountryLanguage VALUES ('PHL','Ilocano','F',9.3); -INSERT INTO CountryLanguage VALUES ('GAB','Mpongwe','F',14.6); -INSERT INTO CountryLanguage VALUES ('GMB','Wolof','F',12.6); -INSERT INTO CountryLanguage VALUES ('GEO','Armenian','F',6.8); -INSERT INTO CountryLanguage VALUES ('GHA','Ewe','F',11.9); -INSERT INTO CountryLanguage VALUES ('GUM','Philippene Languages','F',19.7); -INSERT INTO CountryLanguage VALUES ('GTM','Cakchiquel','F',8.9); -INSERT INTO CountryLanguage VALUES ('GIN','Susu','F',11.0); -INSERT INTO CountryLanguage VALUES ('GNB','Balante','F',14.6); -INSERT INTO CountryLanguage VALUES ('GUY','Arawakan','F',1.4); -INSERT INTO CountryLanguage VALUES ('HND','Creole English','F',0.2); -INSERT INTO CountryLanguage VALUES ('HKG','Fukien','F',1.9); -INSERT INTO CountryLanguage VALUES ('IDN','Malay','T',12.1); -INSERT INTO CountryLanguage VALUES ('IND','Telugu','F',7.8); -INSERT INTO CountryLanguage VALUES ('IRQ','Azerbaijani','F',1.7); -INSERT INTO CountryLanguage VALUES ('IRN','Kurdish','F',9.1); -INSERT INTO CountryLanguage VALUES ('ISR','Russian','F',8.9); -INSERT INTO CountryLanguage VALUES ('ITA','Friuli','F',1.2); -INSERT INTO CountryLanguage VALUES ('AUT','Turkish','F',1.5); -INSERT INTO CountryLanguage VALUES ('JPN','Chinese','F',0.2); -INSERT INTO CountryLanguage VALUES ('JOR','Armenian','F',1.0); -INSERT INTO CountryLanguage VALUES ('YUG','Hungarian','F',3.4); -INSERT INTO CountryLanguage VALUES ('KHM','Chinese','F',3.1); -INSERT INTO CountryLanguage VALUES ('CMR','Duala','F',10.9); -INSERT INTO CountryLanguage VALUES ('CAN','Chinese','F',2.5); -INSERT INTO CountryLanguage VALUES ('KAZ','Ukrainian','F',5.0); -INSERT INTO CountryLanguage VALUES ('KEN','Luo','F',12.8); -INSERT INTO CountryLanguage VALUES ('CAF','Mandjia','F',14.8); -INSERT INTO CountryLanguage VALUES ('CHN','Mant�u','F',0.9); -INSERT INTO CountryLanguage VALUES ('KGZ','Uzbek','F',14.1); -INSERT INTO CountryLanguage VALUES ('COL','Creole English','F',0.1); -INSERT INTO CountryLanguage VALUES ('COM','Comorian-madagassi','F',5.5); -INSERT INTO CountryLanguage VALUES ('COG','Mboshi','F',11.4); -INSERT INTO CountryLanguage VALUES ('COD','Mongo','F',13.5); -INSERT INTO CountryLanguage VALUES ('LAO','Thai','F',7.8); -INSERT INTO CountryLanguage VALUES ('LVA','Belorussian','F',4.1); -INSERT INTO CountryLanguage VALUES ('LSO','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('LBN','French','F',0.0); -INSERT INTO CountryLanguage VALUES ('LBR','Grebo','F',8.9); -INSERT INTO CountryLanguage VALUES ('LIE','Turkish','F',2.5); -INSERT INTO CountryLanguage VALUES ('LTU','Polish','F',7.0); -INSERT INTO CountryLanguage VALUES ('LUX','Italian','F',4.6); -INSERT INTO CountryLanguage VALUES ('MAC','Mandarin Chinese','F',1.2); -INSERT INTO CountryLanguage VALUES ('MKD','Turkish','F',4.0); -INSERT INTO CountryLanguage VALUES ('MWI','Yao','F',13.2); -INSERT INTO CountryLanguage VALUES ('MYS','Tamil','F',3.9); -INSERT INTO CountryLanguage VALUES ('MLI','Senufo and Minianka','F',12.0); -INSERT INTO CountryLanguage VALUES ('MRT','Tukulor','F',5.4); -INSERT INTO CountryLanguage VALUES ('MUS','French','F',3.4); -INSERT INTO CountryLanguage VALUES ('MYT','Malagasy','F',16.1); -INSERT INTO CountryLanguage VALUES ('MEX','Yucatec','F',1.1); -INSERT INTO CountryLanguage VALUES ('FSM','Mortlock','F',7.6); -INSERT INTO CountryLanguage VALUES ('MDA','Ukrainian','F',8.6); -INSERT INTO CountryLanguage VALUES ('MCO','Italian','F',16.1); -INSERT INTO CountryLanguage VALUES ('MNG','Dorbet','F',2.7); -INSERT INTO CountryLanguage VALUES ('MOZ','Sena','F',9.4); -INSERT INTO CountryLanguage VALUES ('MMR','Karen','F',6.2); -INSERT INTO CountryLanguage VALUES ('NAM','Kavango','F',9.7); -INSERT INTO CountryLanguage VALUES ('NRU','Chinese','F',8.5); -INSERT INTO CountryLanguage VALUES ('NPL','Bhojpuri','F',7.5); -INSERT INTO CountryLanguage VALUES ('NIC','Creole English','F',0.5); -INSERT INTO CountryLanguage VALUES ('NER','Tamashek','F',10.4); -INSERT INTO CountryLanguage VALUES ('NGA','Ibo','F',18.1); -INSERT INTO CountryLanguage VALUES ('NOR','Danish','F',0.4); -INSERT INTO CountryLanguage VALUES ('CIV','Malinke','F',11.4); -INSERT INTO CountryLanguage VALUES ('PAK','Sindhi','F',11.8); -INSERT INTO CountryLanguage VALUES ('PLW','English','T',3.2); -INSERT INTO CountryLanguage VALUES ('PAN','Guaym�','F',5.3); -INSERT INTO CountryLanguage VALUES ('PRY','Portuguese','F',3.2); -INSERT INTO CountryLanguage VALUES ('PER','Aimar�','T',2.3); -INSERT INTO CountryLanguage VALUES ('MNP','Chinese','F',7.1); -INSERT INTO CountryLanguage VALUES ('POL','Ukrainian','F',0.6); -INSERT INTO CountryLanguage VALUES ('FRA','Portuguese','F',1.2); -INSERT INTO CountryLanguage VALUES ('PYF','Chinese','F',2.9); -INSERT INTO CountryLanguage VALUES ('REU','Comorian','F',2.8); -INSERT INTO CountryLanguage VALUES ('ROM','Romani','T',0.7); -INSERT INTO CountryLanguage VALUES ('SWE','Southern Slavic Languages','F',1.3); -INSERT INTO CountryLanguage VALUES ('DEU','Southern Slavic Languages','F',1.4); -INSERT INTO CountryLanguage VALUES ('SLB','Polynesian Languages','F',3.8); -INSERT INTO CountryLanguage VALUES ('ZMB','Nyanja','F',7.8); -INSERT INTO CountryLanguage VALUES ('WSM','English','T',0.6); -INSERT INTO CountryLanguage VALUES ('SEN','Serer','F',12.5); -INSERT INTO CountryLanguage VALUES ('SYC','French','T',1.3); -INSERT INTO CountryLanguage VALUES ('SLE','Limba','F',8.3); -INSERT INTO CountryLanguage VALUES ('SGP','Tamil','T',7.4); -INSERT INTO CountryLanguage VALUES ('SVK','Romani','F',1.7); -INSERT INTO CountryLanguage VALUES ('SVN','Hungarian','F',0.5); -INSERT INTO CountryLanguage VALUES ('LKA','Mixed Languages','F',19.6); -INSERT INTO CountryLanguage VALUES ('SDN','Nubian Languages','F',8.1); -INSERT INTO CountryLanguage VALUES ('FIN','Russian','F',0.4); -INSERT INTO CountryLanguage VALUES ('CHE','Italian','T',7.7); -INSERT INTO CountryLanguage VALUES ('TJK','Russian','F',9.7); -INSERT INTO CountryLanguage VALUES ('TWN','Hakka','F',11.0); -INSERT INTO CountryLanguage VALUES ('TZA','Hehet','F',6.9); -INSERT INTO CountryLanguage VALUES ('DNK','Arabic','F',0.7); -INSERT INTO CountryLanguage VALUES ('THA','Chinese','F',12.1); -INSERT INTO CountryLanguage VALUES ('TGO','Watyi','F',10.3); -INSERT INTO CountryLanguage VALUES ('TTO','Creole English','F',2.9); -INSERT INTO CountryLanguage VALUES ('TCD','Mayo-kebbi','F',11.5); -INSERT INTO CountryLanguage VALUES ('CZE','Slovak','F',3.1); -INSERT INTO CountryLanguage VALUES ('TUN','Arabic-French-English','F',3.2); -INSERT INTO CountryLanguage VALUES ('TUR','Arabic','F',1.4); -INSERT INTO CountryLanguage VALUES ('TKM','Russian','F',6.7); -INSERT INTO CountryLanguage VALUES ('TUV','English','T',0.0); -INSERT INTO CountryLanguage VALUES ('UGA','Kiga','F',8.3); -INSERT INTO CountryLanguage VALUES ('UKR','Romanian','F',0.7); -INSERT INTO CountryLanguage VALUES ('HUN','German','F',0.4); -INSERT INTO CountryLanguage VALUES ('NCL','Polynesian Languages','F',11.6); -INSERT INTO CountryLanguage VALUES ('UZB','Tadzhik','F',4.4); -INSERT INTO CountryLanguage VALUES ('BLR','Ukrainian','F',1.3); -INSERT INTO CountryLanguage VALUES ('VUT','French','T',14.2); -INSERT INTO CountryLanguage VALUES ('VEN','Warrau','F',0.1); -INSERT INTO CountryLanguage VALUES ('RUS','Ukrainian','F',1.3); -INSERT INTO CountryLanguage VALUES ('VNM','Thai','F',1.6); -INSERT INTO CountryLanguage VALUES ('EST','Ukrainian','F',2.8); -INSERT INTO CountryLanguage VALUES ('USA','French','F',0.7); -INSERT INTO CountryLanguage VALUES ('VIR','French','F',2.5); -INSERT INTO CountryLanguage VALUES ('ZWE','English','T',2.2); -INSERT INTO CountryLanguage VALUES ('AFG','Turkmenian','F',1.9); -INSERT INTO CountryLanguage VALUES ('NLD','Turkish','F',0.8); -INSERT INTO CountryLanguage VALUES ('AND','French','F',6.2); -INSERT INTO CountryLanguage VALUES ('AGO','Luimbe-nganguela','F',5.4); -INSERT INTO CountryLanguage VALUES ('ABW','Dutch','T',5.3); -INSERT INTO CountryLanguage VALUES ('AUS','Canton Chinese','F',1.1); -INSERT INTO CountryLanguage VALUES ('AZE','Armenian','F',2.0); -INSERT INTO CountryLanguage VALUES ('BGD','Garo','F',0.1); -INSERT INTO CountryLanguage VALUES ('BEL','Arabic','F',1.6); -INSERT INTO CountryLanguage VALUES ('BLZ','Garifuna','F',6.8); -INSERT INTO CountryLanguage VALUES ('BEN','Aizo','F',8.7); -INSERT INTO CountryLanguage VALUES ('BOL','Guaran�','F',0.1); -INSERT INTO CountryLanguage VALUES ('BWA','Khoekhoe','F',2.5); -INSERT INTO CountryLanguage VALUES ('BRA','Japanese','F',0.4); -INSERT INTO CountryLanguage VALUES ('BRN','English','F',3.1); -INSERT INTO CountryLanguage VALUES ('BGR','Macedonian','F',2.6); -INSERT INTO CountryLanguage VALUES ('BFA','Busansi','F',3.5); -INSERT INTO CountryLanguage VALUES ('CHL','Rapa nui','F',0.2); -INSERT INTO CountryLanguage VALUES ('CRI','Chinese','F',0.2); -INSERT INTO CountryLanguage VALUES ('ERI','Hadareb','F',3.8); -INSERT INTO CountryLanguage VALUES ('ESP','Basque','F',1.6); -INSERT INTO CountryLanguage VALUES ('ZAF','Northsotho','F',9.1); -INSERT INTO CountryLanguage VALUES ('ETH','Gurage','F',4.7); -INSERT INTO CountryLanguage VALUES ('PHL','Hiligaynon','F',9.1); -INSERT INTO CountryLanguage VALUES ('GAB','Mbete','F',13.8); -INSERT INTO CountryLanguage VALUES ('GMB','Diola','F',9.2); -INSERT INTO CountryLanguage VALUES ('GEO','Azerbaijani','F',5.5); -INSERT INTO CountryLanguage VALUES ('GHA','Ga-adangme','F',7.8); -INSERT INTO CountryLanguage VALUES ('GUM','Korean','F',3.3); -INSERT INTO CountryLanguage VALUES ('GTM','Kekch�','F',4.9); -INSERT INTO CountryLanguage VALUES ('GIN','Kissi','F',6.0); -INSERT INTO CountryLanguage VALUES ('GNB','Portuguese','T',8.1); -INSERT INTO CountryLanguage VALUES ('HND','Miskito','F',0.2); -INSERT INTO CountryLanguage VALUES ('HKG','Hakka','F',1.6); -INSERT INTO CountryLanguage VALUES ('IDN','Madura','F',4.3); -INSERT INTO CountryLanguage VALUES ('IND','Marathi','F',7.4); -INSERT INTO CountryLanguage VALUES ('IRQ','Assyrian','F',0.8); -INSERT INTO CountryLanguage VALUES ('IRN','Gilaki','F',5.3); -INSERT INTO CountryLanguage VALUES ('ITA','French','F',0.5); -INSERT INTO CountryLanguage VALUES ('AUT','Hungarian','F',0.4); -INSERT INTO CountryLanguage VALUES ('JPN','English','F',0.1); -INSERT INTO CountryLanguage VALUES ('YUG','Romani','F',1.4); -INSERT INTO CountryLanguage VALUES ('KHM','T�am','F',2.4); -INSERT INTO CountryLanguage VALUES ('CMR','Ful','F',9.6); -INSERT INTO CountryLanguage VALUES ('CAN','Italian','F',1.7); -INSERT INTO CountryLanguage VALUES ('KAZ','German','F',3.1); -INSERT INTO CountryLanguage VALUES ('KEN','Kamba','F',11.2); -INSERT INTO CountryLanguage VALUES ('CAF','Ngbaka','F',7.5); -INSERT INTO CountryLanguage VALUES ('CHN','Hui','F',0.8); -INSERT INTO CountryLanguage VALUES ('KGZ','Ukrainian','F',1.7); -INSERT INTO CountryLanguage VALUES ('COL','Arawakan','F',0.1); -INSERT INTO CountryLanguage VALUES ('COM','Comorian-Arabic','F',1.6); -INSERT INTO CountryLanguage VALUES ('COG','Mbete','F',4.8); -INSERT INTO CountryLanguage VALUES ('COD','Rwanda','F',10.3); -INSERT INTO CountryLanguage VALUES ('LAO','Lao-Soung','F',5.2); -INSERT INTO CountryLanguage VALUES ('LVA','Ukrainian','F',2.9); -INSERT INTO CountryLanguage VALUES ('LBR','Gio','F',7.9); -INSERT INTO CountryLanguage VALUES ('LTU','Belorussian','F',1.4); -INSERT INTO CountryLanguage VALUES ('LUX','French','T',4.2); -INSERT INTO CountryLanguage VALUES ('MAC','English','F',0.5); -INSERT INTO CountryLanguage VALUES ('MKD','Romani','F',2.3); -INSERT INTO CountryLanguage VALUES ('MWI','Ngoni','F',6.7); -INSERT INTO CountryLanguage VALUES ('MYS','Iban','F',2.8); -INSERT INTO CountryLanguage VALUES ('MLI','Soninke','F',8.7); -INSERT INTO CountryLanguage VALUES ('MRT','Soninke','F',2.7); -INSERT INTO CountryLanguage VALUES ('MUS','Hindi','F',1.2); -INSERT INTO CountryLanguage VALUES ('MEX','Zapotec','F',0.6); -INSERT INTO CountryLanguage VALUES ('FSM','Kosrean','F',7.3); -INSERT INTO CountryLanguage VALUES ('MDA','Gagauzi','F',3.2); -INSERT INTO CountryLanguage VALUES ('MCO','English','F',6.5); -INSERT INTO CountryLanguage VALUES ('MNG','Bajad','F',1.9); -INSERT INTO CountryLanguage VALUES ('MOZ','Lomwe','F',7.8); -INSERT INTO CountryLanguage VALUES ('MMR','Rakhine','F',4.5); -INSERT INTO CountryLanguage VALUES ('NAM','Afrikaans','F',9.5); -INSERT INTO CountryLanguage VALUES ('NRU','Tuvalu','F',8.5); -INSERT INTO CountryLanguage VALUES ('NPL','Tharu','F',5.4); -INSERT INTO CountryLanguage VALUES ('NIC','Sumo','F',0.2); -INSERT INTO CountryLanguage VALUES ('NER','Ful','F',9.7); -INSERT INTO CountryLanguage VALUES ('NGA','Ful','F',11.3); -INSERT INTO CountryLanguage VALUES ('NOR','Swedish','F',0.3); -INSERT INTO CountryLanguage VALUES ('CIV','Kru','F',10.5); -INSERT INTO CountryLanguage VALUES ('PAK','Saraiki','F',9.8); -INSERT INTO CountryLanguage VALUES ('PLW','Chinese','F',1.6); -INSERT INTO CountryLanguage VALUES ('PAN','Cuna','F',2.0); -INSERT INTO CountryLanguage VALUES ('PRY','German','F',0.9); -INSERT INTO CountryLanguage VALUES ('MNP','Korean','F',6.5); -INSERT INTO CountryLanguage VALUES ('POL','Belorussian','F',0.5); -INSERT INTO CountryLanguage VALUES ('FRA','Italian','F',0.4); -INSERT INTO CountryLanguage VALUES ('REU','Malagasy','F',1.4); -INSERT INTO CountryLanguage VALUES ('ROM','German','F',0.4); -INSERT INTO CountryLanguage VALUES ('SWE','Arabic','F',0.8); -INSERT INTO CountryLanguage VALUES ('DEU','Italian','F',0.7); -INSERT INTO CountryLanguage VALUES ('ZMB','Lozi','F',6.4); -INSERT INTO CountryLanguage VALUES ('SEN','Diola','F',5.0); -INSERT INTO CountryLanguage VALUES ('SLE','Kono-vai','F',5.1); -INSERT INTO CountryLanguage VALUES ('SVK','Czech and Moravian','F',1.1); -INSERT INTO CountryLanguage VALUES ('SDN','Beja','F',6.4); -INSERT INTO CountryLanguage VALUES ('FIN','Estonian','F',0.2); -INSERT INTO CountryLanguage VALUES ('CHE','Romansh','T',0.6); -INSERT INTO CountryLanguage VALUES ('TWN','Ami','F',0.6); -INSERT INTO CountryLanguage VALUES ('TZA','Haya','F',5.9); -INSERT INTO CountryLanguage VALUES ('DNK','German','F',0.5); -INSERT INTO CountryLanguage VALUES ('THA','Malay','F',3.6); -INSERT INTO CountryLanguage VALUES ('TGO','Kotokoli','F',5.7); -INSERT INTO CountryLanguage VALUES ('TCD','Kanem-bornu','F',9.0); -INSERT INTO CountryLanguage VALUES ('CZE','Polish','F',0.6); -INSERT INTO CountryLanguage VALUES ('TKM','Kazakh','F',2.0); -INSERT INTO CountryLanguage VALUES ('UGA','Soga','F',8.2); -INSERT INTO CountryLanguage VALUES ('UKR','Bulgariana','F',0.3); -INSERT INTO CountryLanguage VALUES ('HUN','Serbo-Croatian','F',0.2); -INSERT INTO CountryLanguage VALUES ('UZB','Kazakh','F',3.8); -INSERT INTO CountryLanguage VALUES ('BLR','Polish','F',0.6); -INSERT INTO CountryLanguage VALUES ('RUS','Chuvash','F',0.9); -INSERT INTO CountryLanguage VALUES ('VNM','Muong','F',1.5); -INSERT INTO CountryLanguage VALUES ('EST','Belorussian','F',1.4); -INSERT INTO CountryLanguage VALUES ('USA','German','F',0.7); -INSERT INTO CountryLanguage VALUES ('ZWE','Nyanja','F',2.2); -INSERT INTO CountryLanguage VALUES ('AFG','Balochi','F',0.9); -INSERT INTO CountryLanguage VALUES ('AGO','Nyaneka-nkhumbi','F',5.4); -INSERT INTO CountryLanguage VALUES ('AUS','Arabic','F',1.0); -INSERT INTO CountryLanguage VALUES ('BGD','Khasi','F',0.1); -INSERT INTO CountryLanguage VALUES ('BEL','German','T',1.0); -INSERT INTO CountryLanguage VALUES ('BEN','Bariba','F',8.7); -INSERT INTO CountryLanguage VALUES ('BWA','Ndebele','F',1.3); -INSERT INTO CountryLanguage VALUES ('BRA','Indian Languages','F',0.2); -INSERT INTO CountryLanguage VALUES ('BFA','Dagara','F',3.1); -INSERT INTO CountryLanguage VALUES ('ERI','Bilin','F',3.0); -INSERT INTO CountryLanguage VALUES ('ZAF','English','T',8.5); -INSERT INTO CountryLanguage VALUES ('ETH','Somali','F',4.1); -INSERT INTO CountryLanguage VALUES ('PHL','Bicol','F',5.7); -INSERT INTO CountryLanguage VALUES ('GMB','Soninke','F',7.6); -INSERT INTO CountryLanguage VALUES ('GEO','Osseetti','F',2.4); -INSERT INTO CountryLanguage VALUES ('GHA','Gurma','F',3.3); -INSERT INTO CountryLanguage VALUES ('GUM','Japanese','F',2.0); -INSERT INTO CountryLanguage VALUES ('GTM','Mam','F',2.7); -INSERT INTO CountryLanguage VALUES ('GIN','Kpelle','F',4.6); -INSERT INTO CountryLanguage VALUES ('GNB','Malinke','F',6.9); -INSERT INTO CountryLanguage VALUES ('HKG','Chiu chau','F',1.4); -INSERT INTO CountryLanguage VALUES ('IDN','Minangkabau','F',2.4); -INSERT INTO CountryLanguage VALUES ('IND','Tamil','F',6.3); -INSERT INTO CountryLanguage VALUES ('IRQ','Persian','F',0.8); -INSERT INTO CountryLanguage VALUES ('IRN','Luri','F',4.3); -INSERT INTO CountryLanguage VALUES ('ITA','German','F',0.5); -INSERT INTO CountryLanguage VALUES ('AUT','Slovene','F',0.4); -INSERT INTO CountryLanguage VALUES ('JPN','Philippene Languages','F',0.1); -INSERT INTO CountryLanguage VALUES ('YUG','Slovak','F',0.7); -INSERT INTO CountryLanguage VALUES ('CMR','Tikar','F',7.4); -INSERT INTO CountryLanguage VALUES ('CAN','German','F',1.6); -INSERT INTO CountryLanguage VALUES ('KAZ','Uzbek','F',2.3); -INSERT INTO CountryLanguage VALUES ('KEN','Kalenjin','F',10.8); -INSERT INTO CountryLanguage VALUES ('CAF','Sara','F',6.4); -INSERT INTO CountryLanguage VALUES ('CHN','Miao','F',0.7); -INSERT INTO CountryLanguage VALUES ('KGZ','Tatar','F',1.3); -INSERT INTO CountryLanguage VALUES ('COL','Caribbean','F',0.1); -INSERT INTO CountryLanguage VALUES ('COM','Comorian-Swahili','F',0.5); -INSERT INTO CountryLanguage VALUES ('COG','Punu','F',2.9); -INSERT INTO CountryLanguage VALUES ('COD','Zande','F',6.1); -INSERT INTO CountryLanguage VALUES ('LVA','Polish','F',2.1); -INSERT INTO CountryLanguage VALUES ('LBR','Kru','F',7.2); -INSERT INTO CountryLanguage VALUES ('LTU','Ukrainian','F',1.1); -INSERT INTO CountryLanguage VALUES ('LUX','German','T',2.3); -INSERT INTO CountryLanguage VALUES ('MKD','Serbo-Croatian','F',2.0); -INSERT INTO CountryLanguage VALUES ('MYS','English','F',1.6); -INSERT INTO CountryLanguage VALUES ('MLI','Tamashek','F',7.3); -INSERT INTO CountryLanguage VALUES ('MRT','Ful','F',1.2); -INSERT INTO CountryLanguage VALUES ('MUS','Tamil','F',0.8); -INSERT INTO CountryLanguage VALUES ('MEX','Mixtec','F',0.6); -INSERT INTO CountryLanguage VALUES ('FSM','Yap','F',5.8); -INSERT INTO CountryLanguage VALUES ('MDA','Bulgariana','F',1.6); -INSERT INTO CountryLanguage VALUES ('MNG','Buryat','F',1.7); -INSERT INTO CountryLanguage VALUES ('MOZ','Shona','F',6.5); -INSERT INTO CountryLanguage VALUES ('MMR','Mon','F',2.4); -INSERT INTO CountryLanguage VALUES ('NAM','Herero','F',8.0); -INSERT INTO CountryLanguage VALUES ('NRU','English','T',7.5); -INSERT INTO CountryLanguage VALUES ('NPL','Tamang','F',4.9); -INSERT INTO CountryLanguage VALUES ('NER','Kanuri','F',4.4); -INSERT INTO CountryLanguage VALUES ('NGA','Ibibio','F',5.6); -INSERT INTO CountryLanguage VALUES ('NOR','Saame','F',0.0); -INSERT INTO CountryLanguage VALUES ('CIV','[South]Mande','F',7.7); -INSERT INTO CountryLanguage VALUES ('PAK','Urdu','T',7.6); -INSERT INTO CountryLanguage VALUES ('PAN','Embera','F',0.6); -INSERT INTO CountryLanguage VALUES ('MNP','English','T',4.8); -INSERT INTO CountryLanguage VALUES ('FRA','Spanish','F',0.4); -INSERT INTO CountryLanguage VALUES ('REU','Tamil','F',0.0); -INSERT INTO CountryLanguage VALUES ('ROM','Ukrainian','F',0.3); -INSERT INTO CountryLanguage VALUES ('SWE','Spanish','F',0.6); -INSERT INTO CountryLanguage VALUES ('DEU','Greek','F',0.4); -INSERT INTO CountryLanguage VALUES ('ZMB','Chewa','F',5.7); -INSERT INTO CountryLanguage VALUES ('SEN','Malinke','F',3.8); -INSERT INTO CountryLanguage VALUES ('SLE','Bullom-sherbro','F',3.8); -INSERT INTO CountryLanguage VALUES ('SVK','Ukrainian and Russian','F',0.6); -INSERT INTO CountryLanguage VALUES ('SDN','Nuer','F',4.9); -INSERT INTO CountryLanguage VALUES ('FIN','Saame','F',0.0); -INSERT INTO CountryLanguage VALUES ('TWN','Atayal','F',0.4); -INSERT INTO CountryLanguage VALUES ('TZA','Makonde','F',5.9); -INSERT INTO CountryLanguage VALUES ('DNK','English','F',0.3); -INSERT INTO CountryLanguage VALUES ('THA','Khmer','F',1.3); -INSERT INTO CountryLanguage VALUES ('TGO','Ane','F',5.7); -INSERT INTO CountryLanguage VALUES ('TCD','Ouaddai','F',8.7); -INSERT INTO CountryLanguage VALUES ('CZE','German','F',0.5); -INSERT INTO CountryLanguage VALUES ('UGA','Teso','F',6.0); -INSERT INTO CountryLanguage VALUES ('UKR','Hungarian','F',0.3); -INSERT INTO CountryLanguage VALUES ('HUN','Romanian','F',0.1); -INSERT INTO CountryLanguage VALUES ('UZB','Karakalpak','F',2.0); -INSERT INTO CountryLanguage VALUES ('RUS','Bashkir','F',0.7); -INSERT INTO CountryLanguage VALUES ('VNM','Chinese','F',1.4); -INSERT INTO CountryLanguage VALUES ('EST','Finnish','F',0.7); -INSERT INTO CountryLanguage VALUES ('USA','Italian','F',0.6); -INSERT INTO CountryLanguage VALUES ('AGO','Chokwe','F',4.2); -INSERT INTO CountryLanguage VALUES ('AUS','Vietnamese','F',0.8); -INSERT INTO CountryLanguage VALUES ('BGD','Santhali','F',0.1); -INSERT INTO CountryLanguage VALUES ('BEL','Turkish','F',0.9); -INSERT INTO CountryLanguage VALUES ('BEN','Somba','F',6.7); -INSERT INTO CountryLanguage VALUES ('BFA','Dyula','F',2.6); -INSERT INTO CountryLanguage VALUES ('ERI','Saho','F',3.0); -INSERT INTO CountryLanguage VALUES ('ZAF','Tswana','F',8.1); -INSERT INTO CountryLanguage VALUES ('ETH','Sidamo','F',3.2); -INSERT INTO CountryLanguage VALUES ('PHL','Waray-waray','F',3.8); -INSERT INTO CountryLanguage VALUES ('GEO','Abhyasi','F',1.7); -INSERT INTO CountryLanguage VALUES ('GHA','Joruba','F',1.3); -INSERT INTO CountryLanguage VALUES ('GIN','Yalunka','F',2.9); -INSERT INTO CountryLanguage VALUES ('GNB','Mandyako','F',4.9); -INSERT INTO CountryLanguage VALUES ('IDN','Batakki','F',2.2); -INSERT INTO CountryLanguage VALUES ('IND','Urdu','F',5.1); -INSERT INTO CountryLanguage VALUES ('IRN','Mazandarani','F',3.6); -INSERT INTO CountryLanguage VALUES ('ITA','Albaniana','F',0.2); -INSERT INTO CountryLanguage VALUES ('AUT','Polish','F',0.2); -INSERT INTO CountryLanguage VALUES ('JPN','Ainu','F',0.0); -INSERT INTO CountryLanguage VALUES ('YUG','Macedonian','F',0.5); -INSERT INTO CountryLanguage VALUES ('CMR','Mandara','F',5.7); -INSERT INTO CountryLanguage VALUES ('CAN','Polish','F',0.7); -INSERT INTO CountryLanguage VALUES ('KAZ','Tatar','F',2.0); -INSERT INTO CountryLanguage VALUES ('KEN','Gusii','F',6.1); -INSERT INTO CountryLanguage VALUES ('CAF','Mbum','F',6.4); -INSERT INTO CountryLanguage VALUES ('CHN','Uighur','F',0.6); -INSERT INTO CountryLanguage VALUES ('KGZ','Kazakh','F',0.8); -INSERT INTO CountryLanguage VALUES ('COG','Sango','F',2.6); -INSERT INTO CountryLanguage VALUES ('COD','Ngala and Bangi','F',5.8); -INSERT INTO CountryLanguage VALUES ('LVA','Lithuanian','F',1.2); -INSERT INTO CountryLanguage VALUES ('LBR','Mano','F',7.2); -INSERT INTO CountryLanguage VALUES ('MYS','Dusun','F',1.1); -INSERT INTO CountryLanguage VALUES ('MLI','Songhai','F',6.9); -INSERT INTO CountryLanguage VALUES ('MRT','Zenaga','F',1.2); -INSERT INTO CountryLanguage VALUES ('MUS','Marathi','F',0.7); -INSERT INTO CountryLanguage VALUES ('MEX','Otom�','F',0.4); -INSERT INTO CountryLanguage VALUES ('FSM','Wolea','F',3.7); -INSERT INTO CountryLanguage VALUES ('MNG','Dariganga','F',1.4); -INSERT INTO CountryLanguage VALUES ('MOZ','Tswa','F',6.0); -INSERT INTO CountryLanguage VALUES ('MMR','Chin','F',2.2); -INSERT INTO CountryLanguage VALUES ('NAM','Caprivi','F',4.7); -INSERT INTO CountryLanguage VALUES ('NPL','Newari','F',3.7); -INSERT INTO CountryLanguage VALUES ('NGA','Kanuri','F',4.1); -INSERT INTO CountryLanguage VALUES ('PAK','Balochi','F',3.0); -INSERT INTO CountryLanguage VALUES ('PAN','Arabic','F',0.6); -INSERT INTO CountryLanguage VALUES ('MNP','Carolinian','F',4.8); -INSERT INTO CountryLanguage VALUES ('FRA','Turkish','F',0.4); -INSERT INTO CountryLanguage VALUES ('ROM','Serbo-Croatian','F',0.1); -INSERT INTO CountryLanguage VALUES ('SWE','Norwegian','F',0.5); -INSERT INTO CountryLanguage VALUES ('DEU','Polish','F',0.3); -INSERT INTO CountryLanguage VALUES ('ZMB','Nsenga','F',4.3); -INSERT INTO CountryLanguage VALUES ('SEN','Soninke','F',1.3); -INSERT INTO CountryLanguage VALUES ('SLE','Ful','F',3.8); -INSERT INTO CountryLanguage VALUES ('SDN','Zande','F',2.7); -INSERT INTO CountryLanguage VALUES ('TWN','Paiwan','F',0.3); -INSERT INTO CountryLanguage VALUES ('TZA','Nyakusa','F',5.4); -INSERT INTO CountryLanguage VALUES ('DNK','Swedish','F',0.3); -INSERT INTO CountryLanguage VALUES ('THA','Kuy','F',1.1); -INSERT INTO CountryLanguage VALUES ('TGO','Moba','F',5.4); -INSERT INTO CountryLanguage VALUES ('TCD','Hadjarai','F',6.7); -INSERT INTO CountryLanguage VALUES ('CZE','Silesiana','F',0.4); -INSERT INTO CountryLanguage VALUES ('UGA','Lango','F',5.9); -INSERT INTO CountryLanguage VALUES ('UKR','Belorussian','F',0.3); -INSERT INTO CountryLanguage VALUES ('HUN','Slovak','F',0.1); -INSERT INTO CountryLanguage VALUES ('UZB','Tatar','F',1.8); -INSERT INTO CountryLanguage VALUES ('RUS','Chechen','F',0.6); -INSERT INTO CountryLanguage VALUES ('VNM','Khmer','F',1.4); -INSERT INTO CountryLanguage VALUES ('USA','Chinese','F',0.6); -INSERT INTO CountryLanguage VALUES ('AGO','Luvale','F',3.6); -INSERT INTO CountryLanguage VALUES ('AUS','Serbo-Croatian','F',0.6); -INSERT INTO CountryLanguage VALUES ('BGD','Tripuri','F',0.1); -INSERT INTO CountryLanguage VALUES ('BEN','Ful','F',5.6); -INSERT INTO CountryLanguage VALUES ('ZAF','Southsotho','F',7.6); -INSERT INTO CountryLanguage VALUES ('ETH','Walaita','F',2.8); -INSERT INTO CountryLanguage VALUES ('PHL','Pampango','F',3.0); -INSERT INTO CountryLanguage VALUES ('GIN','Loma','F',2.3); -INSERT INTO CountryLanguage VALUES ('IDN','Bugi','F',2.2); -INSERT INTO CountryLanguage VALUES ('IND','Gujarati','F',4.8); -INSERT INTO CountryLanguage VALUES ('IRN','Balochi','F',2.3); -INSERT INTO CountryLanguage VALUES ('ITA','Slovene','F',0.2); -INSERT INTO CountryLanguage VALUES ('AUT','Czech','F',0.2); -INSERT INTO CountryLanguage VALUES ('CMR','Maka','F',4.9); -INSERT INTO CountryLanguage VALUES ('CAN','Spanish','F',0.7); -INSERT INTO CountryLanguage VALUES ('KEN','Meru','F',5.5); -INSERT INTO CountryLanguage VALUES ('CHN','Yi','F',0.6); -INSERT INTO CountryLanguage VALUES ('KGZ','Tadzhik','F',0.8); -INSERT INTO CountryLanguage VALUES ('COD','Rundi','F',3.8); -INSERT INTO CountryLanguage VALUES ('LBR','Loma','F',5.8); -INSERT INTO CountryLanguage VALUES ('MOZ','Chuabo','F',5.7); -INSERT INTO CountryLanguage VALUES ('MMR','Kachin','F',1.4); -INSERT INTO CountryLanguage VALUES ('NAM','San','F',1.9); -INSERT INTO CountryLanguage VALUES ('NPL','Hindi','F',3.0); -INSERT INTO CountryLanguage VALUES ('NGA','Edo','F',3.3); -INSERT INTO CountryLanguage VALUES ('PAK','Hindko','F',2.4); -INSERT INTO CountryLanguage VALUES ('SLE','Kuranko','F',3.4); -INSERT INTO CountryLanguage VALUES ('SDN','Bari','F',2.5); -INSERT INTO CountryLanguage VALUES ('TZA','Chaga and Pare','F',4.9); -INSERT INTO CountryLanguage VALUES ('DNK','Norwegian','F',0.3); -INSERT INTO CountryLanguage VALUES ('TGO','Naudemba','F',4.1); -INSERT INTO CountryLanguage VALUES ('TCD','Tandjile','F',6.5); -INSERT INTO CountryLanguage VALUES ('CZE','Romani','F',0.3); -INSERT INTO CountryLanguage VALUES ('UGA','Lugbara','F',4.7); -INSERT INTO CountryLanguage VALUES ('UKR','Polish','F',0.1); -INSERT INTO CountryLanguage VALUES ('RUS','Mordva','F',0.5); -INSERT INTO CountryLanguage VALUES ('VNM','Nung','F',1.1); -INSERT INTO CountryLanguage VALUES ('USA','Tagalog','F',0.4); -INSERT INTO CountryLanguage VALUES ('AGO','Ambo','F',2.4); -INSERT INTO CountryLanguage VALUES ('AUS','German','F',0.6); -INSERT INTO CountryLanguage VALUES ('ZAF','Tsonga','F',4.3); -INSERT INTO CountryLanguage VALUES ('PHL','Pangasinan','F',1.8); -INSERT INTO CountryLanguage VALUES ('IDN','Banja','F',1.8); -INSERT INTO CountryLanguage VALUES ('IND','Kannada','F',3.9); -INSERT INTO CountryLanguage VALUES ('IRN','Arabic','F',2.2); -INSERT INTO CountryLanguage VALUES ('ITA','Romani','F',0.2); -INSERT INTO CountryLanguage VALUES ('AUT','Romanian','F',0.2); -INSERT INTO CountryLanguage VALUES ('CMR','Masana','F',3.9); -INSERT INTO CountryLanguage VALUES ('CAN','Portuguese','F',0.7); -INSERT INTO CountryLanguage VALUES ('KEN','Nyika','F',4.8); -INSERT INTO CountryLanguage VALUES ('CHN','Tujia','F',0.5); -INSERT INTO CountryLanguage VALUES ('COD','Teke','F',2.7); -INSERT INTO CountryLanguage VALUES ('LBR','Malinke','F',5.1); -INSERT INTO CountryLanguage VALUES ('MOZ','Ronga','F',3.7); -INSERT INTO CountryLanguage VALUES ('MMR','Kayah','F',0.4); -INSERT INTO CountryLanguage VALUES ('NAM','German','F',0.9); -INSERT INTO CountryLanguage VALUES ('NGA','Tiv','F',2.3); -INSERT INTO CountryLanguage VALUES ('PAK','Brahui','F',1.2); -INSERT INTO CountryLanguage VALUES ('SLE','Yalunka','F',3.4); -INSERT INTO CountryLanguage VALUES ('SDN','Fur','F',2.1); -INSERT INTO CountryLanguage VALUES ('TZA','Luguru','F',4.9); -INSERT INTO CountryLanguage VALUES ('TGO','Gurma','F',3.4); -INSERT INTO CountryLanguage VALUES ('TCD','Gorane','F',6.2); -INSERT INTO CountryLanguage VALUES ('CZE','Hungarian','F',0.2); -INSERT INTO CountryLanguage VALUES ('UGA','Gisu','F',4.5); -INSERT INTO CountryLanguage VALUES ('RUS','Kazakh','F',0.4); -INSERT INTO CountryLanguage VALUES ('VNM','Miao','F',0.9); -INSERT INTO CountryLanguage VALUES ('USA','Polish','F',0.3); -INSERT INTO CountryLanguage VALUES ('AGO','Luchazi','F',2.4); -INSERT INTO CountryLanguage VALUES ('ZAF','Swazi','F',2.5); -INSERT INTO CountryLanguage VALUES ('PHL','Maguindanao','F',1.4); -INSERT INTO CountryLanguage VALUES ('IDN','Bali','F',1.7); -INSERT INTO CountryLanguage VALUES ('IND','Malajalam','F',3.6); -INSERT INTO CountryLanguage VALUES ('IRN','Bakhtyari','F',1.7); -INSERT INTO CountryLanguage VALUES ('CAN','Punjabi','F',0.7); -INSERT INTO CountryLanguage VALUES ('KEN','Masai','F',1.6); -INSERT INTO CountryLanguage VALUES ('CHN','Mongolian','F',0.4); -INSERT INTO CountryLanguage VALUES ('COD','Boa','F',2.3); -INSERT INTO CountryLanguage VALUES ('MOZ','Marendje','F',3.5); -INSERT INTO CountryLanguage VALUES ('NGA','Ijo','F',1.8); -INSERT INTO CountryLanguage VALUES ('SDN','Chilluk','F',1.7); -INSERT INTO CountryLanguage VALUES ('TZA','Shambala','F',4.3); -INSERT INTO CountryLanguage VALUES ('UGA','Acholi','F',4.4); -INSERT INTO CountryLanguage VALUES ('RUS','Avarian','F',0.4); -INSERT INTO CountryLanguage VALUES ('VNM','Man','F',0.7); -INSERT INTO CountryLanguage VALUES ('USA','Korean','F',0.3); -INSERT INTO CountryLanguage VALUES ('ZAF','Venda','F',2.2); -INSERT INTO CountryLanguage VALUES ('PHL','Maranao','F',1.3); -INSERT INTO CountryLanguage VALUES ('IND','Orija','F',3.3); -INSERT INTO CountryLanguage VALUES ('IRN','Turkmenian','F',1.6); -INSERT INTO CountryLanguage VALUES ('CAN','Ukrainian','F',0.6); -INSERT INTO CountryLanguage VALUES ('KEN','Turkana','F',1.4); -INSERT INTO CountryLanguage VALUES ('CHN','Tibetan','F',0.4); -INSERT INTO CountryLanguage VALUES ('COD','Chokwe','F',1.8); -INSERT INTO CountryLanguage VALUES ('MOZ','Nyanja','F',3.3); -INSERT INTO CountryLanguage VALUES ('NGA','Bura','F',1.6); -INSERT INTO CountryLanguage VALUES ('SDN','Lotuko','F',1.5); -INSERT INTO CountryLanguage VALUES ('TZA','Gogo','F',3.9); -INSERT INTO CountryLanguage VALUES ('UGA','Rwanda','F',3.2); -INSERT INTO CountryLanguage VALUES ('RUS','Mari','F',0.4); -INSERT INTO CountryLanguage VALUES ('USA','Vietnamese','F',0.2); -INSERT INTO CountryLanguage VALUES ('ZAF','Ndebele','F',1.5); -INSERT INTO CountryLanguage VALUES ('IND','Punjabi','F',2.8); -INSERT INTO CountryLanguage VALUES ('CAN','Dutch','F',0.5); -INSERT INTO CountryLanguage VALUES ('CHN','Puyi','F',0.2); -INSERT INTO CountryLanguage VALUES ('TZA','Ha','F',3.5); -INSERT INTO CountryLanguage VALUES ('RUS','Udmur','F',0.3); -INSERT INTO CountryLanguage VALUES ('USA','Japanese','F',0.2); -INSERT INTO CountryLanguage VALUES ('IND','Asami','F',1.5); -INSERT INTO CountryLanguage VALUES ('CAN','Eskimo Languages','F',0.1); -INSERT INTO CountryLanguage VALUES ('CHN','Dong','F',0.2); -INSERT INTO CountryLanguage VALUES ('RUS','Belorussian','F',0.3); -INSERT INTO CountryLanguage VALUES ('USA','Portuguese','F',0.2); - -/*!40000 ALTER TABLE CountryLanguage ENABLE KEYS */; - |