Heim >Datenbank >MySQL-Tutorial >MySQL-Lernreihe 3: Datentypen

MySQL-Lernreihe 3: Datentypen

黄舟
黄舟Original
2016-12-28 17:38:312714Durchsuche

BLOB-Datentyp in MYSQL

BLOB ist ein binäres großes Objekt, das zum Speichern variabler Datenmengen verwendet wird. Es gibt 4 BLOB-Typen: TinyBlob, Blob, MediumBlob und LongBlob. Der einzige Unterschied zwischen diesen Typen besteht in der maximalen Größe der gespeicherten Datei.

Typgröße der vier BLOB-Typen von MySQL (Einheit: Bytes)

TinyBlob maximal 255

Blob maximal 65K

MediumBlob maximal 16M

LongBlob Maximum 4G

BLOB-Spalten speichern Binärzeichenfolgen (Bytezeichenfolgen); TEXT-Spalten speichern nicht-binäre Zeichenfolgen (Zeichenfolgen).

BLOB-Spalten haben keinen Zeichensatz und Sortierung und Vergleiche basieren auf dem numerischen Wert der Spaltenwertbytes; TEXT-Spalten haben einen Zeichensatz und Werte werden basierend auf dem Zeichen sortiert und verglichen set

BLOBs sind binäre Strings, TEXT ist ein nicht-binärer String, beide können große Informationsmengen speichern. BLOB speichert hauptsächlich Bilder, Audioinformationen usw.

, während TEXT nur Textdateien speichern kann.

SQLSERVER

SQLSERVER hat keinen BLOB-Datentyp, sondern nur einen Datentyp für große Objekte (BLOB):

text,ntext,image,nvarchar(max),varchar (max) , varbinary (max) und XML-Datentypen

Daten dieser Datentypen werden in Datenseiten vom Typ LOB



Spaltentyp

gespeichert

11.1.1. Übersicht über numerische Typen

Im Folgenden finden Sie eine Übersicht über numerische Spaltentypen. Weitere Informationen finden Sie in Abschnitt 11.2, „Numerische Typen“. Informationen zu den Speicheranforderungen für Säulen finden Sie in Abschnitt 11.5, „Speicheranforderungen für Säulentypen“.

M gibt die maximale Anzeigebreite an. Die maximale effektive Anzeigebreite beträgt 255. Die Anzeigebreite hat nichts mit der Speichergröße oder dem im Typ enthaltenen Wertebereich zu tun, wie in Abschnitt 11.2, „Numerische Typen“ beschrieben.

Wenn ZEROFILL für eine numerische Spalte angegeben ist, fügt MySQL der Spalte automatisch das UNSIGNED-Attribut hinzu.

SERIAL ist ein Alias ​​für BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.

In ganzzahligen Spaltendefinitionen ist SERIAL DEFAULT VALUE ein Alias ​​für NOT NULL AUTO_INCREMENT UNIQUE.

Warnung: Es sollte klar sein, dass bei Verwendung des Minuszeichens zwischen ganzzahligen Werten (von denen einer vom Typ UNSIGNED ist) das Ergebnis ohne Vorzeichen ist. Siehe Abschnitt 12.8, „Cast-Funktionen und Operatoren“.

· BIT[(M)]

Bit-Feldtyp. M stellt die Anzahl der Bits pro Wert dar und reicht von 1 bis 64. Wenn M weggelassen wird, ist der Standardwert 1.

·TINYINT[(M)] [UNSIGNED] [ZEROFILL]

Eine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich liegt zwischen -128 und 127. Der vorzeichenlose Bereich liegt zwischen 0 und 255.

· BOOL, BOOLEAN

ist ein Synonym für TINYINT(1). Ein Wert von Null gilt als falsch. Werte ungleich Null gelten als wahr.

In Zukunft wird die vollständige boolesche Typverarbeitung gemäß Standard-SQL eingeführt.

· SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

Kleine Ganzzahl. Der vorzeichenbehaftete Bereich liegt zwischen -32768 und 32767. Der vorzeichenlose Bereich liegt zwischen 0 und 65535.

· MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

Mittelgroße Ganzzahl. Der vorzeichenbehaftete Bereich ist -8388608 bis 8388607. Der vorzeichenlose Bereich liegt zwischen 0 und 16777215.

· INT[(M)] [UNSIGNED] [ZEROFILL]

Eine Ganzzahl normaler Größe. Der vorzeichenbehaftete Bereich ist -2147483648 bis 2147483647. Der vorzeichenlose Bereich liegt zwischen 0 und 4294967295.

· INTEGER[(M)] [UNSIGNED] [ZEROFILL]

Dies ist ein Synonym für INT.

· BIGINT[(M)] [UNSIGNED] [ZEROFILL]

Große Ganzzahl. Der vorzeichenbehaftete Bereich ist -9223372036854775808 bis 9223372036854775807. Der vorzeichenlose Bereich liegt zwischen 0 und 18446744073709551615.

Folgendes sollte für die BIGINT-Spalte klar sein:

o Verwenden Sie für alle Arithmetik vorzeichenbehaftete BIGINT- oder DOUBLE-Werte, daher außer für Bitfunktionen keine Werte größer als 9223372036854775807 (63 Bits) sollten Signed BIG INTEGER verwendet werden. Wenn Sie dies tun, können die letzten Ziffern im Ergebnis aufgrund von Rundungsfehlern bei der Konvertierung von BIGINT-Werten in DOUBLE falsch sein.

MySQL kann BIGINT in den folgenden Situationen verarbeiten:

§ Wenn Ganzzahlen zum Speichern großer vorzeichenloser Werte in einer BIGINT-Spalte verwendet werden.

§ In MIN(col_name) oder MAX(col_name), wobei sich col_name auf die BIGINT-Spalte bezieht.

§ Bei Verwendung von Operatoren (+, -, * usw.) und beide Operanden ganze Zahlen sind.

o Es ist immer möglich, eine Zeichenfolge zu verwenden, um einen strengen ganzzahligen Wert in einer BIGINT-Spalte zu speichern. In diesem Fall führt MySQL eine String-in-Zahlen-Konvertierung durch und es gibt keine Darstellung mit doppelter Genauigkeit dazwischen.

o Die Operatoren -, + und * verwenden den BIGINT-Algorithmus, wenn beide Operanden ganzzahlige Werte sind. Dies zeigt, dass Sie unerwartete Ergebnisse erhalten, wenn Sie zwei große Ganzzahlen multiplizieren (oder von einer Funktion ausgehen, die eine Ganzzahl zurückgibt), wenn das Ergebnis größer als 9223372036854775807 ist.

· FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

Kleine Gleitkommazahl (einfache Genauigkeit). Zulässige Werte sind -3,402823466E+38 bis -1,175494351E-38, 0 und 1,175494351E-38 bis 3,402823466E+38. Dies sind theoretische Grenzwerte, die auf IEEE-Standards basieren. Die tatsächliche Reichweite kann je nach Hardware oder Betriebssystem etwas geringer sein.

M ist die Anzahl der Dezimalstellen, D ist die Anzahl der Nachkommastellen. Wenn M und D weggelassen werden, wird der Wert gemäß den von der Hardware zugelassenen Einschränkungen gespeichert. Gleitkommazahlen mit einfacher Genauigkeit haben eine Genauigkeit von etwa 7 Dezimalstellen.

Wenn UNSIGNED angegeben ist, sind negative Werte nicht zulässig.

Bei der Verwendung von Gleitkommazahlen können unerwartete Probleme auftreten, da alle Berechnungen in MySQL mit doppelter Genauigkeit durchgeführt werden. Siehe Abschnitt A.5.7, „Probleme mit nicht übereinstimmenden Zeilen lösen“.

· DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

Gleitkommazahl normaler Größe (doppelte Genauigkeit). Zulässige Werte sind -1,7976931348623157E+308 bis -2,2250738585072014E-308, 0 und 2,2250738585072014E-308 bis 1,7976931348623157E+308. Dies sind theoretische Grenzwerte, die auf IEEE-Standards basieren. Die tatsächliche Reichweite kann je nach Hardware oder Betriebssystem etwas geringer sein.

M ist die Gesamtzahl der Dezimalstellen und D ist die Anzahl der Nachkommastellen. Wenn M und D weggelassen werden, wird der Wert gemäß den von der Hardware zugelassenen Einschränkungen gespeichert. Gleitkommazahlen mit doppelter Genauigkeit haben eine Genauigkeit von etwa 15 Dezimalstellen.

Wenn UNSIGNED angegeben ist, sind negative Werte nicht zulässig.

· DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)]
[UNSIGNED] [ZEROFILL]

sind Synonyme für DOUBLE . Ausnahme: Wenn der SQL Server-Modus die Option REAL_AS_FLOAT enthält, ist REAL ein Synonym für FLOAT und nicht ein Synonym für DOUBLE.

· FLOAT(p) [UNSIGNED] [ZEROFILL]

Gleitkommazahl. p steht für Präzision (ausgedrückt in Bits), MySQL verwendet diesen Wert jedoch nur, um zu bestimmen, ob der Datentyp der Ergebnisspalte FLOAT oder DOUBLE ist. Wenn p zwischen 0 und 24 liegt, wird der Datentyp FLOAT ohne M- oder D-Wert. Wenn p zwischen 25 und 53 liegt, wird der Datentyp zu DOUBLE ohne einen M- oder D-Wert. Der resultierende Spaltenbereich ist derselbe wie der weiter oben in diesem Abschnitt beschriebene Datentyp FLOAT mit einfacher Genauigkeit oder DOUBLE mit doppelter Genauigkeit.

Die FLOAT(p)-Syntax ist mit ODBC kompatibel.

· DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

Komprimierte „strenge“ Festkommazahl. M ist die Gesamtzahl der Dezimalstellen (Genauigkeit) und D ist die Anzahl der Nachkommastellen (Skala). Der Dezimalpunkt und das Minuszeichen (für negative Zahlen) sind in M ​​nicht enthalten. Wenn D 0 ist, hat der Wert keinen Dezimalpunkt oder Bruchteil. Die maximale Anzahl von Ziffern (M) in einer DECIMAL-Ganzzahl beträgt 65. Die maximale Anzahl unterstützter Dezimalstellen (D) beträgt 30. Wenn D weggelassen wird, ist
standardmäßig auf 0 gesetzt. Wenn M weggelassen wird, ist der Standardwert 10.

Wenn UNSIGNED angegeben ist, sind negative Werte nicht zulässig.

Grundlegende Berechnungen für alle DECIMAL-Spalten (+, -, *, /) werden mit einer Genauigkeit von 65 Bit durchgeführt.

· DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])]
[UNSIGNED] [ZEROFILL], FIXED[(M[, D])] [UNSIGNED] [ZEROFILL]

ist ein Synonym für DECIMAL. Aus Gründen der Kompatibilität mit anderen Servern gelten FIXED-Synonyme.


11.1.2. Übersicht über Datums- und Uhrzeittypen

Dieser Abschnitt bietet eine umfassende Erläuterung der temporären Spaltentypen. Einzelheiten finden Sie in Abschnitt 11.3, „Datums- und Uhrzeittypen“. Informationen zu den Speicheranforderungen für Säulen finden Sie in Abschnitt 11.5, „Speicheranforderungen für Säulentypen“.

·DATUM

Datum. Der unterstützte Bereich ist „1000-01-01“ bis „9999-12-31“. MySQL zeigt DATE-Werte im Format „JJJJ-MM-TT“ an, ermöglicht jedoch die Zuweisung von Werten zu DATE-Spalten mithilfe von Zeichenfolgen oder Zahlen.

· DATETIME

Eine Kombination aus Datum und Uhrzeit. Der unterstützte Bereich ist „1000-01-01 00:00:00“ bis „9999-12-31 23:59:59“. MySQL zeigt DATETIME-Werte im Format „JJJJ-MM-TT HH:MM:SS“ an, ermöglicht jedoch die Verwendung von Zeichenfolgen oder Zahlen zum Zuweisen von Werten zu DATETIME-Spalten.

· TIMESTAMP[(M)]

Zeitstempel. Der Bereich reicht von „1970-01-01 00:00:00“ bis 2037.

