To find the type of columns, you need to 'query' the SQL sentence, 'fetchArray' the 1rst row, and then extract the name and type of each column.
Example:
function _sqlite_fetch_all( $db, $sql ) {
    $sqlite = new SQLite3( $db);
    if( $sqlite->lastErrorCode() ) return;
    $result = $sqlite->query( $sql );
    $result->fetchArray( SQLITE3_NUM );
    $fieldnames = [];
    $fieldtypes = [];
    for( $colnum=0; $colnum<$result->numColumns(); $colnum++) {
        $fieldnames[] = $result->columnName($colnum);
        $fieldtypes[] = $result->columnType($colnum);
    }
    $result->reset();
    while( $row = $result->fetchArray( SQLITE3_NUM ) ) {
        for ($colnum=0; $colnum<count($row); $colnum++) {
            $col = &$row[$colnum];
            if (isset($fieldtype_encode_binary[$fieldtypes[$colnum]])) $col = $fieldtype_encode_binary[$fieldtypes[$colnum]]( $col );
        }
        unset($col);
        if ($resulttype == SQLITE3_ASSOC) $row = array_combine( $fieldnames, $row );
        $rows[] = $row;
    }
    $result->finalize();
    $sqlite->close();
    return $rows;
}
Remark 1: The type of a column is SQLITE3_NULL before any 'fetchArray' and 'false' after last fetched row.
Remark2 : The actual values of SQLITE3_INTEGER, SQLITE3_FLOAT, SQLITE3_TEXT, SQLITE3_BLOB, SQLITE3_NULL are 1, 2, 3, 4, 5.