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
  #16 (permalink)  
Alt 04-11-2009, 14:49
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

Hallo Slava,

deine Definition von set ist leider schlichtweg falsch. Set (engl. für "Menge") ist für Mengen gedacht, also beliebige Kombinationen der zugelassenen Elemente. Das set-Feld auf '' oder 0 zu setzen, entspricht mathematisch der leeren Menge und ist weder ein unsauberes noch unlogisches Verhalten.

MySQL sagt dazu übrigens
Zitat:
the SET datatype allows you to store any of the values together, from none to all of them
Gruß,

Amica
Mit Zitat antworten
  #17 (permalink)  
Alt 04-11-2009, 14:54
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

"store any of the values together, from none to all of them" beißt sich mit "feld set('true') not null".
Entspricht das Verhalten von MySQL in dieser Sache eigentlich dem Standard? Handhaben es andere DBMS genauso?
Mit Zitat antworten
  #18 (permalink)  
Alt 04-11-2009, 14:56
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

Null hat doch damit gar nichts zu tun. Null bedeutet: nicht definierter oder fehlender Wert. Die leere Menge (genau so wie der leere String bei varchar oder die 0 bei int) sind dagegen sehr wohl definierte Werte.

Andere DBMS haben nicht zwangsläufig einen ENUM- oder SET-Typ, da beide nicht zum ANSI SQL 92 Standard gehören. Wenn aber ein SET-Typ vorhanden ist, sollte er genau so funktionieren wie in MySQL, denn alles andere wäre unlogisch. Eine Menge ist nun mal eine Menge und sollte sich auch wie das gleichnamige mathematische Konzept verhalten.

