Der Typ »INT« in SQL (MySQL) (Der Typ »INT« in SQL (MySQL)), Lektion, Seite 724224
https://www.purl.org/stefan_ram/pub/int_sql (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
SQL-Kurs

Der Typ »INT« in SQL  (MySQL )

Aktuelle Anmerkung von 2020 Der Wert in den Klammern (wie bei »INT( 4 )«) ist inzwischen veraltet.

Der Spaltentyp

Jede Spalte hat einen bestimmten Typ, dies ist ein Typ für die Werte dieser Spalte wie beispielsweise „Zahl“ oder „Text“.

Typangaben für ganzzahlige Spalten

Die Typangabe »INT«

An Stelle eines Spaltentyps wie »VARCHAR ( 255 )« kann auch der Typ »INT« verwendet werden.

Die Zellen der Spalten dieses Typs können Werte aus dem Bereich zwischen −2147483648 (einschließlich) und 2147483647 (einschließlich) enthalten.

Obwohl Zahlen auch als Text (wie zum Beispiel »VARCHAR ( 255 )«) gespeichert werden können, ist es schneller und weniger fehlerträchtig, sie als Zahl mit einem speziellen Zahlentyp zu speichern.

Typangaben wie »INT( 4 )«

Gelegentlich werden wir dem Datentyp »INT« im weiteren Verlauf dieses Kurses auch mit Werten in nachgestellten Klammern begegnen, wie beispielsweise »INT ( 4 )«. Leerzeichen sind dabei irrelevant, solch ein Typ kann also auch als »INT(4)« geschrieben werden oder – da Groß- und Kleinschreibung ebenfalls irrelevant ist – auch als »int(4)«.

Die Zahl in den Klammern gibt eine Empfehlung für die Spaltenbreite  (Feldbreite) bei der Ausgabe von Spalten des Typs an, aber sie hat bei diesem Typ keinen  Einfluß auf den Wertebereich. Auch der Typ »INT ( 4 )« umfaßt also Werte aus dem Bereich zwischen −2147483648 (einschließlich) und 2147483647 (einschließlich).

Mit „INT-Typ“ meinen wir hier einen Typ, dessen Bezeichnung mit »INT« beginnt, wie beispielsweise »INT ( 4 )«.

»INT« alleine hat dieselbe Bedeutung wie »INT ( 11 )«.

Typangaben mit »INTEGER«

Das Wort »INTEGER« ist in SQL  ein Synonym für »INT«. Es hat also genau die gleiche Bedeutung.

Typen von Literalen

Bei Rechnungen mit Literalen können die Typen der Literale das Ergebnis der Rechnung beeinflussen. Deswegen ist es hilfreich zu wissen, welchen Typ Literale überhaupt haben.

Numeralia, die nur aus Ziffern bestehen und nicht zu groß sind, sind ganzzahlige Numeralia. Sie haben einen INT-Typ. Die Zahl in den Klammern gehört nicht zum Typ, sondern gibt nur die verwendete oder empfohlene Ausgabebreite an.

Tabelle
1      INT (1)
22 INT (2)

Das folgende Protokoll zeigt die Verwendung von INT-Numeralia in einfachen Abfragen.

Konsole
SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
SELECT 22;
+----+
| 22 |
+----+
| 22 |
+----+

Effekte im strengen Modus

Zur Illustration legen wir hier eine Tabelle mit den beiden Datentypen »INT« und »VARCHAR ( 255 )« an.

Skript (Anfang)

WARNINGS; SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA S; CREATE SCHEMA S; USE S;

CREATE TABLE BUCHUNG ( NUMMER INT, BEZEICHNUNG VARCHAR ( 255 ) );

INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( 0, 'ZAHLUNGSEINGANG' );

DESCRIBE BUCHUNG;

+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| NUMMER | int(11) | YES | | NULL | |
| BEZEICHNUNG | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+

