Although ThisSuitlsBlackNot is nearly correct there are some important omissions from his answer. As the author of most of the StrictlyTyped and DiscardString attributes I can tell you that in fact, the DiscardString attribute is far more important in this case.
DBI will attempt to cast your data to the TYPE specified and if that fails your data will be left alone and no error is generated. If the cast fails and StrictlyTyped is specified then an error is generated.
The DiscardString attribute throws away the string portion of your data (the pv) is discarded. This is particularly important when using JSON::XS and perhaps other JSON modules as JSON::XS specifically looks at the pv.
So really you should be doing at least:
$sth->bind_col(1, undef, {TYPE => SQL_INTEGER, DiscardString => 1});
NOTE few DBDs actually pay any attention to a bind type in bind_col. DBD::ODBC does because I maintain it. DBD::Oracle does not pay attention to the TYPE normally, except when used with StrictlyTyped and/or DiscardString (because I added that functionality for exactly the same problem you have).
Whether a driver supports those attributes or not can only truly be ascertained (unless documentation says so) by searching the code for use of sql_type_cast and their xs equivalents sql_type_cast_svpv etc. I don't believe DBD::Pg supports StrictlyTyped or DiscardString; in fact I believe at this time only DBD::ODBC and DBD::Oracle do (as I added them).
You might also find this interesting.