diff --git a/.bzrignore b/.bzrignore
index 4683dcd2fb74c069c41a37901d10f21cfac91edb..3b9576a47f0feb500bdc68ce6d12091828f4acc6 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -478,3 +478,4 @@ vio/test-ssl
 vio/test-sslclient
 vio/test-sslserver
 vio/viotest-ssl
+tests/client_test
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 7a1ac4728daeceee442dffa86105d0da6c7b3ef1..c8914702ae79e44c9c03dd1bfe96fd38072a6c7d 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -103,6 +103,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
   file_id = 0;
   cond_count=0;
   convert_set=0;
+  db_charset=default_charset_info;
   mysys_var=0;
 #ifndef DBUG_OFF
   dbug_sentry=THD_SENTRY_MAGIC;
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 37eb366e21fdd53deef12fd5e674c221d270a8a9..9b708e35a1e2aeba1e89a091ea61f11873a8f5bc 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -473,7 +473,8 @@ public:
   ulong	     slave_proxy_id;
   NET*       slave_net;			// network connection from slave -> m.
   my_off_t   log_pos;
-   
+  CHARSET_INFO *db_charset;
+
   THD();
   ~THD();
   void cleanup(void);
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 5275403db40bf53c006d8b2506b204973df66b09..91f7474bb3308aafb60b03130602b53701d3018e 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -25,6 +25,8 @@
 #include <direct.h>
 #endif
 
+#define MY_DB_OPT_FILE ".db.opt"
+
 static long mysql_rm_known_files(THD *thd, MY_DIR *dirp,
 				 const char *db, const char *path,
 				 uint level);
@@ -82,12 +84,12 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info, bool silent
 
   strcat(path,"/");
   unpack_dirname(path,path);
-  strcat(path,"db.opt");
+  strcat(path,MY_DB_OPT_FILE);
   if ((file=my_create(path,CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0)
   {
-    sprintf(path,"CREATE DATABASE %s DEFAULT CHARACTER SET=%s\n",db,
-		  (create_info && create_info->table_charset) 
-		  ? create_info->table_charset->name : "DEFAULT");
+    sprintf(path,"default-character-set=%s\n",
+		 (create_info && create_info->table_charset) ? 
+		 create_info->table_charset->name : "DEFAULT");
     
     if (my_write(file,(byte*) path,strlen(path),MYF(MY_NABP+MY_WME)))
     {
@@ -423,15 +425,44 @@ bool mysql_change_db(THD *thd,const char *name)
 
   strcat(path,"/");
   unpack_dirname(path,path);
-  strcat(path,"db.opt");
+  strcat(path,MY_DB_OPT_FILE);
   if ((file=my_open(path,O_RDWR|O_BINARY,MYF(MY_WME))) >= 0)
   {
     int nbytes=my_read(file,(byte*) path,sizeof(path),MYF(0));
     if ( nbytes >= 0 )
     {
+      char *ln=path;
+      char *pe=path+nbytes;
+
       path[nbytes]='\0';
-      // BAR TODO: parse create options 
-      // and extract database default charset
+      for ( ln=path; ln<pe; )
+      {
+	char *le,*val;
+	for ( le=ln, val=0 ; le<pe ; le++ )
+	{
+	  switch(le[0])
+	  {
+	    case '=':
+	      le[0]='\0';
+	      val=le+1;
+	      le++;
+	      break;
+	    case '\r':
+	    case '\n':
+	      le[0]='\0';
+	      le++;
+	      for( ; (le[0]=='\r' || le[0]=='\n') ; le++);
+	      if (!strcmp(ln,"default-character-set") && val && val[0])
+	      {
+		thd->db_charset=get_charset_by_name(val, MYF(0));
+	      }
+	      goto cnt;
+	      break;
+	  }
+	}
+cnt:
+	ln=le;
+      }
     }
     my_close(file,MYF(0));
   }
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 3a6ff3d6b16c8f6d5d5e394c784f2242a32da8b1..d8012c0c1021269fff774ebb4f1bff7c2ac66993 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -377,7 +377,9 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
       auto_increment++;
     if(!sql_field->charset)
       sql_field->charset = create_info->table_charset ?
-			     create_info->table_charset : default_charset_info;
+			   create_info->table_charset : 
+			   thd->db_charset? thd->db_charset :
+			   default_charset_info;
     pos+=sql_field->pack_length;
   }
   if (auto_increment > 1)