我在从旧的迁移之路上又遇到了一个坎坷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
and TestDecimal
fields.
如果我使用旧的运行以下代码mysql_*()
功能:
$SqlQuery = "SELECT * FROM test";
$Sql_Result = mysql_query($SqlQuery);
var_dump(mysql_fetch_array($Sql_Result));
我得到以下输出,其中正确填零Id
column:
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
column:
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
场地...
有什么方法可以使这项工作正常进行,或者我是否必须检查我的代码库并找出此更改的问题(我已经确定了一些不再工作的事情......)?
演示代码.