php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Umfrageergebnis anzeigen: Wie stellst du booleans in MySQL dar?
tinyint(1) unsigned not null 14 73,68%
char(0) default null 0 0%
enum('false', 'true') (oder umgekehrt) 2 10,53%
set('true') 1 5,26%
ganz anders 2 10,53%
Teilnehmer: 19. Sie dürfen bei dieser Umfrage nicht abstimmen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 08-10-2009, 13:28
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard Wie stellst du booleans in MySQL dar?

Hallo,

vor einiger Zeit begann ich, DB-Anwendungen nach dem DRY-Prinzip aufzubauen. Dabei hole ich mir alle Informationen über Tabellen, Spalten, Indizes und Fremdschlüsselbeziehungen direkt aus der DB statt sie in der Anwendung nochmal zu modellieren.

Bis dahin hatte ich noch "tinyint(1) unsigned not null" für boolean-Spalten benutzt, leider ist dabei nicht anwendungsseitig feststellbar, ob es sich dabei nicht doch um eine normale Ziffer handelt.

Inzwischen nutze ich seit längerem "set('true') not null" und das hat einige Vorteile. Wenn es ganz normal selektiert wird, liefert es "true" oder "", was in PHP auf bool gecastet den korrekten Wert liefert. Selektiert man es in einem numerischen Kontext, liefert es 1/0, was auch ziemlich sinnvoll ist. Beim Schreiben kann man ebenfalls 1/0 reinschreiben oder auch das was PHP aus booleans in einem String-Kontext macht: '1'/''.

Der einzige Nachteil dieser Variante ist, dass man in PHPMyAdmin erst mal wissen muss, wie man das Flag wieder löscht. Dazu braucht man die Strg-Taste. Außerdem könnte man denken, wenn dort true dasteht, wäre es schon gesetzt, was natürlich nur stimmt, wenn das Wörtchen auch farbig hinterlegt ist.

Welche Varianten nutzt ihr, um boolean Werte abzubilden?

Gruß,

Amica

Geändert von AmicaNoctis (08-10-2009 um 13:31 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 08-10-2009, 14:53
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ich benutze BOOLEAN, was ja nur ein Alias für TINYINT(1) ist. Und ich gebe den Spalten ein Präfix "is", also zum Beispiel isEnabled.
Mit Zitat antworten
  #3 (permalink)  
Alt 08-10-2009, 15:03
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Ich benutze BOOLEAN, was ja nur ein Alias für TINYINT(1) ist. Und ich gebe den Spalten ein Präfix "is", also zum Beispiel isEnabled.
So hatte ich es erst auch gemacht, aber das war mir für DRY-Anwendungen zu unsicher. Außerdem komme ich mit is_ nicht in allen Fällen hin. Ich brauche dann noch has_ und can_, weil mir solche Konstrukte wie is_having_ oder is_able_to_have_ irgendwann auch zu albern wurden
Mit Zitat antworten
  #4 (permalink)  
Alt 09-10-2009, 11:32
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Früher hab ich Enums verwendet, mitlerweile dann doch nur tinyints. Das meisste wird aber halt auch schon in den Modellen abgefackelt.
Mit Zitat antworten
  #5 (permalink)  
Alt 20-10-2009, 16:18
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Ich habe dem Gedanken pro Boolean ein ganzes Feld zu verschwenden abgeschworen, sofern ich mehr als ein Boolschen Wert in einer DB speichern möchte. Ist das der Fall greife ich zu SET und nenne dieses Feld einfach "Booleans".

Code:
Booleans SET('Klima', 'Servo', 'Xenon', 'Lenkrad')
Ist also sozusagen eine minimal abgewandelte Variante von 'set('true') not null' wo der Name des DB-Feldes ansich die Namensgebung übernimmt.

Hab sowas vor einer Zeit mal gegen die andere Methode mit tinyint(1) unsigned not null getestet. Bei vielen Booleans blieb die SET-Methode beim Speicherplatzverbrauch im Vorteil, jedoch war interessant, das MySql viele tinyint(1) unsigned not null Felder "intelligent" handled. So war der Speicherplatzverbrauch bei einem Feld bei 7Bytes pro DS und blieb auch bei 4 solchen Feldern bei 7Bytes pro DS.

Bei 10 Feldern gerät die SET-Methode aber schon in Vorteil beim Speicherplatzverbrauch und SELECTs auf größere Datenmengen waren auch schneller.
Mit Zitat antworten
  #6 (permalink)  
Alt 28-10-2009, 09:45
schmalle
  Ich Root, Du nix
Links : Onlinestatus : schmalle ist offline
Registriert seit: Jun 2001
Ort: Egelsbach FFM
Beiträge: 9.170
schmalle ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Feldname beginnt mit B_ und ist Tinyint(1) unsigned not null. Set kommt bei mir nur in Frage, wenn ich Felder mit mehreren Werten gleichzeitig brauche, nach denen ich schnell suchen muss.
__________________
h.a.n.d.
Schmalle

http://impressed.by
http://blog.schmalenberger.it



Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
... nur ohne :-)
Mit Zitat antworten
  #7 (permalink)  
