dedlfix: mySQL varchar() ignoriert Null

Beitrag lesen

Tach!

Wenn ich einen Wert als INT() in meiner Datenbank speichere, ist es dann von Relevanz, ob ich die Zahlenwerte mit Anführungszeichen eintrage oder nicht?

Vor dem Eintragen in die Tabelle ist da ja erstmal das Statement. Und das ist eine Aneinanderreihung von Zeichen, die vom Statement-Parser erstmal interpretiert werden muss. Gegebenenfalls muss auch ein Ausdruck berechnet werden. Dann muss geschaut werden, welchem Typ das Feld angehört und der Wert muss in die interne binäre Darstellung dieses Typs gebracht werden.

Was ich sagen will: du bist nicht derjenige, der die Werte einträgt, du bist nur derjenige, der ein syntaktisch gültiges Statement als String erstellt. Darin befinden sich die Werte in Form diverser Literale. Ein Literal ist die Darstellung eines bestimmten Wertes mithilfe von Zeichen, gegebenenfalls mit zusätzlichen Begrenzungs- und Maskierungszeichen.

Die Regeln des DBMS legen auch fest, welche Umwandlungen stattfinden, wenn zwei Werte eines bestimmten Typs in einem Ausdruck miteinander berechnet werden, und sei es auch nur eine Zuweisung eines Wertes an eine Variable oder ein Feld eines anderen Typs.

Sprich:

Funktionieren sowohl

INSERT INTO tabelle (spalte) VALUES (1234)

als auch

INSERT INTO tabelle (spalte) VALUES ('1234')

?

Ja, im ersten Fall gibt es kein Problem, das Integer-Literal wird als Integer interpretiert. Im zweiten Fall trifft nun ein String-Literal auf einen Integer-Typ, und da versucht das MySQL die im String enthaltenen Zeichen soweit wie möglich als Zahl zu interpretieren (Integer, Kommazahl, Exponentialdarstellung). Der Rest der Zeichenfolge wird ab dem ersten der für Zahlen ungültigen Zeichen ignoriert.

Die Alternative zum Einfügen von Werten als Literal in Statements hört übrigens auf den Namen Prepared Statement. Da musst du dir die Frage nach dem Begrenzungszeichen prinzipbedingt gar nicht mehr stellen. Auch Gedanken zur Beachtung des Kontextwechsel und der dafür notwendigen Maskierregeln entfallen. Es ist aber weiterhin möglich, eine Zahl als Stringliteral zu übergeben, wenn eigentlich ein Zahlentyp erwartet wird. Das wird dann den Regeln entsprechend konvertiert.

dedlfix.