diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index dfa6f88aab7db30ccbd15bc7bc475bf9d7b50a7f..2787f0d599108b633b75ad60919fe1378303ac95 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -4858,4 +4858,33 @@ call bug18787()|
 no_such_function()
 NULL
 drop procedure bug18787|
+create database bug18344_012345678901|
+use bug18344_012345678901|
+create procedure bug18344() begin end|
+create procedure bug18344_2() begin end|
+create database bug18344_0123456789012|
+use bug18344_0123456789012|
+create procedure bug18344() begin end|
+create procedure bug18344_2() begin end|
+use test|
+select schema_name from information_schema.schemata where 
+schema_name like 'bug18344%'|
+schema_name
+bug18344_012345678901
+bug18344_0123456789012
+select routine_name,routine_schema from information_schema.routines where
+routine_schema like 'bug18344%'|
+routine_name	routine_schema
+bug18344	bug18344_012345678901
+bug18344_2	bug18344_012345678901
+bug18344	bug18344_0123456789012
+bug18344_2	bug18344_0123456789012
+drop database bug18344_012345678901|
+drop database bug18344_0123456789012|
+select schema_name from information_schema.schemata where 
+schema_name like 'bug18344%'|
+schema_name
+select routine_name,routine_schema from information_schema.routines where
+routine_schema like 'bug18344%'|
+routine_name	routine_schema
 drop table t1,t2;
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index 5286eb827d3537a8ac0661ba602f29e60d357160..77c1982a7a8be6e1b06df4e6ac0c866a84a3347b 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -5716,6 +5716,38 @@ call bug18787()|
 drop procedure bug18787|
 
 
+#
+# BUG#18344: DROP DATABASE does not drop associated routines
+# (... if the database name is longer than 21 characters)
+#
+#               1234567890123456789012
+create database bug18344_012345678901| 
+use bug18344_012345678901|
+create procedure bug18344() begin end|
+create procedure bug18344_2() begin end|
+
+create database bug18344_0123456789012| 
+use bug18344_0123456789012|
+create procedure bug18344() begin end|
+create procedure bug18344_2() begin end|
+
+use test|
+
+select schema_name from information_schema.schemata where 
+  schema_name like 'bug18344%'|
+select routine_name,routine_schema from information_schema.routines where
+  routine_schema like 'bug18344%'|
+
+drop database bug18344_012345678901| 
+drop database bug18344_0123456789012| 
+
+# Should be nothing left.
+select schema_name from information_schema.schemata where 
+  schema_name like 'bug18344%'|
+select routine_name,routine_schema from information_schema.routines where
+  routine_schema like 'bug18344%'|
+
+
 #
 # BUG#NNNN: New bug synopsis
 #
diff --git a/sql/sp.cc b/sql/sp.cc
index cfcf011032d71acd56bc8aef5d2373ef535e0ed1..ab391e531ebb0c60383066ea2bad01df870100bf 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -886,28 +886,23 @@ int
 sp_drop_db_routines(THD *thd, char *db)
 {
   TABLE *table;
-  byte key[64];			// db
-  uint keylen;
   int ret;
+  uint key_len;
   DBUG_ENTER("sp_drop_db_routines");
   DBUG_PRINT("enter", ("db: %s", db));
 
-  // Put the key used to read the row together
-  keylen= strlen(db);
-  if (keylen > 64)
-    keylen= 64;
-  memcpy(key, db, keylen);
-  memset(key+keylen, (int)' ', 64-keylen); // Pad with space
-  keylen= sizeof(key);
-
   ret= SP_OPEN_TABLE_FAILED;
   if (!(table= open_proc_table_for_update(thd)))
     goto err;
 
+  table->field[MYSQL_PROC_FIELD_DB]->store(db, strlen(db), system_charset_info);
+  key_len= table->key_info->key_part[0].store_length;
+
   ret= SP_OK;
   table->file->ha_index_init(0);
   if (! table->file->index_read(table->record[0],
-				key, keylen, HA_READ_KEY_EXACT))
+                                table->field[MYSQL_PROC_FIELD_DB]->ptr,
+				key_len, HA_READ_KEY_EXACT))
   {
     int nxtres;
     bool deleted= FALSE;
@@ -923,7 +918,8 @@ sp_drop_db_routines(THD *thd, char *db)
 	break;
       }
     } while (! (nxtres= table->file->index_next_same(table->record[0],
-						     key, keylen)));
+                                        table->field[MYSQL_PROC_FIELD_DB]->ptr,
+						     key_len)));
     if (nxtres != HA_ERR_END_OF_FILE)
       ret= SP_KEY_NOT_FOUND;
     if (deleted)