【发布时间】:2014-09-20 12:29:07
【问题描述】:
在从旧的 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 字段不能...
有什么办法可以使这项工作,还是我必须检查我的代码库并找出与此更改有关的问题(我已经确定了一些不再起作用的事情......)?
【问题讨论】:
-
这家伙解决了它改成十进制stackoverflow.com/questions/6825106/…
-
可能不相关,但让我很头疼:
$ResultType的值是多少(在fetch($ResultType)中)? -
@Alex ,mysql 版本?客户端 API 版本?
-
create table查询? -
@sectus: 好的,那为什么我的输出和你不一样呢?也许是 PHP 或 MySQL 配置?你能发布你的
php.ini和my.cnf文件吗?谢谢!