Die Spalte TIMESTAMP wird verwendet, um Datum und Uhrzeit während INSERT- oder UPDATE-Vorgängen aufzuzeichnen. Wenn Sie keinen Wert zuweisen, wird die erste TIMESTAMP-Spalte in der Tabelle automatisch auf das Datum und die Uhrzeit des letzten Vorgangs gesetzt. Sie können die TIMESTAMP-Spalte auch auf das aktuelle Datum und die aktuelle Uhrzeit festlegen, indem Sie einen NULL-Wert zuweisen.

Der TIMESTAMP-Wert wird als Zeichenfolge im Format „JJJJ-MM-TT HH:MM:SS“ zurückgegeben und angezeigt. Die Anzeigebreite ist auf 19 Zeichen festgelegt. Wenn Sie einen numerischen Wert erhalten möchten, fügen Sie +0 zur Spalte TIMESTAMP hinzu.

Hinweis: Das vor MySQL 4.1 verwendete TIMESTAMP-Format wird in MySQL 5.1 nicht unterstützt. Informationen zum alten Format finden Sie im MySQL 4.1-Referenzhandbuch.

· ZEIT

Zeit. Der Bereich liegt zwischen „-838:59:59“ und „838:59:59“. MySQL zeigt TIME-Werte im Format „HH:MM:SS“ an, ermöglicht jedoch die Zuweisung von Werten zu TIME-Spalten mithilfe von Zeichenfolgen oder Zahlen.

· JAHR[(2|4)]

Jahr im zweistelligen oder vierstelligen Format. Der Standardwert ist das vierstellige Format. Im vierstelligen Format sind die Werte 1901 bis 2155 und 0000 zulässig. Im zweistelligen Format liegen die zulässigen Werte zwischen 70 und 69 und repräsentieren die Jahre 1970 bis 2069. MySQL zeigt YEAR-Werte im YYYY-Format an, ermöglicht jedoch die Verwendung von Zeichenfolgen oder Zahlen zum Zuweisen von Werten zu YEAR-Spalten.


11.1.3. Übersicht über String-Typen

Dieser Abschnitt bietet eine umfassende Erläuterung der String-Spaltentypen. Weitere Informationen finden Sie in Abschnitt 11.4, „String-Typ“. Informationen zu den Speicheranforderungen für Säulen finden Sie in Abschnitt 11.5, „Speicheranforderungen für Säulentypen“.

In einigen Fällen kann MySQL eine Zeichenfolgenspalte in einen anderen Typ als den in der CREATE TABLE- oder ALTER TABLE-Anweisung angegebenen Typ ändern. Siehe Abschnitt 13.1.5.1, „Stille Änderungen der Spaltenspezifikation“.

Der MySQL 5.1-String-Datentyp enthält einige Funktionen, die in Versionen vor MySQL 4.1 nicht verfügbar waren:

· Spaltendefinitionen für viele String-Datentypen können das CHARACTER SET-Attribut enthalten, das das Zeichen angibt festgelegt, Korrekturleseregeln können ebenfalls enthalten sein. (CHARSET ist ein Synonym für CHARACTER SET). Diese Eigenschaften gelten für die Typen CHAR, VARCHAR, TEXT, ENUM und SET. Beispiel:

Diese Tabellendefinition erstellt eine Spalte mit dem Namen „c1“ mit einem UTF8-Zeichensatz und der Standardsortierung für diesen Zeichensatz sowie eine Spalte mit dem Namen „Die Spalte“. von c2 und dem Zeichensatz latin1 sowie die binären Sortierregeln dieses Zeichensatzes. Bei binären Sortierregeln wird die Groß-/Kleinschreibung nicht beachtet.

· MySQL 5.1 interpretiert Längenangaben in Zeichenspaltendefinitionen in Zeicheneinheiten. (Einige frühere Versionen von MySQL interpretierten Längen in Bytes).

· Für die Typen CHAR, VARCHAR und TEXT kann das BINARY-Attribut der Spalte die Sortierregeln des Spaltenzeichensatzes zuweisen.

· Zeichenspalten werden basierend auf dem der Spalte zugewiesenen Zeichensatz sortiert und verglichen. In früheren Versionen basierten Sortierung und Vergleich auf den Sortierregeln des Zeichensatzes des Servers. Für CHAR- und VARCHAR-Spalten können Sie die Spalte mit dem BINARY-Attribut deklarieren, sodass Sortier- und Sortierregeln den aktuellen Zeichencodewert anstelle der lexikalischen Reihenfolge verwenden.

Informationen zur Zeichensatzunterstützung in MySQL 5.1 finden Sie in Kapitel 10: Zeichensatzunterstützung.

· [NATIONAL] CHAR(M) [ASCII |. M steht für die Spaltenlänge. Der Bereich von M beträgt 0 bis 255 Zeichen.

Hinweis: Nachgestellte Leerzeichen werden beim Abrufen von CHAR-Werten entfernt.

Wenn Sie die Länge eines CHAR auf mehr als 255 festlegen möchten, schlägt die ausgeführte CREATE TABLE- oder ALTER TABLE-Anweisung fehl und führt zu einem Fehler:



CHAR ist die Abkürzung für CHARACTER. NATIONAL CHAR (oder die entsprechende Kurzform NCHAR) ist die Standard-SQL-Methode zum Definieren, dass eine CHAR-Spalte den Standardzeichensatz verwenden soll. Dies ist der Standardwert in MySQL.

Das BINARY-Attribut ist die Abkürzung für die binäre Sortierregel des angegebenen Spaltenzeichensatzes. Sortierung und Vergleiche basieren auf numerischen Zeichenwerten.

Der Spaltentyp CHAR BYTE ist ein Alias ​​von CHAR BINARY. Dies dient der Gewährleistung der Kompatibilität.

Sie können ASCII-Attribute für CHAR angeben. Es weist den Zeichensatz latin1 zu.

Sie können das UNICODE-Attribut für CHAR angeben. Es weist den ucs2-Zeichensatz zu.

MySQL ermöglicht die Erstellung von Spalten vom Typ CHAR(0). Dies dient hauptsächlich der Kompatibilität mit älteren Versionen von Anwendungen, die eine Spalte haben müssen, den Wert aber nicht tatsächlich verwenden. Es ist auch gut, wenn Sie eine Spalte benötigen, die nur zwei Werte annehmen kann: Eine CHAR(0)-Spalte, die nicht als NOT NULL definiert ist, nimmt nur ein Bit ein und kann nur die Werte NULL und „ (leerer String) annehmen.

· CHAR

Dies ist ein Synonym für CHAR(1) [NATIONAL] VARCHAR(M) [BINARY]

M steht für die maximale Spaltenlänge 65.535 (Die maximale tatsächliche Länge eines VARCHAR wird durch die Größe der längsten Zeile und den verwendeten Zeichensatz bestimmt. Die maximale effektive Länge beträgt 65.532 Bytes) Hinweis: MySQL 5.1 entspricht der Standard-SQL-Spezifikation und entfernt keine nachgestellten Leerzeichen aus VARCHAR-Werten .

VARCHAR ist die Abkürzung für das Zeichen VARYING.

Das Attribut BINARY steht für die binäre Sortierung des Zeichensatzes der angegebenen Spalte > VARCHAR wird mit einem Ein-Byte- oder Zwei-Byte-Längenpräfix + Daten gespeichert. Wenn die deklarierte Länge der VARCHAR-Spalte größer als 255 ist, beträgt das Längenpräfix zwei Bytes 🎜>Der Typ BINARY ähnelt dem Typ CHAR, enthält jedoch einen binären Byte-String anstelle eines nicht-binären Strings.

· VARBINARY(M)
Der Typ VARBINARY ähnelt der Typ VARCHAR, enthält jedoch einen binären Byte-String anstelle eines nicht-binären Strings

· TINYBLOB

Ein BLOB mit einer maximalen Länge von 255 (28–1) Bytes

· TINYTEXT

TEXT-Spalte mit einer maximalen Länge von 255 (28–1) Zeichen

· BLOB[(M)]

Max Spalte mit einer Länge von 65.535 (216–1) Bytes kann mit einer optionalen Länge M dieses Typs angegeben werden. Wenn angegeben, erstellt MySQL die Spalte so klein wie möglich, aber groß genug, um M Bytes aufzunehmen . BLOB-Werttyp

·TEXT[(M)]

Es kann eine TEXT-Spalte mit einer maximalen Länge von 65.535 (216–1) Zeichen angegeben werden optional. Länge M. MySQL erstellt die Spalte als kleinsten TEXT-Typ, der groß genug ist, um einen Wert von M Zeichen lang aufzunehmen

Die maximale Länge beträgt 16.777.215 (224–1) Bytes >
· MEDIUMTEXT

TEXT-Spalte mit einer maximalen Länge von 16.777.215 (224–1) Zeichen

· LONGBLOB

Eine maximale Länge von 4.294.967.295 oder 4 GB. 232–1) Byte-BLOB-Spalte. Die maximal effektive (zulässige) Länge einer LONGBLOB-Spalte hängt von der im Client/Server-Protokoll konfigurierten maximalen Paketgröße und dem verfügbaren Speicher ab.

· LONGTEXT

Eine TEXT-Spalte mit einer maximalen Länge von 4.294.967.295 oder 4 GB (232–1) Zeichen. Die maximal effektive (zulässige) Länge einer LONGTEXT-Spalte hängt von der im Client/Server-Protokoll konfigurierten maximalen Paketgröße und dem verfügbaren Speicher ab.

· ENUM(‘value1‘, ‘value2‘,…)

Aufzählungstyp. Eine Zeichenfolge, die nur einen Wert haben kann, ausgewählt aus den Wertspalten „Wert1“, „Wert2“, …, NULL oder dem speziellen „Fehlerwert“. Die ENUM-Spalte kann bis zu 65.535 unterschiedliche Werte haben werden intern als Ganzzahldarstellung verwendet.

· SET('value1','value2',…)

Ein String-Objekt kann null oder mehr Werte haben, jeder Wert muss aus einem Spaltenwert stammen. 'value1', 'value2', ... SET-Spalten können bis zu 64 Mitglieder haben. SET-Werte werden intern als Ganzzahlen dargestellt



Numerische Typen

MySQL unterstützt alle standardmäßigen numerischen SQL-Datentypen (INTEGER, SMALLINT, DECIMAL und NUMERIC) und ungefähre numerische Datentypen (FLOAT, REAL und DOUBLE PRECISION). für INTEGER und das Schlüsselwort DEC ist ein Synonym für DECIMAL. Der BIT-Datentyp speichert Bitfeldwerte und unterstützt MyISAM-, MEMORY-, InnoDB- und BDB-Tabellen Als SQL-Standard unterstützt MySQL auch die Integer-Typen TINYINT, MEDIUMINT und BIGINT. Die folgende Tabelle zeigt den für jeden Integer-Typ erforderlichen Speicher und Bereich


Typ Bytes Minimalwert Maximalwert

(Signiert/Unsigniert) ( Signiert/Unsigniert)

TINYINT 1 -128 127

0 255

SMALLINT 2 -32768 32767

0 65535

MEDIUMINT 3 -8388608 8388607

0 16777215


INT 4 -2147483648 2147483647

0 4294967295 BIGINT 8 -9223372036854775808 9223372036854775807

0 18446744073709551615

MySQL unterstützt auch die Option, die Anzeigebreite eines ganzzahligen Werts in Klammern nach dem Typschlüsselwort anzugeben (z. B. INT(4)). Die optionale Angabe der Anzeigebreite wird verwendet, um die Breite von links zu füllen, wenn die Anzeigebreite kleiner als die angegebene Spaltenbreite ist.

Die Anzeigebreite schränkt weder den Wertebereich ein, der innerhalb der Spalte gespeichert werden kann, noch die Anzeige von Werten, die die angegebene Spaltenbreite überschreiten.

Bei Verwendung in Kombination mit dem optionalen erweiterten Attribut ZEROFILL werden die standardmäßigen zusätzlichen Leerzeichen durch Nullen ersetzt. Beispielsweise wird für eine als INT(5) ZEROFILL deklarierte Spalte der Wert 4 als 00004 abgerufen. Bitte beachten Sie, dass MySQL bei der Generierung temporärer Tabellen für komplexe Joins auf Probleme stößt, wenn Sie in einer Integer-Spalte einen Wert speichern, der die angezeigte Breite überschreitet, da MySQL in diesen Fällen davon ausgeht, dass die Daten in die ursprüngliche Spaltenbreite passen.