Geändert von AmicaNoctis (04-11-2009 um 15:16 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 04-11-2009, 15:16
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

0 ist ein int, ein leerer String ist ein String und eine leere Menge ist eine Menge. Damit bin ich völlig einverstanden.
Wenn ich einer Spalte vom Typ set('true') die Einermenge {'true'} zuweise, bekomme ich den String "true" zurück.
Wenn ich der Spalte die leere Menge {} zuweise, bekomme ich einen leeren String zurück.
Das ist imho nicht sehr intuitiv, zumal der leere String laut Spaltendefinition kein zugelassenes Element ist.
Die leere Menge wird durch einen leeren String ausgedrückt.
Anders gehts ja auch nicht. Sie mit NULL auszudrücken widerspräche der dreiwertigen Logik.

Es mag also alles funktionieren, aber intuitiv ist das wirklich nicht und es würde mich auch nicht wundern, wenns gar nicht dem Standard entspricht.
Mit Zitat antworten
  #20 (permalink)  
Alt 04-11-2009, 15: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 onemorenerd Beitrag anzeigen
zumal der leere String laut Spaltendefinition kein zugelassenes Element ist.
Der leere String ist nichtmal ein zulässiges Element für eine Spaltendefinition, weil er ja als Repräsentant der leeren Menge verwendet wird

Du kannst keine set('abc', 'de', 'f', '')-Spalte definieren.
Mit Zitat antworten
  #21 (permalink)  
Alt 04-11-2009, 16:38
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

Edit: set('a','') ist sehr wohl zulässig. Habs grad getestet. Und wenn man einem Datensatz in dieser Spalte '' zuweist, bekommt man das gleiche zurück wie bei der leeren Menge, d.h. man kann es gar nicht unterscheiden. Ziemlich krank!

Geändert von onemorenerd (04-11-2009 um 16:54 Uhr)
Mit Zitat antworten
  #22 (permalink)  
Alt 04-11-2009, 16:47
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

Angenommen eine Spalte hat den Typ set('a','b') und ein Datensatz enthält in dieser Spalte die Menge {'a', 'b'}. In PHP bekommt man dann den String "a,b" zurück. Um daraus sowas wie eine Menge zu machen, greift man meist zu explode(',' ...). Alles schick, man erhält ein Array mit zwei Elementen.

Aber hat ein Datensatz nun die leere Menge in dieser Spalte, würde man ein leeres Array erwarten. Doch explode() liefert ein Array mit einem Element, dem leeren String. Imho funktioniert explode() in dieser Hinsicht korrekt.
Mit Zitat antworten
  #23 (permalink)  
Alt 04-11-2009, 17:10
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
Edit: set('a','') ist sehr wohl zulässig. Habs grad getestet. Und wenn man einem Datensatz in dieser Spalte '' zuweist, bekommt man das gleiche zurück wie bei der leeren Menge, d.h. man kann es gar nicht unterscheiden. Ziemlich krank!
Kann ich bestätigen. Finde ich auch krank. Ich war mir sicher, dass das nicht zulässig ist.

Was den Vergleich mit explode betrifft: Es würde genauso korrekt arbeiten, wenn es ein leeres Array zurückgeben würde, nur bist du es gewohnt, ein Array mit einem leeren String zu bekommen, so dass du es inzwischen logisch findest. Ein PHP-Anfänger könnte das wieder ganz anders sehen. Für solche Spezialfälle gibt es kein korrekt oder nicht, nur spezifikationskonformes Verhalten oder nicht. Wenn das alles mit Logik entscheidbar wäre, bräuchte man ja keine Doku

PS: Guck dir mal die Spezialfälle für empty() an und sag mir dann mal, ob du das logisch findest oder dich nur dran gewöhnt hast.
Mit Zitat antworten
  #24 (permalink)  
Alt 04-11-2009, 17:20
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

Ja sicher gibt es viele Eigenheiten/Spezialitäten in PHP. Aber explode() gehört nicht dazu. Es ist keine Entscheidung der Enwickler von PHP gewesen, dass sich explode() so verhält. Es muss sich so verhalten, denn würde es hierbei
PHP-Code:
$emptyString '';
var_dump(explode(','$emptyString)); 
ein leeres Array zurückgeben, dann müsste es das hierfür auch
PHP-Code:
$emptyString '';
var_dump(explode(','$emptyString.','.$emptyString)); 
und das ginge ja absolut nicht. Dafür müsste man ja in PHP leere Strings verbieten - unmöglich in einer ernst zu nehmenden Sprache.

... muss man sich mal vorstellen, jedes Formularfeld ein Pflichtfeld

Geändert von onemorenerd (04-11-2009 um 17:25 Uhr)
Mit Zitat antworten
  #25 (permalink)  
Alt 04-11-2009, 17:22
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Jau - beknackt ist dagegen, dass explode immer noch ein Array, mit einem Element das einen leeren String enthält, zurückgibt, wenn du $emptyString = NULL machst.
Mit Zitat antworten
  #26 (permalink)  
Alt 04-11-2009, 17:31
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

Auch das ist nichts besonderes bzw. es liegt nicht an explode. Die Funktion erwartet als zweiten Parameter einen String. Wenn du $emptyString mit NULL belegst, castet PHP das zum String, bevor es die Funktion aufruft. Dass NULL zu einem leeren String gecastet wird, kann man vielleicht als beknackt empfinden - das ist tatsächlich so eine Eigenheit von PHP. Die Entwickler hätten es auch so machen können, dass NULL zu "0" (String mit Zeichen 0) wird oder zu "NULL". Beides wäre aber noch beknackter.
Mit Zitat antworten
  #27 (permalink)  
Alt 04-11-2009, 17:36
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Genau das sollte IMHO halt nicht geschehen - wenn explode einen Parameter bekommt, der keinen akzetablen Datentyp enthält, sollte es meinetwegen ein false liefern, aber nicht etwas, was letztenendes doppel- bzw. gar mehrdeutig ist, weil der zurückgelieferte Wert auch einen anderen Ursprung haben könnte.

So errinnert das einen entfernt an die Heisenbergsche Unschärferelation...
Mit Zitat antworten
  #28 (permalink)  
Alt 04-11-2009, 18:21
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

Wie ich bereits sagte, das ist keine Macke von explode(). Das ist bei allen Funktionen so und es sind nicht die Funktionen, die sich ihre Parameter zurecht-casten. Das macht die Engine.
Im Manual heißt es "a variable's type is determined by the context in which the variable is used" oder "The type of a variable is not usually set by the programmer; rather, it is decided at runtime by PHP depending on the context in which that variable is used."

Wenn man explode() irgendwas vorwerfen kann, dann dass es keinen dritten Parameter bool $strict hat und bei $strict == true das Type Juggling verhindert.
Mit Zitat antworten
  #29 (permalink)  
Alt 05-11-2009, 08:16
Quetschi
 PHP Expert
Links : Onlinestatus : Quetschi ist offline
Registriert seit: Dec 2004
Beiträge: 3.134
Quetschi wird schon bald berühmt werden
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Wenn man explode() irgendwas vorwerfen kann, dann dass es keinen dritten Parameter bool $strict hat und bei $strict == true das Type Juggling verhindert.
Wäre eigentlich nicht schlecht, wenn man das Global festlegen könnte. Manchmal ist es ja nett, aber manchmal zwingt es einem halt auch wieder zu gewissen Umwegen.
Mit Zitat antworten
  #30 (permalink)  
Alt 09-11-2009, 23:57
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

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Wenn man explode() irgendwas vorwerfen kann, dann dass es keinen dritten Parameter bool $strict hat und bei $strict == true das Type Juggling verhindert.
Und bevor man dann anfängt zu lamentieren, wie sich explode nun verhalten sollte und dass ja eh alles total doof ist, kann man sich auch einfach mal die Zeit nehmen, und das selbst comitten

Das bezieht sich jetzt nicht auf dich sondern auf die generelle "PHP machts anders als es eigentlich richtig wäre, und deswegen ist alles scheiße"-Mentalität, die in letzter Zeit hier Einzug hält
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 11:38 Uhr.