I ran into a similar problem using DBD::ODBC with an Informix database. When you select, e.g., a DECIMAL(12) column, you don't get an error, but you get the wrong number. A "12.3" comes back as something like "0.000000000123" (and there is no way to know where the decimal was). The solution for me was to explicitly format the column in the SQL statement with the desired number of decimal places (in Informix it was with the TRUNC function, e.g. "select trunc(some_column, 2) from...", I don't know about DB2).