Alle Ganzzahltypen können ein optionales (nicht standardmäßiges) Attribut UNSIGNED haben. Werte ohne Vorzeichen können verwendet werden, wenn Sie in einer Spalte nur nicht negative Zahlen zulassen möchten und die Spalte einen größeren oberen Zahlenbereich erfordert.

Gleitkomma- und Festkommatypen können auch UNSIGNED sein. Für denselben Zahlentyp verhindert diese Eigenschaft, dass negative Werte in der Spalte gespeichert werden. Im Gegensatz zu ganzzahligen Typen bleibt der obere Bereich der Spaltenwerte jedoch unverändert.

Wenn ZEROFILL für eine numerische Spalte angegeben ist, fügt MySQL der Spalte automatisch das UNSIGNED-Attribut hinzu.

Für Gleitkomma-Spaltentypen verwenden Werte mit einfacher Genauigkeit 4 Bytes und Werte mit doppelter Genauigkeit 8 Bytes in MySQL.

Der FLOAT-Typ wird verwendet, um ungefähre numerische Datentypen darzustellen. Mit dem SQL-Standard können Sie optional die Genauigkeit in Bits (jedoch nicht in exponentiellen Bereichen) in Klammern nach dem Schlüsselwort FLOAT angeben. MySQL unterstützt auch optionale Präzisionsspezifikationen, die nur zur Bestimmung der Speichergröße verwendet werden. Genauigkeiten von 0 bis 23 entsprechen der 4-Byte-Einzelgenauigkeit der FLOAT-Spalte. Genauigkeiten von 24 bis 53 entsprechen der 8-Byte-Doppelgenauigkeit der DOUBLE-Spalte.

MySQL erlaubt die Verwendung einer nicht standardmäßigen Syntax: FLOAT(M,D) oder REAL(M,D) oder DOUBLE
PRECISION(M,D). Hier bedeutet „(M,D)“, dass der Wert insgesamt M-stellige Ganzzahlen anzeigt, wobei sich D-Stellen nach dem Dezimalpunkt befinden. Beispielsweise könnte eine als FLOAT(7,4) definierte Spalte als -999,9999 angezeigt werden. MySQL rundet den Wert beim Speichern. Wenn Sie also 999,00009 in die Spalte FLOAT(7,4) einfügen, ist das ungefähre Ergebnis 999,0001.

MySQL behandelt DOUBLE als Synonym für DOUBLE PRECISION (nicht standardmäßige Erweiterung). MySQL behandelt REAL auch als Synonym für DOUBLE PRECISION (nicht standardmäßige Erweiterung), es sei denn, der SQL Server-Modus enthält die Option REAL_AS_FLOAT.

Um die größtmögliche Portabilität zu gewährleisten, sollte Code, der die Speicherung ungefährer numerischer Datenwerte erfordert, FLOAT oder DOUBLE PRECISION verwenden, ohne die Genauigkeit oder Anzahl der Ziffern anzugeben.

DECIMAL- und NUMERIC-Typen werden in MySQL als derselbe Typ behandelt. Sie werden zur Speicherung von Werten verwendet, die eine genaue Genauigkeit erfordern, beispielsweise Währungsdaten. Wenn Sie eine Spalte dieses Typs deklarieren, können Sie (und tun dies normalerweise auch) Genauigkeit und Skalierung angeben, zum Beispiel:

In diesem Beispiel ist 5 die Präzision und 2 der Maßstab. Die Präzision gibt an, wie viele Ziffern im Wert gespeichert werden können, und die Skala gibt an, wie viele Ziffern nach dem Dezimalpunkt gespeichert werden können.

Speichern Sie DECIMAL- und NUMERIC-Werte im Binärformat in MySQL 5.1.

Standard-SQL erfordert, dass die Gehaltsspalte jeden Wert mit 5 Ganzzahlen und zwei Dezimalstellen enthalten kann. Daher liegt der Wertebereich, der in der Gehaltsspalte gespeichert werden kann, in diesem Fall zwischen -999,99 und 999,99.

In Standard-SQL entspricht die Syntax DECIMAL(M) DECIMAL(M,0). In ähnlicher Weise entspricht die Syntax DECIMAL DECIMAL(M,0), und der Wert von M kann durch Berechnung bestimmt werden. Variable Formen der Datentypen DECIMAL und NUMERIC werden in MySQL
5.1 unterstützt. Der Standardwert von M ist 10.

Die maximale Anzahl von Ziffern für eine DEZIMAL- oder NUMERISCHE Spalte beträgt 65, aber der tatsächliche Bereich einer bestimmten DEZIMAL- oder NUMERISCHEN Spalte wird durch die Genauigkeit oder Skalierung der spezifischen Spalte eingeschränkt. Wenn einer solchen Spalte ein Wert mit mehr Nachkommastellen zugewiesen wird, als die angegebene Skala zulässt, wird der Wert in diese Skala konvertiert. (Der konkrete Vorgang hängt vom Betriebssystem ab, aber im Allgemeinen werden die Ergebnisse auf die zulässige Anzahl von Ziffern gekürzt).

Der BIT-Datentyp kann zum Speichern von Bitfeldwerten verwendet werden. Der Typ BIT(M) ermöglicht die Speicherung von M-Bit-Werten. M reicht von 1 bis 64.

Um einen Bitwert anzugeben, können Sie das b'value'-Symbol verwenden. value ist ein binärer Wert, der mit 0 und 1 geschrieben wird. Beispielsweise stehen b’111′ und b’100000000′ für 7 bzw. 128. Siehe Abschnitt 9.1.5, „Bitfeldwerte“.

Wenn die Länge des der Spalte BIT(M) zugewiesenen Werts weniger als M Bits beträgt, füllen Sie die linke Seite des Werts mit Nullen auf. Beispielsweise hat die Zuweisung eines Werts b'101' zur Spalte BIT(6) den gleichen Effekt wie die Zuweisung von b'000101'.

Wenn Sie einen Wert in einer numerischen Spalte speichern möchten, der den zulässigen Bereich der Spalte überschreitet, hängt die Funktionsweise von MySQL vom zu diesem Zeitpunkt gültigen SQL-Modus ab. Wenn der Modus nicht festgelegt ist, schneidet MySQL den Wert auf den entsprechenden Endpunkt des Bereichs ab und speichert den abgeschnittenen Wert. Wenn der Modus jedoch auf traditionell („strikter Modus“) eingestellt ist, werden Werte außerhalb des Bereichs mit einem Fehler zurückgewiesen und Einfügungen schlagen gemäß SQL-Standards fehl. Siehe Abschnitt 5.3.2, „SQL Server-Modus“.

Wenn die INT-Spalte UNSIGNED ist, bleibt die Größe des Spaltenbereichs gleich, aber seine Endpunkte ändern sich in 0 und 4294967295. Wenn Sie versuchen, -9999999999 und 9999999999 zu speichern, sind die im nicht strengen Modus in der Spalte gespeicherten Werte 0 und 4294967296.

Wenn der in einer Gleitkomma- oder Festkommaspalte zugewiesene Wert den durch die angegebene (oder Standard-)Genauigkeit und Skalierung angegebenen Bereich überschreitet, speichert MySQL den Wert, der den entsprechenden Endpunkt des Bereichs darstellt, in nicht strenger Form Modus.

Wenn MySQL nicht im strikten Modus arbeitet, werden Konvertierungen aufgrund von Clipping als Warnungen für ALTER TABLE-, LOAD DATA INFILE-, UPDATE- und mehrzeilige INSERT-Anweisungen gemeldet. Wenn MySQL im strikten Modus arbeitet, schlagen diese Anweisungen fehl und einige oder alle Werte werden nicht eingefügt oder geändert, je nachdem, ob die Tabelle transaktional ist und andere Faktoren. Weitere Informationen finden Sie in Abschnitt 5.3.2, „SQL Server-Modus“.


11.3. Datums- und Uhrzeittypen

11.3.1. DATETIME-, DATE- und TIMESTAMP-Typen 11.3.3. YEAR-Typ 11.3.4. Y2K-Angelegenheiten und Datumstypen

DATE- und Zeittypen, die Zeitwerte darstellen DATETIME, DATE, TIMESTAMP, TIME und YEAR. Jeder Zeittyp verfügt über einen Bereich gültiger Werte und einen „Null“-Wert, der verwendet wird, wenn ein unzulässiger Wert angegeben wird, den MySQL nicht darstellen kann. Der Typ TIMESTAMP verfügt über proprietäre automatische Aktualisierungsfunktionen, die später beschrieben werden.

MySQL gibt eine Warnung oder einen Fehler aus, wenn Sie versuchen, ein ungültiges Datum einzugeben. Sie können den SQL-Modus ALLOW_INVALID_DATES verwenden, damit MySQL bestimmte Datumsangaben akzeptiert, beispielsweise „1999-11-31“. Nützlich, wenn Sie einen „möglicherweise falschen“ Wert, den der Benutzer angegeben hat, in der Datenbank (z. B. in einem Webformular) für die zukünftige Verarbeitung speichern möchten. In diesem Modus überprüft MySQL nur, ob der Monatsbereich zwischen 0 und 12 und der Tagesbereich zwischen 0 und 31 liegt. Diese Bereiche können Null umfassen, da MySQL das Speichern von Tag/Monat und Datumsangaben ermöglicht, bei denen der Tag in einer DATE- oder DATETIME-Spalte Null ist. Dies ist nützlich, wenn eine Anwendung einen Geburtstag speichern muss, dessen genaues Datum Sie nicht kennen. Speichern Sie in diesem Fall einfach das Datum als „00.00.1999“ oder „00.01.1999“. Funktionen, die ein vollständiges Datum erfordern, wie DATE_SUB() oder DATE_ADD, liefern keine korrekten Ergebnisse, wenn Sie ein solches Datum speichern. (Wenn Sie nicht möchten, dass im Datum Nullen erscheinen, können Sie den SQL-Modus NO_ZERO_IN_DATE verwenden.)

MySQL ermöglicht auch das Speichern von „0000-00-00“ als „Pseudodatum“ (wenn der SQL-Modus NO_ZERO_DATE nicht verwendet wird). Dies ist in manchen Situationen praktischer als die Verwendung von NULL-Werten (und die Daten und Indizes beanspruchen weniger Platz).

Setzen Sie die Systemvariable sql_mode auf den entsprechenden Moduswert, um klarer zu wissen, welche Art von Datumsangaben MySQL unterstützen soll. Siehe Abschnitt 5.3.2, „SQL Server-Modus“.

Die folgenden Punkte sollten bei der Arbeit mit Datums- und Uhrzeittypen beachtet werden:

· MySQL ruft Werte eines bestimmten Datums- oder Uhrzeittyps im Standardausgabeformat ab, tut es aber Am besten interpretieren Sie jeden von Ihnen angegebenen Wert als Eingabewertformat (z. B. wenn Sie einen Wert angeben, der einem Datums- oder Zeittyp zugewiesen oder mit diesem verglichen wird). Es werden nur die in den folgenden Abschnitten beschriebenen Formate unterstützt. Erwarten Sie, dass Sie gültige Werte angeben. Wenn Sie Werte in anderen Formaten verwenden, kann es zu unerwarteten Ergebnissen kommen.

· Daten mit zweistelligen Jahresangaben sind nicht eindeutig, da das Jahrhundert nicht bekannt ist. MySQL verwendet die folgenden Regeln, um zweistellige Jahreswerte zu interpretieren:

o Jahreswerte im Bereich 70-99 werden in 1970-1999 konvertiert.

o Jahreswerte im Bereich 00-69 werden in 2000-2069 umgerechnet.

· Obwohl MySQL versucht, Werte in verschiedenen Formaten zu interpretieren, sind Datumsangaben immer in der Reihenfolge Jahr-Monat-Tag (z. B. „98-09-04“) und nicht wie üblich in Monat-Tag-Jahr Wird häufig anderswo verwendet. Oder die Reihenfolge Tag-Monat-Jahr (zum Beispiel „09-04-98“, „04-09-98“).

· MySQL wandelt einen Wert vom Typ Datum oder Uhrzeit automatisch in eine Zahl um, wenn der Wert in einem numerischen Kontext verwendet wird, und umgekehrt.

