--- php-5.2.11/ext/mysqli/php_mysqli.h	2009-09-14 18:51:11.000000000 +0200
+++ active-2.11/ext/mysqli/php_mysqli.h	2009-12-02 15:06:42.000000000 +0100
@@ -148,7 +148,7 @@
 extern mysqli_property_entry mysqli_driver_property_entries[];
 extern mysqli_property_entry mysqli_warning_property_entries[];
 
-extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flag, int into_object);
+extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flag, int into_object, short typed);
 extern void php_clear_stmt_bind(MY_STMT *stmt);
 extern void php_clear_mysql(MY_MYSQL *);
 extern MYSQLI_WARNING *php_get_warnings(MYSQL *mysql);
@@ -448,6 +448,7 @@
 	HashTable		*report_ht;
 	unsigned int	multi_query;
 	unsigned int	embedded;
+	unsigned short  typed;
 ZEND_END_MODULE_GLOBALS(mysqli)
 
 
--- php-5.2.11/ext/mysqli/mysqli.c	2009-02-17 11:40:18.000000000 +0100
+++ active-2.11/ext/mysqli/mysqli.c	2009-12-02 15:07:16.000000000 +0100
@@ -62,6 +62,42 @@
 	mysqli_write_t write_func;
 } mysqli_prop_handler;
 
+/* {{{ mysqli_cast */
+static int mysqli_cast(zval **data, MYSQL_FIELD *mysql_field, char *value TSRMLS_DC) {
+
+	switch(mysql_field->type) {
+		case MYSQL_TYPE_DECIMAL:
+		case MYSQL_TYPE_TINY:
+		case MYSQL_TYPE_SHORT:
+		case MYSQL_TYPE_LONG:
+		case MYSQL_TYPE_TIMESTAMP:
+		case MYSQL_TYPE_LONGLONG:
+		case MYSQL_TYPE_INT24:
+		case MYSQL_TYPE_YEAR:
+			Z_TYPE_PP(data) = IS_LONG;
+			ZVAL_LONG(*data, atol(value));
+			break;
+
+#if MYSQL_VERSION_ID >= 50000
+		case MYSQL_TYPE_NEWDECIMAL:
+#endif
+		case MYSQL_TYPE_FLOAT:
+		case MYSQL_TYPE_DOUBLE:
+			Z_TYPE_PP(data) = IS_DOUBLE;
+			ZVAL_DOUBLE(*data, zend_strtod(value, NULL));
+			break;
+
+		case MYSQL_TYPE_NULL:
+			Z_TYPE_PP(data) = IS_NULL;
+			break;
+
+		default:
+			return 0;
+	}
+	return 1;
+}
+/* }}} */
+
 /* {{{ php_free_stmt_bind_buffer */
 void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
 {
@@ -452,6 +488,7 @@
 	STD_PHP_INI_ENTRY("mysqli.default_port",			"3306",	PHP_INI_ALL,		OnUpdateLong,		default_port,		zend_mysqli_globals,		mysqli_globals)
 	STD_PHP_INI_ENTRY("mysqli.default_socket",			NULL,	PHP_INI_ALL,		OnUpdateStringUnempty,	default_socket,	zend_mysqli_globals,		mysqli_globals)
 	STD_PHP_INI_BOOLEAN("mysqli.reconnect",				"0",	PHP_INI_SYSTEM,		OnUpdateLong,		reconnect,			zend_mysqli_globals,		mysqli_globals)
+	STD_PHP_INI_BOOLEAN("mysqli.typed",                 "1",    PHP_INI_SYSTEM,     OnUpdateLong,       typed,              zend_mysqli_globals,        mysqli_globals)
 PHP_INI_END()
 
 /* }}} */
@@ -836,7 +873,7 @@
 
 /* {{{ php_mysqli_fetch_into_hash
  */
-void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags, int into_object)
+void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags, int into_object, short typed)
 {
 	MYSQL_RES		*result;
 	zval			*mysql_result;
@@ -906,7 +943,7 @@
 			if (PG(magic_quotes_runtime)) {
 				Z_TYPE_P(res) = IS_STRING;
 				Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC);
-			} else {
+			} else if(!typed || !mysqli_cast(&res, fields + i, row[i] TSRMLS_CC)) {
 				ZVAL_STRINGL(res, row[i], field_len[i], 1);	
 			}
 
--- php-5.2.11/ext/mysqli/mysqli_api.c	2009-09-14 18:51:11.000000000 +0200
+++ active-2.11/ext/mysqli/mysqli_api.c	2009-12-02 14:53:56.000000000 +0100
@@ -919,7 +919,7 @@
    Get a result row as an enumerated array */
 PHP_FUNCTION(mysqli_fetch_row) 
 {
-	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_NUM, 0);
+	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_NUM, 0, MyG(typed));
 }
 /* }}} */
 
--- php-5.2.11/ext/mysqli/mysqli_nonapi.c	2008-12-31 12:17:49.000000000 +0100
+++ active-2.11/ext/mysqli/mysqli_nonapi.c	2009-12-02 14:55:02.000000000 +0100
@@ -169,7 +169,7 @@
    Fetch a result row as an associative array, a numeric array, or both */
 PHP_FUNCTION(mysqli_fetch_array) 
 {
-	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
+	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0, MyG(typed));
 }
 /* }}} */
 
@@ -177,7 +177,7 @@
    Fetch a result row as an associative array */
 PHP_FUNCTION(mysqli_fetch_assoc) 
 {
-	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 0);
+	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 0, MyG(typed));
 }
 /* }}} */
 
@@ -185,7 +185,7 @@
    Fetch a result row as an object */
 PHP_FUNCTION(mysqli_fetch_object) 
 {
-	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1);	
+	php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1, MyG(typed));
 }
 /* }}} */
 
