java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA7\xA7' for column

365 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

问题背景

今天在开发自己的小程序时候,在苹果手机上输入了一个表情,结果出现了错误,查看后台报错如下: java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA7\xA7' for column 'content' at row 1

问题分析

出现这个错误,可以从他的异常信息看出是SQL异常了,然后在后面会有一个'\xF0\x9F\xA7\xA7' for column 'content' at row 1,说明是在content字段插入了一个4字节的emoji表情,出现错误了。

数据中包含的emoji表情字符,通常的情况下,Mysql数据编码格式为“utf-8”,对于我们汉字来说也是足够用的,但是mysql中的utf8占用的是3个字节,此时,三个字节对于emoji表情符号就是完全不够用的了;它需要的是4个字节,所以,此时的utf8会报错上文提到的Incorrect string value: '\xF0\x9F\xA7\xA7' for column 问题。

解决方案

这里提供两种解决方案

  1. 修改mysql的编码格式 utfmb4编码其实是utf8编码的超集,他是兼容utf8的,并且能够存储4个字节emoji表情字符了。

    首先,修改mysql的配置文件:usr/local/mysql/bin/my.ini,然后添加如下的内容:

    [client]
     default-character-set=utf8mb4
    
     [mysql]
     default-character-set=utf8mb4
    
     [mysqld]
     character-set-client-handshake=FALSE
     character-set-server=utf8mb4
     collation-server=utf8mb4_unicode_ci
     init_connect=‘SET NAMES utf8mb4’
    
    

    然后,重启数据库

    在linux中:service mysql restart

    在windows中:

            net stop mysql 
    
            net start mysql
    

    最后,修改数据编码格式更改为utf8mb4 执行sql: ALTER TABLE t_leave_word CONVERT TO CHARACTER SET utf8mb4

  2. 通过我们的代码来实现4字节的字符进行转换

    这里代码就不贴了,因为这种方案几乎没人用了,毕竟第一种方案是最简但方便的,为什么还要去撸代码实现转化呢?

    对于那些想要代码的,可以私信我,亦或者去找度娘吧,他那肯定有的!

对于阿里云购买的数据库怎么搞呢?

这里也不着急,进入阿里云官网后台,控制台中选择数据库实例管理页面,找到参数管理,将他的character_set_server修改为utf8mb4,提交参数,重启数据库即可。

这里就搞定了,欢迎大家留言交流,也欢迎大家关注我的公众号《coder练习生》