После прочтения документации и кода в DBI.xs (реализация в sql_type_cast_svpv
) возвращаемое значение 1 означает, что «значение не может быть преобразовано корректно, и DBIstcf_STRICT не использовался'.
Принимая ключевую часть этой функции, в вашем случае:
case SQL_DOUBLE:
sv_2nv(sv);
/* SvNOK should be set but won't if sv is not numeric (in which
* case perl would have warn'd already if -w or warnings are in effect)
*/
cast_ok = SvNOK(sv);
break;
....
if (cast_ok) {
if (flags & DBIstcf_DISCARD_STRING
&& SvNIOK(sv) /* we set a numeric value */
&& SvPVX(sv) /* we have a buffer to discard */
) {
SvOOK_off(sv);
if (SvLEN(sv))
Safefree(SvPVX(sv));
SvPOK_off(sv);
SvPV_set(sv, NULL);
SvLEN_set(sv, 0);
SvCUR_set(sv, 0);
}
}
if (cast_ok)
return 2;
SvNOK должен быть установлен для вас.Не углубляясь в sv_2nv, суть проблемы заключается в том, что «4.8g» не является числовым типом, поскольку числовой флаг в скалярном значении не установлен (это то, что проверяет SvNOK).
Мое предложение, используйте регулярное выражение, чтобы убрать этот ввод перед вызовом sql_type_cast.