很長時間以來,我們在做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網站都是支持的,例如:
- Emoji All 表情字典 📓 (Drupal 7)
- Emoji All 表情符号的博客 ✍️ (Drupal 8)
還有幾個有用工具:
评论