Werden Daten in eine Spalte eingefügt, die eigentlich nicht mehr passend  sind, so wird dies von MySQL  oft ohne Meldung toleriert. Die nicht passenden Angaben werden dann entsprechend uminterpretiert. Da die Uminterpretation aber zu Mißinterpretationen und Problemen führen kann, wird empfohlen, für Felder möglichst gleich Angaben mit einem passendem Typ zu machen (wie eben gezeigt).

In dem folgenden Beispiel zum Einfügen von Zeilen mit nicht-passenden Daten ohne  Fehlermeldung hat das Literal »1« den Datentyp »INT ( 1 )«, und das Literal »'1.0'« hat den Datentyp »VARCHAR ( 3 )«.

Skript (Fortsetzung)
INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( 1, 1 );
Query OK, 1 row affected (0.13 sec)
INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( '1', '1' );
Query OK, 1 row affected (0.03 sec)

Die Ausgabe der Tabelle zeigt, wie die Daten interpretiert wurden.

Ausgabe der Tabelle
SELECT * FROM BUCHUNG;
+--------+-----------------+
| NUMMER | BEZEICHNUNG |
+--------+-----------------+
| 0 | ZAHLUNGSEINGANG |
| 1 | 1 |
| 1 | 1 |
+--------+-----------------+

Man beachte, wie der gewählte Datentyp die Formatierung  der Ausgabe beeinflußt. Zahlen erscheinen rechtsbündig, Texte linksbündig.

SQL  wird oft eingebettet in ein Anwendungsprogramm benutzt, so daß die für einen Endbenutzer sichtbare Formatierung dann oft erst durch dieses Anwendungsprogramm festgelegt wird. Spaltentypen sollten also nicht  gewählt werden, um eine bestimmte Formatierung zu erhalten, sondern nur, um den Inhalt einer Spalte richtig darzustellen. Die Formatierung kann immer noch nachträglich festgelegt werden.

Erst wenn Daten eingefügt werden, die von MySQL  nicht mehr uminterpretiert werden können, erscheint eine Fehlermeldung.

Beispiel zum Einfügen von Zeilen mit nicht-passenden Daten und mit  Fehlermeldung:

Skript (Fortsetzung)

INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( 'abc', 'abc' );

ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'NUMMER' at row 1

Effekte außerhalb des strengen Modus

Wenn jedoch der Modus »STRICT_ALL_TABLES« (beziehungsweise »TRADITIONAL«) entfernt wird, toleriert MySQL  noch mehr fragwürdige Daten.

Skript (Fortsetzung)

SET sql_mode = 'ANSI';

INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( '1 Apfel', '1 Apfel' );

Query OK, 1 row affected, 1 warning (0.05 sec)

Warning (Code 1265): Data truncated for column 'NUMMER' at row 1

INSERT INTO BUCHUNG ( NUMMER, BEZEICHNUNG ) VALUES ( 'abc', 'abc' );

Query OK, 1 row affected, 1 warning (0.05 sec)

Warning (Code 1366): Incorrect integer value: 'abc' for column 'NUMMER' at row 1

SELECT * FROM BUCHUNG;
+--------+-----------------+
| NUMMER | BEZEICHNUNG |
+--------+-----------------+
| 0 | ZAHLUNGSEINGANG |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 Apfel |
| 0 | abc |
+--------+-----------------+

Wir machen im folgenden davon Gebrauch, daß auch ein Grundstrich »_« in Spaltennamen verwendet werden kann. Wir verwenden sie hier, um zu vermeiden, daß der Name einer Spalte so lautet wie der Name eines Datentyps.

Das folgende Beispiel zeigt, was passiert, wenn ein INT-Numerale mit drei Stellen in eine Spalte eingefügt wird, die nur zwei Stellen für die Ausgabebreite empfiehlt: Der Wert wird kommentarlos eingetragen, da die Ausgabebreite nur eine Empfehlung ist, welche keinen Einfluß auf den Wertebereich einer Spalte hat.

Konsole
SET sql_mode = 'STRICT_ALL_TABLES';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( _INT2_ INT ( 2 ) );
INSERT INTO T ( _INT2_ ) VALUES ( 123 );
SELECT * FROM T;
+--------+
| _INT2_ |
+--------+
| 123 |
+--------+

