近日在開發手機app的評論功能時,輸入表情文字,保存後提示資料庫保存失敗。錯誤日誌片段如下 caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONT
近日在開發手機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 ([email protected]) (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 wget http://repo.mysql.com/mysql57-community-release-el6-7.noarch.rpm $ 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%';
.png)

.png)

.png)
