Ожидаемый тип данных подготовленных параметров оператора определяется при подготовке оператора, и преобразование типа в этот тип данных происходит до выполнения оператора.
В вашем примере ожидается целочисленный параметр; поэтому предоставленная строка преобразуется в целое число (184) перед выполнением оператора, и сравнение между целочисленным столбцом vlan
и параметром является успешным для соответствующей записи.
«Обычный» оператор, напротив, сравнивает целочисленный столбец со строкой; поэтому аргументы сравниваются как числа с плавающей запятой, и ни одна запись не имеет соответствия vlan
.
Чтобы избежать этой ситуации, убедитесь, что тип данных не может быть определен при подготовке (или что определенный тип данных не теряет никакой информации) - например:
prepare not_so_stupid from
"select hostname from server where `vlan` = CAST(? AS CHAR) limit 1"
;