MySQL使用int从char列中选择 - 前导零导致意外结果

时间:2012-01-23 15:38:53

标签: php mysql pear

我有以下数据:

stockcode (CHAR) | description (VARCHAR)
----------------------------------------------
1234               | some product
01234              | some other product

我运行以下代码:

$sql = "SELECT * FROM stock WHERE stockcode = " . $db->quoteSmart($stockcode)
$res = $db->query($sql);

如果我传入股票代码“01234”,我会按预期获得第二行。如果我传入“1234”,我会得到两行,当我希望只获得第一行时。

通过回显sql语句,似乎是因为只有01234股票代码获得了它周围的报价,1234股票代码没有(大概是quoteSmart认为它是一个整数,它不需要报价?)。

然后Mysql将int 1234与CHAR列进行比较,并确定它们都匹配(可能是它正在进行比较为int?)

代码中有很多地方构建这样的查询,99%的时候,stockcode变量将是字母数字,它只是偶然的完全数字,很少包含前导零,这只是一个侥幸发生我偶然发现了。

任何人都可以推荐一个简单的解决方案吗?

2 个答案:

答案 0 :(得分:1)

尝试将变量显式地转换为字符串:

$db->quoteSmart((string)$stockcode);
// instead of:
// $db->quoteSmart($stockcode);

修改

如果这不起作用,我认为quoteSmart()并不是那么聪明(或者它试图太聪明而不是它自己的好处),所以你很可能需要停止使用它并坚持下去绑定参数(无论如何我建议使用此方法)。

答案 1 :(得分:0)

添加引号,以便数据库中的char不会转换为比较数字

 $sql = "SELECT * FROM stock 
                  WHERE stockcode = '" . $db->quoteSmart($stockcode). "'"

第二版:

$stockcode_str = $db->quoteSmart($stockcode);
if (is_numeric($stockcode_str))
    $stockcode_str = "'$stockcode_str'";
$sql = "SELECT * FROM stock 
                      WHERE stockcode = $stockcode_str";