mysql字符集utf8mb4和utf8的问题

近段碰到这么个bug,项目出现一个异常,`Incorrect string value: '***' from column nickname at row 34`。对应nickname字段是varchar类型、utf8字符集,之前有存入数据了。
再查下对应写入数据,好吧,大概明白什么情况了。原来用户昵称中包含了emoji字符,字符类型是4个字节,而mysql数据库utf8(也是utf8mb3)是最大支持3个字节长度,从而导致这类数据不能成功存储。

解决方法,就是要让数据能存储4个字节长度的字符,刚好mysql数据有utf8mb4字符集,只需要将对应字段更改为此字符集即可。

对于两个字符集有什么不同呢?

utf8字符集,中文字符以三个字节长度存储,英文字符以一个字节进行存储,mysql下是utf8,实际上也叫utf8mb3,因为该字符集是不能存储超过三个字节字符。
utf8mb4,算是utf8的一个超集,相比utf8多增加了一个字节的支持,而在其他方面,如编码、存储值、字符长度、存储特性等都是一样。
utf8变更为utf8mb4,不需要对字符做任何处理,不需要补充字符数据进行转换。而且在mysql8.0之后,数据库默认字符集都是utf8mb4。utf8mb4兼容utf8,可放心变更字符集。

注意

变更字符集之前,请先确定几个先决条件:

  • 数据库字符集,如果数据库字符集不是utf8mb4,单单更改字段字符集将是无效果。
  • 数据库版本,如果是5.5.3之前,不要尝试变更数据库字符集啦,先考虑是否能升级数据库版本吧。

对于升级比较麻烦的,建议在代码层面对emoji字符进行处理。即转码后入库存储。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值