diff --git a/sql/field.cc b/sql/field.cc
index 8a53928a7716b7344049885583fb0ea8cdb862d2..9acf2e14829c252f22e51321f0b63588f20fed3e 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -4276,7 +4276,7 @@ uint Field_varstring::max_packed_col_length(uint max_length)
   return (max_length > 255 ? 2 : 1)+max_length;
 }
 
-void Field_varstring::get_key_image(char *buff, uint length, imagetype type)
+void Field_varstring::get_key_image(char *buff, uint length, CHARSET_INFO *cs,imagetype type)
 {
   length-= HA_KEY_BLOB_LENGTH;
   uint f_length=uint2korr(ptr);
@@ -4290,10 +4290,10 @@ void Field_varstring::get_key_image(char *buff, uint length, imagetype type)
 #endif
 }
 
-void Field_varstring::set_key_image(char *buff,uint length)
+void Field_varstring::set_key_image(char *buff,uint length, CHARSET_INFO *cs)
 {
   length=uint2korr(buff);			// Real length is here
-  (void) Field_varstring::store(buff+2, length, default_charset_info);
+  (void) Field_varstring::store(buff+2, length, cs);
 }
 
 
@@ -4542,7 +4542,7 @@ int Field_blob::cmp_binary(const char *a_ptr, const char *b_ptr,
 
 /* The following is used only when comparing a key */
 
-void Field_blob::get_key_image(char *buff,uint length, imagetype type)
+void Field_blob::get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type)
 {
   length-= HA_KEY_BLOB_LENGTH;
   uint32 blob_length= get_length(ptr);
@@ -4577,14 +4577,14 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type)
   memcpy(buff+2,blob,length);
 }
 
-void Field_blob::set_key_image(char *buff,uint length)
+void Field_blob::set_key_image(char *buff,uint length, CHARSET_INFO *cs)
 {
   length=uint2korr(buff);
-  (void) Field_blob::store(buff+2,length, default_charset_info);
+  (void) Field_blob::store(buff+2,length,cs);
 }
 
 
-void Field_geom::get_key_image(char *buff,uint length, imagetype type)
+void Field_geom::get_key_image(char *buff,uint length,CHARSET_INFO *cs, imagetype type)
 {
   length-=HA_KEY_BLOB_LENGTH;
   ulong blob_length=get_length(ptr);
@@ -4603,7 +4603,7 @@ void Field_geom::get_key_image(char *buff,uint length, imagetype type)
   return;
 }
 
-void Field_geom::set_key_image(char *buff,uint length)
+void Field_geom::set_key_image(char *buff,uint length,CHARSET_INFO *cs)
 {
 }
 
diff --git a/sql/field.h b/sql/field.h
index d0855aa46b3b3db6382ecae793a2af9d598cb1f5..40578d19c823f800241eb7ff740bbd0b9462a3af 100644
--- a/sql/field.h
+++ b/sql/field.h
@@ -149,14 +149,14 @@ public:
     if (null_ptr)
       null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*);
   }
-  inline void get_image(char *buff,uint length)
+  inline void get_image(char *buff,uint length, CHARSET_INFO *cs)
     { memcpy(buff,ptr,length); }
-  inline void set_image(char *buff,uint length)
+  inline void set_image(char *buff,uint length, CHARSET_INFO *cs)
     { memcpy(ptr,buff,length); }
-  virtual void get_key_image(char *buff,uint length, imagetype type)
-    { get_image(buff,length); }
-  virtual void set_key_image(char *buff,uint length)
-    { set_image(buff,length); }
+  virtual void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type)
+    { get_image(buff,length,cs); }
+  virtual void set_key_image(char *buff,uint length, CHARSET_INFO *cs)
+    { set_image(buff,length,cs); }
   inline int cmp_image(char *buff,uint length)
     { return memcmp(ptr,buff,length); }
   inline longlong val_int_offset(uint row_offset)
@@ -836,8 +836,8 @@ public:
   bool send_binary(Protocol *protocol);
   int cmp(const char *,const char*);
   void sort_string(char *buff,uint length);
-  void get_key_image(char *buff,uint length, imagetype type);
-  void set_key_image(char *buff,uint length);
+  void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type);
+  void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
   void sql_type(String &str) const;
   char *pack(char *to, const char *from, uint max_length=~(uint) 0);
   const char *unpack(char* to, const char *from);
