gpt4 book ai didi

PHP MySQL PDO : how to preserve leading zeros of zerofill int columns

转载 作者:IT老高 更新时间:2023-10-29 00:04:22 26 4
gpt4 key购买 nike

在从旧的 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 的 IdTestDecimal 字段。

如果我运行以下代码,使用旧的 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 字段一起使用...有什么方法可以使这项工作有效,还是我必须检查我的代码库并找出此更改的问题(我已经确定了一些不再有效的东西...)?

Demo code .

最佳答案

你可以使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com