· Wenn MySQL auf einen Datums- oder Zeittypwert stößt, der außerhalb des gültigen Bereichs liegt oder für diesen Typ unzulässig ist (wie am Anfang dieses Abschnitts beschrieben), konvertiert es den Wert in den „Null“-Wert dieser Klasse . Eine Ausnahme besteht darin, dass TIME-Werte außerhalb des Bereichs auf den entsprechenden Endpunkt des TIME-Bereichs begrenzt werden.

Die folgende Tabelle zeigt das Format verschiedener „Null“-Werte. Bitte beachten Sie, dass die Verwendung dieser Werte Warnungen generiert, wenn der SQL-Modus NO_ZERO_DATE aktiviert ist.

Spaltentyp „Null“-Wert

DATETIME '0000-00-00 00:00:00′

DATE '0000-00-00′

TIMESTAMP 00000000000000

TIME '00:00:00′

YEAR 0000

· Der Wert „Null“ ist ein besonderer Wert, aber Sie können den verwenden In-Table-Darstellung Die Werte werden explizit gespeichert oder verweisen darauf. Sie können auch den Wert „0“ oder 0 zum Speichern oder Referenzieren verwenden, was das Schreiben erleichtert.

· „Null“-Datums- oder Zeitwerte, die in MyODBC verwendet werden, werden in MyODBC 2.50.12 und höher automatisch in NULL konvertiert, da ODBC solche Werte nicht verarbeiten kann.


11.3.1. DATETIME-, DATE- und TIMESTAMP-Typen

11.3.1.1.
TIMESTAMP-Attribut seit MySQL 4.1

DATETIME-, DATE- und TIMESTAMP-Typen sind verwandt. In diesem Abschnitt werden ihre Eigenschaften, ihre Gemeinsamkeiten und Unterschiede beschrieben.

Verwenden Sie den Typ DATETIME, wenn Sie einen Wert benötigen, der sowohl Datums- als auch Uhrzeitinformationen enthält. MySQL ruft DATETIME-Werte im Format „JJJJ-MM-TT HH:MM:SS“ ab und zeigt sie an. Der unterstützte Bereich ist „1000-01-01 00:00:00“ bis „9999-12-31 23:59:59“. („Unterstützt“ bedeutet, dass der vorherige Wert zwar funktionieren kann, es jedoch keine Garantie gibt).

Der Typ DATE sollte verwendet werden, wenn Sie nur den Datumswert ohne den Zeitteil benötigen. MySQL verwendet das Format „JJJJ-MM-TT“, um DATE-Werte abzurufen und anzuzeigen. Der unterstützte Bereich ist „1000-01-01“ bis „9999-12-31“.

Die Eigenschaften des Spaltentyps TIMESTAMP sind nicht festgelegt und hängen von der MySQL-Version und dem SQL-Modus ab, in dem der Server ausgeführt wird. Diese Eigenschaften werden später in diesem Abschnitt beschrieben.

DATETIME-, DATE- und TIMESTAMP-Werte können in jedem gängigen Format angegeben werden:

· 'YYYY-MM-DD HH:MM:SS' oder 'YY-MM-DD HH: MM:SS 'Formatzeichenfolge. „Entspannte“ Syntax ist zulässig: Als Trennzeichen zwischen Datums- oder Uhrzeitteilen kann jedes Interpunktionszeichen verwendet werden. Zum Beispiel „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′ sind gleichwertig.

· Eine Zeichenfolge im Format „JJJJ-MM-TT“ oder „JJ-MM-TT“. Auch eine „entspannte“ Syntax ist hier zulässig. Beispielsweise sind „98-12-31“, „98.12.31“, „98/12/31“ und „98@12@31“ gleichwertig.

· Eine Zeichenfolge im Format „YYYYMMDDHHMMSS“ oder „YYMMDDHHMMSS“ ohne Trennzeichen, vorausgesetzt, dass die Zeichenfolge für Datumstypen sinnvoll ist. Beispielsweise werden „19970523091528“ und „970523091528“ als „1997-05-23 09:15:28“ interpretiert, aber „971122129015“ ist illegal (es hat einen bedeutungslosen Minutenteil) und wird zu „0000-00-00 00“. :00:00′.

· Eine Zeichenfolge im Format „JJJJMMTT“ oder „JJMMTT“ ohne Trennzeichen, vorausgesetzt, die Zeichenfolge ist für Datumstypen sinnvoll. Beispielsweise werden „19970523“ und „970523“ als „1997-05-23“ interpretiert, aber „971332“ ist illegal (es hat einen bedeutungslosen Monats- und Tagesteil) und wird zu „0000-00-00“.

· Eine Zahl im Format YYYYMMDDHHMMSS oder YYMMDDHHMMSS, sofern die Zahl für den Datumstyp sinnvoll ist. Beispielsweise werden 19830905132800 und 830905132800 als „1983-09-05 13:28:00“ interpretiert.

· Eine Zahl im Format JJJJMMTT oder JJMMTT, sofern die Zahl für den Datumstyp sinnvoll ist. Beispielsweise werden 19830905 und 830905 als „05.09.1983“ interpretiert.

· Das von der Funktion zurückgegebene Ergebnis ist für den DATETIME-, DATE- oder TIMESTAMP-Kontext geeignet, z. B. NOW() oder CURRENT_DATE.

Ungültige DATETIME-, DATE- oder TIMESTAMP-Werte werden in einen „Null“-Wert des entsprechenden Typs („0000-00-00 00:00:00“, „0000-00-00“ oder 00000000000000) umgewandelt ).

Für Zeichenfolgenwerte, die Datumsteiltrennzeichen enthalten, müssen keine zwei Ziffern angegeben werden, wenn die Tages- und Monatswerte kleiner als 10 sind. „1979-6-9“ ist dasselbe wie „1979-06-09“. Ebenso besteht bei Zeichenfolgenwerten, die Zeitteiltrennzeichen enthalten, keine Notwendigkeit, zwei Ziffern anzugeben, wenn die Stunden-, Minuten- und Sekundenwerte kleiner als 10 sind. „1979-10-30 1:2:3“ ist dasselbe wie „1979-10-30 01:02:03“.

Der numerische Wert sollte 6, 8, 12 oder 14 Ziffern lang sein. Wenn eine Zahl 8 oder 14 Ziffern lang ist, wird davon ausgegangen, dass sie im Format JJJJMMTT oder JJJJMMTDHHMMSS vorliegt, wobei die ersten 4 Ziffern das Jahr darstellen. Wenn die Zahl 6 oder 12 Ziffern lang ist, wird davon ausgegangen, dass sie im Format JJMMTT oder JJMMTDHHMMSS vorliegt, wobei die ersten beiden Ziffern das Jahr darstellen. Andere Zahlen werden so interpretiert, als ob sie auf die nächste Länge mit Nullen aufgefüllt würden.

Als unqualifizierte Zeichenfolgen angegebene Werte werden mit der angegebenen Länge interpretiert. Wenn die Zeichenfolge 8 oder 14 Zeichen lang ist, stellen die ersten 4 Ziffern das Jahr dar. Ansonsten geben die ersten beiden Ziffern das Jahr an. Interpretieren Sie jede in der Zeichenfolge vorkommende Komponente von links nach rechts, um die Werte für Jahr, Monat, Tag, Stunde, Minute und Sekunde zu ermitteln. Das bedeutet, dass Zeichenfolgen mit weniger als 6 Zeichen nicht verwendet werden sollten. Wenn Sie beispielsweise „9903“ angeben und denken, dass dies März 1999 bedeutet, fügt MySQL einen Datumswert „Null“ in Ihre Tabelle ein. Dies liegt daran, dass die Jahres- und Monatswerte 99 und 03 sind, der Tagesteil jedoch vollständig fehlt, sodass der Wert kein gültiges Datum ist. Sie können jedoch explizit einen Nullwert angeben, um den fehlenden Monats- oder Tagesteil darzustellen. Beispielsweise können Sie mit „990300“ den Wert „00.03.1999“ einfügen.

Bis zu einem gewissen Grad ist es möglich, einen Wert eines Datumstyps einem anderen Datumstyp zuzuweisen. Der Wert kann sich jedoch ändern oder einige Informationen verlieren:

· Wenn Sie einem DATETIME- oder TIMESTAMP-Objekt einen DATE-Wert zuweisen, wird der Zeitanteil des resultierenden Werts aus diesem Grund auf „00:00:00“ gesetzt der DATE-Wert. Keine Zeitinformationen enthalten.

· Wenn Sie einem DATE-Objekt einen DATETIME- oder TIMESTAMP-Wert zuweisen, wird der Zeitanteil des resultierenden Werts entfernt, da der DATE-Wert keine Zeitinformationen enthält.

· Denken Sie daran, dass DATETIME-, DATE- und TIMESTAMP-Werte zwar im gleichen Format angegeben werden können, die Bereiche für die verschiedenen Wertetypen jedoch unterschiedlich sind. Beispielsweise darf der TIMESTAMP-Wert nicht vor 1970 oder nach 2037 liegen. Dies weist darauf hin, dass ein Datum wie „01.01.1968“ zwar für DATETIME- oder DATE-Werte gültig ist, für TIMESTAMP-Werte jedoch nicht gültig ist und in 0 konvertiert wird, wenn es einem solchen Objekt zugewiesen wird.

Beachten Sie bestimmte Fallstricke bei der Angabe von Datumswerten:

· Das nicht strenge Format, das für als Zeichenfolgen angegebene Werte zulässig ist, kann irreführend sein. Beispielsweise kann der Wert „10:11:12“ aufgrund des Trennzeichens „:“ wie ein Zeitwert aussehen, aber wenn er in einem Datumskontext verwendet wird, wird der Wert als Jahr „2010-11-12“ interpretiert. Der Wert „10:45:15“ wird in „0000-00-00“ umgewandelt, da „45“ kein gesetzlicher Monat ist.

· Im nicht-strikten Modus führt der MySQL-Server nur grundlegende Prüfungen der Gültigkeit von Datumsangaben durch: Die Bereiche Jahr, Monat und Tag liegen jeweils zwischen 1000 und 9999, zwischen 00 und 12 und zwischen 00 und 31. Alle Datumsangaben, die Teile außerhalb dieser Bereiche enthalten, werden in „0000-00-00“ umgewandelt. Beachten Sie, dass Sie weiterhin illegale Daten wie „2002-04-31“ speichern dürfen. Um sicherzustellen, dass die Daten gültig sind, wenn Sie den strikten Modus nicht verwenden, sollten Sie Ihre Bewerbung überprüfen.

Im strikten Modus werden illegale Daten nicht akzeptiert und nicht konvertiert.

Einzelheiten finden Sie in Abschnitt 5.3.2, „SQL Server-Modus“.

· Daten mit zweistelligen Jahresangaben sind nicht eindeutig, da das Jahrhundert nicht bekannt ist. MySQL verwendet die folgenden Regeln, um zweistellige Jahreswerte zu interpretieren:

o Jahreswerte im Bereich 00-69 werden in 2000-2069 konvertiert.

o Jahreswerte im Bereich 70-99 werden auf 1970-1999 umgerechnet.


11.3.1.1. TIMESTAMP-Attribute seit MySQL 4.1

Hinweis: In älteren Versionen von MySQL (vor 4.1) waren die Attribute des TIMESTAMP-Spaltentyps in vielen Fällen vorhanden Wege Ganz anders als in diesem Abschnitt beschrieben. Wenn Sie alte TIMESTAMP-Daten konvertieren müssen, damit sie in MySQL 5.1 funktionieren, finden Sie weitere Informationen im MySQL 4.1-Referenzhandbuch.

Das Anzeigeformat der TIMESTAMP-Spalte ist das gleiche wie das der DATETIME-Spalte. Mit anderen Worten: Die Anzeigebreite ist auf 19 Zeichen festgelegt und das Format ist JJJJ-MM-TT HH:MM:SS.

Der MySQL-Server kann auch im MAXDB-Modus ausgeführt werden. Wenn der Server in diesem Modus läuft, ist TIMESTAMP gleich DATETIME. Das heißt, wenn der Server beim Erstellen der Tabelle im MAXDB-Modus ausgeführt wird, wird die TIMESTAMP-Spalte als DATETIME-Spalte erstellt. Das Ergebnis ist, dass die Spalte das DATETIME-Anzeigeformat verwendet, denselben Wertebereich hat und nicht automatisch mit dem aktuellen Datum und der aktuellen Uhrzeit initialisiert oder aktualisiert wird.

