当MySLQ中UPDATA和INSERT数据时,如果数据上有emoji图标,例如:💗,👽,💔很容易更新或插入不成功,导致错误。Error:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD:Incorrectstringvalue:'\xF0\x9F\x91\xBD\xF0\x9F...'forcolumn'name'atrow差点崩溃,还好这个鬼问题终于解决了。资料显示,原因是在MYSQL5.5之前,UTF8编码只支持1-3个字节,并且只支持BMP的unicode编码区,而emoji图标刚好是4字节编码存储的。从MYSQL5.5开始可以支持4字节的UTF编码utf8mb4,一个字符最多可以有4个字节,所以可以支持更多的字符集。所以要解决问题,需要将数据库表的字符编码全部改为utf8mb4。常用字符集ASCII:AmericanStandardCodeforInformationInterchange;英语和其他西欧语言;单字节编码,7位代表一个字符,共128个字符。GBK:双字节,汉字内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录汉字21003个,扩展名GB2312。UTF-8:Unicode标准变长字符编码;Unicode标准(Unicode),业界统一标准,包括全球数十种文字系统;UTF-8:使用一到三个字节对每个字符进行编码。utf8mb4:存储四个字节,应用场景用于存储emoji表情,因为emoji表情可以是四个字节。utf8mb4:MySQL版本>5.5.3。其他常见字符集:UTF-32、UTF-16、Big5和latin1。数据库中的字符集包含两层含义。各种字符和符号的集合,包括国字、标点符号、图形符号、数字等。字符的编码方式,即二进制数据与字符之间的映射规则。系统环境MySQL5.7.14MacOSX10.11.6升级数据前先备份服务器所有数据,保持良好习惯,安全***!升级您的MySQL新数据库可以在此处下载将MySQL服务器升级到v5.5.3+。修改你的数据库,表,字段#对于每个数据库:ALTERDATABASE这里是数据库名CHARACTERSET=utf8mb4COLLATE=utf8mb4_unicode_ci;#对于每个表:ALTERTABLE这里是表名CONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;#对于每个字段:ALTERTABLE这里是表名CHANGE字段名称重复字段名VARCHAR(191)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;#上面这句还是用modify来改变ALTERTABLE这里是表名修改字段名VARCHAR(50)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciDEFAULT'';utf8mb4完全向后兼容utf8,不会出现乱码或其他形式的数据丢失。理论上,你可以放心修改。如果不放心,可以用备份恢复数据,然后让程序员来处理这个兼容的emoji存储问题。保存的时候过滤一下再转成base64,检索的时候再转回去?..修改数据库更方便。检查您的字段和索引,不要将所有内容都设置为utf8mb4,这是必要的。当我的一些字段是VARCHAR类型时,我只将它设置为utf8mb4。修改MySQL配置文件是最糟糕的地方。我在我的Macosx系统上找不到/etc/my.cnf。它根本不存在,所以我们需要创建这样一个文件并修改它。#进入该目录,#该目录下有一个后缀为`.cnf`的文件cd/usr/local/mysql/support-files/#将此文件复制到`etc`目录下,命名为`my.cnf`sudocpmy-default.cnf/etc/my.cnf#然后编辑`my.cnf`文件,将以下内容复制进去。sudovim/etc/my.cnfMySQL配置文件(/etc/my.cnf):[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collat??ion-server=utf8mb4_unicode_ci重启MySQL重启这一步很重要,否则没有效果。开始:/usr/local/mysql/support-files/mysql.serverstart停止:/usr/local/mysql/support-files/mysql.serverstop重启:/usr/local/mysql/support-files/mysql.server在重启系统中,可以重启、停止或启动servicemysqldstopservicemysqldstartservicemysqldrestart来检查是否设置成功。通过以下命令查看是否设置成功!#登录MySQL查询mysql>SHOWVARIABLESWHEREVariable_nameLIKE'character\_set\_%'ORVariable_nameLIKE'collat??ion%';#运行上面代码显示如下结果#+----------------------+--------------------+#|Variable_name|Value|#+------------------------+----------------------+#|字符集客户端|utf8mb4|#|字符集连接|utf8mb4|#|字符集数据库|utf8mb4|#|字符集文件系统|二进制|#|字符集结果|utf8mb4|#|字符集服务器|utf8mb4|#|字符集系统|utf8|#|collat??ion_connection|utf8mb4_unicode_ci|#|collat??ion_database|utf8mb4_unicode_ci|#|collat??ion_server|utf8mb4_unicode_ci|#+------------------------+----------------+#查看表mysql的情况>SHOWFULLCOLUMNSFROMusers_profile;这一步代表你成功了!恭喜!~修复优化表我跑到这一步了。其实根本不需要对表进行修复和优化。为了保险起见,我还是跑了这两条命令。虽然我不知道它有什么用,但我还是把它放在这里,注意REPAIRTABLE表名;优化表名;
