[MySQL] ENUM, default & verkeerde values

Pagina: 1
Acties:

  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

Topicstarter
Ik heb een klein probleempje met ENUM-data in een MySQL database. Het betreft hier een ENUM, die de waarde 'ja' of 'nee' kan aannemen, geen null mag zijn en standaard 'nee'. Zo dus
code:
1
Verwijderd ENUM('ja','nee') NOT NULL default 'nee',

Wanneer ik wat in de tabel zet met onderstaande queries, krijg ik zoals verwacht eerst 'ja', daarna 'nee' en in de laatste nog een keer 'nee'.
code:
1
2
3
INSERT into tabel (Verwijderd) values ('ja'); 
INSERT into tabel (Verwijderd) values ('nee'); 
INSERT into tabel (Ander_veld) values ('boeit_niet');

Wanneer ik echter het onderstaande zou doen, dan neemt het ENUM-veld een lege waarde aan, maar géén null.
code:
1
INSERT into tabel (Verwijderd) values ('bullshit');

Hoe krijg ik MySQL zover, dat ook de laatste query ervoor zorgt dat het ENUM-veld de waarde 'nee' aanneemt? Uiteraard zal je in de praktijk nooit een dergelijke query geven, maar ik heb het liefst dat mijn database gewoon goed functioneert en altijd nette waardes heeft, ook wanneer de PHP scripts onzinnige queries geven.

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR


  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 14-09 23:09
Waarom heb je een enum met 'ja' en 'nee' nodig? Als je een optie wil omzetten kun je ook bijv. tinyint(1) gebruiken en daar dan 0 of 1 stoppen.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

Topicstarter
Op woensdag 26 december 2001 17:42 schreef Taradino het volgende:
Waarom heb je een enum met 'ja' en 'nee' nodig? Als je een optie wil omzetten kun je ook bijv. tinyint(1) gebruiken en daar dan 0 of 1 stoppen.
Ja, maar dan ben je ook nog steeds afhankelijk van de correctheid van het script, want als iemand er bijv. 3 in zet, heeft het ook geen zin :)

Overigens had ik al veel gezocht naar keywords als 'incorrect' etc., maar ik kwam nu op het idee om 'unsupported' in te vullen, en toen kreeg ik o.a. het volgende searchresult:

1.7.5 Known Errors and Design Deficiencies in MySQL
Because MySQL allows you to work with table types that don't support transactions, and thus can't rollback data, some things behave a little differently in MySQL than in other SQL servers. This is just to ensure that MySQL never need to do a rollback for a SQL command. This may be a little awkward at times as column values must be checked in the application, but this will actually give you a nice speed increase as it allows MySQL to do some optimisations that otherwise would be very hard to do. If you set a column to an incorrect value, MySQL will, instead of doing a rollback, store the best possible value in the column:
• If you set an ENUM column to an unsupported value, it will be set to the error value 'empty string', with numeric value 0.


Het ziet er dus naar uit, dat er niets anders op zit dan het gewoon te accepteren.

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Als je dus er inderdaad een (tiny)int van maakt, met ENUM(0,1) (met 0='nee' en 1'='ja') dan heb je precies wat jij wilt.

Als het niet voldoet aan de enum, gaat het naar de default 0 volgens de regel die jij quote.

  • intoxicated
  • Registratie: Januari 2001
  • Niet online

intoxicated

Haaaai :w | ALT-S

Topicstarter
Dat is helaas geen oplossing, want ENUM zit zo in elkaar:
ENUM("0", "1")
code:
1
2
3
4
5
Value     Index  
NULL    NULL  
""    0  
"0"  1  
"1"  2

Als je een foute value opgeeft, wordt de indexwaarde dus 0, als je een 0-value opgeeft, wordt de indexwaarde 1, dus value "" != "0", ook al is "" in de index wel 0.

"Anyone who does not agree with me is mentally sick, and should be shot I'm afraid to say."
- Pastor Richards @ VCPR


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

From the MySql online manual the following:

Steve Lawson <SL@SentientNetware.com>: It should be noted here that char(0) can be used as a bool. char(0) is an empty string, but when used with NULL you get NULL or "", perfect for bool, and a lot smaller than enum("true","false");

Dus misschien is dit wat?
Pagina: 1