Um den MAXDB-Modus zu aktivieren, verwenden Sie beim Starten des Servers die Serveroption –sql-mode=MAXDB oder stellen Sie den SQL-Servermodus zur Laufzeit auf MAXDB ein, indem Sie die globale Variable sql_mode festlegen:

Der Client kann den Server für seine Verbindung wie folgt im MAXDB-Modus laufen lassen:

MySQL akzeptiert keine Dateien in Japan oder die Monatsspalte enthält eine Null oder einen Zeitstempelwert, der einen unzulässigen Datumswert enthält. Die einzige Ausnahme von dieser Regel ist der Sonderwert „0000-00-00 00:00:00“.

Sie können sehr flexibel bestimmen, wann TIMESTAMP initialisiert und aktualisiert werden soll und welche Spalten initialisiert und aktualisiert werden sollen:

· Sie können den aktuellen Zeitstempel als Standardwert und den automatisch aktualisierten Wert angeben. Sie können jedoch nur eines oder keines von beiden auswählen. (Es ist nicht möglich, dass eine Spalte ein Verhalten und eine andere Spalte ein anderes Verhalten auswählt.)

· Sie können angeben, welche TIMESTAMP-Spalte automatisch initialisiert oder auf das aktuelle Datum und die aktuelle Uhrzeit aktualisiert wird. Die 1. TIMESTAMP-Spalte wird nicht mehr benötigt.

Bitte beachten Sie, dass die unten besprochenen Informationen nur für TIMESTAMP-Spalten in Tabellen gelten, die ohne aktivierten MAXDB-Modus erstellt wurden. (Wie oben erwähnt, führt der MAXDB-Modus dazu, dass Spalten als DATETIME-Spalten erstellt werden.) Die Regeln, die die Initialisierung und Aktualisierung von TIMESTAMP-Spalten steuern, lauten wie folgt:

· Wenn die erste TIMESTAMP-Spalte in einer Tabelle als DEFAULT-Wert angegeben ist, kann sie nicht ignoriert werden. Der Standardwert kann CURRENT_TIMESTAMP oder ein konstanter Datums- und Uhrzeitwert sein.

· DEFAULT NULL ist dasselbe wie DEFAULT CURRENT_TIMESTAMP der ersten TIMESTAMP-Spalte. Für andere TIMESTAMP-Spalten wird DEFAULT NULL als DEFAULT 0 behandelt.

· Jede TIMESTAMP-Spalte in der Tabelle kann so eingestellt werden, dass sie automatisch mit dem aktuellen Zeitstempel initialisiert und/oder aktualisiert wird.

· In der CREATE TABLE-Anweisung können Sie die erste TIMESTAMP-Spalte auf eine der folgenden Arten deklarieren:

o Verwenden Sie die Klauseln DEFAULT CURRENT_TIMESTAMP und ON UPDATE CURRENT_TIMESTAMP, um den Standardwert zu verwenden aktuellen Zeitstempel und wird automatisch aktualisiert.

o Verwendet keine DEFAULT- oder ON UPDATE-Klausel, genau wie DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP.

o Verwenden Sie die DEFAULT CURRENT_TIMESTAMP-Klausel anstelle der ON UPDATE-Klausel. Die Spalte verwendet den aktuellen Zeitstempel als Standardwert, wird jedoch nicht automatisch aktualisiert.

o Ohne die DEFAULT-Klausel, aber mit der ON UPDATE CURRENT_TIMESTAMP-Klausel hat die Spalte einen Standardwert von 0 und wird automatisch aktualisiert.

o Verwenden Sie den konstanten DEFAULT-Wert, wobei der angegebene Standardwert aufgeführt ist. Wenn die Spalte eine ON UPDATE CURRENT_TIMESTAMP-Klausel hat, wird sie automatisch aktualisiert, andernfalls nicht.

Mit anderen Worten: Sie können den aktuellen Zeitstempel für den Anfangswert und den automatisch aktualisierten Wert verwenden, oder das eine oder das andere oder keines von beidem. (Sie können beispielsweise ON UPDATE angeben, um automatische Aktualisierungen zu ermöglichen, ohne dass die Spalten automatisch initialisiert werden.)

· Sie können CURRENT_TIMESTAMP, CURRENT_TIMESTAMP() oder NOW() in den Klauseln DEFAULT und ON UPDATE verwenden. Sie haben alle die gleiche Wirkung.

Die Reihenfolge der beiden Eigenschaften ist nicht wichtig. Wenn sowohl DEFAULT als auch ON UPDATE für eine TIMESTAMP-Spalte angegeben sind, kann einer der beiden vor dem anderen stehen.

Beispiel: Folgende Aussagen sind äquivalent:

· Um die automatische Standardeinstellung oder Aktualisierung für eine andere TIMESTAMP-Spalte als Spalte 1 festzulegen, müssen Sie die automatische Initialisierung und Aktualisierung deaktivieren, indem Sie der ersten TIMESTAMP-Spalte explizit einen konstanten DEFAULT-Wert zuweisen. (Zum Beispiel DEFAULT 0 oder DEFAULT’2003-01-01 00:00:00′). Für andere TIMESTAMP-Spalten gelten dann dieselben Regeln wie für die erste TIMESTAMP-Spalte, mit der Ausnahme, dass die Klauseln DEFAULT und ON UPDATE nicht ignoriert werden können. Wenn Sie dies tun, erfolgt keine automatische Initialisierung oder Aktualisierung.

Zum Beispiel: Folgende Aussagen sind äquivalent:

Sie können für jede Verbindung die aktuelle Zeitzone einstellen, Weitere Beschreibungen finden Sie in Abschnitt 5.10.8, „MySQL Server-Zeitzonenunterstützung“. TIMESTAMP-Werte werden im UTC-Format gespeichert, beim Speichern in die aktuelle Zeitzone konvertiert und beim Abrufen wieder in die aktuelle Zeitzone konvertiert. Solange der Zeitzonen-Einstellwert konstant ist, kann der Wert zum Zeitpunkt der Speicherung ermittelt werden. Wenn Sie einen TIMESTAMP-Wert speichern, sollten Sie die Zeitzone ändern und dann den Wert abrufen, da er sich von dem von Ihnen gespeicherten Wert unterscheidet. Dies liegt daran, dass bei der Konvertierung in beide Richtungen nicht dieselbe Zeitzone verwendet wird. Die aktuelle Zeitzone kann als Wert der Systemvariablen time_zone verwendet werden.

Sie können das NULL-Attribut in die Definition einer TIMESTAMP-Spalte aufnehmen, damit die Spalte NULL-Werte enthalten kann. Beispiel:

Wenn das NULL-Attribut nicht angegeben ist, wird die Spalte durch Setzen auf NULL auf den aktuellen Zeitstempel gesetzt. Bitte beachten Sie, dass eine TIMESTAMP-Spalte, die NULL-Werte zulässt, nicht den aktuellen Zeitstempel annimmt, es sei denn, ihr Standardwert ist als CURRENT_TIMESTAMP definiert oder NOW() oder CURRENT_TIMESTAMP wird in die Spalte eingefügt. Mit anderen Worten: Eine als NULL definierte TIMESTAMP-Spalte wird nur dann automatisch aktualisiert, wenn sie erstellt wird mit:

Andernfalls – das heißt, wenn NULL anstelle von DEFAULT TIMESTAMP verwendet wird Um die TIMESTAMP-Spalte wie folgt zu definieren...

... dann müssen Sie explizit einen Wert einfügen, der dem aktuellen Datum und der aktuellen Uhrzeit entspricht. Beispiel:


11.3.2 TIME-Typ

MySQL ruft TIME-Werte in „HH:MM“ ab und zeigt sie an. SS‘-Format (oder ‚HHH:MM:SS‘-Format für große Stundenwerte). TIME-Werte können zwischen „-838:59:59“ und „838:59:59“ liegen. Der Grund dafür, dass der Stundenteil so groß ist, liegt darin, dass der Typ TIME nicht nur zur Darstellung der Tageszeit (die weniger als 24 Stunden betragen muss) verwendet werden kann, sondern auch der Zeit, die ein Ereignis verstreicht, oder des Zeitintervalls zwischen zwei Ereignisse (die länger als 24 Stunden dauern oder sogar negativ sein können).

Sie können den TIME-Wert in verschiedenen Formaten angeben:

· Eine Zeichenfolge im Format „D HH:MM:SS.fraction“. Sie können auch eine der folgenden „nicht strengen“ Syntaxen verwenden: „HH:MM:SS.fraction“, „HH:MM:SS“, „HH:MM“, „D HH:MM:SS“, „D HH: MM“, „D HH“ oder „SS“. Dabei stellt D den Tag dar, der einen Wert zwischen 0 und 34 annehmen kann. Bitte beachten Sie, dass MySQL noch keine Ergebnisse speichert.

· Eine Zeichenfolge im Format „HHMMSS“ ohne Trennzeichen, die eine aussagekräftige Zeitangabe voraussetzt. Beispielsweise wird „101112“ als „10:11:12“ verstanden, aber „109712“ ist illegal (es enthält einen bedeutungslosen Minutenteil) und wird zu „00:00:00“.

· Wert im HHMMSS-Format, angenommen als aussagekräftiger Zeitpunkt. Beispielsweise wird 101112 als „10:11:12“ verstanden. Folgende Formate werden ebenfalls verstanden: SS, MMSS, HHMMSS, HHMMSS.fraction. Bitte beachten Sie, dass MySQL noch keine Ergebnisse speichert.

· Das von der Funktion zurückgegebene Ergebnis mit einem für den TIME-Kontext geeigneten Wert, z. B. CURRENT_TIME.

Für TIME-Werte, die als Zeichenfolgen einschließlich Zeitteiltrennzeichen angegeben werden, müssen keine zwei Ziffern angegeben werden, wenn der Stunden-, Minuten- oder Sekundenwert kleiner als 10 ist. „8:3:2“ ist dasselbe wie „08:03:02“.

Bei der Zuweisung abgekürzter Werte zur Spalte TIME ist Vorsicht geboten. Ohne den Doppelpunkt interpretiert MySQL den Wert unter der Annahme, dass die beiden Ziffern ganz rechts Sekunden darstellen. (MySQL interpretiert TIME-Werte als Zeit in der Vergangenheit und nicht als Zeit heute). Sie könnten beispielsweise denken, dass „1112“ und 1112 „11:12:00“ (11 Minuten nach 11 Uhr) bedeuten, MySQL interpretiert sie jedoch als „00:11:12“ (11 Minuten, 12 Sekunden). Ebenso werden „12“ und 12 als „00:00:12“ interpretiert. Im Gegensatz dazu wird ein Doppelpunkt in einem TIME-Wert immer als Tageszeit betrachtet. Das heißt, „11:12“ bedeutet „11:12:00“, nicht „00:11:12“.

Werte, die außerhalb des TIME-Bereichs liegen, aber zulässig sind, werden auf den nächstgelegenen Endpunkt des Bereichs begrenzt. Beispielsweise werden „-850:00:00“ und „850:00:00“ in „-838:59:59“ und „838:59:59“ umgewandelt.

Ungültige TIME-Werte werden in „00:00:00“ umgewandelt. Bitte beachten Sie, dass, da „00:00:00“ selbst ein zulässiger TIME-Wert ist, nur ein in der Tabelle gespeicherter „00:00:00“-Wert nicht erkennen kann, ob der ursprüngliche Wert „00:00:00“ oder ein unzulässiger Wert ist .


11.3.3 Typ JAHR

Der YEAR-Typ ist ein Einzelbyte-Typ, der zur Darstellung des Jahres verwendet wird.

MySQL ruft YEAR-Werte im YYYY-Format ab und zeigt sie an. Der Bereich liegt zwischen 1901 und 2155.

Sie können YEAR-Werte in verschiedenen Formaten angeben:

· Vierstellige Zeichenfolge im Bereich von „1901“ bis „2155“.

· Vier Ziffern im Bereich von 1901 bis 2155.

· Zweistellige Zeichenfolge im Bereich von „00“ bis „99“. Werte im Bereich „00“ bis „69“ und „70“ bis „99“ werden in YEAR-Werte im Bereich 2000 bis 2069 und 1970 bis 1999 umgewandelt.