Alt 28-10-2009, 13:59
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

wir verwenden enum('0','1') not null default '0'.

tinyint(1) kann leider auch die werte von 2 bis 9 erhalten, bei "enum('0','1') not null" hast du wirklich nur 2 Zustände
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #8 (permalink)  
Alt 28-10-2009, 14:21
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Slava Beitrag anzeigen
tinyint(1) kann leider auch die werte von 2 bis 9 erhalten
Eben, daher halte ich das für absolut ungeeignet.

Zitat:
Zitat von Slava Beitrag anzeigen
bei "enum('0','1') not null" hast du wirklich nur 2 Zustände
Der Nachteil an enum ist aber, dass die Werte in einem numerischen Kontext als 1 für false und 2 für true zurückgegeben werden und man beim Einfügen ganz genau drauf achten muss, ob sie als Strings oder als Zahl übergeben werden, da 1 false wäre, aber '1' true. Daher finde ich set('true') not null ideal, weil false dort als 0 und true als 1 rauskommt.
Mit Zitat antworten
  #9 (permalink)  
Alt 28-10-2009, 14:50
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Eben, daher halte ich das für absolut ungeeignet.
Die Werte 2-9 sind in PHP auch true.
Mit Zitat antworten
  #10 (permalink)  
Alt 28-10-2009, 14:53
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Die Werte 2-9 sind in PHP auch true.
Das weiß ich doch, mir geht es aber darum, dass ich bei einer tinyint-Spalte nicht programmatisch feststellen kann, ob es eine Ziffer als solche repräsentieren soll oder einen Wahrheitswert, genauer gesagt: Soll ich das Feld dann als Checkbox realisieren oder als Textfeld (evtl. mit Tasteninterzeptor, der nur Zifferntasten akzeptiert)?
Mit Zitat antworten
  #11 (permalink)  
Alt 28-10-2009, 15:26
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Das weiß ich doch, mir geht es aber darum, dass ich bei einer tinyint-Spalte nicht programmatisch feststellen kann, ob es eine Ziffer als solche repräsentieren soll oder einen Wahrheitswert ...
Das kann man am Präfix des Spaltennamens erkennen. Ich weiß, du willst es lieber direkt am Wert erkennen. Das klappt zwar mit deiner SET-Variante, aber dafür musst du beim Schreiben in die DB genau auf den Typ achten bzw. konvertieren. Denn aus einem Formular kommt von einer Checkbox irgendwas (vom User manipuliertes). Du musst daraus 'true' oder 'false' machen, während für TINYINT-Spalten ein Cast zu int genügt.

Eigentlich ist das alles nur eine Geschmacksfrage und imho kaum praxisrelevant. Ich habe jedenfalls schon ewig nichts mehr so programmiert, dass die Applikation den Datentyp aus dem DB-Schema oder -Werten erkennen muss.
Mit Zitat antworten
  #12 (permalink)  
Alt 28-10-2009, 16:04
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Das kann man am Präfix des Spaltennamens erkennen.
Unzuverlässig.

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Ich weiß, du willst es lieber direkt am Wert erkennen.
Nein, am Typ!

