Index: src/wp-includes/class-wp-meta-query.php
===================================================================
--- src/wp-includes/class-wp-meta-query.php	(revision 33848)
+++ src/wp-includes/class-wp-meta-query.php	(working copy)
@@ -587,10 +587,22 @@
 				$meta_value = trim( $meta_value );
 			}
 
+			switch ( $meta_type ) {
+				case 'SIGNED':
+					$cast_string = '%d';
+					break;
+				case 'UNSIGNED':
+					$cast_string = '%u';
+					break;
+				default:
+					$cast_string = '%s';
+					break;
+			}
+
 			switch ( $meta_compare ) {
 				case 'IN' :
 				case 'NOT IN' :
-					$meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';
+					$meta_compare_string = '(' . substr( str_repeat( ',' . $cast_string, count( $meta_value ) ), 1 ) . ')';
 					$where = $wpdb->prepare( $meta_compare_string, $meta_value );
 					break;
 
@@ -597,19 +609,19 @@
 				case 'BETWEEN' :
 				case 'NOT BETWEEN' :
 					$meta_value = array_slice( $meta_value, 0, 2 );
-					$where = $wpdb->prepare( '%s AND %s', $meta_value );
+					$where = $wpdb->prepare( $cast_string . ' AND ' . $cast_string, $meta_value );
 					break;
 
 				case 'LIKE' :
 				case 'NOT LIKE' :
 					$meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';
-					$where = $wpdb->prepare( '%s', $meta_value );
+					$where = $wpdb->prepare( $cast_string, $meta_value );
 					break;
 
 				// EXISTS with a value is interpreted as '='.
 				case 'EXISTS' :
 					$meta_compare = '=';
-					$where = $wpdb->prepare( '%s', $meta_value );
+					$where = $wpdb->prepare( $cast_string, $meta_value );
 					break;
 
 				// 'value' is ignored for NOT EXISTS.
@@ -618,12 +630,12 @@
 					break;
 
 				default :
-					$where = $wpdb->prepare( '%s', $meta_value );
+					$where = $wpdb->prepare( $cast_string, $meta_value );
 					break;
 
 			}
 
-			if ( $where ) {
+			if ( $where !== '' ) {
 				$sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}";
 			}
 		}