· Zweistellige Ganzzahl im Bereich 1 bis 99. Werte im Bereich 1 bis 69 und 70 bis 99 werden in JAHR-Werte im Bereich 2001 bis 2069 und 1970 bis 1999 umgewandelt. Beachten Sie, dass sich zweistellige Ganzzahlbereiche geringfügig von zweistelligen Zeichenfolgenbereichen unterscheiden, da Sie Null nicht direkt als Zahl angeben und diese als 2000 interpretieren lassen können. Sie müssen es als Zeichenfolge „0“ oder „00“ angeben, sonst wird es als 0000 interpretiert.

· Das von der Funktion zurückgegebene Ergebnis, dessen Wert für den YEAR-Kontext geeignet ist, z. B. NOW().

Unzulässige YEAR-Werte werden in 0000 umgewandelt.


11.3.4. Y2K-Angelegenheiten und Datumstypen

MySQL ist von Natur aus sicher für das Jahr 2000 (Y2K) (siehe Abschnitt 1.4.5, „Y2K-Kompatibilität“) , aber der in MySQL eingegebene Wert ist möglicherweise nicht sicher. Jede Eingabe, die einen zweistelligen Jahreswert enthält, ist mehrdeutig, da das Jahrhundert nicht bekannt ist. Diese Werte müssen als vier Ziffern interpretiert werden, da MySQL intern vier Ziffern zum Speichern des Jahres verwendet.

Für die Typen DATETIME, DATE, TIMESTAMP und YEAR verwendet MySQL die folgenden Regeln, um Datumsangaben mit mehrdeutigen Jahreswerten zu interpretieren:

· Jahreswerte im Bereich von 00-69 werden konvertiert bis 2000-2069.

· Jahreswerte im Bereich 70-99 werden auf 1970-1999 umgerechnet.

Denken Sie daran, dass es sich bei diesen Regeln nur um vernünftige Schätzungen darüber handelt, was die Datenwerte darstellen. Wenn die von MySQL verwendete Heuristik nicht den richtigen Wert liefert, sollten Sie die genaue Eingabe mit dem vierstelligen Jahreswert bereitstellen.

ORDER BY kann TIMESTAMP- oder YEAR-Werte mit zwei Ziffern des Jahres korrekt sortieren.

Einige Funktionen wie MIN() und MAX() konvertieren TIMESTAMP oder YEAR in eine Zahl. Dies bedeutet, dass diese Funktionen bei Werten mit zweistelligen Jahresangaben nicht korrekt funktionieren. Die Lösung besteht in diesem Fall darin, TIMESTAMP oder YEAR in ein vierstelliges Jahresformat zu konvertieren oder MIN(DATE_ADD(TIMESTAMP,INTERVAL 0 DAYS)) zu verwenden.


11.4. String-Typen

11.4.1. CHAR- und VARCHAR-Typen 11.4.2.
BINARY- und VARBINARY-Typen
11.4.4. ENUM-Typ 11.4.5. SET-Typ

String-Typen beziehen sich auf CHAR, VARCHAR, BINARY, VARBINARY, BLOB, TEXT, ENUM und SET. In diesem Abschnitt wird beschrieben, wie diese Typen funktionieren und wie sie in Abfragen verwendet werden.


11.4.1. CHAR- und VARCHAR-Typen

CHAR- und VARCHAR-Typen sind ähnlich, werden jedoch unterschiedlich gespeichert und abgerufen. Sie unterscheiden sich auch hinsichtlich ihrer maximalen Länge und ob nachgestellte Leerzeichen erhalten bleiben. Während der Speicherung oder des Abrufs wird keine Fallkonvertierung durchgeführt.

Die für die Typen CHAR und VARCHAR deklarierte Länge gibt die maximale Anzahl von Zeichen an, die Sie speichern möchten. CHAR(30) kann beispielsweise 30 Zeichen belegen.

Die Länge der CHAR-Spalte ist auf die Länge festgelegt, die beim Erstellen der Tabelle angegeben wurde. Die Länge kann ein beliebiger Wert zwischen 0 und 255 sein. Wenn Sie CHAR-Werte speichern, füllen Sie diese rechts mit Leerzeichen bis zur angegebenen Länge auf. Wenn ein CHAR-Wert abgerufen wird, werden nachgestellte Leerzeichen entfernt. Während der Speicherung oder des Abrufs wird keine Fallkonvertierung durchgeführt.

Die Werte in der VARCHAR-Spalte sind Zeichenfolgen variabler Länge. Die Länge kann als Wert zwischen 0 und 65.535 angegeben werden. (Die maximale effektive Länge von VARCHAR wird durch die maximale Zeilengröße und den verwendeten Zeichensatz bestimmt. Die maximale Gesamtlänge beträgt 65.532 Byte.)

Im Vergleich zu CHAR wird beim Speichern des VARCHAR-Werts nur die erforderliche Anzahl von Zeichen plus ein Byte zum Aufzeichnen der Länge gespeichert (wenn die deklarierte Länge der Spalte 255 überschreitet, werden zwei Bytes verwendet).

VARCHAR-Werte werden ohne Auffüllung gespeichert. Nachfolgende Leerzeichen bleiben erhalten, wenn der Wert gespeichert und abgerufen wird, entsprechend dem Standard-SQL.

Wenn der einer CHAR- oder VARCHAR-Spalte zugewiesene Wert die maximale Länge der Spalte überschreitet, wird der Wert passend zugeschnitten. Wenn das abgeschnittene Zeichen kein Leerzeichen ist, wird eine Warnung generiert. Wenn Nicht-Leerzeichen gekürzt werden, führt dies zu einem Fehler (anstelle einer Warnung) und verhindert das Einfügen von Werten durch Verwendung des strikten SQL-Modus. Siehe Abschnitt 5.3.2, „SQL Server-Modus“.

Die folgende Tabelle zeigt die Ergebnisse des Speicherns verschiedener Zeichenfolgenwerte in den Spalten CHAR(4) und VARCHAR(4) und veranschaulicht den Unterschied zwischen CHAR und VARCHAR:

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 Bytes

Bitte beachten Sie, dass der Wert in der letzten Zeile im Die obige Tabelle gilt nur, wenn der strikte Modus nicht verwendet wird. Wenn MySQL im strikten Modus ausgeführt wird, werden Werte, die die Spaltenlänge überschreiten, nicht gespeichert und es tritt ein Fehler auf.

Die aus den Spalten CHAR(4) und VARCHAR(4) abgerufenen Werte sind nicht immer gleich, da nachgestellte Leerzeichen beim Abrufen aus der Spalte CHAR entfernt werden. Den Unterschied verdeutlicht das folgende Beispiel:

Sortiert und vergleicht Werte in CHAR- und VARCHAR-Spalten gemäß den der Spalte zugewiesenen Zeichensatz-Sortierungsregeln.

Bitte beachten Sie, dass alle MySQL-Sortierungsregeln zur PADSPACE-Klasse gehören. Dies bedeutet, dass alle CHAR- und VARCHAR-Werte in MySQL beim Vergleich keine nachgestellten Leerzeichen berücksichtigen müssen. Zum Beispiel:

Bitte beachten Sie, dass dies für alle MySQL-Versionen gilt und nicht davon betroffen ist den SQL-Server-Modus.

In Fällen, in denen nachfolgende Füllzeichen beim Vergleich abgeschnitten oder ignoriert werden und der Spaltenindex einen eindeutigen Wert erfordert, führt das Einfügen eines Werts in die Spalte, der sich nur in der Anzahl der Füllzeichen unterscheidet, zu einem doppelten Schlüsselwert Fehler.

CHAR BYTE ist ein Alias ​​für CHAR BINARY. Dies dient der Gewährleistung der Kompatibilität.

Das ASCII-Attribut weist der CHAR-Spalte den Zeichensatz latin1 zu. Das UNICODE-Attribut weist den ucs2-Zeichensatz zu.


11.4.2. BINARY- und VARBINARY-Typen

Die BINARY- und VARBINARY-Klassen ähneln CHAR und VARCHAR, außer dass sie binäre Zeichenfolgen anstelle von nicht-binären Zeichenfolgen enthalten . Das heißt, sie enthalten Byte-Strings und keine Zeichenfolgen. Dies bedeutet, dass sie keinen Zeichensatz haben und Sortierung und Vergleich auf dem numerischen Wert der Spaltenwertbytes basieren.

Die maximal zulässigen Längen von BINARY und VARBINARY sind dieselben, genau wie CHAR und VARCHAR. Der Unterschied besteht darin, dass die Länge von BINARY und VARBINARY die Länge der Bytes und nicht die Länge der Zeichen ist.

Die Datentypen BINARY und VARBINARY unterscheiden sich von den Datentypen CHAR BINARY und VARCHAR BINARY. Beim letzteren Typ behandelt die BINARY-Eigenschaft die Spalte nicht als binäre Zeichenfolgenspalte. Stattdessen werden die binären Sortierregeln des Zeichensatzes der Spalte verwendet und die Spalte selbst enthält nicht-binäre Zeichenfolgen anstelle von binären Byte-Strings. Beispielsweise wird CHAR(5) BINARY als CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin behandelt, vorausgesetzt, dass der Standardzeichensatz latin1 ist. Dies unterscheidet sich von BINARY(5), das eine 5-Byte-Binärzeichenfolge ohne Zeichensatz oder Sortierregeln enthält.

Wenn Sie BINÄR-Werte speichern, füllen Sie diese rechts mit Werten in der angegebenen Länge auf. Der Füllwert ist 0×00 (null Bytes). Fügt beim Einfügen eines Werts rechts 0×00 hinzu und löscht bei der Auswahl keine nachfolgenden Bytes. Beim Vergleich sind alle Bytes wichtig, auch bei ORDER BY- und DISTINCT-Operationen. Beim Vergleich sind 0×00 Bytes und Leerzeichen unterschiedlich, 0×00
Zum Beispiel: Für eine BINARY(3)-Spalte wird „a“ beim Einfügen zu „a“. „a“ wird beim Einfügen zu „a“. Bei Auswahl ändert sich keiner der eingefügten Werte.

Für VARBINARY werden Zeichen beim Einfügen nicht aufgefüllt und Bytes werden bei Auswahl nicht gekürzt. Beim Vergleich sind alle Bytes wichtig, auch bei ORDER BY- und DISTINCT-Operationen. Beim Vergleich sind 0×00 Bytes und Leerzeichen unterschiedlich, 0×00
In Fällen, in denen nachfolgende Füllzeichen beim Vergleich abgeschnitten oder ignoriert werden und der Spaltenindex einen eindeutigen Wert erfordert, führt das Einfügen eines Werts in die Spalte, der sich nur in der Anzahl der Füllzeichen unterscheidet, zu einem doppelten Schlüsselwert Fehler.

Wenn Sie planen, diese Datentypen zum Speichern von Binärdaten zu verwenden und genau denselben Wert wie den gespeicherten Wert abrufen müssen, sollten Sie die zuvor beschriebenen Auffüll- und Beschneidungsfunktionen in Betracht ziehen. Das folgende Beispiel veranschaulicht, wie sich ein mit 0×00 aufgefüllter BINARY-Wert auf den Spaltenwertvergleich auswirkt:

if The Der abgerufene Wert muss mit dem für die Speicherung ohne Auffüllung angegebenen Wert übereinstimmen, vorzugsweise unter Verwendung des Datentyps BLOB.

MySQL kann den Typ einer BINARY- oder VARBINARY-Spalte beim Erstellen einer Tabelle stillschweigend ändern. Siehe Abschnitt 13.1.5.1, „Stille Änderungen der Spaltenspezifikation“.


11.4.3. BLOB- und TEXT-Typen

BLOB ist ein binäres großes Objekt, das eine variable Datenmenge speichern kann. Es gibt 4 BLOB-Typen: TINYBLOB, BLOB, MEDIUMBLOB und LONGBLOB. Sie unterscheiden sich lediglich in der maximalen Länge, in der sie einen Wert aufnehmen können.

Es gibt 4 TEXT-Typen: TINYTEXT, TEXT, MEDIUMTEXT und LONGTEXT. Diese entsprechen 4 BLOB-Typen mit der gleichen maximalen Länge und den gleichen Speicheranforderungen.