Zitat:
Zitat von onemorenerd Beitrag anzeigen
aber dafür musst du beim Schreiben in die DB genau auf den Typ achten bzw. konvertieren. Denn aus einem Formular kommt von einer Checkbox irgendwas (vom User manipuliertes). Du musst daraus 'true' oder 'false' machen, während für TINYINT-Spalten ein Cast zu int genügt.
Völlig falsch! Ich hab im ersten Beitrag dieses Threads schon ziemlich ausführlich erklärt, wie sich das verhält. Ich kann genau so auf int casten und erhalte den richtigen Wert - sowohl beim Select als auch beim Insert. Das ist alles völlig logisch und intuitiv.

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Eigentlich ist das alles nur eine Geschmacksfrage und imho kaum praxisrelevant. Ich habe jedenfalls schon ewig nichts mehr so programmiert, dass die Applikation den Datentyp aus dem DB-Schema oder -Werten erkennen muss.
Es ist praxisrelevant. Ich will doch nicht jedes Mal, wenn sich an der DB ne Kleinigkeit ändert, die kompletten Model-Klassen durchwühlen, um die Änderungen dort auch vorzunehmen. Außerdem habe ich eine generische ReST-Schnittstelle zu MySQL entwickelt, die gar nicht realisierbar wäre, wenn ich nicht die strukturellen Metadaten der Datenbank auslesen würde. Das alles ist unter dem Namen DRY-Prinzip bekannt und durchaus sinnvoll, wenn man nicht für jedes Projekt alles doppelt modellieren will (DB und Model-Klassen).
Mit Zitat antworten
  #13 (permalink)  
Alt 28-10-2009, 20:10
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Völlig falsch! Ich hab im ersten Beitrag dieses Threads schon ziemlich ausführlich erklärt, wie sich das verhält. Ich kann genau so auf int casten und erhalte den richtigen Wert - sowohl beim Select als auch beim Insert.
Ohja stimmt. Ich hatte schon vergessen, dass du kein 'false' im SET hast. Jedenfalls musst du auch casten. Beim Schreiben in die DB mit int(), beim Lesen mit bool(). Genau das muss man auch bei TINYINT.

In deiner selbstgebauten DB-Abstraktion hast du ein bißchen Code, der automatisch richtig castet. Aber dazu muss dieser Code auch das DB-Schema kennen. Sonst könnte man in ein Textfeld "true" eingeben und beim nächsten Aufruf wäre es eine Checkbox.
Woher kennt dein Code das DB-Schema? Offensichtlich liest er es aus der DB. Das kostet.

Zitat:
Ich will doch nicht jedes Mal, wenn sich an der DB ne Kleinigkeit ändert, die kompletten Model-Klassen durchwühlen
Wenn sich bei mir das DB-Schema ändert, spiegelt sich das zuerst im Code wider. Propel, Doctrine, sogar Drupal ...
Mit Zitat antworten
  #14 (permalink)  
Alt 29-10-2009, 14:39
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

*OT-Diskussion abgetrennt*
Mit Zitat antworten
  #15 (permalink)  
Alt 04-11-2009, 14:39
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

bei einem feld der "feld set('true') not null" ist, erwarte ich logischeweise nur ein einziger wert und zwar 'true' (so eine spalte kann man ganz auslassen).

"Set" ist für die Anzeige von meheren Zuständen gleichzeitg ausgedacht und ein einzelner Eintrag set('true') sieht schon ein wenig verdächtigt aus

Die Tatsache , dass
" update tabelle set feld= ''; "
eine set-spalte bei MySql tatsächlich mit leerem String verändert, ist zwar machbar, aber leider verwirrend

Die Frage ist auch, ob so ein (meine Meinung nach ein falschen) Verhalten auch in den nächsten Versionen vom Mysql unterstützt wird.
__________________
Slava
bituniverse.com
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
mysql Ausgabe problem, supplied argument is not a valid MySQL result thx-sound PHP Developer Forum 38 28-05-2009 17:55
WAMP Win/ME MySQL Error: #2003, Cant connect to MySQL server on localhost (10050) hand Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 6 12-11-2007 00:10
Cachen von MySQL-Abfrage, Ergebnissen, HTML-Seiten und -teilen mit PHP und MySQL Lennynero BRAINSTORMING PHP/SQL/HTML/JS/CSS 3 07-09-2007 12:24
[MySQL 4.1] tab text to mySQL and mySQL values update batchas SQL / Datenbanken 1 27-02-2007 13:22
[MySQL 4.1] Speicherung von Daten MySQL 4.0 vs. MySQL 4.1 ?? lesterlong PHP Developer Forum 20 11-01-2007 08:11

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:12 Uhr.