php-sql查询删除前导0


php sql query removes leading 0s

我的代码本质上是

$query = mysql_query('SELECT `foo` FROM `Bar` WHERE id=1', $conn)
$result = mysql_fetch_assoc($query)
$val = $map[$result['foo']];

其中foo的类型为CHAR(2),id=1的值为07

但是返回的值只有7,这在将其用作关联数组的索引时会造成问题。

PhpMyAdmin显示07 的正确值

当使用mysql_fetch_object太时,我得到了相同的结果

来自评论:var_dump($result)的结果是

array
  'foo' => string '7' (length=1)

var_dump($map)为大堆'07'=>字符串'bar'(长度=3)

编辑2:我刚刚发现了一个更大的问题:以0开头的电话号码也会受到影响。没有简单的方法(如下面建议的str_pad)来解决这个问题

编辑3:服务器是带有examplep 1.7.7和PHP 5.3.8的Windows 7数据库为InnoDB,具有latin_swedish_ci和COMPACT行格式

CREATE TABLE `Bar` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `foo` char(2) DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

编辑4:SELECT CONCAT("0", foo) FROM Bar WHERE id = 55返回07

sprintf('%02d', $row['number']);

或者,您也可以使用str_pad:

str_pad($row['number'], 2, '0', STR_PAD_LEFT);

这也可能停止PHP的自动类型转换:

$var = (string) $row['number'];

你也可以在第一个零之前加一个引号,比如这样:07

您可以通过这样做来更新表中的所有值(这样您就不必更改每个条目):

mysql_query('UPDATE tablename SET rowname = concat("''", rowname)');