Siehe Abschnitt 11.5, „Speicheranforderungen für Spaltentypen“.

BLOB-Spalten werden als Binärzeichenfolgen (Bytezeichenfolgen) behandelt. TEXT-Spalten werden als nicht-binäre Zeichenfolgen (Zeichenfolgen) behandelt. BLOB-Spalten haben keinen Zeichensatz und Sortierung und Vergleich basieren auf dem numerischen Wert der Spaltenwertbytes. TEXT-Spalten verfügen über einen Zeichensatz und die Werte werden gemäß den Sortierregeln des Zeichensatzes sortiert und verglichen.

Beim Speichern oder Abrufen von TEXT- oder BLOB-Spalten erfolgt keine Groß-/Kleinschreibung.

Wenn Sie nicht im strikten Modus ausgeführt werden und einer BLOB- oder TEXT-Spalte einen Wert zuweisen, der die maximale Länge des Spaltentyps überschreitet, wird der Wert passend gekürzt. Wenn das abgeschnittene Zeichen kein Leerzeichen ist, wird eine Warnung generiert. Im strikten SQL-Modus wird ein Fehler generiert und der Wert abgelehnt, anstatt mit einer Warnung abzufangen. Siehe Abschnitt 5.3.2, „SQL Server-Modus“.

In den meisten Fällen kann man sich eine BLOB-Spalte als VARBINARY-Spalte vorstellen, die groß genug sein kann. Ebenso können TEXT-Spalten als VARCHAR-Spalten behandelt werden. BLOB und TEXT unterscheiden sich in folgenden Punkten von VARBINARY und VARCHAR:

· Nachgestellte Leerzeichen werden beim Speichern oder Abrufen von Werten aus BLOB- und TEXT-Spalten nicht entfernt. (Dies ist dasselbe wie bei den Spalten VARBINARY und VARCHAR).

Bitte beachten Sie, dass der TEXT mit Leerzeichen erweitert wird, um ihn an das verglichene Objekt anzupassen, genau wie CHAR und VARCHAR.

· Für Indizes auf BLOB- und TEXT-Spalten muss die Länge des Indexpräfixes angegeben werden. Für CHAR und VARCHAR ist die Präfixlänge optional. Siehe Abschnitt 7.4.3, „Spaltenindizes“.

· BLOB- und TEXT-Spalten können keine Standardwerte haben.

LONG und LONG VARCHAR entsprechen dem Datentyp MEDIUMTEXT. Dies dient der Gewährleistung der Kompatibilität. Wenn der Spaltentyp TEXT das Attribut BINARY verwendet, wird der Spalte die binäre Sortierung des Spaltenzeichensatzes zugewiesen.

MySQL Connector/ODBC definiert BLOB-Werte als LONGVARBINARY und TEXT-Werte als LONGVARCHAR.

Da BLOB- und TEXT-Werte sehr lang sein können, kann es bei ihrer Verwendung zu einigen Einschränkungen kommen:

· Beim Sortieren werden nur die ersten max_sort_length Bytes der Spalte verwendet. Der Standardwert für max_sort_length ist 1024; dieser Wert kann mit der Option –max_sort_length beim Starten des mysqld-Servers geändert werden. Siehe Abschnitt 5.3.3, „Serversystemvariablen“.

Durch Erhöhen des Werts von max_sort_length zur Laufzeit können mehr Bytes beim Sortieren oder Kombinieren sinnvoller werden. Jeder Client kann den Wert seiner Sitzungsvariablen „max_sort_length“ ändern:

Wenn Sie sinnvolle Bytes länger als max_sort_length machen möchten, gehen Sie richtig. Ein anderer Weg Wenn Sie GROUP BY oder ORDER BY für BLOB- oder TEXT-Spalten verwenden, die lange Werte enthalten, werden die Spaltenwerte in Objekte mit fester Länge konvertiert. Der Standardansatz ist die Verwendung der SUBSTRING-Funktion. Die folgende Anweisung sortiert beispielsweise 2000 Bytes der Kommentarspalte: Der tatsächliche Maximalwert, der zwischen Client und Server übertragen werden kann, wird durch die Menge des verfügbaren Speichers und die Größe des Kommunikationspuffers bestimmt. Sie können die Größe des Nachrichtenpuffers ändern, indem Sie den Wert der Variablen max_allowed_packet ändern. Sie müssen jedoch sowohl die Server- als auch die Clientprogramme ändern. Sie können beispielsweise mysql und mysqldump verwenden, um den max_allowed_packet-Wert des Clients zu ändern. Siehe Abschnitt 7.5.2, „Anpassen von Serverparametern“, Abschnitt 8.3, „mysql: MySQL-Befehlszeilentool“ und Abschnitt 8.8, „mysqldump: Datenbanksicherungsprogramm“.

Jeder BLOB- oder TEXT-Wert wird jeweils durch ein intern zugewiesenes Objekt dargestellt. Dies steht im Gegensatz zu anderen Spaltentypen, die beim Öffnen der Tabelle jeder Spalte eine Speicher-Engine zuweisen.

11.4.4. ENUM-Typ

ENUM ist ein String-Objekt, dessen Werte aus einer Wertespalte stammen, die in der Spaltenspezifikation explizit aufgezählt wird Die Tabelle wird erstellt.

