当前位置

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标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。