在从旧的 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;
注意 zerofill 的 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));
我得到这个输出,错误地非 zerofilled 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)
在 PHP 中,PDO 类似乎正在查看列类型并返回匹配的变量类型(在本例中为整数)。
经过一番搜索后,我发现了 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 字段一起使用...
有什么方法可以使这项工作有效,还是我必须检查我的代码库并找出此更改的问题(我已经确定了一些不再有效的东西...)?
最佳答案
你可以使用LPAD吗?
试试这个:SELECT *, LPAD( Id, 3, '0') AS zero_Fill_Id FROM test
应该根据 int 大小更改 3:对于这种情况可能是 4?
更新:
我不认为 change int to decimal 是个好习惯,为什么我不深入探讨这个问题,你可以搜索那个主题。
我认为你使用了 mysqlnd 驱动程序,我发现了它(检查是否启用 How to know if MySQLnd is the active driver? ):
Advantages of using mysqlnd for PDO
mysqlnd returns native data types when using Server-side Prepared Statements, for example an INT column is returned as an integer variable not as a string. That means fewer data conversions internally.
来源:How to get numeric types from MySQL using PDO?
在这种情况下,PDO::ATTR_STRINGIFY_FETCHES 在您的情况下应设置为 true,您也可以尝试 PDO::ATTR_EMULATE_PREPARES 属性进一步查看:PDO MySQL: Use PDO::ATTR_EMULATE_PREPARES or not?
...
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
希望这对任何情况或任何人都有帮助 :))
关于PHP MySQL PDO : how to preserve leading zeros of zerofill int columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010145/