In einigen Fällen können ENUM-Werte auch leere Zeichenfolgen (") oder NULL sein:


· Wenn Sie einen unzulässigen Wert in ENUM (d. h. die Spalte mit zulässigen Werten) einfügen Als spezieller Fehlerwert wird eine leere Zeichenfolge eingefügt. Diese Zeichenfolge unterscheidet sich von der „normalen“ leeren Zeichenfolge, die den numerischen Wert 0 hat. Wenn eine ENUM-Spalte so deklariert ist, dass sie NULL zulässt, wird der NULL-Wert angegeben ist ein gültiger Wert für die Spalte und der Standardwert ist NULL. Wenn die ENUM-Spalte als NOT NULL deklariert ist, ist ihr Standardwert das erste Element der zulässigen Wertespalte 🎜>

Jeder Enumerationswert hat einen Index:


· Die Werte in der Spalte werden beginnend mit 1 nummeriert, beginnend mit den in der Spalte angegebenen zulässigen Werten.

· Der Fehlerwert der leeren Zeichenfolge ist 0. Dies bedeutet, dass Sie dies tun können Verwenden Sie die folgende SELECT-Anweisung, um Zeilen mit unzulässigen ENUM-Werten zu finden:





· Der Index für NULL-Werte ist NULL > Beispielsweise kann eine als ENUM ('eins', 'zwei', 'drei') definierte Spalte jeden unten angezeigten Wert haben:


Wertindex

NULL NULL

🎜>

'Eins

' Zwei '2

' Drei ' 3

Eine Aufzählung kann bis zu 65.535 Elemente enthalten.

Beim Erstellen einer Tabelle werden nachgestellte Leerzeichen in ENUM-Mitgliedswerten automatisch entfernt.

Beim Abrufen werden die in der ENUM-Spalte gespeicherten Werte in der in der Spaltendefinition verwendeten Groß- und Kleinschreibung angezeigt. Bitte beachten Sie, dass ENUM-Spalten Zeichensätze und Sortierregeln zugewiesen werden können. Bei binären oder case-sensitiven Sortierregeln sollte beim Zuweisen von Werten zu Spalten die Groß-/Kleinschreibung berücksichtigt werden.

Wenn ein ENUM-Wert in einem numerischen Kontext abgerufen wird, wird der Index des Spaltenwerts zurückgegeben. Sie können beispielsweise wie folgt nach numerischen Werten aus einer ENUM-Spalte suchen:

Wenn Sie eine Zahl in einer ENUM-Spalte speichern, wird die Zahl behandelt als Index, und der gespeicherte Wert ist Das diesem Index entsprechende Aufzählungsmitglied. (Dies funktioniert jedoch nicht mit LOAD DATA, das alle Eingaben als Zeichenfolgen behandelt.) Es wird nicht empfohlen, eine ENUM-Spalte mit numerischen Aufzählungswerten zu definieren, da dies leicht zu Verwirrung führen kann. Die folgende Spalte enthält beispielsweise Aufzählungsmitglieder mit den Zeichenfolgenwerten „0“, „1“ und „2“, aber den numerischen Indexwerten 1, 2 und 3:

Sortieren Sie ENUM-Werte entsprechend der Reihenfolge, in der die Enumerationsmitglieder in der Spaltendefinition aufgeführt sind. (Mit anderen Worten, ENUM-Werte werden nach Indexnummer sortiert). Beispielsweise steht für ENUM('a', 'b') 'a' vor 'b', aber für ENUM('b', 'a') steht 'b' vor 'a'. Leere Zeichenfolgen werden vor nicht leeren Zeichenfolgen sortiert, und NULL-Werte werden vor allen anderen Aufzählungswerten sortiert. Um unerwartete Ergebnisse zu vermeiden, geben Sie ENUM-Spalten in alphabetischer Reihenfolge an. Sie können auch GROUP BY CAST(col AS CHAR) oder GROUP BY CONCAT(col) verwenden, um sicherzustellen, dass die Spalten lexikalisch und nicht numerisch sortiert werden.

Wenn Sie alle möglichen Werte für eine ENUM-Spalte ermitteln möchten, verwenden Sie SHOW COLUMNS FROM tbl_name LIKE enum_col und analysieren Sie die ENUM-Definition für Spalte 2 in der Ausgabe.


11.4.5. SET-Typ

SET ist ein Zeichenfolgenobjekt, das null oder mehr Werte haben kann und dessen Wert aus einer der zulässigen Spalten stammt, die angegeben werden, wenn das Tabelle wurde Wert erstellt. Wenn Sie einen SET-Spaltenwert angeben, der mehrere SET-Mitglieder enthält, verwenden Sie Kommas („,“), um die einzelnen Mitglieder zu trennen. Auf diese Weise darf der SET-Mitgliedswert selbst keine Kommas enthalten.

Zum Beispiel kann eine Spalte, die als SET('one', 'two') NOT NULL angegeben ist, einen der folgenden Werte haben:

SET Es können bis zu 64 verschiedene Mitglieder vorhanden sein.

Beim Erstellen einer Tabelle werden nachgestellte Leerzeichen in SET-Mitgliedswerten automatisch entfernt.

Beim Abrufen wird der in der SET-Spalte gespeicherte Wert in der in der Spaltendefinition verwendeten Groß- und Kleinschreibung angezeigt. Bitte beachten Sie, dass SET-Spalten Zeichensätze und Sortierregeln zugewiesen werden können. Bei binären oder case-sensitiven Sortierregeln sollte beim Zuweisen von Werten zu Spalten die Groß-/Kleinschreibung berücksichtigt werden.

MySQL speichert den SET-Wert als Zahl und das niederwertige Bit des gespeicherten Werts entspricht dem ersten SET-Mitglied. Wenn ein SET-Wert in einem numerischen Kontext abgerufen wird, entsprechen die Biteinstellungen des abgerufenen Werts den SET-Mitgliedern, aus denen der Spaltenwert besteht. Sie können beispielsweise einen numerischen Wert aus einer SET-Spalte wie folgt abrufen:

Wenn Sie eine Zahl in einer SET-Spalte speichern, wird die Anzahl der Bits in der Die binäre Darstellung der Anzahl wird durch SET-Mitglieder in Spaltenwerten bestimmt. Für Spalten, die als SET('a','b','c','d') angegeben sind, haben Mitglieder die folgenden Dezimal- und Binärwerte:

SET-Mitglied Dezimalwert Binärwert

'a' 1 0001

'b' 2 0010

'c' 4 0100

Wenn Sie Der Spalte wird ein Wert von 9 zugewiesen, der binär ist Die Form ist 1001, daher werden die 1. und 4. SET-Wertelemente „a“ und „d“ ausgewählt und die resultierenden Werte sind „a,d“.

Bei Werten, die mehrere SET-Elemente enthalten, spielt die Reihenfolge, in der die Elemente aufgelistet sind, beim Einfügen des Werts keine Rolle. Es spielt keine Rolle, wie oft ein bestimmtes Element im Wert aufgeführt ist. Wenn der Wert später abgerufen wird, erscheint jedes Element im Wert einmal und listet die Elemente in der Reihenfolge auf, die beim Erstellen der Tabelle angegeben wurde. Angenommen, eine Spalte ist als SET('a','b','c','d') angegeben:



Fügen Sie den Wert ' ein. a, d', 'd,a', 'a,d,d', 'a,d,a' und 'd,a,d':



Alle diese Werte werden beim Abrufen als „a,d“ angezeigt:



Wenn eine SET-Spalte auf einen nicht unterstützten Wert festgelegt ist, ist der Wert ignoriert und warnt:



SET-Werte werden in numerischer Reihenfolge sortiert. NULL-Werte werden vor Nicht-NULL-SET-Werten sortiert.

Normalerweise können Sie die Funktion FIND_IN_SET() oder den Operator LIKE verwenden, um nach SET-Werten zu suchen:



Die erste Anweisung findet heraus, dass SET_col Enthält die Wertesatz-Mitgliedszeile. Die zweite Methode ist ähnlich, aber anders: Sie findet Zeilen, in denen set_col an anderer Stelle einen Wert enthält, sogar in einem Teilstring eines anderen SET-Mitglieds.

Die folgenden Anweisungen sind ebenfalls zulässig:



Die erste Anweisung sucht nach dem Wert, der das erste Mengenmitglied enthält. Die zweite Anweisung sucht nach einem genau passenden Wert. Auf Vergleiche der Kategorie 2 sollte geachtet werden. Das Ergebnis, das durch den Vergleich des eingestellten Werts mit „val1, val2“ zurückgegeben wird, unterscheidet sich von dem Ergebnis, das durch den Vergleich des eingestellten Werts mit „val2, val1“ zurückgegeben wird. Die Werte sollten in derselben Reihenfolge angegeben werden, wie sie in der Spaltendefinition aufgeführt sind.

Wenn Sie alle möglichen Werte für eine SET-Spalte ermitteln möchten, verwenden Sie SHOW COLUMNS FROM tbl_name LIKE set_col und analysieren Sie die SET-Definition für Spalte 2 in der Ausgabe.


11.5. Speicheranforderungen für Spaltentypen

Listet die Speicheranforderungen für jeden von MySQL unterstützten Spaltentyp nach Kategorie auf.

Die maximale Größe einer Zeile in einer MyISAM-Tabelle beträgt 65.534 Bytes. Jede BLOB- und TEXT-Spalte macht davon nur 5 bis 9 Byte aus.

Wenn die MyISAM-Tabelle Spaltentypen mit variabler Länge enthält, ist auch das Datensatzformat variabler Länge. Beim Erstellen einer Tabelle kann MySQL unter bestimmten Bedingungen eine Spalte von einem Typ mit variabler Länge in einen Typ mit fester Länge oder umgekehrt ändern. Weitere Informationen finden Sie in Abschnitt 13.1.5.1, „Stille Änderungen der Spaltenspezifikation“.

Speicheranforderungen für numerische Typen

Speicheranforderungen für Spaltentypen

TINYINT 1 Byte

SMALLINT 2 Bytes

MEDIUMINT 3 Bytes

INT, INTEGER 4 Bytes

BIGINT 8 Bytes

FLOAT(p) wenn 0 <= p <= 24 ist 4 Bytes, wenn 25 <= p <= 53 ist 8 Bytes

FLOAT 4 Bytes

DOUBLE [PRECISION], item REAL 8 Bytes

DECIMAL(M,D), NUMERIC(M,D) Variable Länge; siehe Diskussion unten

BIT(M) Über (M+7)/8 Bytes

Die Speicheranforderungen von DECIMAL (und NUMERIC) sind versionenspezifisch:

Verwendet das Binärformat, um 9 Dezimalzahlen (basierend auf 10) in 4 Bytes zu komprimieren, um DECIMAL-Spaltenwerte darzustellen. Die Speicherung der ganzzahligen und gebrochenen Teile jedes Werts wird separat festgelegt. Jedes Vielfache von 9 Ziffern erfordert 4 Bytes, und die „verbleibenden“ Bits benötigen einen Teil der 4 Bytes. Die folgende Tabelle gibt die Speicheranforderungen für überschüssige Bits an:

Verbleibende Bytes

Anzahl der Bits

0 0

1 1

2 1  

3 2  

4 2  

5 3  

6 3  

7 4

8 4  

9 4  

Speicheranforderungen für Datums- und Uhrzeittypen

Spaltentyp Speicheranforderungen  

DATUM 3 Wörter Abschnitt

DATETIME 8 Bytes

TIMESTAMP 4 Bytes

TIME 3 Bytes

YEAR 1 Byte

Speicheranforderungen für String-Typ

Spaltentyp Speicheranforderungen

CHAR(M) M Bytes, 0 <= M <= 255

VARCHAR(M) L+1 Bytes, wobei L <= M und 0 <= M <= 65535 (siehe Hinweis unten)

BINARY(M) M Bytes, 0 < ;= M <= 255

VARBINARY(M) L+1 Bytes, wobei L <= M und 0 <= M <= 255

TINYBLOB, TINYTEXT L +1 Bytes, wobei L < 28

BLOB, TEXT L+2 Bytes , wobei L < 216

MEDIUMBLOB, MEDIUMTEXT L+3 Bytes, wobei L < 224

LONGBLOB, LONGTEXT L+4 Bytes, wobei L < 232 ENUM('value1','value2',…) 1 oder 2 Bytes, abhängig von der Anzahl der Enumerationswerte (bis zu 65.535 Werte)

SET('value1','value2',… ) 1, 2, 3, 4 oder 8 Bytes, abhängig von der Anzahl der Set-Mitglieder (maximal 64 Mitglieder)

VARCHAR-, BLOB- und TEXT-Klassen sind Typen variabler Länge. Der Speicherbedarf jedes Typs hängt von der tatsächlichen Länge des Spaltenwerts ab (in der vorherigen Tabelle mit L gekennzeichnet), nicht von der maximal möglichen Größe des Typs. Beispielsweise kann eine VARCHAR(10)-Spalte eine Zeichenfolge mit einer maximalen Länge von 10 enthalten. Der tatsächliche Speicherbedarf ist die Länge der Zeichenfolge (L) plus ein Byte, das die Länge der Zeichenfolge aufzeichnet. Für die Zeichenfolge „abcd“ ist L 4 und die Speicherung erfordert 5 Bytes.

Für die Typen CHAR, VARCHAR und TEXT sollten die Werte L und M in der vorherigen Tabelle als Anzahl der Zeichen interpretiert werden, und die Länge dieser Typen in der Spaltendefinition stellt die Anzahl der Zeichen dar. Um beispielsweise einen TINYTEXT-Wert zu speichern, sind L Zeichen +
1 Byte erforderlich.

Um die Anzahl der Bytes zu berechnen, die zum Speichern des Werts einer bestimmten CHAR-, VARCHAR- oder TEXT-Spalte verwendet werden, müssen Sie den von der Spalte verwendeten Zeichensatz berücksichtigen. Im konkreten Fall müssen Sie bei der Arbeit mit Unicode bedenken, dass alle Unicode-Zeichen die gleiche Anzahl an Bytes verwenden. Eine Aufschlüsselung des von verschiedenen Klassen von Unicode-Zeichen verwendeten Speichers finden Sie in Abschnitt 10.5, „Unicode-Unterstützung“.

Hinweis: Die effektive maximale Länge einer VARCHAR-Spalte beträgt 65.532 Zeichen.

Die NDBCLUSTER-Engine unterstützt nur Spalten mit fester Breite. Das bedeutet, dass sich VARCHAR-Spalten in Tabellen im MySQL-Cluster wie Typ-CHAR-Spalten verhalten (außer dass jeder Datensatz noch über ein zusätzliches Byte an Speicherplatz verfügt). Beispielsweise belegt in einer Cluster-Tabelle jeder Datensatz in einer als VARCHAR(100) deklarierten Spalte beim Speichern 101 Byte, unabhängig von der Länge der Zeichenfolge im tatsächlich gespeicherten Datensatz.

BLOB- und TEXT-Klassen erfordern 1, 2, 3 oder 4 Bytes, um die Länge des Spaltenwerts aufzuzeichnen, abhängig von der maximal möglichen Länge der Klasse. Siehe Abschnitt 11.4.3, „BLOB- und TEXT-Typen
“.

In der NDB-Cluster-Speicher-Engine ist die Implementierung von TEXT- und BLOB-Spalten unterschiedlich, wobei jeder Datensatz in der TEXT-Spalte aus zwei separaten Teilen besteht. Eine davon hat eine feste Größe (256 Byte) und wird tatsächlich in der Originaltabelle gespeichert. Die andere umfasst alle Daten über 256 Bytes, die in einer impliziten Tabelle gespeichert sind. Datensätze in der zweiten Tabelle sind immer 2.000 Byte lang. Das bedeutet, dass bei size<= 256 die Größe der TEXT-Spalte 256 beträgt (wobei size die Größe des Datensatzes darstellt); andernfalls beträgt die Größe 256
+size+(2000–(size–256)%2000) .

Die Größe eines ENUM-Objekts wird durch die Anzahl der verschiedenen Enumerationswerte bestimmt. Die Aufzählung verwendet ein Byte und kann 255 mögliche Werte haben. Wenn der Aufzählungswert zwischen 256 und 65.535 liegt, werden zwei Bytes verwendet. Siehe Abschnitt 11.4.4, „ENUM-Typen“.

Die Größe des SET-Objekts wird durch die Anzahl der verschiedenen Set-Mitglieder bestimmt. Wenn die festgelegte Größe N ist, belegt das Objekt (N+7)/8 Bytes, gerundet auf 1, 2, 3, 4 oder 8 Bytes. Ein SET kann bis zu 64 Mitglieder haben. Siehe Abschnitt 11.4.5, „SET-Typen“.


11.6. Auswahl des richtigen Spaltentyps

Um die Speicherung zu optimieren, sollte in jedem Fall der genaueste Typ verwendet werden. Wenn die Spaltenwerte beispielsweise zwischen 1 und 99999 liegen, ist MEDIUMINT
UNSIGNED ein guter Typ, wenn Sie ganze Zahlen verwenden. Dieser Typ benötigt von allen Typen, die den Spaltenwert darstellen können, den geringsten Speicher.

Führt alle grundlegenden Berechnungen (+, -, *, /) für DECIMAL-Spalten unter Verwendung von Dezimalzahlen mit einer Genauigkeit von 65 Stellen (basierend auf 10) durch. Siehe Abschnitt 11.1.1, „Übersicht über numerische Typen“.

Verwenden Sie Operationen mit doppelter Genauigkeit, um DEZIMAL-Werte zu berechnen. Wenn die Genauigkeit nicht zu wichtig ist oder die Geschwindigkeit höchste Priorität hat, ist der Typ DOUBLE ausreichend. Um eine hohe Präzision zu erreichen, kann eine Konvertierung in in BIGINT gespeicherte Festkommatypen durchgeführt werden. Dadurch können alle Berechnungen mit 64-Bit-Ganzzahlen durchgeführt und die Ergebnisse bei Bedarf wieder in Gleitkommawerte umgewandelt werden.


11.7. Verwendung von Spaltentypen aus anderen Datenbank-Engines

Um von anderen Anbietern geschriebenen SQL-Ausführungscode zu verwenden, ordnet MySQL Spaltentypen wie in der folgenden Tabelle gezeigt zu. Tabellendefinitionen können über diese Zuordnungen problemlos aus anderen Datenbank-Engines in MySQL importiert werden:

Andere Verkäufertypen MySQL-Typen

BOOL, TINYINT

BOOLEAN TINYINT

CHAR VARYING(M) VARCHAR(M)

DEC DECIMAL

FIXED DECIMAL

FLOAT4 FLOAT

FLOAT8 DOUBLE

INT1 TINYINT

INT2 SMALLINT

INT3 MEDIUMINT

INT4 INT

INT8 BIGINT

LONG VARBINARY MEDIUMBLOB

LONG Beim Erstellen wird der Tabellenspaltentyp zugeordnet und dann der ursprüngliche Typ verworfen. Wenn Sie eine Tabelle mit dem Typ eines anderen Anbieters erstellen und dann die Anweisung DESCRIBE tbl_name ausführen, verwendet MySQL den entsprechenden MySQL-Typ, um die Struktur der Tabelle zu melden.

Das Obige ist der Inhalt der MySQL-Lernserie 3: Datentypen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn