Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3804[/thread]

mysql: ENUM und default



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Froschpopo
 2007-04-25 13:48
#35413 #35413
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich glaub et hakt hier wieder in der Mechanik. Folgender Sachverhalt beschäftigt derzeit meinen schönen und frisch tätowierten Körper den ich natürlich nicht nur mit Nadeln sondern auch mit Laufsport trainiere...
Und auf die Ernährung achte ich natürlich auch.
Also folgender Sachverhalt:


Wenn ich unter mySQL eine Spalte hinzufüge:
Code: (dl )
ALTER TABLE users ADD status ENUM('1', '2', '3') default '1' NOT NULL


dann kann doch theoretisch "status" garnicht KEINEN WERT enthalten oder?
Tut's aber!

Wenn ich der Spalte beim INSERT keinen Wert zuweise, dann enthält sie später auch keinen. Das default ignoriert die Sau einfach!\n\n

<!--EDIT|Froschpopo|1177494542-->
nepos
 2007-04-25 15:58
#35414 #35414
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
If an ENUM column is declared to allow NULL, the NULL value is a legal value for the column, and the default value is NULL. If an ENUM column is declared NOT NULL, its default value is the first element of the list of allowed values.


Ich denke, den Default kannst du dir dann sparen. Aber wieso es nicht klappt, ist mir grade auch ein Rätsel...
Froschpopo
 2007-04-25 16:03
#35415 #35415
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich hab ja NOT NULL, also müsste der Beschreibung nach der default gleich 1 sein, auch wenn ich das default wegließe.
ALPTRAUM! Ich will aufwachen!
nepos
 2007-04-25 16:50
#35416 #35416
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
MySQL halt :P

Sorry, ich halt von dieser Datenbank nicht sonderlich viel...
Aber du hast recht. Laut dem, was in der Doku steht, sollte es eigentlich eine 1 reinschreiben. Wie genau sieht denn dein INSERT aus? Eventuell passt das was noch ned ganz und der Fehler liegt gar nicht bei MySQL.
bloonix
 2007-04-25 16:53
#35417 #35417
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
nepos++

rm -rf /var/lib/mysql and ...........

*SCNR*
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Froschpopo
 2007-04-25 17:04
#35418 #35418
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
jetzt kommen wieder diese anti's :D
wegen sowas wechsle ich eigentlich nicht sofort die Datenbank. Vermutlich hat Postgres dann woanders wieder irgendwelche Macken.

@nepos: beim Insert lasse ich "status" einfach weg. Das funktioniert auch beim Update:
Code: (dl )
UPDATE users SET status = '' WHERE...

erzeugt ebenso ein leeres Feld welches keines der ENUM-Werte enthält.
Man muss Behinderungen annehmen wie sie sind. Aber indem man darüber schweigt und die Datenbank wechselt, damit ist keinem geholfen. Man muss offen sein und die Dinge aussprechen.
Werde mal mySQL nachher mal auf diese Behinderung ansprechen . Vielleicht hat der Verantwortliche ja auch einfach nur persönliche Probleme und sucht jemandem zu reden.\n\n

<!--EDIT|Froschpopo|1177506476-->
nepos
 2007-04-25 17:10
#35419 #35419
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, habe das bei mir mal getestet:
Code: (dl )
1
2
3
4
create table testtable(
feld1 enum('1','2','3') not null,
feld2 integer
);


Wenn ich dort nun mittels
Code: (dl )
INSERT INTO testtable(feld2) values(1234);
eine Zeile einfüge, dann nimmt MySQL bei mir korrekterweise als Default für feld1 die 1.
Füge ich sowas ein:
Code: (dl )
insert into testtable values('4', 123);

Dann kriege ich keinen Fehler (was an sich schon mal datenbanktechnischer Murks ist...) und MySQL belegt in dieser Zeile feld1 mit NULL.

Wenn ich die Tabelle so anlege:
Code: (dl )
1
2
3
4
create table testtable(
feld1 enum('1','2','3') default '1' not null,
feld2 integer
);

Dann klappt es wie gehabt. Schreibe ich default 1 ohne die Single Quotes, klappt es immer noch. Welche Version von MySQL benutzt du denn?
Bei mir handelt es sich um 4.1.21.
nepos
 2007-04-25 17:16
#35420 #35420
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ehm, '' ist aber soweit ok. Es ist kein NULL-Wert und MySQL setzt, wenn man keinen gültigen Wert aus dem Bereich des ENUM-Typs angibt automatisch einen leeren String ein:
Quote
If you insert an invalid value into an ENUM (that is, a string not present in the list of allowed values), the empty string is inserted instead as a special error value. This string can be distinguished from a &“normal&” empty string by the fact that this string has the numerical value 0. More about this later.


Eventuell solltest du den strict SQL mode aktivieren, dann würdest du einen Fehler bekommen, wenn du einen Wert eintragen willst, der nicht im ENUM dabei ist.
Froschpopo
 2007-04-25 17:18
#35421 #35421
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich hab 4.1.13!
Werds auch nicht updaten ohne SuSE neu aufzuziehen. Ich nutze derzeit noch SuSE 10
Für son Update muss ich mir jedesmal nen ganzen tag freiräumen :(
nepos
 2007-04-25 17:24
#35422 #35422
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das scheint, soweit ich das sehe ein Default-Verhalten zu sein. Wie gesagt, du könntest versuchen, den Strict SQL Mode zu benutzen... allerdings könnte es da an anderen Stellen krachen.

Ausserdem, wieso machst du z.B. nen UPDATE und setzt status auf ''? Wenn der Status unbekannt ist, wäre eigentlich der NULL-Wert das richtige, da der für "passt nicht" bzw. "unbekannt" benutzt wird.
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-04-25 13:48.