近日在开发手机app的评论功能时,输入表情文字,保存后提示数据库保存失败。错误日志片段如下
caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
经过调研发现,这个问题是mysql的utf8编码导致。在mysql中utf8支持3个字节的长度,普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用。这时需要把mysql字符集更改为utf8mb4。(支持4个字节的utf8编码)。这时问题来了,阿里云默认安装的mysql版本是5.1.x,而utf8mb4支持至少需要5.5.3以上的版本。经过一番调研决定将mysql软件版本从5.1.x升级到5.7.x。
因为mysql数据库是开发测试环境,考虑到mysql跨多个大版本升级时的复杂度,决定采用先完全删除mysql 5.1后重新安装mysql 5.7的方式来进行。以下是整个卸载并重装mysql的流程。
1 查看当前linux版本
$ cat /proc/version
Linux version 2.6.32-431.23.3.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Thu Jul 31 17:20:51 UTC 2014
2 查看当前mysql安装情况
$ rpm -qa | grep -i mysql
perl-DBD-MySQL-4.013-3.el6.x86_64
mysql-5.1.73-5.el6_6.x86_64
mysql-libs-5.1.73-5.el6_6.x86_64
mysql-server-5.1.73-5.el6_6.x86_64
3 停止mysql服务
$ /etc/init.d/mysqld stop
4 根据步骤2的输出结果,依次删除以上组件
$ rpm -ev --nodeps perl-DBD-MySQL-4.013-3.el6.x86_64
$ rpm -ev --nodeps mysql-5.1.73-5.el6_6.x86_64
$ rpm -ev --nodeps mysql-libs-5.1.73-5.el6_6.x86_64
$ rpm -ev --nodeps mysql-server-5.1.73-5.el6_6.x86_64
5 删除老版本mysql的开发头文件和库
$ rm -fr /usr/lib/mysql
$ rm -fr /usr/include/mysql
$ rm -fr /usr/include/mysql*
$ rm -fr /var/lib/mysql
6 确认系统中是否有残留的mysql文件或目录
$ find / -name mysql*
7 从mysql官方下载安装mysql57
$ su root
$ sudo rpm -ivh mysql57-community-release-el6-7.noarch.rpm
$ sudo yum install mysql-server
8 从mysqld_safe启用并设置root用户密码
$ mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
$ mysql -u root mysql
mysql> update user set authentication_string=PASSWORD('XXXX') where user='root';
mysql> flush privileges;
mysql> quit
9 重启mysql用root用户登录
$ /etc/init.d/mysqld restart
$ mysql -u root -p
mysql> alter password=PASSWORD('XXXX');
mysql> show variables like '%char%';
默认安装mysql之后,字符集还是utf8。我们需要调整为utf8mb4
10 修改my.cnf字符集并重启mysql
$ vim /etc/my.cnf
$ /etc/init.d/mysqld restart
$ mysql -u root -p
mysql> show variables like '%char%';
字符集已经更改为utf8mb4。
至此,手机app上评论中输入表情文字保存出错的问题解决!