您在這裡

MySQL數據備份、恢複後Emoji字符丢失🙁

James Qi 在 2019年5月25日 - 22:42 發表

  很長時間以來,我們在做MySQL數據轉移的時候都是按照[[MySQL設置]]這篇文章裡面的說法:

導出備份數據

mysqldump -h 服務器IP地址 -u 用戶名 -p 密碼 --opt 數據庫名>備份數據庫名

  例如:

mysqldump -h localhost -u root -p --opt food>food2007-08-24-04.sql

  這條命令将服務器localhost上的food這個數據庫備份到本地計算機當前目錄的food2007-08-24-04.sql這個文件中,這樣,當數據庫不小心損壞或數據丢失時,就可以由food2007-08-24-04.sql這個備份文件恢複了

導入恢複數據

mysql -h 服務器IP地址 -u 用戶名 -p 密碼 -f -D 數據庫名 <備份文件名

  例如:

mysql -h localhost -u root -p -f -D food <food2007-08-24-04.sql

  這條命令會将food2007-08-24-04.sql這個文件中的數據重新恢複到服務器food數據庫中。

  注意在恢複前這個庫應該删除,并重建,而且.sql文件中的數據庫名要與創建的數據庫名相同才能恢複:

mysqladmin -uroot -p123456 drop database_name
mysqladmin -uroot -p123456 create database_name

  要指定字符集,可以登錄phpmyadmin後執行:

CREATE DATABASE `new_database_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  上面這種做法做了10年都沒有問題,直到最近一次轉移emojiall.com的數據後,發現轉移後的内容丢失了部分Emoji字符,例如這樣的:

  • ? 地圖
  • ? 地理
  • ?️ 建築
  • ⛪ 宗教場所
  • ⛲ 其他場所
  • ⛽ 陸路交通
  • ? 水路交通
  • ?️ 空中運輸
  • ?️ 酒店
  • ⌚ 時間
  • ☂️ 天空&天氣

  仔細檢查發現是數據庫備份、恢複後與以前的數據内容不一樣的,雖然數據庫表結構都是一樣的,也都支持uft8mb4。在網上搜了一下,應該把備份語句改為下面這樣:

mysqldump --default-character-set=utf8mb4 -utest -ptest test_dev user > user.sql

  這樣的備份數據恢複後就不會産生emoji丢失的情況,上面那個列表顯示如下:

  • 🌍 地圖
  • 🌋 地理
  • 🏗️ 建築
  • ⛪ 宗教場所
  • ⛲ 其他場所
  • ⛽ 陸路交通
  • 🚢 水路交通
  • 🛎️ 空中運輸
  • 🛎️ 酒店
  • ⌚ 時間
  • ☂️ 天空&天氣

  Emoji的用途這幾年越來越普及了,MySQL必須用utf8mb4來支持,我們後來建的Drupal 7、Drupal 8網站都是支持的,例如:

  還有幾個有用工具:

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。