mysql的utf8并不是完整的utf8,只能存储最多三个字节的字符,而完整的utf8编码是一个字符最多可以占用4个字节的。
这就导致一些4个字节的字符不能存进utf8编码的表里面,比如emoji表情符号。
mysql5.5.3版本的时候新增了一个新的字符集,叫做utf8mb4,这个就是真正的utf8编码的,也可以直接存储emoji表情符号。
utf8mb4的字符范围是包含utf8的,所以,我们可以直接把当前数据库的编码转换成utf8mb4,不会有任何问题。
为了避免以后因为字符范围而导致的问题,我们在新建数据库的时候也应该用utf8mb4代替utf8作为默认的字符编码。
校验规则的话utf8mb4_general_ci
和utf8mb4_unicode_ci
都是可以得,mysql默认是前者,前者校验速度较快,后者则更准确一点。
那么如何把当前数据库的编码由utf8转换为utf8mb4呢?
我们需要下面几步:
首先,我们先备份下原来的数据库,是吧?为了保险起见。
然后呢!再核对下msyql的版本号,如果版本低于5.5.3的话就先升级一下吧!
第三步,修改数据库,表和列,数量少的话可以直接执行sql语句:
#修改数据库编码 ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci; #修改表 ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; #修改列 ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
第四步是修改连接,客户端和服务器的编码,这个可以修改my.cnf配置文件:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4
重启msyql之后,登录,如下方式查看变更:
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 10 rows in set (0.00 sec)
上面第三步修改数据库、表编码,如果很多表,显然很不方便。
我们可以通过mysqldump工具导出数据,修改编码之后再次导入的方法,方便快捷。
命令类似下面这样导出:
mysqldump -h localhost -u username -p -B db | sed 's/AUTO_INCREMENT=[0-9]*\s//g' > db.sql
最后就是修改程序连接msyql服务器的编码为utf8mb4了,再就是搞点数据测试一下了。
最最后,这里有篇老外的文章可供参考,比较完整的过程,我就是参考哪里搞得,有些步骤我也没做。
文章链接:https://mathiasbynens.be/notes/mysql-utf8mb4
本来链接:https://360us.net/article/42.html