PHP MySQL PDO: Wie man führende Nullen von Zerofill-Int-Spalten erhält

Ich bin noch einmal auf dem Weg der Migration vom alten auf eine Bodenwelle gestoßenmysql_*() Funktionen zur neuen PDO-Klasse: Ich habe folgende Tabelle:

CREATE TABLE `test` (
  `Id` tinyint(4) unsigned zerofill NOT NULL,
  `UserName` varchar(4) NOT NULL,
  `TestDecimal` decimal(6,0) unsigned zerofill DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Beachten Sie die Null ausgefülltId undTestDecimal Felder.

Wenn ich den folgenden Code ausführe, verwende ich den altenmysql_*() Funktionen:

$SqlQuery = "SELECT * FROM test";
$Sql_Result = mysql_query($SqlQuery);
var_dump(mysql_fetch_array($Sql_Result));

Ich bekomme folgende Ausgabe mit derrichtig null ausgefülltId Säule:

array (size=6)
  0 => string '0001' (length=4)
  'Id' => string '0001' (length=4)
  1 => string 'alex' (length=4)
  'UserName' => string 'alex' (length=4)
  2 => string '000002' (length=6)
  'TestDecimal' => string '000002' (length=6)

Wenn ich jedoch das gleiche mit PDO mache, wie folgt:

$SqlQuery = "SELECT * FROM test";
$SqlResult = $MysqlPDO->prepare($SqlQuery);
$SqlResult->execute();
var_dump($SqlResult->fetch(PDO::FETCH_BOTH));

Ich bekomme diese Ausgabe mit derfalsch nicht nullgefülltId Säule:

array (size=6)
  'Id' => int 1
  0 => int 1
  'UserName' => string 'alex' (length=4)
  1 => string 'alex' (length=4)
  'TestDecimal' => string '000002' (length=6)
  2 => string '000002' (length=6)

Es scheint, als würde die PDO-Klasse den Spaltentyp untersuchen und einen passenden Variablentyp (in diesem Fall eine Ganzzahl) in PHP zurückgeben. Nach einigem Suchen fand ich über das herausPDO::ATTR_STRINGIFY_FETCHES Dieses Attribut kann so eingestellt werden, dass alle MYSQL-Ergebnisse als Zeichenfolgen zurückgegeben werden. Dies scheint zwar zu funktionieren (ich erhalte eine Zeichenfolge anstelle einer Ganzzahl), es gibt jedoch immer noch keine führenden Nullen zurück:

array (size=6)
  'Id' => string '1' (length=1)
  0 => string '1' (length=1)
  'UserName' => string 'alex' (length=4)
  1 => string 'alex' (length=4)
  'TestDecimal' => string '000002' (length=6)
  2 => string '000002' (length=6)

Es scheint richtig zu funktionieren mit demdecimal(6,0) zerofill Feld, aber nicht mit dertinyint(4) zerofill field ... Gibt es eine Möglichkeit, dies zum Laufen zu bringen, oder muss ich meine Codebasis durchgehen und herausfinden, was mit dieser Änderung zu tun hat (ich habe bereits ein paar Dinge identifiziert, die nicht mehr funktionieren ...)?

Demo-Code.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage