MySQL-Fehler 1264: Wert außerhalb des Bereichs für die Spalte


74

Wie ich SETcust_fax in einer Tabelle in MySQL wie folgt:

cust_fax integer(10) NOT NULL,

und dann füge ich einen Wert wie folgt ein:

INSERT INTO database values ('3172978990');

aber dann heißt es

`Fehler 1264` hat keinen Wert für die Spalte

Und ich möchte wissen, wo der Fehler liegt? Mein Set? Oder andere?

Jede Antwort wird geschätzt!


1
Sie können dieses Problem auf stackoverflow.com/questions/6621530/1264-out-of-range-value-fix überprüfen , um Ihr Problem zu lösen.
Lucas Maus

Es wird empfohlen, Zahlen und Zahlen und Zeichenfolgen als Zeichenfolgen anzugeben. '3172978990'ist eine Zeichenfolge, 3172978990ist eine Zahl. Übrigens. die 10in int(10)sich nicht definieren beliebigen Datentyp constraint. Es ist nur ein Hinweis zur Clientanzeige .
a_horse_with_no_name

Antworten:


134

Der Wert 3172978990 ist größer als 2147483647 - der Maximalwert für INT- daher der Fehler. Hier sind MySQL-Integer-Typen und ihre Bereiche aufgeführt .

Beachten Sie auch, dass das (10)In INT(10)nicht die "Größe" einer Ganzzahl definiert. Es gibt die Anzeigebreite der Spalte an. Diese Informationen dienen nur zur Beratung.

Ändern Sie Ihren Datentyp in, um den Fehler zu beheben VARCHAR. Telefon- und Faxnummern sollten als Zeichenfolgen gespeichert werden. Siehe diese Diskussion .


Für mich wurde der Fehler dadurch verursacht, dass aus AUTO_INCREMENTeiner Tabelle mit einer kleinen Zeilenanzahl eine große Zahl wurde. Also brauchte ich ALTER TABLE table_name AUTO_INCREMENT=103;(wenn es momentan 102 Zeilen gibt).
Totymedli

1
@totymedli Dies könnte eine nützliche Antwort für jemanden sein, bei dem dieselben Symptome, aber unterschiedliche Probleme auftreten.
Salman A

Ich verwende intfür Telefonnummern, weil ich Benutzereingaben bereinige, indem ich alle Nicht-Nummern entferne.
Reed

1
@Reed, ich würde nicht empfehlen, intfür Telefonnummern zu verwenden. Wenn jemand ein internationales Format als 0044 eingeben würde, verlieren Sie 00. Bereinigen Sie die Telefonnummer in Ihrem Code, bevor Sie sie an die Abfrage senden.
Tipul07

@ Tipul07 Du hast vollkommen recht. VARCHARes ist dann. Ich entwickle in den USA und die meisten Sachen, die ich mache, sind lokal in meiner Heimatstadt, ABER ich sollte vom ersten Tag an immer noch mit Blick auf die Barrierefreiheit codieren.
Reed

26

Sie können den Datentyp auch in bigInt ändern, um Ihr Problem zu lösen. Es wird nicht empfohlen, Ganzzahlen als Zeichenfolgen beizubehalten, sofern dies nicht erforderlich ist. :) :)

ALTER TABLE T_PERSON MODIFY mobile_no BIGINT;

Wenn die Anwendung eine Telefonnummer speichert, wird die Verwendung von Zeichenfolgen sicherlich bevorzugt. Vielen Dank jedoch für die ALTER-Erklärung. Es hat mein Problem behoben (einfacher Ganzzahlüberlauf, bei dem ich Dateigrößen mit INTEGER gespeichert habe).
Curt

Dies funktionierte für mich ALTER TABLE tbl_name MODIFY tbl_column BIGINT (50) UNSIGNED NOT NULL
Adam Winnipass

Upvoted! Andere Vorschläge zur Konvertierung in Zeichenfolgen sind Unsinn. Ganzzahlen sind aus einem bestimmten Grund Ganzzahlen.
Whir

"@Reed Ich würde nicht empfehlen, int für Telefonnummern zu verwenden. Wenn jemand ein internationales Format als 0044 eingeben würde ... verlieren Sie 00." - Ein weiterer Kommentar auf dieser Seite. Ich gehe mitVARCHAR
Reed

13

Sie überschreiten die Länge des Datentyps int . Sie können das Attribut UNSIGNED verwenden , um diesen Wert zu unterstützen.

SIGNED INT unterstützt bis 2147483647 und ermöglicht mit UNSIGNED INT das Doppelte. Danach möchten Sie noch Daten speichern, als CHAR oder VARCHAR mit der Länge 10 zu verwenden


4

tl; dr

Stellen Sie sicher, dass Sie AUTO_INCREMENTnicht außerhalb der Reichweite sind. Legen Sie in diesem Fall einen neuen Wert fest mit:

ALTER TABLE table_name AUTO_INCREMENT=100 -- Change 100 to the desired number

Erläuterung

AUTO_INCREMENTkann eine Zahl enthalten, die größer ist als der vom Datentyp zulässige Maximalwert. Dies kann passieren, wenn Sie einen Tisch gefüllt haben, den Sie später geleert haben, der AUTO_INCREMENTaber gleich geblieben ist, aber es kann auch verschiedene Gründe geben. In diesem Fall liegt die ID eines neuen Eintrags außerhalb des Bereichs.

Lösung

Wenn dies die Ursache Ihres Problems ist, können Sie es beheben, indem Sie einen Wert festlegen AUTO_INCREMENT, der größer als die ID der letzten Zeile ist. Wenn die ID Ihrer letzten Zeile 100 lautet, gilt Folgendes:

ALTER TABLE table_name AUTO_INCREMENT=101

Wenn Sie den AUTO_INCREMENTaktuellen Wert überprüfen möchten , verwenden Sie diesen Befehl :

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.