T-Rex: Autoincrement bei value = '' funktioniert mal und mal nicht

Moin,

hab gerade einen doofen Fehler gefixed.
Da gibt es eine Tabelle mit einem Feld das Autoincrement ist. Bislang war es vollkommen okay, wenn man dieses Feld mit einem Value von "" belegte. Der Autoinkrement hat trotzdem funktioniert
PHPinfo Info:
Client API version 5.5.40

Bei einer anderen Version wird gemeckert, dass der Wert des Feldes kein Integer ist - was ja auch stimmt.
PHPinfo Info:
Client API version mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $

Jetzt würde ich doch gerne wissen wo der Unterschied beider Versionen ist? Eventuell gibt es noch mehr Unterschiede (Tickende Zeitbomben). Vor allem was ist den mysqllnd überhaupt?

Gruß
Info-mierender
T-Rex

  1. Vor allem was ist den mysqllnd überhaupt?

    mysqlnd

  2. Tach!

    PHPinfo Info:
    Client API version 5.5.40
    PHPinfo Info:
    Client API version mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $

    Die Client-API ist ein Teil der MySQL-Software, der bei Clients eingebaut wird, damit diese mit einem MySQL-Server kommunizieren können. Es ist aber keinesfalls notwendig, dass die Version der Client-API mit der Version vom Server übereinstimmt. Sonst könnte man nicht mit ein und demselben Client mehrere Server mit unterschiedlichen Versionen ansprechen. In der Regel bekommt man trotz erheblicher Versionsunterschiede auch mit älteren Client-APIs eine erfolgreiche Kommunikation mit Server zustande. Das Verhalten des Servers jedenfalls kann man anhand der Client-API-Versionsnummer nicht beurteilen. Dazu braucht es die Versionsnummer des Servers. Die kann phpinfo() nicht ermitteln, weil es ja gar nicht weiß, welchen Server du anzusprechen gedenkst. localhost ist es jedenfalls nicht immer. Lange Vorrede ...

    Jetzt würde ich doch gerne wissen wo der Unterschied beider Versionen ist?

    ... finde erstmal die Versionsnummern der Server. Dann kannst du in der jeweilgen Dokumentation nach dem auto_increment-Verhalten schauen. Auch in den Changelogs, die zwischen den beiden Versionen herausgegeben wurden, kannst du fündig werden. Diese sind üblicherweise vollständig.

    dedlfix.

    1. Hmpf...
      Die Client Api Version hat bei mir bislang immer sehr gut auf die MySQL Version gepasst. Was ein Zufall :D.
      Ansonsten danke für die Klarstellung.

      Gruß
      Klargestellter
      T-Rex

      1. Tach!

        Die Client Api Version hat bei mir bislang immer sehr gut auf die MySQL Version gepasst. Was ein Zufall :D.

        Diesem Zufall wird man meist mehr oder gezielt auf die Sprünge zu helfen versuchen, wenn man keinen Zoo an unterschiedlichen Versionsständen pflegen will oder muss. Die Versionsnummern der Client-API und des Servers sind vor allem dann gleich, wenn man beide aus derselben Distribution installiert. Man kann sich aber nicht darauf verlassen, dass das in jeder Konstellation so ist, weswegen man die Client-API-Versionsnummern prinzipiell erstmal links liegen lassen sollte.

        Aber nun zum eigentlichen Problem. Sind die Server-Versionen in deinem Fall dieselben?

        dedlfix.

        1. Tach!

          Die Client Api Version hat bei mir bislang immer sehr gut auf die MySQL Version gepasst. Was ein Zufall :D.
          [...]
          Sind die Server-Versionen in deinem Fall dieselben?

          PHPinfo Info:
          Client API version 5.5.40
          PHPinfo Info:
          Client API version mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $

          Ich hab noch etwas recherchiert. Bis vor einer Weile war es so, dass PHP seine mysql/mysqli-Funktionen mit der von MySQL bereitgestellten allgemeine Client-API hat sprechen lassen, und die haben dann mit dem jeweiligen Server die erforderlichen Daten ausgetauscht. Das war aber nicht sonderlich performant und so hat PHP von MySQL eine PHP-Extension programmiert bekommen, die direkt und ohne die MySQL-Client-API mit MySQL-Servern kommunizieren kann. Diese Extension ist direkter Teil von PHP geworden und verwendet keine Bestandteile der MySQL-Server-Software. Das heißt, dass die Versionsnummer von mysqlnd nun gar keinen Grund mehr hat, mit der Versionsnummer irgendeines Servers übereinzustimmen. (Außerdem waren MySQL-Server mit der Versionsnummer 5.0 schon vor drei Jahren am Ende ihres Lebenszyklus angekommen.) Das heißt also, wenn du PHP mit mysqlnd verwendest (und was anderes will man auch gar nicht mehr verwenden), dann kannst du von der angezeigte Versionsnummer keine Rückschlüsse mehr auf den Server vornehmen, auch keine zufälligen. Im aktuellen PHP-Code ist die Versionsnummer mit "mysqlnd 5.0.11-dev - 20120503" nur ein kleines Schrittchen vorangekommen, die MySQL-Server sind aber bei Version 5.6, gehen auf die 5.7 zu und MariaDB hat einen Versionssprung zu 10.0 (10.1 demnächst) hingelegt. (MariaDB schickt sich allem Anschein nach grad an, MySQL zu vertreiben.)

          SELECT VERSION() nach dem Connect zum Server war und ist die einzig zuverlässige Versionsnummernabfrage aus PHP heraus.

          Bei einer anderen Version wird gemeckert, dass der Wert des Feldes kein Integer ist - was ja auch stimmt.

          Wer genau meckert denn? Ist es eine PHP-Meldung oder eine vom Server? Und warum nimmst du einen Leerstring und nicht 0 oder NULL, wenn du schon unbedingt einen Wert angeben willst?

          dedlfix.