diff --git a/lib/modules/Sql.pmod/mysql.pike b/lib/modules/Sql.pmod/mysql.pike
index f8073dacbc9b371e6c7d293b21e65635cda937a9..506f0adeacf5552202871bb5363b502d023489a9 100644
--- a/lib/modules/Sql.pmod/mysql.pike
+++ b/lib/modules/Sql.pmod/mysql.pike
@@ -421,7 +421,9 @@ string latin1_to_utf8 (string s)
   ])));
 }
 
-string utf8_encode_query (string q, function(string:string) encode_fn)
+string utf8_encode_query (string q,
+			  function(string, mixed|void...:string) encode_fn,
+			  mixed ... extras)
 //! Encodes the appropriate sections of the query with @[encode_fn].
 //! Everything except strings prefixed by an introducer (i.e.
 //! @expr{_something@} or @expr{N@}) is encoded.
@@ -430,7 +432,7 @@ string utf8_encode_query (string q, function(string:string) encode_fn)
   string e = "";
   while (1) {
     sscanf(q, "%[^\'\"]%s", string prefix, string suffix);
-    e += encode_fn (prefix);
+    e += encode_fn (prefix, @extras);
 
     if (suffix == "") break;
 
@@ -526,7 +528,7 @@ string utf8_encode_query (string q, function(string:string) encode_fn)
       }
       e += s;
     } else {
-      e += encode_fn (suffix[..end]);
+      e += encode_fn (suffix[..end], @extras);
     }
 
     q = suffix[end+1..];
@@ -685,7 +687,7 @@ int decode_datetime (string timestr)
        */								\
       if ((send_charset == "utf8") || !_can_send_as_latin1(query)) {	\
 	CH_DEBUG ("Converting query to utf8.\n");			\
-	query = utf8_encode_query (query, string_to_utf8);		\
+	query = utf8_encode_query (query, string_to_utf8, 2);		\
 	new_send_charset = "utf8";					\
       }									\
     }									\
diff --git a/lib/modules/Sql.pmod/sql_util.pmod b/lib/modules/Sql.pmod/sql_util.pmod
index adfcfd84cbbb64cc0e093bf5327f3547cc95d6e8..756aa91bd908be512b2f71f4d44c50fef7d6c4ad 100644
--- a/lib/modules/Sql.pmod/sql_util.pmod
+++ b/lib/modules/Sql.pmod/sql_util.pmod
@@ -198,12 +198,12 @@ class UnicodeWrapper (
       field_info = master_result->fetch_fields();
       foreach(field_info, int|mapping(string:mixed) field) {
 	if (mappingp(field)) {
-	  field->name = utf8_to_string(field->name);
+	  field->name = utf8_to_string(field->name, 2);
 	  if (field->table) {
-	    field->table = utf8_to_string(field->table);
+	    field->table = utf8_to_string(field->table, 2);
 	  }
 	  if (field->default) {
-	    field->default = utf8_to_string(field->default);
+	    field->default = utf8_to_string(field->default, 2);
 	  }
 	}
       }
@@ -227,7 +227,7 @@ class UnicodeWrapper (
     array(int|mapping(string:mixed)) field_info = fetch_fields();
     foreach(row; int i; string|int val) {
       if (stringp(val)) {
-	row[i] = utf8_to_string(val);
+	row[i] = utf8_to_string(val, 2);
       }
     }
     return row;
@@ -260,7 +260,7 @@ class MySQLUnicodeWrapper
     array(int|mapping(string:mixed)) field_info = fetch_fields();
     foreach(row; int i; string|int val) {
       if (stringp(val) && field_info[i]->charsetnr != 63) {
-	row[i] = utf8_to_string(val);
+	row[i] = utf8_to_string(val, 2);
       }
     }
     return row;
@@ -296,7 +296,7 @@ class MySQLBrokenUnicodeWrapper
     foreach(row; int i; string|int val) {
       if (stringp(val) && field_info[i]->flags &&
 	  !field_info[i]->flags->binary) {
-	row[i] = utf8_to_string(val);
+	row[i] = utf8_to_string(val, 2);
       }
     }
     return row;