diff --git a/includes/destinations.db.mysql.inc b/includes/destinations.db.mysql.inc
index ce29411..81f36f2 100644
--- a/includes/destinations.db.mysql.inc
+++ b/includes/destinations.db.mysql.inc
@@ -378,13 +378,29 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
     // Escape backslashes, PHP code, special chars
     $search = array('\\', "'", "\x00", "\x0a", "\x0d", "\x1a");
     $replace = array('\\\\', "''", '\0', '\n', '\r', '\Z');
-  
-    $line = array();
+    $no_mb_detect_encoding = !function_exists('mb_detect_encoding');
+
     foreach ($data as $row) {
-      // DB Escape the values.
+      // DB Escape the values:
+      // NULL and int as-is, regular strings escaped, binary data hex-encoded.
       $items = array();
       foreach ($row as $key => $value) {
-        $items[] = is_null($value) ? "null" : "'". str_replace($search, $replace, $value) ."'";
+        if (is_null($value)) {
+          $items[] = 'null';
+        }
+        elseif (ctype_digit($value) && ($value[0] !== '0' || $value === '0')) {
+          $items[] = $value;
+        }
+        else {
+          $escaped_value = str_replace($search, $replace, $value);
+          $valid_value = $no_mb_detect_encoding || mb_detect_encoding($escaped_value, 'utf-8', TRUE) !== FALSE;
+          if ($valid_value) {
+            $items[] = "'" . $escaped_value . "'";
+          }
+          else {
+            $items[] = '0x' . bin2hex($value);
+          }
+        }
       }
   
       // If there is a row to be added.
diff --git a/includes/sources.db.mysql.inc b/includes/sources.db.mysql.inc
index f972281..f9786c7 100644
--- a/includes/sources.db.mysql.inc
+++ b/includes/sources.db.mysql.inc
@@ -371,13 +371,29 @@ class backup_migrate_source_db_mysql extends backup_migrate_source_db {
     // Escape backslashes, PHP code, special chars
     $search = array('\\', "'", "\x00", "\x0a", "\x0d", "\x1a");
     $replace = array('\\\\', "''", '\0', '\n', '\r', '\Z');
-  
-    $line = array();
+    $no_mb_detect_encoding = !function_exists('mb_detect_encoding');
+
     foreach ($data as $row) {
-      // DB Escape the values.
+      // DB Escape the values:
+      // NULL and int as-is, regular strings escaped, binary data hex-encoded.
       $items = array();
       foreach ($row as $key => $value) {
-        $items[] = is_null($value) ? "null" : "'". str_replace($search, $replace, $value) ."'";
+        if (is_null($value)) {
+          $items[] = 'null';
+        }
+        elseif (ctype_digit($value) && ($value[0] !== '0' || $value === '0')) {
+          $items[] = $value;
+        }
+        else {
+          $escaped_value = str_replace($search, $replace, $value);
+          $valid_value = $no_mb_detect_encoding || mb_detect_encoding($escaped_value, 'utf-8', TRUE) !== FALSE;
+          if ($valid_value) {
+            $items[] = "'" . $escaped_value . "'";
+          }
+          else {
+            $items[] = '0x' . bin2hex($value);
+          }
+        }
       }
   
       // If there is a row to be added.
