Posts mit dem Label mysql werden angezeigt. Alle Posts anzeigen
Posts mit dem Label mysql werden angezeigt. Alle Posts anzeigen

Mittwoch, 5. November 2014

#1690 - BIGINT UNSIGNED value is out of range

#1690 - BIGINT UNSIGNED value is out of range

Kann bei einer MySQL - Abfrage erscheinen, wenn man innerhalb der Abfrage mit UNSIGNED Integer - Spalten rechnet und das Ergebnis ein negativer Wert ist.

Also beispielsweise die Tabellenspalte "time" ist eine unsigned Integer Spalte. Unsigned bedeutet übrigens, dass der Wert nicht negativ werden kann, aber dafür erhöht sich der gültige Wertebereich im postiven Bereich um 100%.

Nehmen wir an die Spalte "time" hat einen UNIX TIMESTAMP wert in der Vergangenheit und wir haben folgende Abfrage:

SELECT * FROM tabelle WHERE time - UNIX_TIMESTAMP() < 5

Hier würde entweder die Fehlermeldung von oben erscheinen oder ein sehr hoher Wert errechnet werden.

Die Lösung:

1. entweder die Spalte "time" zum normalen Integer umwandeln (ALTER TABLE `tabelle` CHANGE `time` `time` INT(10) NOT NULL DEFAULT '0';)

2. Oder MySQL im 'no_unsigned_subtraction' - Modus starten.
Dazu einfach in der my.cnf "sql_mode = 'no_unsigned_subtraction'" eintragen, bzw. "no_unsigned_subtraction" in der entsprechenden Zeile ergänzen.


Mittwoch, 29. Oktober 2014

strict_trans_tables deaktivieren. Möglicher fix.

Ich musste wegen eines Projekts die irgendwann neu eingeführte Direktive "strict_trans_tables" in mysql deaktivieren, da sie dazu führte, dass einige MySQL-Queries nicht ausgeführt wurden.

Normalerweise geht man in die /etc/my.cnf , sucht nach "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES" und kommentiert diese Zeile aus.

Hat aber nicht gereicht. Nach etwas Recherche suchte ich my.cnf die im /usr Verzeichnis sein sollte. Und tatsächlich, sie existierte. Dort gab es auch nur die Zeile "sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES", welche auskommentiert werden musste.


MySQL Datenbank von einem Server zum anderen kopieren mittels ssh und mysqldump

Um eine Datenbank per SSH zu einem anderen Server zu kopieren kann man folgenden Befehl verwenden:

mysqldump -uuser -ppassword db1 | mysql -h desthost -uuser -ppassword destdb

Ja: nach -u und -p kommt KEIN Leerzeichen. Hier ein Beispiel, wenn
User gleich root
Passwort gleich 123sonnenschein
Datenbank gleich MyDB
Ziel-Host: 192.168.2.1

mysqldump -uroot -p123sonnenschein MyDB | mysql -h 192.168.2.1 -uroot -p123sonnenschein MyDB

Es sollte beachtet werden, dass auf dem Zielhost entsprechende Rechte des Users vorhanden sind. Also, dass er auch außerhalb von localhost auf den Server verbinden kann.
Zudem sollte die Datenbank (in diesem Fall MyDB) bereits angelegt worden sein.

Das Beispiel geht davon aus, dass User und Passwort auf beiden Servern gleich ist (was keine gute Idee ist).

Donnerstag, 17. Dezember 2009

Via phpmyadmin nachträglich einen Auto-Increment primary key hinzufügen

Wer kennt es nicht.

Man muss mit einigen Werten testen und muss eine Tabelle um einen neuen Primary Key bereichern. Wenn man das über phpmyadmin mit der normalen Spalten-Hinzufüge-Funktion macht, klappt dies nicht auf anhieb.

Hier die Lösung: Zuerst die Spalte (bsp. "id") anlegen, ohne gleichzeitig Auto-Increment zu aktivieren oder die Spalte als Index zu definieren. Als wäre es eine ganz normale Spalte.

Danach diese Spalte als INDEX festlegen (noch NICHT Primary Key). Nun die Spalte bearbeiten und "Auto increment" aktivieren.
Jetzt kann man bei Bedarf den Index als Primary Key deklarieren.

Fertig.