
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.
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.
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
NUL) Zeichen.
\'
\"
\b
\n
\r
\t
\z
mysql Datenbank < Dateiname
benutzen.)
\\
\%
\_
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:
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
\
'
"
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!
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.
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.
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.
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:
--default-character-set-Option für mysqld geändert werden.
See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
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.
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.
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.
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:
mysql interaktiv ausführen, sehen Sie, dass
mysql verwirrt ist, weil sich die Eingabeaufforderung von
mysql> zu to '> oder "> ändert.
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.
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
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
D
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]
-128
bis 127. Der vorzeichenlose Bereich ist 0 to 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
-32768 bis
32767. Der vorzeichenlose Bereich ist 0 bis 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
-8388608 bis 8388607. Der vorzeichenlose Bereich ist 0
bis 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
-2147483648 bis 2147483647. Der vorzeichenlose Bereich ist
0 bis 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
-9223372036854775808 bis 9223372036854775807. Der
vorzeichenlose Bereich ist 0 bis 18446744073709551615.
Einiger Dinge sollten Sie sich bei BIGINT-Spalten bewusst sein:
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:
BIGINT-Spalte zu speichern.
MIN(große_ganzzahl_spalte) und
MAX(große_ganzzahl_spalte).
+, -, * usw.), wenn
beide Operanden Ganzzahlen sind.
BIGINT-Spalte
speichern, wenn Sie sie als Zeichenkette speichern, denn in diesem Fall
wird diese nicht zwischendurch als Double dargestellt.
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]
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]
-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]
-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]
DOUBLE.
DECIMAL[(M[,D])] [ZEROFILL]
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]
DECIMAL.
DATE
'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
'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)]
'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
'-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)]
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]
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]
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
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
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
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
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',...)
'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',...)
'wert1', 'wert2',
... ausgewählt werden muss. Eine SET kann maximal 64 Elemente
haben. See section 7.2.3.4 Der SET-Typ.
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.
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:
'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').
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
|
'0' oder 0
machen, die leichter zu schreiben sind.
NULL umgewandelt, weil ODBC solche Werte nicht handhaben kann.
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:
00 bis 69 werden in 2000 bis 2069
umgewandelt.
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.
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:
INSERT- oder LOAD DATA
INFILE-Statement nicht explizit angegeben.
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.)
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:
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:
'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.
'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.
'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.
'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.
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.
YYYYMMDD- oder YYMMDD-Format, vorausgesetzt,
die Zahl ergibt als Datum einen Sinn. 19830905 und 830905 zum
Beispiel werden als '1983-09-05' interpretiert.
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:
TIMESTAMP(4) oder TIMESTAMP(2) sind. Ansonsten wäre der Wert
kein zulässiges Datum und 0 würde gespeichert werden.
ALTER TABLE benutzen, um eine enge TIMESTAMP-Spalte
breiter zu machen, werden Informationen angezeigt, die vorher ``versteckt''
waren.
TIMESTAMP-Spalte nicht dazu,
dass Informationen verloren gehen, ausser in dem Sinn, dass weniger
Informationen dargestellt werden, wenn die Werte angezeigt werden.
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:
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.
DATE-Objekt einen DATETIME- oder
TIMESTAMP-Wert zuweisen, wird der Zeitanteil des Ergebniswerts
gelöscht, weil der DATE-Typ keine Zeitinformationen speichert.
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:
'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.
00 bis 69 werden in 2000 bis 2069
umgewandelt.
70 bis 99 werden in 1970 bis 1999
umgewandelt.
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:
'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.
'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.
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.
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.
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:
'1901' bis
'2155'.
1901 bis 2155.
'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.
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.
YEAR-Zusammenhang akzeptabel ist, wie NOW().
Unzulässige YEAR-Werte werden in 0000 umgewandelt.
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.
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.
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:
BLOB- und
TEXT-Spalten anlegen. Ältere Versionen von MySQL unterstützten das
nicht.
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:
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;
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.
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:
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.
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:
SELECT-Statement benutzen, um Zeilen zu finden, denen
unzulässige ENUM-Werte zugewiesen wurden:
mysql> SELECT * FROM tabelle WHERE enum_spalte=0;
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.
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.
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.
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.
Der Speicherbedarf jedes Spaltentyps, der von MySQL unterstützt wird, ist unten nach Kategorie sortiert aufgelistet:
| 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)
|
| Spaltentyp | Speicherbedarf |
DATE | 3 Bytes |
DATETIME | 8 Bytes |
TIMESTAMP | 4 Bytes |
TIME | 3 Bytes |
YEAR | 1 Byte |
| 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.
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
( ... )
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
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:
NULL sind, ist das Ergebnis des
Vergleichs NULL, ausser beim <=> Operator.
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.