mysql 整个数据库从 utf8 转为 utf8mb4 最简单的解决方案

由于 utf8 只支持1-3字节,而 emoji 表情用到了4字节,所以如果用户的输入中有 emoji 表情,会导致写入数据库异常,这个问题很致命,而我一个项目就掉进了这个坑(而且laravel并没有报错,只是写入后再读出来是???)。

网上找了很多无损转换方法,基本都是逐个表进行修改,那么表多的话会比较麻烦,而且原结构的字段长度不一定记得,若预先show create table,等于又多了一个流程,不小心的话还容易留下隐患。

我希望能够以导出导入的方式轻松解决,文件式修改,通过搜索和替换的功能,可以减少失误,下面是我的做法:

  1. 把当前数据库分结构和数据两部分导出

    导出结构和数据:(操作前的备份)

     mysqldump -uroot -p dbname > backup.sql
    

    只导出结构:

     mysqldump -uroot -p --opt -d dbname > only_structure.sql
    

    只导出数据:

     mysqldump -uroot -p -t dbname > only_data.sql
    
  2. 编辑结构SQL,批量替换utf8utf8mb4

  3. 编辑结构SQL,搜索varchar,把长度超过191的字段都改成text(因为utf8mb4支持4字节,所以支持最大长度只有191)

  4. 导入新的结构

    进入 mysql shell:

     mysql -uroot -p
    

    删除原utf8编码数据库,并新建utf8mb4编码数据库

     drop database dbname;
     create database dbname character set utf8mb4 collate utf8mb4_unicode_ci;
     use dbname;
    

    导入utf8mb4的新结构

     source only_structure.sql
    

    导入旧数据

     source only_data.sql
若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