В других инфраструктурах абстракции БД на других языках это можно использовать для таких вещей, как обеспечение правильного экранирования для встроенных значений (для драйверов, которые не поддерживают надлежащие связанные параметры) и повышение эффективности сети путем создания уверен, что числа двоично упакованы соответствующим образом (с учетом поддержки протокола). Похоже, что в PDO, это не так много.
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
char *p;
int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
ZVAL_STRINGL(param->parameter, p, len, 0);
} else {
convert_to_string(param->parameter);
}
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
convert_to_boolean(param->parameter);
}
Итак, если вы говорите, что это STR (или вообще ничего не говорите, так как это по умолчанию), а внутренний тип ваших данных - double, тогда он превратит его в строку одним методом, если это не double, тогда он преобразует его в строку другим методом.
Если вы скажете, что это int, но на самом деле это bool, тогда он преобразует его в long.
Если вы скажете, что это bool, но на самом деле это число, оно преобразует его в истинное логическое значение.
Это действительно все, что я видел (быстро), глядя на источник stmt, я представляю, как только вы передадите параметры в драйвер, они могут творить дополнительную магию. Итак, я предполагаю, что все, что вы получите, - это немного поработать правильно и много неоднозначности и различий в поведении между водителями.