jjzjj

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

coder 2023-06-11 原文

在从旧的 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/

有关PHP MySQL PDO : how to preserve leading zeros of zerofill int columns的更多相关文章

随机推荐