Я ударил еще один удар по пути перехода от старых функций mysql_*()
к новому классу PDO:
У меня есть следующая таблица:
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;
Обратите внимание на поля с нулевым значением Id
и TestDecimal
.
Если я запустил следующий код, используя старые функции mysql_*()
:
$SqlQuery = "SELECT * FROM test";
$Sql_Result = mysql_query($SqlQuery);
var_dump(mysql_fetch_array($Sql_Result));
Я получаю следующий вывод с корректно нулевым столбцом Id
:
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)
Однако, если я делаю то же самое с использованием PDO, например:
$SqlQuery = "SELECT * FROM test";
$SqlResult = $MysqlPDO->prepare($SqlQuery);
$SqlResult->execute();
var_dump($SqlResult->fetch(PDO::FETCH_BOTH));
Я получаю этот вывод с некорректно отличным от нуля столбцом Id
:
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)
Кажется, что класс PDO смотрит на тип столбца и возвращает соответствующий тип переменной (целочисленный в этом случае) в PHP.
После некоторого поиска я узнал об атрибуте PDO::ATTR_STRINGIFY_FETCHES
, который можно настроить для принудительного возвращения всех результатов MYSQL в виде строк, в то время как это, похоже, работает (я получаю строку вместо int), она по-прежнему не возвращает ведущие нули:
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)
Кажется, что он корректно работает с полем decimal(6,0) zerofill
, но не с полем tinyint(4) zerofill
...
Есть ли способ сделать эту работу, или мне придется перебирать свою кодовую базу и выяснять, что ломается с этим изменением (я уже определил пару вещей, которые больше не работают...)?