Locale Page...  Global  |  Germany  |  UK  |  USA
Your privat CyberGadget - Die besten Resourcen für Web-Designer, Web-Master und Web-Developer!
Quick Search
Werbung
Partner & Freunde
Developersdex
Tutorial Guide
Original Referenzhandbuch für MySQL Datenbanksysteme
Go to the first, previous, next, last section, table of contents.


7 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.

7.1 Sprachstruktur

7.1.1 Literale: Wie Zeichenketten und Zahlen geschrieben werden

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.

7.1.1.1 Zeichenketten

Eine Zeichenkette ist eine Folge von Zeichen, die entweder von Apostrophs (einfachen Anführungszeichen, `'') oder (doppelten) Anführungszeichen (`"') umgeben ist (nur einfache Anführungszeichen, wenn Sie MySQL im ANSI-Modus laufen lassen). Beispiele:

'eine Zeichenkette'
"eine weitere Zeichenkette"

Innerhalb einer Zeichenkette haben bestimmte Folgen eine spezielle Bedeutung. Jede dieser Folgen fängt mit einem Backslash (`\') an, bekannt als Fluchtzeichen (Escape-Zeichen). MySQL erkennt folgende Flucht-Folgen (Escape-Folgen):

\0
Ein ASCII-0- (NUL) Zeichen.
\'
Ein Apostroph- (`'') Zeichen.
\"
Ein Anführungszeichen (`"').
\b
Ein Rückschritt- (Backspace-) Zeichen.
\n
Ein Neue-Zeile- (Newline-) Zeichen.
\r
Ein Wagenrücklauf- (carriage return) Zeichen.
\t
Ein Tabulator-Zeichen.
\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 mysql Datenbank < Dateiname benutzen.)
\\
Ein Backslash- (`\') Zeichen.
\%
Ein `%'-Zeichen. Dieses wird benutzt, um nach literalen Instanzen von `%' in Zusammenhängen zu suchen, wo `%' ansonsten als Platzhalterzeichen interpretiert werden würde. See section 7.3.2.1 Zeichenketten-Vergleichsfunktionen.
\_
Ein `_'-Zeichen. Dieses wird benutzt, um nach literalen Instanzen von `_' in Zusammenhängen zu suchen, wo `_' ansonsten als Platzhalterzeichen interpretiert werden würde. See section 7.3.2.1 Zeichenketten-Vergleichsfunktionen.

Beachten Sie, dass bei der Benutzung von `\%' oder `\_' in einigen Zeichenketten-Zusammenhängen diese die Zeichenketten `\%' und `\_' und nicht `%' und `_' zurückgeben.

Es gibt verschiedene Möglichkeiten, Anführungszeichen innerhalb einer Zeichenkette zu schreiben:

  • Ein `'' innerhalb einer Zeichenkette, die mit `'' begrenzt wird, kann als `''' geschrieben werden.
  • Ein `"' innerhalb einer Zeichenkette, die `"' begrenzt wird, kann als `""' geschrieben werden.
  • Sie können dem Anführungszeichen ein Fluchtzeichen (Escape-Zeichen) (`\') voranstellen.
  • Ein `'' innerhalb einer Zeichenkette, die mit `"' begrenzt wird, braucht keine spezielle Behandlung und muss nicht verdoppelt oder escapet werden. In gleicher Weise benötigt `"' innerhalb einer Zeichenkette, die mit `'' begrenzt wird, keine spezielle Behandlung.

Die unten stehenden SELECT-Statements zeigen, wie Quoten und Escapen funktionieren:

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 |
+--------------------+

Wenn Sie Binärdaten in eine BLOB-Spalte einfügen, müssen folgende Zeichen durch Flucht-Folgen repräsentiert werden:

NUL
ASCII 0. Dieses geben Sie als `\0' ein (ein Backslash und ein ASCII-`0'-Zeichen).
\
ASCII 92, Backslash. Das geben Sie als `\\' ein.
'
ASCII 39, Apostroph. Das geben Sie als `\'' ein.
"
ASCII 34, Anführungszeichen. Das geben Sie als `\"' ein.

Wenn Sie C-Code schreiben, können Sie die C-API-Funktion mysql_escape_string() für Fluchtzeichen (Escape-Zeichen) für das INSERT-Statement benutzen. See section 9.4.2 C-API-Funktionsüberblick. In Perl können Sie die quote-Methode des DBI-Pakets benutzen, um Sonderzeichen in die korrekten Flucht-Folgen umzuwandeln. See section 9.2.2 Die DBI-Schnittstelle.

Sie sollten auf jede Zeichenkette, die eins der oben erwähnten Sonderzeichen enthalten könnte, eine der Flucht-Funktionen anwenden!

7.1.1.2 Zahlen

Ganzzahlen werden als Folge von Ziffern repräsentiert. Fließkommazahlen benutzen `.' als Dezimalseparator. Jedem Zahlentyp kann `-' vorangestellt werden, um einen negativen Wert anzuzeigen.

Beispiele gültiger Ganzzahlen:

1221
0
-32

Beispiele gültiger Fließkommazahlen:

294.42
-32032.6809e+10
148.00

Eine Ganzzahl kann in einem Fließkomma-Zusammenhang benutzt werden, sie wird dann als die äquivalente Fließkommazahl interpretiert.

7.1.1.3 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:

mysql> SELECT x'FF'
       -> 255
mysql> SELECT 0xa+0;
       -> 10
mysql> select 0x5061756c;
       -> Paul

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.

7.1.1.4 NULL-Werte

Der NULL-Wert bedeutet ``keine Daten'' und unterscheidet sich von Werten wie 0 bei numerischen Typen oder der leeren Zeichenkette bei Zeichenkettentypen. See section A.5.3 Probleme mit NULL-Werten.

NULL kann durch \N repräsentiert werden, wenn Sie die Textdatei-Import- oder Exportformate (LOAD DATA INFILE, SELECT ... INTO OUTFILE) benutzen. See section 7.4.9 LOAD DATA INFILE-Syntax.

7.1.2 Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen

Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen folgen in MySQL alle denselben Regeln.

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 ``'. `"' funktioniert ebenfalls, um Bezeichner zu quoten, wenn Sie im ANSI-Modus fahren. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.

Bezeichner Maximale Länge Erlaubte Zeichen
Datenbank 64 Jedes Zeichen, dass für ein Verzeichnis erlaubt ist, ausser `/' oder `.'.
Tabelle 64 Jedes Zeichen, dass für einen Dateinamen erlaubt ist, ausser `/' oder `.'.
Spalte 64 Alle Zeichen.
Alias 255 Alle Zeichen.

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 ` angegeben sein muss:

SELECT * from `select` where `select`.id > 100;

In vorherigen Versionen von MySQL sind die Namensregeln wie folgt:

  • Ein Name muss aus alphanumerischen Zeichen des aktuellen Zeichensatzes bestehen und darf darüber hinaus `_' und `$' enthalten. Der vorgabemäßige Zeichensatz ist ISO-8859-1 Latin1; dass kann durch die --default-character-set-Option für mysqld geändert werden. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
  • 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 nur aus Zahlen bestehen.
  • Sie können das `.'-Zeichen in Namen nicht benutzen, weil es benutzt wird, um das Format zu erweitern, mit dem man auf Spalten verweisen kann (siehe unten).

Es wird empfohlen, dass Sie keine Namen wie 1e verwenden, weil ein Ausdruck wie 1e+1 mehrdeutig ist. Er kann als der Ausdruck 1e + 1 oder als die Zahl 1e+1 interpretiert werden.

In MySQL können Sie in folgender Form auf Spalten verweisen:

Spaltenverweis Bedeutung
spalten_name Spalte des Namens spalten_name einer beliebigen, in der Anfrage verwendeten Tabelle.
tabelle.spalten_name Spalte des Namens spalten_name der Tabelle tabelle der aktuellen Datenbank.
datenbank.tabelle.spalten_name Spalte des Namens spalten_name der Tabelle tabelle der Datenbank datenbank. Diese Form ist ab MySQL-Version 3.22 verfügbar.
`spalte` Eine Spalte, die ein reserviertes Wort ist oder Sonderzeichen enthält.

Das tabelle- oder 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 t1 und t2 enthielten beide jeweils eine Spalte c und Sie verweisen auf c in einem SELECT-Statement, das sowohl t1 als auch t2 benutzt. In diesem Fall ist c mehrdeutig, weil es innerhalb der im Statement benutzten Tabellen nicht eindeutig ist. Daher müssen Sie angeben, welche Tabelle Sie meinen, indem Sie t1.c oder t2.c schreiben. Ähnliches gilt, wenn Sie aus einer Tabelle t in Datenbank datenbank1 und von eine Tabelle t in Datenbank datenbank2 abrufen. Dann müssen Sie auf Spalten in diesen Tabellen als datenbank1.t.spalten_name und datenbank2.t.spalten_name verweisen.

Die Syntax .tabelle bedeutet die Tabelle tabelle in der aktuellen Datenbank. Diese Syntax wird aus Gründen der ODBC-Kompatibilität akzeptiert, weil einige ODBC-Programme Tabellenname ein `.'-Zeichen voranstellen.

7.1.3 Groß-/Kleinschreibung in Namen

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. See section 2.7.3 MySQL-Erweiterungen zu ANSI SQL92.

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 meine_tabelle als auch mit MEINE_TABELLE verweist:

mysql> SELECT * FROM meine_tabelle WHERE MEINE_TABELLE.spalte=1;

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 a als auch mit A verweist:

mysql> SELECT spalten_name FROM tabelle AS a
           WHERE a.spalten_name = 1 OR A.spalten_name = 2;

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, mysqld mit -O lower_case_tabelles=1 zu starten. Vorgabemäßig ist diese Option 1 unter Windows und 0 unter Unix.

Wenn 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 mysqld starten.

7.1.4 Benutzer-Variablen

MySQL unterstützt Thread-spezifische Variablen mit der @variablename-Syntax. Eine Variable kann aus alphanumerischen Zeichen des aktuellen Zeichensatzes sowie aus `_', `$' und `.' bestehen. Der vorgabemäßige Zeichensatz ist ISO-8859-1 Latin1; das kann mit der --default-character-set-Option für mysqld geändert werden. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.

Variablen müssen nicht initialisiert werden. Sie enthalten vorgabemäßig 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 SET-Syntax setzen:

SET @variable= { ganzzahl_ausdruck | realzahl_ausdruck | zeichenketten_ausdruck } [,@variable= ...].

Sie können eine Variable in einem Ausdruck auch mit der @variable:=expr-Syntax setzen:

select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

(Wir mussten hier die :=-Syntax benutzen, weil = 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 LIMIT-Klausel eines SELECT-Statements oder der IGNORE Anzahl LINES-Klausel eines LOAD DATA-Statements.

HINWEIS: In einem SELECT-Statement wird jeder Ausdruck erst dann ausgewertet, wenn er an den Client geschickt wird. Das heißt, dass Sie in der HAVING-, GROUP BY- oder ORDER BY-Klausel nicht auf einen Ausdruck verweisen können, der Variablen beinhaltet, die nicht im SELECT-Teil gesetzt wurden. Folgendes Statement zum Beispiel funktioniert erwartungsgemäß NICHT:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tabelle HAVING b=5;

Der Grund ist, dass @aa nicht den Wert der aktuellen Zeile enthält, sondern den Wert von id der vorher akzeptierten Zeile.

7.1.5 Kommentar-Syntax

Der MySQL-Server die Kommentar-Stile # bis Zeilenende, -- bis Zeilenende und /* mittendrin oder mehrzeilig */:

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;

Beachten Sie, dass Sie beim Kommentarstil -- mindestens ein Leerzeichen hinter -- setzen müssen!

Obwohl der Server die Kommentar-Syntax wie beschrieben versteht, gibt es einige Einschränkungen in der Art, wie der mysql-Client /* ... */-Kommentare parst:

  • 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 mysql interaktiv ausführen, sehen Sie, dass mysql verwirrt ist, weil sich die Eingabeaufforderung von mysql> zu to '> oder "> ändert.
  • Ein Semikolon wird genommen, um das Ende des aktuellen SQL-Statements kenntlich zu machen. Alles Folgende wird als Anfang des nächsten Statements aufgefasst.

Diese Einschränkungen gelten sowohl, wenn Sie mysql interaktiv ausführen und wenn Sie Befehle in eine Datei schreiben und mysql mit mysql < some-file anweisen, seine Eingaben aus dieser Datei zu lesen.

MySQL unterstützt nicht den ANSI-SQL-Kommentarstil `--' ohne nachfolgendes Leerzeichen. See section 2.7.4.8 `--' als Beginn eines Kommentars.

7.1.6 Ist MySQL pingelig hinsichtlich reservierter Wörter?

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 TIMESTAMP oder GROUP. Sie dürfen das tun (beispielsweise ist ABS ein zulässiger Spaltenname), aber es sind dann keine Leerzeichen zwischen einem Funktionsname und der `(' 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 group). Einige wenige sind reserviert, weil MySQL sie benötigt und (momentan) einen yacc-Parser benutzt:

action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full Funktion
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procedure process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary mit write when
where year year_month zerofill

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.

  • ACTION
  • BIT
  • DATE
  • ENUM
  • NO
  • TEXT
  • TIME
  • TIMESTAMP

7.2 Spaltentypen

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:

M
Gibt die maximale Anzeigebreite an. Die größte erlaubte Anzeigebreite ist 255.
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 M-2.

Eckige Klammern (`[' und `]') geben Teile der Typ-Festlegung an, die optional sind.

Wenn Sie ZEROFILL für eine Spalte angeben, beachten Sie, dass MySQL der Spalte automatisch ein UNSIGNED-Attribut hinzufügt.

TINYINT[(M)] [UNSIGNED] [ZEROFILL]
Eine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -128 bis 127. Der vorzeichenlose Bereich ist 0 to 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
Eine kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -32768 bis 32767. Der vorzeichenlose Bereich ist 0 bis 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
A Ganzzahl mittlerer Größe. Der vorzeichenbehaftete Bereich ist -8388608 bis 8388607. Der vorzeichenlose Bereich ist 0 bis 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
Eine Ganzzahl normaler Größe. Der vorzeichenbehaftete Bereich ist -2147483648 bis 2147483647. Der vorzeichenlose Bereich ist 0 bis 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
Ein Synonym für INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
Eine große Ganzzahl. Der vorzeichenbehaftete Bereich ist -9223372036854775808 bis 9223372036854775807. Der vorzeichenlose Bereich ist 0 bis 18446744073709551615. Einiger Dinge sollten Sie sich bei BIGINT-Spalten bewusst sein:
  • Weil alle arithmetischen Berechnungen mit vorzeichenbehafteten BIGINT- oder DOUBLE-Werten durchgeführt werden, sollten Sie keine vorzeichenlosen Ganzzahlen größer als 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 BIGINT in DOUBLE auftreten. MySQL 4.0 kann BIGINT in folgenden Fällen handhaben:
    • Benutzen Sie Ganzzahlen, um große vorzeichenlose Wert in einer BIGINT-Spalte zu speichern.
    • Bei MIN(große_ganzzahl_spalte) und MAX(große_ganzzahl_spalte).
    • Bei der Benutzung der Operatoren (+, -, * usw.), wenn beide Operanden Ganzzahlen sind.
  • Sie können immer einen genauen Ganzzahlwert in einer BIGINT-Spalte speichern, wenn Sie sie als Zeichenkette speichern, denn in diesem Fall wird diese nicht zwischendurch als Double dargestellt.
  • `-', `+' und `*' benutzen arithmetische BIGINT-Berechnungen, wenn beide Argumente 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 9223372036854775807 ist.
FLOAT(genauigkeit) [ZEROFILL]
Eine Fließkommazahl. Kann nicht vorzeichenlos sein. genauigkeit ist <=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 FLOAT und DOUBLE-Typen. FLOAT(X) hat denselben Wertebereich wie die entsprechenden FLOAT- und 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 FLOAT(genauigkeit) immer 2 Dezimalstellen. Beachten Sie, dass bei der Benutzung von FLOAT unerwartete Probleme auftreten können, weil alle Berechnungen in MySQL mit doppelter Genauigkeit durchgeführt werden. See section A.5.6 Probleme bei keinen übereinstimmenden Zeilen lösen. Diese Syntax steht wegen der ODBC-Kompatibilität zur Verfügung.
FLOAT[(M,D)] [ZEROFILL]
Eine kleine Fließkommazahl (einfacher Genauigkeit). Kann nicht vorzeichenlos sein. Der Wertebereich umfasst -3.402823466E+38 bis -1.175494351E-38, 0 und 1.175494351E-38 bis 3.402823466E+38. M ist die Anzeigebreite und D ist die Anzahl von Dezimalstellen. FLOAT ohne Argument oder mit einem Argument <= 24 steht für eine Fließkommazahl einfacher Genauigkeit.
DOUBLE[(M,D)] [ZEROFILL]
Eine normal große Fließkommazahl (doppelter Genauigkeit). Kann nicht vorzeichenlos sein. Der Wertebereich umfasst -1.7976931348623157E+308 bis -2.2250738585072014E-308, 0 und 2.2250738585072014E-308 bis 1.7976931348623157E+308. M ist die Anzeigebreite und D ist die Anzahl von Dezimalstellen. DOUBLE ohne Argument oder FLOAT(X) mit 25 <= X <= 53 steht für eine Fließkommazahl doppelter Genauigkeit.
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
Synonyme für DOUBLE.
DECIMAL[(M[,D])] [ZEROFILL]
Eine unkomprimierte Fließkommazahl. Kann nicht vorzeichenlos sein. Verhält sich wie eine 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 `-'-Zeichen, werden in M nicht mitgezählt (aber hierfür wird Platz reserviert). Wenn D 0 ist, haben Werte keinen Dezimalpunkt oder Bruchteil. Der maximale Wertebereich von DECIMAL-Werte ist derselbe wie für DOUBLE, aber der tatsächliche Wertebereich einer gegebenen DECIMAL-Spalte kann durch die Auswahl von M und D eingeschränkt sein. Wenn D weggelassen wird, wird es auf 0 gesetzt. Wenn M ausgelassen wird, wird es auf 10 gesetzt. Beachten Sie, dass in MySQL-Version 3.22 das M-Argument den Platz für das Vorzeichen und den Dezimalpunkt beinhaltete!
NUMERIC(M,D) [ZEROFILL]
Synonym für DECIMAL.
DATE
Ein Datum. Der unterstützte Wertebereich ist '1000-01-01' bis '9999-12-31'. MySQL zeigt DATE-Werte im 'YYYY-MM-DD'-Format an, gestattet jedoch, DATE-Spalten Werte entweder als Zeichenketten oder als Zahlen zuzuweisen. See section 7.2.2.2 Die DATETIME-, DATE- und TIMESTAMP-Typen.
DATETIME
Eine Datums-/Zeit-Kombination. Der unterstützte Wertebereich ist '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'. MySQL zeigt DATETIME-Werte im 'YYYY-MM-DD HH:MM:SS'-Format an, gestattet jedoch, DATETIME-Spalten Werte entweder als Zeichenketten oder als Zahlen zuzuweisen. See section 7.2.2.2 Die DATETIME-, DATE- und TIMESTAMP-Typen.
TIMESTAMP[(M)]
Ein Zeitstempel. Der Wertebereich ist '1970-01-01 00:00:00' bis irgendwann im Jahr 2037. MySQL zeigt TIMESTAMP-Werte im YYYYMMDDHHMMSS-, YYMMDDHHMMSS-, YYYYMMDD- oder YYMMDD-Format an, abhängig davon, ob M 14 (oder fehlend), 12, 8 oder 6 ist, gestattet aber, dass Sie TIMESTAMP-Spalten Werte entweder als Zeichenketten oder als Zahlen zuweisen. Eine TIMESTAMP-Spalte ist nützlich, um Datum und Zeit einer INSERT- oder 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 NULL-Wert zuweisen. See section 7.2.2 Datums- und Zeit-Typen. Ein TIMESTAMP wird immer mit 4 Bytes gespeichert. Das M-Argument betrifft nur die Anzeige der TIMESTAMP-Spalte. Beachten Sie, dass TIMESTAMP(X)-Spalten, bei denen X 8 oder 14 ist, als Zahlen interpretiert werden, während andere TIMESTAMP(X)-Spalten als Zeichenketten interpretiert werden. Das soll lediglich sicherstellen, dass Sie Tabellen mit diesen Typen verlässlich dumpen und wiederherstellen können! See section 7.2.2.2 Die DATETIME-, DATE- und TIMESTAMP-Typen.
TIME
Ein Zeit-Typ. Der Wertebereich ist '-838:59:59' bis '838:59:59'. MySQL zeigt TIME-Werte im 'HH:MM:SS'-Format an, gestattet aber, TIME-Spalten Werte entweder als Zeichenketten oder als Zahlen zuweisen. See section 7.2.2.3 Der TIME-Typ.
YEAR[(2|4)]
Ein Jahr in 2- oder 4-Ziffernformat (Vorgabe ist 4-Ziffern). Die zulässigen Werte reichen von 1901 bis 2155 sowie 0000 im 4-Ziffern-Jahresformat, und von 1970 bis 2069 beim 2-Ziffernformat (70 bis 69). MySQL zeigt YEAR-Werte im YYYY-Format an, gestattet aber, YEAR-Spalten Werte entweder als Zeichenketten oder als Zahlen zuweisen. (Der YEAR-Typ ist neu seit MySQL-Version 3.22.). See section 7.2.2.4 Der YEAR-Typ.
[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 M ist 1 bis 255 Zeichen. Leerzeichen am Ende werden beim Abruf des Wertes entfernt. CHAR-Werte werden nach dem vorgabemäßigen Zeichensatz ohne Berücksichtigung der Groß-/Kleinschreibung sortiert und verglichen, es sei denn, dass Schlüsselwort BINARY wird angegeben. NATIONAL CHAR (Kurzform 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. CHAR ist eine Abkürzung für CHARACTER. MySQL erlaubt das Anlegen einer Spalte des Typs 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 CHAR(0), die nicht als NOT NULL definiert ist, belegt nur 1 Bit und kann 2 Werte annehmen: NULL oder "". See section 7.2.3.1 Die CHAR- und VARCHAR-Typen.
[NATIONAL] VARCHAR(M) [BINARY]
Eine Zeichenkette variabler Länge. HINWEIS: Leerzeichen am Ende werden bei der Speicherung des Wertes entfernt (das unterscheidet den Typ von der ANSI-SQL-Spezifikation). Der Wertebereich von M ist 1 bis 255 Zeichen. VARCHAR-Werte werden nach dem vorgabemäßigen Zeichensatz ohne Berücksichtigung der Groß-/Kleinschreibung sortiert und verglichen, es sei denn, dass Schlüsselwort BINARY wird angegeben. See section 7.5.3.1 Stille Spaltentyp-Änderungen. VARCHAR ist eine Abkürzung für CHARACTER VARYING. See section 7.2.3.1 Die CHAR- und VARCHAR-Typen.
TINYBLOB
TINYTEXT
Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 255 (2^8 - 1) Zeichen. See section 7.5.3.1 Stille Spaltentyp-Änderungen. See section 7.2.3.2 Die BLOB- und TEXT-Typen.
BLOB
TEXT
Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 65535 (2^16 - 1) Zeichen. See section 7.5.3.1 Stille Spaltentyp-Änderungen. See section 7.2.3.2 Die BLOB- und TEXT-Typen.
MEDIUMBLOB
MEDIUMTEXT
Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 16777215 (2^24 - 1) Zeichen. See section 7.5.3.1 Stille Spaltentyp-Änderungen. See section 7.2.3.2 Die BLOB- und TEXT-Typen.
LONGBLOB
LONGTEXT
Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 4294967295 (2^32 - 1) Zeichen. See section 7.5.3.1 Stille Spaltentyp-Änderungen. 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. See section 7.2.3.2 Die BLOB- und TEXT-Typen.
ENUM('wert1','wert2',...)
An Aufzählung. Ein Zeichenkettenobjekt, das nur einen Wert haben kann, der aus den Auflistungswerten 'wert1', 'wert2', ..., NULL oder dem speziellen ""-Fehlerwert ausgewählt wird. Eine ENUM kann maximal 65535 unterschiedliche Werte haben. See section 7.2.3.3 Der ENUM-Typ.
SET('wert1','wert2',...)
Eine Reihe. Ein Zeichenkettenobjekt, das 0 oder mehr Werte haben kann, von denen jeder aus den Auflistungswerten 'wert1', 'wert2', ... ausgewählt werden muss. Eine SET kann maximal 64 Elemente haben. See section 7.2.3.4 Der SET-Typ.

7.2.1 Numerische Typen

MySQL unterstützt alle numerischen Typen von ANSI/ISO-SQL92. Diese Typen beinhalten die exakten numerischen Datentypen (NUMERIC, DECIMAL, INTEGER und SMALLINT) sowie die näherungsweisen numerischen Datentypen (FLOAT, REAL und DOUBLE PRECISION). Das Schlüsselwort INT ist ein Synonym für INTEGER und das Schlüsselwort DEC ist ein Synonym für DECIMAL.

Die NUMERIC- und 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:

    gehalt DECIMAL(9,2)

In diesem Beispiel repräsentiert 9 (genauigkeit) die Anzahl signifikanter Dezimalziffern, die für Werte gespeichert werden, und 2 (bereich) repräsentiert die Anzahl von Ziffern, die nach dem Dezimalpunkt gespeichert werden. In diesem Fall liegt der Wertebereich, der in der gehalt-Spalte gespeichert werden kann, deswegen zwischen -9999999.99 und 9999999.99. (MySQL kann tatsächlich Zahlen bis zu 9999999.99 in dieser Spalte speichern, weil er nicht das Vorzeichen für positive Zahlen speichern muss).

In ANSI/ISO-SQL92 ist die Syntax DECIMAL(p) äquivalent zu DECIMAL(p,0). Gleichermaßen ist die Syntax DECIMAL äquivalent zu DECIMAL(p,0), wobei es der Implementation überlassen bleibt, den Wert von p festzulegen. MySQL unterstützt momentan keine dieser abweichenden Formen der DECIMAL- / 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.

DECIMAL- und 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 bereich > 0) und das `-'-Zeichen (für negative Zahlen). Wenn bereich 0 ist, enthalten DECIMAL- und NUMERIC-Werte weder Dezimalpunkt noch Bruchteil.

Der maximale Wertebereich von DECIMAL- und NUMERIC-Werten ist derselbe wie für DOUBLE, aber der tatsächliche Wertebereich einer gegebenen DECIMAL- oder NUMERIC-Spalte kann durch genauigkeit oder 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 bereich zugelassen, wird der Wert auf diesen bereich gerundet. Wenn einer DECIMAL- oder NUMERIC-Spalte ein Wert zugewiesen wird, dessen Größe den Wertebereich überschreitet, der von der festgelegten (oder vorgabemäßigen) genauigkeit und 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 TINYINT, MEDIUMINT und 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 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 ZEROFILL wird - statt vorgabemäßig mit Leerzeichen - mit Nullen aufgefüllt. Bei einer Spalte zum Beispiel, die als INT(5) ZEROFILL deklariert wurde, wird 4 als 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 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 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 FLOAT in Klammern. Die MySQL-Implementation unterstützt ebenfalls diese optionale Genauigkeitsfestlegung. Wenn das Schlüsselwort 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 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 DECIMAL und 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 REAL- und DOUBLE PRECISION-Typen akzeptieren keine Genauigkeitsfestlegungen. Als Erweiterung zum ANSI/ISO-SQL92-Standard erkennt MySQL DOUBLE als ein Synonym für den DOUBLE PRECISION-Typ. Im Gegensatz zur Anforderung des Standard, dass die Genauigkeit für REAL kleiner sein muss als die für 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, FLOAT oder 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 INT-Spalte ist zum Beispiel -2147483648 bis 2147483647. Wenn Sie versuchen, -9999999999 in eine INT-Spalte einzufügen, wird der Wert auf den unteren Endpunkt des Bereichs abgeschnitten, und es wird -2147483648 gespeichert. Gleichermaßen wird beim Einfügen in eine solche Spalte nicht 9999999999, sondern 2147483647 gespeichert.

Wenn die INT-Spalte UNSIGNED ist, ist die Größe des Wertebereichs dieselbe, aber ihre Endpunkte verschieben sich zu 0 und 4294967295. Wenn Sie versuchen, -9999999999 bzw. 9999999999 zu speichern, werden die in der Spalte gespeicherten Werte statt dessen zu 0 bzw. 4294967296.

Umwandlungen, die aufgrund von Abschneiden geschehen, werden als ``Warnungen'' bei ALTER TABLE, LOAD DATA INFILE, UPDATE und in mehrzeiligen INSERT-Statements berichtet.

7.2.2 Datums- und Zeit-Typen

Die Datums- und Zeit-Typen sind DATETIME, DATE, TIMESTAMP, TIME und 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 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 DATE- oder 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 1999-00-00 oder 1999-01-00 speichern. (Sie können nicht erwarten, von Funktionen wie DATE_SUB() oder 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:

  • 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.
  • 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 '98-09-04') statt in der Reihenfolge Monat - Tag - Jahr oder Tag - Monat - Jahr, die anderswo häufig gebraucht werden (zum Beispiel '09-04-98', '04-09-98').
  • MySQL wandelt einen Datums- oder Zeitwert automatisch in eine Zahl um, wenn der Wert in einem numerischen Zusammenhang benutzt wird, und umgekehrt.
  • 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 TIME-Werte ausserhalb des Wertebereichs auf den entsprechenden Endpunkt des TIME-Wertebereichs abgeschnitten werden.) Die unten stehende Tabelle zeigt das Format des ``0''-Werts für jeden Typ:
    Spaltentyp ``0''-Wert
    DATETIME '0000-00-00 00:00:00'
    DATE '0000-00-00'
    TIMESTAMP 00000000000000 (Länge abhängig von der Anzeigebreite)
    TIME '00:00:00'
    YEAR 0000
  • 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 '0' oder 0 machen, die leichter zu schreiben sind.
  • ``0''-Datums- oder -Zeitwerte, die über MyODBC benutzt werden, werden in MyODBC-Version 2.50.12 und höher automatisch in NULL umgewandelt, weil ODBC solche Werte nicht handhaben kann.

7.2.2.1 Jahr-2000-Probleme und Datumstypen

MySQL selbst ist Jahr-2000-konform (Jahr-2000-sicher, see section 2.2.4 Jahr-2000-Konformität), 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 DATETIME-, DATE-, TIMESTAMP- und YEAR-Typen interpretiert MySQL Datumsangaben mit mehrdeutigen Jahreswerten nach folgenden Regeln:

  • Jahreswerte im Bereich 00 bis 69 werden in 2000 bis 2069 umgewandelt.
  • Jahreswerte im Bereich 70 bis 99 werden in 1970 bis 1999 umgewandelt.

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.

ORDER BY sortiert 2-stellige YEAR/DATE/DATETIME-Typen korrekt.

Beachten Sie, dass einige Funktionen wie MIN() und MAX() ein 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 TIMESTAMP / DATE in ein 4-stelliges Jahresformat umgewandelt wird, oder etwas wie MIN(DATE_ADD(zeitstempel,INTERVAL 0 DAYS)) benutzt wird.

7.2.2.2 Die DATETIME-, DATE- und TIMESTAMP-Typen

Die DATETIME-, DATE- und TIMESTAMP-Typen sind verwandt. Dieser Abschnitt beschreibt ihre Charakteristiken, wo sie sich ähnlich sind und wo sie sich unterscheiden.

Der DATETIME-Typ wird benutzt, wenn Sie Werte brauchen, die sowohl Datums- als auch Zeitinformationen beinhalten. MySQL ruft DATETIME-Werte ab und zeigt sie an im 'YYYY-MM-DD HH:MM:SS'-Format. Der unterstützte Wertebereich ist '1000-01-01 00:00:00' bis '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 DATE-Typ wird benutzt, wenn Sie nur einen Datumswert brauchen, ohne Zeitanteil. MySQL ruft DATE-Werte ab und zeigt sie an im 'YYYY-MM-DD'-Format. Der unterstützte Wertebereich ist '1000-01-01' bis '9999-12-31'.

Der TIMESTAMP-Typ ist ein Typ, den Sie dafür benutzen können, um INSERT- oder UPDATE-Operationen mit dem aktuellen Datum und der aktuellen Zeit zu stempeln. Wenn Sie mehrfache TIMESTAMP-Spalten haben, wird nur die erste automatisch aktualisiert.

Die automatische Aktualisierung der TIMESTAMP-Spalte geschieht unter einer der folgenden Bedingungen:

  • Die Spalte wird in einem INSERT- oder LOAD DATA INFILE-Statement nicht explizit angegeben.
  • Die Spalte wird in einem UPDATE-Statement nicht explizit angegeben, aber ein anderer Spaltenwert ändert sich. (Beachten Sie, dass ein UPDATE, das eine Spalte auf einen Wert setzt, den diese bereits hat, nicht dazu führt, dass die TIMESTAMP-Spalte aktualisiert wird, weil MySQL das Aktualisieren in einem solchen Fall auf Effizienzgründen ignoriert.)
  • Wenn Sie die TIMESTAMP-Spalte explizit auf NULL setzen.

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 NULL oder auf NOW().

Sie können jede 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 TIMESTAMP-Spalte. Sie können diese Eigenschaft benutzen, wenn Sie einen 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:

  • Lassen Sie MySQL die Spalte setzen, wenn die Zeile erzeugt wird. Das initialisiert sie auf das aktuelle Datum und die aktuelle Zeit.
  • Wenn Sie nachfolgende Aktualisierungen anderer Spalten in der Zeile durchführen, setzen Sie die TIMESTAMP-Spalte explizit auf ihren aktuellen Wert.

Auf der anderen Seite finden Sie vielleicht mindestens so einfach, eine DATETIME-Spalte zu benutzen, die Sie auf NOW() initialisieren, wenn die Zeile erzeugt wird, und die Sie bei nachfolgenden Aktualisierungen nicht anfassen.

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 TIMESTAMP-Werte abruft und anzeigt, hängt von der Anzeigebreite ab, wie in der obigen Tabelle dargestellt. Das `volle' TIMESTAMP-Format ist 14 Ziffern, aber TIMESTAMP-Spalten können mit kürzeren Anzeigebreiten angelegt werden:

Spaltentyp Anzeigeformat
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY

Alle 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 DATETIME-, DATE- und TIMESTAMP-Werte mit folgenden Formaten festlegen:

  • Als eine Zeichenkette im 'YYYY-MM-DD HH:MM:SS'- oder '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 '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45' und '98@12@31 11^30^45' äquivalent.
  • Als eine Zeichenkette im 'YYYY-MM-DD'- oder 'YY-MM-DD'-Format. Auch hier ist eine ``entspannte'' Syntax zugelassen. Beispielsweise sind '98-12-31', '98.12.31', '98/12/31' und '98@12@31' äquivalent.
  • Als eine Zeichenkette ohne Begrenzer im 'YYYYMMDDHHMMSS'- oder 'YYMMDDHHMMSS'-Format, vorausgesetzt, die Zeichenkette ergibt als Datum einen Sinn. '19970523091528' und '970523091528' beispielsweise werden als '1997-05-23 09:15:28' interpretiert, aber '971122129015' ist unzulässig (es hat einen Minutenanteil, der keinen Sinn ergibt) und wird in '0000-00-00 00:00:00' umgewandelt.
  • Als eine Zeichenkette ohne Begrenzer im 'YYYYMMDD'- oder 'YYMMDD'-Format, vorausgesetzt, die Zeichenkette ergibt als Datum einen Sinn. '19970523' und '970523' werden als '1997-05-23' interpretiert, aber '971332' ist unzulässig (es hat einen Monatsanteil und einen Tagesanteil, der keinen Sinn ergibt) und wird in '0000-00-00' umgewandelt.
  • Als eine Zahl im YYYYMMDDHHMMSS- oder YYMMDDHHMMSS-Format, vorausgesetzt, die Zahl ergibt als Datum einen Sinn. 19830905132800 und 830905132800 zum Beispiel werden als '1983-09-05 13:28:00' interpretiert.
  • Als eine Zahl im YYYYMMDD- oder YYMMDD-Format, vorausgesetzt, die Zahl ergibt als Datum einen Sinn. 19830905 und 830905 zum Beispiel werden als '1983-09-05' interpretiert.
  • Als Ergebnis einer Funktion, die einen Wert zurückgibt, der in einem DATETIME-, DATE- oder TIMESTAMP-Zusammenhang einen Sinn ergibt, wie NOW() oder CURRENT_DATE.

Unzulässige DATETIME-, DATE- oder TIMESTAMP-Werte werden in den ``0''-Wert des jeweiligen Typs umgewandelt ('0000-00-00 00:00:00', '0000-00-00' oder 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 10 sind. '1979-6-9' ist dasselbe wie '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 10 sind. '1979-10-30 1:2:3' ist dasselbe wie '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 YYYYMMDD- oder 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 YYMMDD- oder 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.

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 '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 99 und 03 sind, aber der Tagesanteil fehlt (0), so dass der Wert kein zulässiges Datum darstellt.

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:

  • Geben Sie immer Jahr, Monat und Tag an, selbst wenn Ihre Spaltentypen TIMESTAMP(4) oder TIMESTAMP(2) sind. Ansonsten wäre der Wert kein zulässiges Datum und 0 würde gespeichert werden.
  • Wenn Sie ALTER TABLE benutzen, um eine enge TIMESTAMP-Spalte breiter zu machen, werden Informationen angezeigt, die vorher ``versteckt'' waren.
  • Gleichermaßen führt das Verengen einer TIMESTAMP-Spalte nicht dazu, dass Informationen verloren gehen, ausser in dem Sinn, dass weniger Informationen dargestellt werden, wenn die Werte angezeigt werden.
  • Obwohl TIMESTAMP-Werte mit voller Genauigkeit gespeichert werden, ist die einzige Funktion, die direkt mit dem zugrunde liegenden gespeicherten Wert arbeitet, UNIX_TIMESTAMP(). Alle anderen Funktionen arbeiten mit dem formatierten, abgerufenen Wert. Das bedeutet, Sie können keine Funktionen wie HOUR() oder SECOND() benutzen, wenn nicht auch der relevante Teil des TIMESTAMP-Werts im formatierten Werte enthalten ist. Wenn zum Beispiel der HH-Teil einer TIMESTAMP-Spalte nicht angezeigt wird, wenn die Anzeigebreite nicht mindestens 10 beträgt, wird der Versuch, HOUR() auf kürzere TIMESTAMP-Werte anzuwenden, unsinnige Ergebnisse erzeugen.

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:

  • Wenn Sie einem DATETIME- oder TIMESTAMP-Objekt einen DATE-Wert zuweisen, wird der Zeitanteil im Ergebniswert auf '00:00:00' gesetzt, weil der DATE-Wert keine Zeitinformationen enthält.
  • Wenn Sie einem DATE-Objekt einen DATETIME- oder TIMESTAMP-Wert zuweisen, wird der Zeitanteil des Ergebniswerts gelöscht, weil der DATE-Typ keine Zeitinformationen speichert.
  • Denken Sie daran, dass DATETIME-, DATE- und TIMESTAMP-Werte zwar in denselben Formaten angegeben werden können, dass die Typen jedoch nicht alle denselben Wertebereich haben. TIMESTAMP-Werte zum Beispiel können nicht früher als 1970 oder später als 2037 sein. Das bedeutet, dass ein Datum wie '1968-01-01', was als DATETIME oder DATE-Wert zulässig wäre, kein gültiger TIMESTAMP-Wert ist und in 0 umgewandelt wird, wenn er einem solchen Objekt zugewiesen wird.

Seien Sie auf der Hut vor Fallstricken, wenn Sie Datumswerte angeben:

  • Das entspannte Format läßt Werte als Zeichenketten zu, die täuschen können. Ein Wert wie '10:11:12' zum Beispiel sieht wegen des `:'-Begrenzers wie ein Zeitwert aus, wird er aber in einem Datums-Zusammenhang benutzt, wird er als das Datum '2010-11-12' interpretiert. Der Wert '10:45:15' wird in '0000-00-00' umgewandelt, weil '45' kein zulässiger Monat ist.
  • Jahreswerte, die als zwei Ziffern angegeben werden, sind mehrdeutig, weil das Jahrhundert unbekannt ist. unknown. MySQL interpretiert 2-stellige Jahreswerte nach folgenden Regeln:
    • Jahreswerte im Bereich 00 bis 69 werden in 2000 bis 2069 umgewandelt.
    • Jahreswerte im Bereich 70 bis 99 werden in 1970 bis 1999 umgewandelt.

7.2.2.3 Der TIME-Typ

MySQL ruft TIME-Werte ab und zeigt sie an im 'HH:MM:SS'-Format (oder 'HHH:MM:SS'-Format für große Stundenwerte). TIME-Werte rangieren von '-838:59:59' bis '838:59:59'. Der Grund dafür, dass der Stundenanteil so Groß sein kann, liegt darin, dass der 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 TIME-Werte in einer Vielzahl von Formaten angeben:

  • Als eine Zeichenkette im '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: HH:MM:SS.bruchteil, HH:MM:SS, HH:MM, D HH:MM:SS, D HH:MM, D HH oder SS. Hierbei ist D Tage zwischen 0 und 33.
  • Als eine Zeichenkette ohne Begrenzer im 'HHMMSS'-Format, vorausgesetzt, dass diese als Zeitangabe einen Sinn ergibt. '101112' zum Beispiel wird als '10:11:12' interpretiert, aber '109712' ist unzulässig (es hat einen Minutenanteil, der keinen Sinn ergibt) und wird in '00:00:00' umgewandelt.
  • Als eine Zahl im HHMMSS-Format, vorausgesetzt, dass diese als Zeitangabe einen Sinn ergibt. 101112 zum Beispiel wird als '10:11:12' interpretiert. Folgende alternativen Formate werden ebenfalls verstanden: SS, MMSS, HHMMSS, HHMMSS.bruchteil. Beachten Sie, dass MySQL bislang noch nicht den Bruchteil speichert.
  • Als Ergebnis einer Funktion, die einen Wert zurück gibt, der in einem TIME-Zusammenhang akzeptabel ist, wie CURRENT_TIME.

Bei 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 10 sind. '8:3:2' ist dasselbe wie '08:03:02'.

Seien Sie vorsichtig damit, einer TIME-Spalte ``kurze'' TIME-Werte zuzuweisen. Ohne Semikolon interpretiert MySQL Werte unter der Annahme, dass die am weitesten rechts stehenden Ziffern Sekunden repräsentieren. (MySQL interpretiert TIME-Werte als vergangene Zeit statt als Tageszeit.) Sie könnten zum Beispiel denken, dass '1112' und 1112 '11:12:00' bedeuten (12 Minuten nach 11 Uhr), aber MySQL interpretiert sie als '00:11:12' (11 Minuten, 12 Sekunden). Gleichermaßen wird '12' und 12 als '00:00:12' interpretiert. TIME-Werte mit Semikolon werden statt dessen immer als Tageszeit interpretiert. Das heißt, '11:12' bedeutet '11:12:00', nicht '00:11:12'.

Werte, die ausserhalb des TIME-Wertebereichs liegen, ansonsten aber zulässig sind, werden auf den entsprechenden Endpunkt des Wertebereichs abgeschnitten. '-850:00:00' bzw. '850:00:00' werden in '-838:59:59' bzw. '838:59:59' umgewandelt.

Unzulässige TIME-Werte werden in '00:00:00' umgewandelt. Beachten Sie, dass es keine Möglichkeit gibt zu unterscheiden, wenn ein Wert von '00:00:00' in einer Tabelle gespeichert ist, ob dieser originär als '00:00:00' eingegeben wurde oder ob es ein unzulässiger Wert war, weil '00:00:00' selbst ein zulässiger TIME-Wert ist.

7.2.2.4 Der YEAR-Typ

Der YEAR-Typ ist ein 1-Byte-Typ, der für die Darstellung von Jahren benutzt wird.

MySQL ruft YEAR-Werte ab und speichert sie im YYYY-Format. Der Wertebereich ist 1901 bis 2155.

Sie können YEAR-Werte in einer Vielzahl von Formaten angeben:

  • Als vierstellige Zeichenkette im Wertebereich von '1901' bis '2155'.
  • Als vierstellige Zahl im Wertebereich von 1901 bis 2155.
  • Als zweistellige Zeichenkette im Wertebereich von '00' bis '99'. Werte in den Bereichen von '00' bis '69' und '70' bis '99' werden in YEAR-Werte in den Bereichen von 2000 bis 2069 und 1970 bis 1999 umgewandelt.
  • Als zweistellige Zahl im Wertebereich von 1 bis 99. Werte in den Bereichen von 1 bis 69 und 70 bis 99 werden in YEAR-Werte in den Bereichen von 2001 bis 2069 und 1970 bis 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 2000 interpretiert wird. Sie müssen sie als Zeichenkette '0' oder '00' angeben, oder sie wird als 0000 interpretiert.
  • Als Ergebnis einer Funktion, die einen Wert zurück gibt, der in einem YEAR-Zusammenhang akzeptabel ist, wie NOW().

Unzulässige YEAR-Werte werden in 0000 umgewandelt.

7.2.3 Zeichenketten-Typen

Die Zeichenketten-Typen sind CHAR, VARCHAR, BLOB, TEXT, ENUM und SET. Dieser Abschnitt beschreibt, wie diese Typen funktionieren, ihren Speicherbedarf und wie sie in Anfragen benutzt werden.

7.2.3.1 Die CHAR- und VARCHAR-Typen

Die CHAR- und VARCHAR-Typen sind ähnlich, unterscheiden sich aber in der Art, wie sie gespeichert und abgerufen werden.

Die Länge einer 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 CHAR-Werte gespeichert werden, werden sie am rechten Ende bis zur festgelegten Länge mit Leerzeichen aufgefüllt. Wenn CHAR-Werte abgerufen werden, werden die Leerzeichen am Ende entfernt.

Werte in VARCHAR-Spalten sind Zeichenketten variabler Länge. Sie können eine VARCHAR-Spalte mit jeder Länge zwischen 1 und 255 deklarieren, genau wie für CHAR-Spalten. Im Gegensatz zu CHAR werden 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 CHAR- oder 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 CHAR(4)- und VARCHAR(4)-Spalten gezeigt wird:

Wert CHAR(4) Speicherbedarf VARCHAR(4) Speicherbedarf
'' ' ' 4 Bytes '' 1 Byte
'ab' 'ab ' 4 Bytes 'ab' 3 Bytes
'abcd' 'abcd' 4 Bytes 'abcd' 5 Bytes
'abcdefgh' 'abcd' 4 Bytes 'abcd' 5 Bytes

Die Werte, die aus den CHAR(4)- und VARCHAR(4)-Spalten abgerufen werden, sind in jedem Fall gleich, weil Leerzeichen am Ende von CHAR-Spalten beim Abruf entfernt werden.

Werte in CHAR- und VARCHAR-Spalten werden unabhängig von der Groß-/Kleinschreibung sortiert und verglichen, es sei denn, beim Erzeugen der Tabelle wurde das BINARY-Attribut festgelegt. Das 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. BINARY beeinflusst nicht, wie die Spalte gespeichert oder abgerufen wird.

Das BINARY-Attribut ist 'klebrig', das heißt, dass der gesamte Ausdruck als ein BINARY-Wert verglichen wird, sobald eine BINARY-Spalte im Ausdruck benutzt wird.

MySQL ändert eventuell 'still' den Typ von CHAR- oder VARCHAR-Spalten bei der Tabellenerzeugung. See section 7.5.3.1 Stille Spaltentyp-Änderungen.

7.2.3.2 Die BLOB- und TEXT-Typen

Ein BLOB ist großes Binärobjekt (Binary Large OBject), das eine variable Menge von Daten enthalten kann. Die vier BLOB-Typen TINYBLOB, BLOB, MEDIUMBLOB und LONGBLOB unterscheiden sich nur hinsichtlich der maximalen Länge der Werte, die sie aufnehmen können. See section 7.2.6 Speicherbedarf von Spaltentypen.

Die vier TEXT-Typen TINYTEXT, TEXT, MEDIUMTEXT und LONGTEXT entsprechen den vier BLOB-Typen und haben dieselben maximalen Längen und denselben Speicherbedarf. Der einzige Unterschied zwischen BLOB- und TEXT-Typen ist, dass beim Sortieren und Vergleichen bei BLOB-Werten Groß-/Kleinschreibung berücksichtigt wird, bei TEXT-Werten dagegen nicht. Mit anderen Worten ist ein TEXT ein BLOB ohne Berücksichtigung der Groß-/Kleinschreibung.

Wenn Sie einer BLOB- oder 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 TEXT-Spalte als eine VARCHAR-Spalte betrachten, die so Groß sein kann, wie Sie wollen. Gleichermaßen können Sie eine BLOB-Spalte als eine VARCHAR BINARY-Spalte betrachten. Die Unterschiede sind:

  • Seit MySQL-Version 3.23.2 können Sie Indexe auf BLOB- und TEXT-Spalten anlegen. Ältere Versionen von MySQL unterstützten das nicht.
  • Leerzeichen am Ende werden beim Speichern von BLOB- und TEXT-Spalten nicht wie bei VARCHAR-Spalten entfernt.
  • BLOB- und TEXT-Spalten können keine DEFAULT-Werte haben.

MyODBC definiert BLOB-Werte als LONGVARBINARY und TEXT-Werte als LONGVARCHAR.

Weil BLOB- und TEXT-Werte extrem lang sein können, treffen Sie bei der Benutzung eventuell auf Beschränkungen:

  • Wenn Sie GROUP BY oder ORDER BY für BLOB- oder TEXT-Spalten benutzen wollen, müssen Sie den Spaltenwert in ein Objekt fester Länge umwandeln. Standardmäßig wird das mit der SUBSTRING-Funktion gemacht. Beispiel:
    mysql> select kommentar from tabelle,substring(kommentar,20) as substr
           ORDER BY substr;
    
    Wenn Sie das nicht tun, werden nur die ersten max_sort_length Bytes der Spalte beim Sortieren benutzt. Der Vorgabewert von max_sort_length ist 1024; dieser Wert kann mit der -O-Option geändert werden, wenn der mysqld-Server gestartet wird. Sie können auf einen Ausdruck, der BLOB- oder TEXT-Werte enthält, gruppieren, indem Sie die Spaltenposition angeben oder ein Alias benutzen:
    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;
    
  • Die maximale Größe eines BLOB- oder 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. See section 6.5.2 Serverparameter tunen.

Beachten Sie, dass intern jeder BLOB- oder 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.

7.2.3.3 Der ENUM-Typ

Ein 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 ("") oder NULL sein:

  • Wenn Sie in eine 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.
  • Wenn ein ENUM als NULL deklariert ist, ist NULL ebenfalls ein zulässiger Wert für die Spalte und der Vorgabewert ist NULL. Wenn ein ENUM als NOT NULL deklariert ist, ist der Vorgabewert das erste Element der Auflistung erlaubter Werte.

Jeder Aufzählungswert hat einen Index:

  • Werte der Auflistung zulässiger Elemente in der Spaltenspezifikation fangen mit 1 an.
  • Der Indexwert des Fehlerwerts leere Zeichenkette ist 0. Folglich können Sie folgendes SELECT-Statement benutzen, um Zeilen zu finden, denen unzulässige ENUM-Werte zugewiesen wurden:
    mysql> SELECT * FROM tabelle WHERE enum_spalte=0;
    
  • Der Index des NULL-Werts ist NULL.

Wenn beispielsweise eine Spalte als ENUM("eins", "zwei", "drei") festgelegt wurde, kann sie einen der unten dargestellen Werte besitzen. Der Index jedes Werts wird auch dargestellt:

Wert Index
NULL NULL
"" 0
"eins" 1
"zwei" 2
"drei" 3

Eine Aufzählung kann maximal 65535 Elemente enthalten.

Groß-/Kleinschreibung ist irrelevant, wenn Sie einer 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 ENUM in einem numerischen Zusammenhang benutzen, wird der Index des Spaltenwerts zurückgegeben. Sie können beispielsweise numerische Werte aus einer ENUM-Spalte wie folgt abrufen:

mysql> SELECT enum_spalte+0 FROM tabelle;

Wenn Sie eine Zahl in eine ENUM speichern, wird die Zahl als Index behandelt und der gespeicherte Wert ist das Aufzählungselement mit diesem Index. (Das funktioniert jedoch nicht bei LOAD DATA, was alle Eingaben als Zeichenketten behandelt.)

ENUM-Werte werden in der Reihenfolge sortiert, wie die Aufzählungselemente bei der Spaltenspezifizierung eingegeben wurden. (Mit anderen Worten werden ENUM-Werte nach ihren Indexzahlen sortiert.) So wird beispielsweise "a" vor "b" einsortiert bei ENUM("a", "b"), aber "b" wird vor "a" einsortiert bei ENUM("b", "a"). Die leere Zeichenkette wird vor nicht leeren Zeichenketten und NULL-Werte vor allen anderen Aufzählungswerten einsortiert.

Wenn Sie alle möglichen Werte einer ENUM-Spalte erhalten wollen, benutzen Sie: SHOW COLUMNS FROM tabelle LIKE enum_spalte und gehen die ENUM-Definition in der zweiten Spalte durch.

7.2.3.4 Der SET-Typ

Ein 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. SET-Spaltenwerte, die aus mehrfachen SET-Elementen bestehen, werden angegeben, indem die Elemente durch Kommas (`,') getrennt werden. Daraus ergibt sich, dass SET-Elemente selbst keine Kommas enthalten dürfen.

Eine Spalte beispielsweise, die als SET("eins", "zwei") NOT NULL festgelegt wurde, kann folgende Werte haben:

""
"eins"
"zwei"
"eins,zwei"

Eine SET kann maximal 64 unterschiedliche Elemente besitzen.

MySQL speichert SET-Werte numerisch, wobei das niedrigste Bit in der Reihenfolge der gespeicherten Werte dem ersten SET-Element entspricht. Wenn Sie einen 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 SET-Spalte wie folgt abrufen:

mysql> SELECT set_spalte+0 FROM tabelle;

Wenn in einer 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 SET("a","b","c","d") festgelegt, dann haben die Elemente folgende Bitwerte:

SET Element Dezimalwert Binärwert
a 1 0001
b 2 0010
c 4 0100
d 8 1000

Wenn Sie dieser Spalte einen Wert von 9 zuweisen, ist das binär 1001. Daher werden der erste und der vierte SET-Wert, die Elemente "a" und "d", ausgewählt, und der Ergebniswert ist "a,d".

Bei einem Wert, der mehr als ein 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 SET("a","b","c","d") festgelegt ist, erscheinen "a,d", "d,a" und "d,a,a,d,d" als "a,d", wenn sie abgerufen werden.

SET-Werte werden numerisch sortiert. NULL-Werte werden vor Nicht-NULL-SET-Werten einsortiert.

Normalerweise führt man SELECT auf eine SET-Spalte mit dem LIKE-Operator oder der FIND_IN_SET()-Funktion aus:

mysql> SELECT * FROM tabelle WHERE set_spalte LIKE '%wert%';
mysql> SELECT * FROM tabelle WHERE FIND_IN_SET('wert',set_spalte)>0;

Aber auch folgendes funktioniert:

mysql> SELECT * FROM tabelle WHERE set_spalte = 'wert1,wert2';
mysql> SELECT * FROM tabelle WHERE set_spalte & 1;

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 SET-Spalte erhalten wollen, benutzen Sie: SHOW COLUMNS FROM tabelle LIKE set_spalte und gehen die SET-Definition in der zweiten Spalte durch.

7.2.4 Den richtigen Typ für eine Spalte 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 1 und 99999 benutzt wird, ist MEDIUMINT UNSIGNED der beste Typ.

Akkurate Darstellung monetärer Werte ist ein häufiges Problem. In MySQL sollten Sie den DECIMAL-Typ benutzen. Dieser wird als Zeichenkette gepeichert, weshalb kein Genauigkeitsverlust auftreten sollte. Wenn Genauigkeit nicht allzu wichtig ist, sollte auch der DOUBLE-Typ ausreichen.

Um hohe Präzision zu erzielen, können Sie immer auch in einen Festkommawert umwandeln, der in einer BIGINT gespeichert wird. Das erlaubt Ihnen, alle Berechnungen mit Ganzzahlen durchzuführen und die Ergebnisse nur wenn notwendig in Fließkommawerte zurückzuwandeln.

7.2.5 Spaltentypen anderer Datenbanken benutzen

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:

Typ anderer Hersteller MySQL-Typ
BINARY(NUM) CHAR(NUM) BINARY
CHAR VARYING(NUM) VARCHAR(NUM)
FLOAT4 FLOAT
FLOAT8 DOUBLE
INT1 TINYINT
INT2 SMALLINT
INT3 MEDIUMINT
INT4 INT
INT8 BIGINT
LONG VARBINARY MEDIUMBLOB
LONG VARCHAR MEDIUMTEXT
MIDDLEINT MEDIUMINT
VARBINARY(NUM) VARCHAR(NUM) BINARY

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 DESCRIBE tabelle-Statement absetzen, zeigt MySQL die Tabellenstruktur mit den äquivalenten MySQL-Typen an.

7.2.6 Speicherbedarf von Spaltentypen

Der Speicherbedarf jedes Spaltentyps, der von MySQL unterstützt wird, ist unten nach Kategorie sortiert aufgelistet:

Speicherbedarf für numerische Typen

Spaltentyp Speicherbedarf
TINYINT 1 Byte
SMALLINT 2 Bytes
MEDIUMINT 3 Bytes
INT 4 Bytes
INTEGER 4 Bytes
BIGINT 8 Bytes
FLOAT(X) 4, wenn X <= 24, oder 8, wenn 25 <= X <= 53
FLOAT 4 Bytes
DOUBLE 8 Bytes
DOUBLE PRECISION 8 Bytes
REAL 8 Bytes
DECIMAL(M,D) M+2 Bytes, wenn D > 0, M+1 Bytes, wenn D = 0 (D+2, wenn M < D)
NUMERIC(M,D) M+2 Bytes, wenn D > 0, M+1 Bytes, wenn D = 0 (D+2, wenn M < D)

Speicherbedarf für Datums- und Zeit-Typen

Spaltentyp Speicherbedarf
DATE 3 Bytes
DATETIME 8 Bytes
TIMESTAMP 4 Bytes
TIME 3 Bytes
YEAR 1 Byte

Speicherbedarf für Zeichenketten-Typen

Spaltentyp Speicherbedarf
CHAR(M) M Bytes, 1 <= M <= 255
VARCHAR(M) L+1 Bytes, wobei L <= M und 1 <= M <= 255
TINYBLOB, TINYTEXT L+1 Bytes, wobei L < 2^8
BLOB, TEXT L+2 Bytes, wobei L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 Bytes, wobei L < 2^24
LONGBLOB, LONGTEXT L+4 Bytes, wobei L < 2^32
ENUM('wert1','wert2',...) 1 oder 2 Bytes, abhängig von der Anzahl der Aufzählungswerte (65535 Werte maximal)
SET('wert1','wert2',...) 1, 2, 3, 4 oder 8 Bytes, abhängig von der Anzahl von SET-Elementen (64 Elemente maximal)

VARCHAR und die BLOB- und 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 L) statt von der maximal möglichen Größe des Typs. 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 (L) plus 1 Byte, um die Länge zu speichern. Bei der Zeichenkette 'abcd' ist L 4 und der Speicherbedarf 5 Bytes.

Die BLOB- und 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. See section 7.2.3.2 Die BLOB- und TEXT-Typen.

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. See section 7.5.3.1 Stille Spaltentyp-Änderungen.

Die Größe eines 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. See section 7.2.3.3 Der ENUM-Typ.

Die Größe eines SET-Objekts hängt von der Anzahl unterschiedlicher SET-Elemente ab. Wenn die SET-Größe N ist, belegt das Objekt (N+7)/8 Bytes, gerundet auf 1, 2, 3, 4 oder 8 Bytes. Ein SET kann maximal 64 Elemente besitzen. See section 7.2.3.4 Der SET-Typ.

7.3 Funktionen für die Benutzung in SELECT- und WHERE-Klauseln

Ein select_ausdruck oder eine where_definition in einem SQL-Statement kann aus jedem beliebigen Ausdruck bestehen, der die unten beschriebenen Funktionen benutzt.

Ein Ausdruck, der NULL enthält, erzeugt immer einen NULL-Wert, wenn es in der Dokumentation für die Operatoren und Funktionen, die im Ausdruck vorkommen, nicht anders beschrieben ist.

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 mysqld mit --ansi starten oder CLIENT_IGNORE_SPACE bei mysql_connect(), benutzen, aber in diesem Fall werden alle Funktionsnamen zu reservierten Wörtern. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.

Der Kürze zuliebe sind die Ausgaben des mysql-Programms in gekürzter Form dargestellt. Daher wird

mysql> select MOD(29,9);
+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+
1 rows in set (0.00 sec)

wie folgt dargestellt:

mysql> select MOD(29,9);
        -> 2

7.3.1 Nicht typenspezifische Operatoren und Funktionen

7.3.1.1 Klammer

( ... )

Benutzen Sie Klammern, um die Reihenfolge der Auswertung in einem Ausdruck zu erzwingen. Beispiel:

mysql> select 1+2*3;
        -> 7
mysql> select (1+2)*3;
        -> 9

7.3.1.2 Vergleichsoperatoren

Vergleichsoperationen ergeben einen Wert von 1 (TRUE), 0 (FALSE) oder 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:

  • Wenn ein oder beide Argumente NULL sind, ist das Ergebnis des Vergleichs NULL, ausser beim <=> Operator.
  • Wenn beide Argumente in einer Vergleichsoperation Zeichenketten sind, werden sie als Zeichenketten verglichen.
  • Wenn beide Argumente Ganzzahlen sind, werden sie als Ganzzahlen verglichen.
  • Hexadezimale Werte werden als binäre Zeichenketten behandelt, wenn sie nicht mit einer Zahl verglichen werden.
  • Wenn eins der Argumente eine TIMESTAMP- oder 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.
  • In allen an