MYSQL macht kein UPDATE
Taurus
- datenbank
Hallo zusammen,
habe ein Problem mit MySQL.
Ich habe eine Tabelle mit AdressDaten, updates funktionieren auf allen Feldern, ausser bei der Postleitzahl.
Wenn ich im phpMyAdmin diesen befehl eingebe:
UPDATE user__customer SET zip = '58540' WHERE id = '7'
bekomme ich die Meldung:
Betroffene Datensätze: 0
selbst wenn ich es ohne WHERE-Klausel mache, bekomme ich kein Resultat.
Die Spalte gibt es aber auf jedenfall,sonst würde er ja auch einen Fehler ausspucken.
Auf der Spalte liegt kein Schlüssel, kein unique oder sonst irgendwas.
Die Spalte ist vom Typ smallint(5)
Irgendjemand eine Idee, oder braucht Ihr noch mehr Infos um mir helfen zu können?
Danke Euch vielmals
gruß
Taurus
Die Spalte ist vom Typ smallint(5)
Warum dann die Anführungzeichen?
Aber obs wirklich daran liegt kann ich nicht sagen, war nur ne spontane Idee.
echo $begrüßung;
Wenn ich im phpMyAdmin diesen befehl eingebe:
UPDATE user__customer SET zip = '58540' WHERE id = '7'
bekomme ich die Meldung:
Betroffene Datensätze: 0
Wenn die Postleitzahl bereits drinsteht, dann ist das Vehalten MySQL-typisch normal.
echo "$verabschiedung $name";
Wenn die Postleitzahl bereits drinsteht, dann ist das Vehalten MySQL-typisch normal.
Warum, verstehe ich nicht.
ist das bei smallint so?
Wie kann ich dann so ein Update durchführen.
Dachte immer das wäre gleich, ob smallint oder INT (nur halt weniger zeichen)
Gruß
Taurus
Moin!
»» Wenn die Postleitzahl bereits drinsteht, dann ist das Vehalten MySQL-typisch normal.
Warum, verstehe ich nicht.
Weil MySQL nur die Spalten zählt, die tatsächlich aktualisiert wurden, d.h. in denen sich was verändert hat. Wenn sich nichts ändert, wird nichts gezählt.
Dieses Verhalten kannst du mit einem Parameter auf PHP-Seite bei Eröffnung der Connection verändern, aber mir fällt gerade nicht ein, wie der heißt.
ist das bei smallint so?
Postleitzahlen, gerade auch deutsche, sind keine Integer-Zahlen, sondern Strings der Länge 5.
Wie kann ich dann so ein Update durchführen.
Dachte immer das wäre gleich, ob smallint oder INT (nur halt weniger zeichen)
Zunächst mal: Die Zahlenangabe bei Zahlentypen definiert die Länge der Ausgabe bei ZEROFILL. Ein BIGINT(2) verbraucht nicht deshalb weniger Speicherplatz, weil er nur zwei Stellen lang sein soll - er würde bei Nutzung von ZEROFILL nur auf zwei Stellen mit Nullen aufgefüllt.
Und wie erwähnt: Postleitzahlen sind keine Integers, auch keine fünfstelligen. Und der Typ SMALLINT mit seinem maximalen Wertebereich von 0-65535 ist sowieso zu klein für die vollständige Erfassung aller deutschen Postleitzahlen. Zahlenwerte mit 7xxxx, 8xxxx und 9xxxx kommen ebenso vor, wie 0xxxx, ohne dass die führende Null wegreduziert werden dürfte.
- Sven Rautenberg
Und wie erwähnt: Postleitzahlen sind keine Integers, auch keine fünfstelligen. Und der Typ SMALLINT mit seinem maximalen Wertebereich von 0-65535 ist sowieso zu klein für die vollständige Erfassung aller deutschen Postleitzahlen. Zahlenwerte mit 7xxxx, 8xxxx und 9xxxx kommen ebenso vor, wie 0xxxx, ohne dass die führende Null wegreduziert werden dürfte.
Okay, das mit der Länge leuchtet mir ein. Aber nicht warum es keine Integer sind.
Wenn Du noch Zeit und Lust hast, kannst Du mir das ja mal bitte erklären.
Ansonsten vielen Dank für die ausführliche Antwort
Gruß
Taurus
Hi Taurus,
»» Und wie erwähnt: Postleitzahlen sind keine Integers, auch keine fünfstelligen.[...]
Okay, das mit der Länge leuchtet mir ein. Aber nicht warum es keine Integer sind.
deutsche Postleitzahlen sind immer fünfstellig. Die führende 0 gehört eindeutig zur Information ("Die erste Ziffer der fünfstelligen Postleitzahl bezeichnet die Zone (und damit den Verkehrsflughafen, ab dem die Post ausgeliefert wird)[...]" (http://de.wikipedia.org/wiki/Postleitzahl_(Deutschland)#Systematik), daher sollte sie auch gespeichert werden.
Und wenn du deine Anwendung mal internationalisieren möchtest, kommst du an String-Datentypen eh nicht vorbei, da nicht-deutsche PLZ auch Buchstaben enthalten können.
Gruß,
Andreas.
Hello,
Weil MySQL nur die Spalten zählt, die tatsächlich aktualisiert wurden,
^^^^^^^^
Zeilen :-)
Liebe Grüße aus dem Cyberspace
Tom vom Berg
echo $begrüßung;
Weil MySQL nur die [Zeilen] zählt, die tatsächlich aktualisiert wurden, d.h. in denen sich was verändert hat. Wenn sich nichts ändert, wird nichts gezählt. Dieses Verhalten kannst du mit einem Parameter auf PHP-Seite bei Eröffnung der Connection verändern, aber mir fällt gerade nicht ein, wie der heißt.
Man benötigt dazu die mysqli-Extension, denn es wird ein mysqli::real_connect()-Aufruf benötigt, dem man das Flag MYSQLI_CLIENT_FOUND_ROWS mit auf den Weg gibt.
Und der Typ SMALLINT mit seinem maximalen Wertebereich von 0-65535
... wenn man UNSIGNED verwendet ...
(Außerdem ist das Wort "maximal" hier nicht richtig. Der Wertebereich ist pro Typ immer gleich. Maximal und minimal sind nur die jeweiligen Endwerte.)
echo "$verabschiedung $name";