diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 6c376d2c0da..457be355f81 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1,5 +1,5 @@
 /*
-   Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+   Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -1109,6 +1109,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
     char *user= (char*) packet, *packet_end= packet + packet_length;
     /* Safe because there is always a trailing \0 at the end of the packet */
     char *passwd= strend(user)+1;
+    uint user_length= passwd - user - 1;
 
     thd->change_user();
     thd->clear_error();                         // if errors from rollback
@@ -1122,6 +1123,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
       for *passwd > 127 and become 2**32-127 after casting to uint.
     */
     char db_buff[NAME_LEN+1];                 // buffer to store db in utf8
+    char user_buff[USERNAME_LENGTH + 1];      // buffer to store user in utf8
     char *db= passwd;
     char *save_db;
     /*
@@ -1172,15 +1174,31 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
         my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client",
                  cs->csname);
         break;
-      }        
+      }
+
+      if (cs_number)
+      {
+        /*
+          We have checked charset earlier,
+          so thd_init_client_charset cannot fail.
+        */
+        if (thd_init_client_charset(thd, cs_number))
+          DBUG_ASSERT(0);
+        thd->update_charset();
+      }
     }
 
-    /* Convert database name to utf8 */
+    /* Convert database and user names to utf8 */
     db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
                              system_charset_info, db, db_length,
                              thd->charset(), &dummy_errors)]= 0;
     db= db_buff;
 
+    user_buff[copy_and_convert(user_buff,sizeof(user_buff)-1,
+                               system_charset_info, user, user_length,
+                               thd->charset(), &dummy_errors)]= 0;
+    user= user_buff;
+
     /* Save user and privileges */
     save_db_length= thd->db_length;
     save_db= thd->db;
@@ -1215,17 +1233,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
 #endif /* NO_EMBEDDED_ACCESS_CHECKS */
       x_free(save_db);
       x_free(save_security_ctx.user);
-
-      if (cs_number)
-      {
-        /*
-          We have checked charset earlier,
-          so thd_init_client_charset cannot fail.
-        */
-        if (thd_init_client_charset(thd, cs_number))
-          DBUG_ASSERT(0);
-        thd->update_charset();
-      }
     }
     break;
   }