Выбор MySQL из столбца char с использованием int - ведущий ноль приводит к неожиданному результату - PullRequest
3 голосов
/ 23 января 2012

У меня есть следующие данные:

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 и решает, что они совпадают (предположительно, выполняется сравнение в виде целых чисел?)

В коде много мест, где создаются запросы, подобные этому, и в 99% случаев переменная stockcode будет буквенно-цифровой, лишь изредка полностью числовой и очень редко содержит начальный ноль, это всего лишь случайность, с которой я столкнулся сегодня.

Кто-нибудь может порекомендовать простое решение?

Ответы [ 2 ]

1 голос
/ 23 января 2012

Попробуйте явно привести ваши переменные к строкам:

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

Edit:

Если это не сработает, я думаю, что quoteSmart() на самом деле не такой умный (или пытается быть слишком умным для своего блага), поэтому вам, скорее всего, придется прекратить его использовать и придерживаться параметры (которые я предлагаю по этому методу в любом случае).

0 голосов
/ 23 января 2012

Добавьте кавычки, чтобы символ в базе данных не преобразовывался в числа для сравнения

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

2-я версия:

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