@@ -908,8 +908,8 @@ public:
       store_length(length);
       memcpy_fixed(ptr+packlength,&data,sizeof(char*));
     }
-  void get_key_image(char *buff,uint length, imagetype type);
-  void set_key_image(char *buff,uint length);
+  void get_key_image(char *buff,uint length, CHARSET_INFO *cs, imagetype type);
+  void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
   void sql_type(String &str) const;
   inline bool copy()
   { char *tmp;
@@ -950,8 +950,8 @@ public:
                  table_arg, my_charset_bin) {}
   enum ha_base_keytype key_type() const { return HA_KEYTYPE_VARBINARY; }
 
-  void get_key_image(char *buff,uint length, imagetype type);
-  void set_key_image(char *buff,uint length);
+  void get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type);
+  void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
 };
 
 
diff --git a/sql/item_buff.cc b/sql/item_buff.cc
index 7b8976bb5729fa2d0fb41a36d2e1f45efd3a1fae..573d4ab17e332be17a0913885bdf7698f27e5b40 100644
--- a/sql/item_buff.cc
+++ b/sql/item_buff.cc
@@ -99,7 +99,7 @@ bool Item_field_buff::cmp(void)
 {
   bool tmp= field->cmp(buff) != 0;		// This is not a blob!
   if (tmp)
-    field->get_image(buff,length);
+    field->get_image(buff,length,field->charset());
   if (null_value != field->is_null())
   {
     null_value= !null_value;
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index bcea522cb6df516314a73c48670fd35171a6672a..fd1a56fc97a863a1bbc27ffadd032fa62c5172b2 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -1043,7 +1043,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
   if (maybe_null)
     *str= (char) field->is_real_null();		// Set to 1 if null
   field->get_key_image(str+maybe_null,key_part->part_length,
-		       key_part->image_type);
+		       field->charset(),key_part->image_type);
   if (!(tree=new SEL_ARG(field,str,str)))
     DBUG_RETURN(0);
 
@@ -2813,7 +2813,8 @@ print_key(KEY_PART *key_part,const char *key,uint used_length)
     }
     field->set_key_image((char*) key,key_part->part_length -
 			 ((field->type() == FIELD_TYPE_BLOB) ?
-			  HA_KEY_BLOB_LENGTH : 0));
+			  HA_KEY_BLOB_LENGTH : 0),
+			 field->charset());
     field->val_str(&tmp,&tmp);
     fwrite(tmp.ptr(),sizeof(char),tmp.length(),DBUG_FILE);
   }
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 1477d46e75652c6d1a98a3a78f4e06fa42825fe4..b1bb36353bf50d88acb2ee853bcee914d94286c7 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -364,7 +364,8 @@ static bool find_range_key(TABLE_REF *ref, Field* field, COND *cond)
 	// Save found constant
 	if (part->null_bit)
 	  *key_ptr++= (byte) test(part->field->is_null());
-        part->field->get_key_image((char*) key_ptr,part->length, Field::itRAW);
+        part->field->get_key_image((char*) key_ptr,part->length, 
+				   part->field->charset(), Field::itRAW);
 	key_ptr+=part->store_length - test(part->null_bit);
 	left_length-=part->store_length;
       }
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 602a4b494b6f0919f78ee48ee4ca76b4df8e6f68..988cae8363b6b5bfa02923068b4beb398b254f00 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -6645,12 +6645,14 @@ store_record_in_cache(JOIN_CACHE *cache)
     {
       if (last_record)
       {
-	copy->blob_field->get_image((char*) pos,copy->length+sizeof(char*));
+	copy->blob_field->get_image((char*) pos,copy->length+sizeof(char*), 
+				    copy->blob_field->charset());
 	pos+=copy->length+sizeof(char*);
       }
       else
       {
-	copy->blob_field->get_image((char*) pos,copy->length); // blob length
+	copy->blob_field->get_image((char*) pos,copy->length, // blob length
+				    copy->blob_field->charset());
 	memcpy(pos+copy->length,copy->str,copy->blob_length);  // Blob data
 	pos+=copy->length+copy->blob_length;
       }
@@ -6707,7 +6709,8 @@ read_cached_record(JOIN_TAB *tab)
     {
       if (last_record)
       {
-	copy->blob_field->set_image((char*) pos,copy->length+sizeof(char*));
+	copy->blob_field->set_image((char*) pos,copy->length+sizeof(char*),
+				    copy->blob_field->charset());
 	pos+=copy->length+sizeof(char*);
       }
       else