Gründe für die schwachen Typprüfungen

SQL  wird in der Praxis oft zusammen mit einem Programm in einer anderen Programmiersprache eingesetzt, welche die Daten aus einer Quelle entgegennimmt und dann mit Hilfe von SQL  in die Datenbank schreibt. Die Hersteller von Datenbankprodukten wie MySQL  sind der Meinung, daß die Prüfung von Eingaben auf Korrektheit Aufgabe des Programms einer anderen Programmiersprache ist und daher nicht noch einmal von der Datenbank wiederholt werden muß. Deswegen sind manche Datenbankprodukte hier so tolerant.

Der Typ INT UNSIGNED

Der Typ »INT UNSIGNED« findet sich nicht in Standard-SQL -2003, aber in MySQL.

Er umfaßt keine negativen Werte, aber dafür doppelt so viel nicht-negative Werte wie »INT«

INT: -2147483648 to 2147483647.

INT UNSIGNED: 0 to 4294967295.

Wenn im Rest des Kurses »INT« für einen künstlichen numerischen Schlüssel verwendet wird, kann er dort in der Regel durch »INT UNSIGNED« ersetzt werden.

Bei Verwendung von Datenbanken, die »INT UNSIGNED« nicht kennen, kann weiterhin »INT« verwendet werden.

Datentypen und Domänen

Die Datentypen sind eigentlich auf halben Weg stehengebliebene Versuche, Domänen zu implementieren - Hausnummern, Jahreszahlen oder Stückzahlen werden aber leider nicht  als verschiedene Domänen angesehen, sondern als ein einziger Datentyp „Zahl“ (»INT«) - dadurch werden sinnlose Vergleiche (wie der Vergleich einer Hausnummer mit einer Jahreszahl) möglich!

Datentypen und Leistung

In bestimmten Fällen verwendet bei einer VARCHAR(255)-Spalte »X« eine Abfrage mit »WHERE X = '22'« mit einem VARCHAR(2)-Literal das Register, eine Abfrage mit »WHERE X = 22« mit einem INT-Literal jedoch nicht.

Daher sollte stets darauf geachtet werden, daß bei einer Spalte mit einem bestimmten Datentyp auch alle Werte, mit denen Werte aus jener Spalte verglichen werden, denselben  Datentyp haben.

Es sollten also stets VARCHAR-Werte mit VARCHAR-Werten und INT-Werte mit INT-Werten verglichen werden.

Eventuellen Zahlen in Klammern (wie bei »VARCHAR(255)« und »VARCHAR(2)«) müssen dabei aber nicht  übereinstimmen.

INT-Numeralia

Numeralia, die nur aus Ziffern bestehen und nicht zu groß sind, sind ganzzahlige Numeralia. Sie haben einen INT-Typ. Die Zahl in den Klammern gehört nicht zum Typ, sondern gibt nur eine Empfehlung für die Ausgabebreite an.

1      INT (1)
22 INT (2)

Das folgende Transkript zeigt die Verwendung von INT-Numeralia in einfachen Abfragen.

Konsole
SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
SELECT 22;
+----+
| 22 |
+----+
| 22 |
+----+

Das folgende Beispiel zeigt, was passiert, wenn ein INT-Numerale mit drei Stellen in eine Spalte eingefügt wird, die nur zwei Stellen für die Ausgabebreite empfiehlt: Der Wert wird kommentarlos eingetragen, da die Ausgabebreite nur eine Empfehlung ist, welche keinen Einfluß auf den Wertebereich einer Spalte hat.

Konsole
SET sql_mode = 'STRICT_ALL_TABLES';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( _INT2_ INT ( 2 ) );
INSERT INTO T ( _INT2_ ) VALUES ( 123 );
SELECT * FROM T;
+--------+
| _INT2_ |
+--------+
| 123 |
+--------+

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724224 stefan_ram:724224 Der Typ »INT« in SQL (MySQL) Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724224, slrprddef724224, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/int_sql